Credit days and credit limit option in customer group / supplier type #1354
This commit is contained in:
parent
e9daefe07f
commit
3a40435f8c
@ -38,10 +38,10 @@ class JournalVoucher(AccountsController):
|
|||||||
self.set_print_format_fields()
|
self.set_print_format_fields()
|
||||||
self.validate_against_sales_order()
|
self.validate_against_sales_order()
|
||||||
self.validate_against_purchase_order()
|
self.validate_against_purchase_order()
|
||||||
self.check_credit_limit()
|
|
||||||
self.check_credit_days()
|
self.check_credit_days()
|
||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
|
self.check_credit_limit()
|
||||||
self.make_gl_entries()
|
self.make_gl_entries()
|
||||||
self.update_advance_paid()
|
self.update_advance_paid()
|
||||||
|
|
||||||
@ -73,8 +73,8 @@ class JournalVoucher(AccountsController):
|
|||||||
check_credit_limit(customer, self.company)
|
check_credit_limit(customer, self.company)
|
||||||
|
|
||||||
def check_credit_days(self):
|
def check_credit_days(self):
|
||||||
|
from erpnext.accounts.party import get_credit_days
|
||||||
posting_date = self.posting_date
|
posting_date = self.posting_date
|
||||||
company_credit_days = frappe.db.get_value("Company", self.company, "credit_days")
|
|
||||||
if self.cheque_date:
|
if self.cheque_date:
|
||||||
for d in self.get("entries"):
|
for d in self.get("entries"):
|
||||||
if d.party_type and d.party and d.get("credit" if d.party_type=="Customer" else "debit") > 0:
|
if d.party_type and d.party and d.get("credit" if d.party_type=="Customer" else "debit") > 0:
|
||||||
@ -83,11 +83,12 @@ class JournalVoucher(AccountsController):
|
|||||||
elif d.against_voucher:
|
elif d.against_voucher:
|
||||||
posting_date = frappe.db.get_value("Purchase Invoice", d.against_voucher, "posting_date")
|
posting_date = frappe.db.get_value("Purchase Invoice", d.against_voucher, "posting_date")
|
||||||
|
|
||||||
credit_days = frappe.db.get_value(d.party_type, d.party, "credit_days") or company_credit_days
|
credit_days = get_credit_days(d.party_type, d.party, self.company)
|
||||||
if credit_days:
|
if credit_days:
|
||||||
if (getdate(self.cheque_date) - getdate(posting_date)).days > flt(credit_days):
|
date_diff = (getdate(self.cheque_date) - getdate(posting_date)).days
|
||||||
msgprint(_("Note: Reference Date is after allowed credit days {0} for {1} {2}")
|
if date_diff > flt(credit_days):
|
||||||
.format(credit_days, d.party_type, d.party))
|
msgprint(_("Note: Reference Date exceeds allowed credit days by {0} days for {1} {2}")
|
||||||
|
.format(date_diff, d.party_type, d.party))
|
||||||
|
|
||||||
def validate_cheque_info(self):
|
def validate_cheque_info(self):
|
||||||
if self.voucher_type in ['Bank Voucher']:
|
if self.voucher_type in ['Bank Voucher']:
|
||||||
|
|||||||
@ -147,9 +147,15 @@ def get_due_date(posting_date, party_type, party, company):
|
|||||||
|
|
||||||
return due_date
|
return due_date
|
||||||
|
|
||||||
def get_credit_days(self, party_type, party, company):
|
def get_credit_days(party_type, party, company):
|
||||||
return frappe.db.get_value(party_type, party, "credit_days") or \
|
party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Type"
|
||||||
frappe.db.get_value("Company", company, "credit_days") if company else 0
|
credit_days, party_group = frappe.db.get_value(party_type, party, ["credit_days", frappe.scrub(party_group_doctype)])
|
||||||
|
|
||||||
|
if not credit_days:
|
||||||
|
credit_days = frappe.db.get_value(party_group_doctype, party_group, "credit_days") or \
|
||||||
|
frappe.db.get_value("Company", company, "credit_days")
|
||||||
|
|
||||||
|
return credit_days
|
||||||
|
|
||||||
def validate_due_date(posting_date, due_date, party_type, party, company):
|
def validate_due_date(posting_date, due_date, party_type, party, company):
|
||||||
credit_days = get_credit_days(party_type, party, company)
|
credit_days = get_credit_days(party_type, party, company)
|
||||||
@ -164,8 +170,8 @@ def validate_due_date(posting_date, due_date, party_type, party, company):
|
|||||||
"credit_controller") in frappe.user.get_roles()
|
"credit_controller") in frappe.user.get_roles()
|
||||||
|
|
||||||
if is_credit_controller:
|
if is_credit_controller:
|
||||||
msgprint(_("Note: Due / Reference Date exceeds the allowed credit days by {0} day(s)").format(
|
msgprint(_("Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s)")
|
||||||
diff - flt(credit_days)))
|
.format(diff - flt(credit_days)))
|
||||||
else:
|
else:
|
||||||
max_due_date = formatdate(add_days(posting_date, credit_days))
|
max_due_date = formatdate(add_days(posting_date, credit_days))
|
||||||
frappe.throw(_("Due / Reference Date cannot be after {0}").format(max_due_date))
|
frappe.throw(_("Due / Reference Date cannot be after {0}").format(max_due_date))
|
||||||
|
|||||||
@ -152,9 +152,7 @@ def get_customer_list(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
def check_credit_limit(customer, company):
|
def check_credit_limit(customer, company):
|
||||||
customer_outstanding = get_customer_outstanding(customer, company)
|
customer_outstanding = get_customer_outstanding(customer, company)
|
||||||
|
|
||||||
credit_limit = frappe.db.get_value("Customer", customer, "credit_limit") or \
|
credit_limit = get_credit_limit(customer, company)
|
||||||
frappe.db.get_value('Company', company, 'credit_limit')
|
|
||||||
|
|
||||||
if credit_limit > 0 and flt(customer_outstanding) > credit_limit:
|
if credit_limit > 0 and flt(customer_outstanding) > credit_limit:
|
||||||
msgprint(_("Credit limit has been crossed for customer {0} {1}/{2}")
|
msgprint(_("Credit limit has been crossed for customer {0} {1}/{2}")
|
||||||
.format(customer, customer_outstanding, credit_limit))
|
.format(customer, customer_outstanding, credit_limit))
|
||||||
@ -186,9 +184,9 @@ def get_customer_outstanding(customer, company):
|
|||||||
select
|
select
|
||||||
sum(
|
sum(
|
||||||
(
|
(
|
||||||
(ifnull(dn_item.amount) - (select sum(ifnull(amount, 0))
|
(ifnull(dn_item.amount, 0) - ifnull((select sum(ifnull(amount, 0))
|
||||||
from `tabSales Invoice Item`
|
from `tabSales Invoice Item`
|
||||||
where ifnull(dn_detail, '') = dn_item.name and docstatus = 1)
|
where ifnull(dn_detail, '') = dn_item.name and docstatus = 1), 0)
|
||||||
)/dn.net_total
|
)/dn.net_total
|
||||||
)*dn.grand_total
|
)*dn.grand_total
|
||||||
)
|
)
|
||||||
@ -198,10 +196,19 @@ def get_customer_outstanding(customer, company):
|
|||||||
and dn.docstatus = 1 and dn.status != 'Stopped'
|
and dn.docstatus = 1 and dn.status != 'Stopped'
|
||||||
and ifnull(dn_item.against_sales_order, '') = ''
|
and ifnull(dn_item.against_sales_order, '') = ''
|
||||||
and ifnull(dn_item.against_sales_invoice, '') = ''
|
and ifnull(dn_item.against_sales_invoice, '') = ''
|
||||||
and ifnull(dn_item.amount) > (select sum(ifnull(amount, 0))
|
and ifnull(dn_item.amount, 0) > ifnull((select sum(ifnull(amount, 0))
|
||||||
from `tabSales Invoice Item`
|
from `tabSales Invoice Item`
|
||||||
where ifnull(dn_detail, '') = dn_item.name and docstatus = 1)""", (customer, company))
|
where ifnull(dn_detail, '') = dn_item.name and docstatus = 1), 0)""", (customer, company))
|
||||||
|
|
||||||
outstanding_based_on_dn = flt(outstanding_based_on_dn[0][0]) if outstanding_based_on_dn else 0.0
|
outstanding_based_on_dn = flt(outstanding_based_on_dn[0][0]) if outstanding_based_on_dn else 0.0
|
||||||
|
|
||||||
return outstanding_based_on_gle + outstanding_based_on_so + outstanding_based_on_dn
|
return outstanding_based_on_gle + outstanding_based_on_so + outstanding_based_on_dn
|
||||||
|
|
||||||
|
|
||||||
|
def get_credit_limit(customer, company):
|
||||||
|
credit_limit, customer_group = frappe.db.get_value("Customer", customer, ["credit_limit", "customer_group"])
|
||||||
|
if not credit_limit:
|
||||||
|
credit_limit = frappe.db.get_value("Customer Group", customer_group, "credit_limit") or \
|
||||||
|
frappe.db.get_value("Company", company, "credit_limit")
|
||||||
|
|
||||||
|
return credit_limit
|
||||||
|
|||||||
@ -56,6 +56,18 @@
|
|||||||
"options": "Price List",
|
"options": "Price List",
|
||||||
"permlevel": 0
|
"permlevel": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "credit_days",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"label": "Credit Days",
|
||||||
|
"permlevel": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "credit_limit",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"label": "Credit Limit",
|
||||||
|
"permlevel": 1
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "lft",
|
"fieldname": "lft",
|
||||||
"fieldtype": "Int",
|
"fieldtype": "Int",
|
||||||
@ -101,7 +113,7 @@
|
|||||||
"icon": "icon-sitemap",
|
"icon": "icon-sitemap",
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"in_create": 1,
|
"in_create": 1,
|
||||||
"modified": "2014-05-27 03:49:09.397308",
|
"modified": "2014-08-27 17:41:35.154380",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Setup",
|
"module": "Setup",
|
||||||
"name": "Customer Group",
|
"name": "Customer Group",
|
||||||
@ -146,6 +158,23 @@
|
|||||||
"role": "Sales Master Manager",
|
"role": "Sales Master Manager",
|
||||||
"submit": 0,
|
"submit": 0,
|
||||||
"write": 1
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"permlevel": 1,
|
||||||
|
"read": 1,
|
||||||
|
"role": "Sales Master Manager",
|
||||||
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"permlevel": 1,
|
||||||
|
"read": 1,
|
||||||
|
"role": "Sales User"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"permlevel": 1,
|
||||||
|
"read": 1,
|
||||||
|
"role": "Sales Manager",
|
||||||
|
"write": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"read_only": 1,
|
"read_only": 1,
|
||||||
|
|||||||
@ -16,11 +16,17 @@
|
|||||||
"oldfieldtype": "Data",
|
"oldfieldtype": "Data",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "credit_days",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"label": "Credit Days",
|
||||||
|
"permlevel": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "icon-flag",
|
"icon": "icon-flag",
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"modified": "2014-05-27 03:49:20.505739",
|
"modified": "2014-08-27 17:43:31.479133",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Setup",
|
"module": "Setup",
|
||||||
"name": "Supplier Type",
|
"name": "Supplier Type",
|
||||||
@ -65,6 +71,22 @@
|
|||||||
"role": "Purchase Master Manager",
|
"role": "Purchase Master Manager",
|
||||||
"submit": 0,
|
"submit": 0,
|
||||||
"write": 1
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"permlevel": 1,
|
||||||
|
"read": 1,
|
||||||
|
"role": "Purchase Master Manager",
|
||||||
|
"write": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"permlevel": 1,
|
||||||
|
"read": 1,
|
||||||
|
"role": "Purchase Manager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"permlevel": 1,
|
||||||
|
"read": 1,
|
||||||
|
"role": "Purchase User"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -9,7 +9,6 @@ from frappe import throw, msgprint, _
|
|||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
|
||||||
class Warehouse(Document):
|
class Warehouse(Document):
|
||||||
|
|
||||||
def autoname(self):
|
def autoname(self):
|
||||||
suffix = " - " + frappe.db.get_value("Company", self.company, "abbr")
|
suffix = " - " + frappe.db.get_value("Company", self.company, "abbr")
|
||||||
if not self.warehouse_name.endswith(suffix):
|
if not self.warehouse_name.endswith(suffix):
|
||||||
@ -22,7 +21,6 @@ class Warehouse(Document):
|
|||||||
self.update_parent_account()
|
self.update_parent_account()
|
||||||
|
|
||||||
def update_parent_account(self):
|
def update_parent_account(self):
|
||||||
|
|
||||||
if not getattr(self, "__islocal", None) \
|
if not getattr(self, "__islocal", None) \
|
||||||
and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")):
|
and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")):
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user