From 28a6578ba2974f3aa0535940bfd626c107dc1e2d Mon Sep 17 00:00:00 2001 From: shreyas Date: Mon, 25 Jan 2016 12:44:14 +0530 Subject: [PATCH] Added the credit_days_based_on field to Supplier and Supplier Type doctype --- erpnext/accounts/party.py | 40 ++++++------ erpnext/buying/doctype/supplier/supplier.json | 53 +++++++++++++++- .../buying/doctype/supplier/test_supplier.py | 51 +++++++++++++++- .../doctype/supplier_type/supplier_type.json | 61 ++++++++++++++++++- 4 files changed, 177 insertions(+), 28 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index d1e2cdcd695..e76137905ed 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -237,16 +237,11 @@ def get_due_date(posting_date, party_type, party, company): due_date = None if posting_date and party: due_date = posting_date - if party_type=="Customer": - credit_days_based_on, credit_days = get_credit_days(party_type, party, company) - if credit_days_based_on == "Fixed Days" and credit_days: - due_date = add_days(posting_date, credit_days) - elif credit_days_based_on == "Last Day of the Next Month": - due_date = (get_first_day(posting_date, 0, 2) + datetime.timedelta(-1)).strftime("%Y-%m-%d") - else: - credit_days = get_credit_days(party_type, party, company) - if credit_days: - due_date = add_days(posting_date, credit_days) + credit_days_based_on, credit_days = get_credit_days(party_type, party, company) + if credit_days_based_on == "Fixed Days" and credit_days: + due_date = add_days(posting_date, credit_days) + elif credit_days_based_on == "Last Day of the Next Month": + due_date = (get_first_day(posting_date, 0, 2) + datetime.timedelta(-1)).strftime("%Y-%m-%d") return due_date @@ -255,20 +250,21 @@ def get_credit_days(party_type, party, company): if party_type == "Customer": credit_days_based_on, credit_days, customer_group = \ frappe.db.get_value(party_type, party, ["credit_days_based_on", "credit_days", "customer_group"]) - - if not credit_days_based_on: - credit_days_based_on, credit_days = \ - frappe.db.get_value("Customer Group", customer_group, ["credit_days_based_on", "credit_days"]) \ - or frappe.db.get_value("Company", company, ["credit_days_based_on", "credit_days"]) - - return credit_days_based_on, credit_days else: - credit_days, supplier_type = frappe.db.get_value(party_type, party, ["credit_days", "supplier_type"]) - if not credit_days: - credit_days = frappe.db.get_value("Supplier Type", supplier_type, "credit_days") \ - or frappe.db.get_value("Company", company, "credit_days") + credit_days_based_on, credit_days, supplier_type = \ + frappe.db.get_value(party_type, party, ["credit_days_based_on", "credit_days", "supplier_type"]) - return credit_days + if not credit_days_based_on: + if party_type == "Customer": + credit_days_based_on, credit_days = \ + frappe.db.get_value("Customer Group", customer_group, ["credit_days_based_on", "credit_days"]) \ + or frappe.db.get_value("Company", company, ["credit_days_based_on", "credit_days"]) + else: + credit_days_based_on, credit_days = \ + frappe.db.get_value("Supplier Type", supplier_type, ["credit_days_based_on", "credit_days"])\ + or frappe.db.get_value("Company", company, ["credit_days_based_on", "credit_days"] ) + + return credit_days_based_on, credit_days def validate_due_date(posting_date, due_date, party_type, party, company): if getdate(due_date) < getdate(posting_date): diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 9f78eab025e..b7697da2269 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -230,10 +230,60 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "section_credit_limit", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Limit", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "fieldname": "credit_days_based_on", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Days Based On", + "length": 0, + "no_copy": 0, + "options": "\nFixed Days\nLast Day of the Next Month", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.credit_days_based_on == 'Fixed Days'", "fieldname": "credit_days", "fieldtype": "Int", "hidden": 0, @@ -485,7 +535,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-01-06 02:35:18.285473", + "modified": "2016-01-22 02:18:14.158258", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", @@ -635,5 +685,6 @@ "read_only": 0, "read_only_onload": 0, "search_fields": "supplier_name, supplier_type", + "sort_order": "ASC", "title_field": "supplier_name" } \ No newline at end of file diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index f7479989354..7a4a0cdea84 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -2,6 +2,53 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals - import frappe -test_records = frappe.get_test_records('Supplier') \ No newline at end of file +import unittest +from erpnext.accounts.party import get_due_date + +test_records = frappe.get_test_records('Supplier') + +class TestSupplier(unittest.TestCase): + def test_supplier_due_date_against_supplier_credit_limit(self): + # Set Credit Limit based on Fixed days + frappe.db.set_value("Supplier", "_Test Supplier", "credit_days_based_on", "Fixed Days") + frappe.db.set_value("Supplier", "_Test Supplier", "credit_days", 10) + + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") + self.assertEqual(due_date, "2016-02-01") + + # Set Credit Limit based on Last day next month + frappe.db.set_value("Supplier", "_Test Supplier", "credit_days", 0) + frappe.db.set_value("Supplier", "_Test Supplier", "credit_days_based_on", + "Last Day of the Next Month") + + # Leap year + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") + self.assertEqual(due_date, "2016-02-29") + # Non Leap year + due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier", "_Test Company") + self.assertEqual(due_date, "2017-02-28") + + frappe.db.set_value("Supplier", "_Test Supplier", "credit_days_based_on", "") + + # Set credit limit for the supplier type instead of supplier and evaluate the due date + # based on Fixed days + frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days_based_on", + "Fixed Days") + frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days", 10) + + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") + self.assertEqual(due_date, "2016-02-01") + + # Set credit limit for the supplier type instead of supplier and evaluate the due date + # based on Last day of next month + frappe.db.set_value("Supplier", "_Test Supplier Type", "credit_days", 0) + frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days_based_on", + "Last Day of the Next Month") + + # Leap year + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") + self.assertEqual(due_date, "2016-02-29") + # Non Leap year + due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier", "_Test Company") + self.assertEqual(due_date, "2017-02-28") diff --git a/erpnext/setup/doctype/supplier_type/supplier_type.json b/erpnext/setup/doctype/supplier_type/supplier_type.json index c6849b72578..8d340229fca 100644 --- a/erpnext/setup/doctype/supplier_type/supplier_type.json +++ b/erpnext/setup/doctype/supplier_type/supplier_type.json @@ -26,6 +26,7 @@ "oldfieldtype": "Data", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -33,10 +34,59 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "section_credit_limit", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Limit", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "fieldname": "credit_days_based_on", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Days Based On", + "length": 0, + "no_copy": 0, + "options": "\nFixed Days\nLast Day of the Next Month", + "permlevel": 1, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.credit_days_based_on=='Fixed Days'", "fieldname": "credit_days", "fieldtype": "Int", "hidden": 0, @@ -46,8 +96,10 @@ "label": "Credit Days", "length": 0, "no_copy": 0, - "permlevel": 1, + "permlevel": 0, + "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -70,6 +122,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -95,6 +148,7 @@ "options": "Party Account", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -113,7 +167,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2015-11-16 06:29:58.970888", + "modified": "2016-01-25 02:09:49.846022", "modified_by": "Administrator", "module": "Setup", "name": "Supplier Type", @@ -241,5 +295,6 @@ } ], "read_only": 0, - "read_only_onload": 0 + "read_only_onload": 0, + "sort_order": "ASC" } \ No newline at end of file