Merge pull request #5360 from neilLasrado/hotfix
Fixed reports
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index 8559b8c..4cc1cec 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
from __future__ import unicode_literals
-__version__ = '6.27.15'
+__version__ = '6.27.17'
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 1f9c74d..03bd587 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -19,8 +19,12 @@
self.get("__onload").can_freeze_account = True
def autoname(self):
- self.name = self.account_name.strip() + ' - ' + \
- frappe.db.get_value("Company", self.company, "abbr")
+ # first validate if company exists
+ company = frappe.db.get_value("Company", self.company, ["abbr", "name"], as_dict=True)
+ if not company:
+ frappe.throw(_('Company {0} does not exist').format(self.company))
+
+ self.name = self.account_name.strip() + ' - ' + company.abbr
def validate(self):
if frappe.local.flags.allow_unverified_charts:
@@ -68,7 +72,7 @@
if self.root_type != db_value.root_type:
frappe.db.sql("update `tabAccount` set root_type=%s where lft > %s and rgt < %s",
(self.root_type, self.lft, self.rgt))
-
+
if self.root_type and not self.report_type:
self.report_type = "Balance Sheet" \
if self.root_type in ("Asset", "Liability", "Equity") else "Profit and Loss"
@@ -78,14 +82,14 @@
if frappe.db.exists("Account", self.name):
if not frappe.db.get_value("Account", self.name, "parent_account"):
throw(_("Root cannot be edited."), RootNotEditable)
-
+
if not self.parent_account and not self.is_group:
frappe.throw(_("Root Account must be a group"))
-
+
def validate_group_or_ledger(self):
if self.get("__islocal"):
return
-
+
existing_is_group = frappe.db.get_value("Account", self.name, "is_group")
if self.is_group != existing_is_group:
if self.check_gle_exists():
@@ -153,7 +157,7 @@
def validate_mandatory(self):
if not self.root_type:
throw(_("Root Type is mandatory"))
-
+
if not self.report_type:
throw(_("Report Type is mandatory"))
@@ -216,9 +220,9 @@
if val != [self.is_group, self.root_type, self.company]:
throw(_("""Merging is only possible if following properties are same in both records. Is Group, Root Type, Company"""))
-
+
if self.is_group and frappe.db.get_value("Account", new, "parent_account") == old:
- frappe.db.set_value("Account", new, "parent_account",
+ frappe.db.set_value("Account", new, "parent_account",
frappe.db.get_value("Account", old, "parent_account"))
return new_account
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.js b/erpnext/accounts/doctype/payment_tool/payment_tool.js
index e15694c..8d8e0ce 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.js
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.js
@@ -146,6 +146,10 @@
c.total_amount = d.invoice_amount;
c.outstanding_amount = d.outstanding_amount;
+ if (in_list(['Sales Invoice', 'Purchase Invoice'], d.voucher_type)){
+ c.due_date = d.due_date
+ }
+
if (frm.doc.set_payment_amount) {
c.payment_amount = d.outstanding_amount;
}
@@ -202,7 +206,7 @@
}
frappe.call({
- method: 'erpnext.accounts.doctype.payment_tool.payment_tool.get_against_voucher_amount',
+ method: 'erpnext.accounts.doctype.payment_tool.payment_tool.get_against_voucher_details',
args: {
"against_voucher_type": row.against_voucher_type,
"against_voucher_no": row.against_voucher_no,
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.py b/erpnext/accounts/doctype/payment_tool/payment_tool.py
index ef8ffb1..5c5b393 100644
--- a/erpnext/accounts/doctype/payment_tool/payment_tool.py
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.py
@@ -20,15 +20,15 @@
jv.company = self.company
jv.cheque_no = self.reference_no
jv.cheque_date = self.reference_date
-
- party_account_currency, party_account_type = frappe.db.get_value("Account", self.party_account,
+
+ party_account_currency, party_account_type = frappe.db.get_value("Account", self.party_account,
["account_currency", "account_type"])
-
+
bank_account_currency, bank_account_type = None, None
if self.payment_account:
- bank_account_currency, bank_account_type = frappe.db.get_value("Account", self.payment_account,
+ bank_account_currency, bank_account_type = frappe.db.get_value("Account", self.payment_account,
["account_currency", "account_type"])
-
+
if not self.total_payment_amount:
frappe.throw(_("Please enter Payment Amount in atleast one row"))
@@ -36,11 +36,11 @@
if not frappe.db.get_value(v.against_voucher_type, {"name": v.against_voucher_no}):
frappe.throw(_("Row {0}: {1} is not a valid {2}").format(v.idx, v.against_voucher_no,
v.against_voucher_type))
-
+
if v.payment_amount:
exchange_rate = get_exchange_rate(self.party_account, party_account_currency,
self.company, v.against_voucher_type, v.against_voucher_no)
-
+
d1 = jv.append("accounts")
d1.account = self.party_account
d1.party_type = self.party_type
@@ -56,7 +56,7 @@
d1.reference_name = v.against_voucher_no
d1.is_advance = 'Yes' \
if v.against_voucher_type in ['Sales Order', 'Purchase Order'] else 'No'
-
+
amount = flt(d1.debit_in_account_currency) - flt(d1.credit_in_account_currency)
if bank_account_currency == party_account_currency:
total_payment_amount += amount
@@ -65,27 +65,27 @@
d2 = jv.append("accounts")
if self.payment_account:
- bank_account_currency, bank_account_type = frappe.db.get_value("Account", self.payment_account,
+ bank_account_currency, bank_account_type = frappe.db.get_value("Account", self.payment_account,
["account_currency", "account_type"])
-
+
d2.account = self.payment_account
d2.account_currency = bank_account_currency
d2.account_type = bank_account_type
- d2.exchange_rate = get_exchange_rate(self.payment_account, bank_account_currency, self.company,
- debit=(abs(total_payment_amount) if total_payment_amount < 0 else 0),
+ d2.exchange_rate = get_exchange_rate(self.payment_account, bank_account_currency, self.company,
+ debit=(abs(total_payment_amount) if total_payment_amount < 0 else 0),
credit=(total_payment_amount if total_payment_amount > 0 else 0))
d2.account_balance = get_balance_on(self.payment_account)
-
+
amount_field_bank = 'debit_in_account_currency' if total_payment_amount < 0 \
else 'credit_in_account_currency'
-
+
d2.set(amount_field_bank, abs(total_payment_amount))
-
+
company_currency = frappe.db.get_value("Company", self.company, "default_currency")
if party_account_currency != company_currency or \
(bank_account_currency and bank_account_currency != company_currency):
jv.multi_currency = 1
-
+
jv.set_amounts_in_company_currency()
jv.set_total_debit_credit()
@@ -150,7 +150,7 @@
return order_list
@frappe.whitelist()
-def get_against_voucher_amount(against_voucher_type, against_voucher_no, party_account, company):
+def get_against_voucher_details(against_voucher_type, against_voucher_no, party_account, company):
party_account_currency = get_account_currency(party_account)
company_currency = frappe.db.get_value("Company", company, "default_currency")
ref_field = "base_grand_total" if party_account_currency == company_currency else "grand_total"
diff --git a/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json b/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json
index 765aa93..66447b0 100644
--- a/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json
+++ b/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json
@@ -16,14 +16,16 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
- "in_list_view": 1,
+ "in_list_view": 0,
"label": "Against Voucher Type",
"length": 0,
"no_copy": 0,
"options": "DocType",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"print_width": "",
"read_only": 0,
"report_hide": 0,
@@ -41,6 +43,7 @@
"fieldtype": "Dynamic Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Against Voucher No",
@@ -49,6 +52,7 @@
"options": "against_voucher_type",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -60,10 +64,36 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "fieldname": "due_date",
+ "fieldtype": "Date",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Due Date",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"fieldname": "column_break_3",
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"length": 0,
@@ -71,6 +101,7 @@
"permlevel": 0,
"precision": "",
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -86,6 +117,7 @@
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Total Amount",
@@ -94,6 +126,7 @@
"options": "party_account_currency",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -109,6 +142,7 @@
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Outstanding Amount",
@@ -117,6 +151,7 @@
"options": "party_account_currency",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
@@ -132,6 +167,7 @@
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Payment Amount",
@@ -140,6 +176,7 @@
"options": "party_account_currency",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -150,13 +187,14 @@
],
"hide_heading": 0,
"hide_toolbar": 0,
+ "idx": 0,
"in_create": 0,
"in_dialog": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2015-11-16 06:29:51.626386",
+ "modified": "2016-05-05 06:22:24.736160",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Tool Detail",
diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js
index 941aa87..bad826e 100644
--- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js
+++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js
@@ -34,6 +34,12 @@
"fieldtype": "Link",
"options": "Company",
"default": frappe.defaults.get_user_default("Company")
+ },
+ {
+ "fieldname":"mode_of_payment",
+ "label": __("Mode of Payment"),
+ "fieldtype": "Link",
+ "options": "Mode of Payment"
}
]
}
diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
index 9e7cdb6..d6bbee5 100644
--- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
+++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
@@ -35,7 +35,7 @@
expense_account = d.expense_account or aii_account_map.get(d.company)
row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, d.supplier,
- d.supplier_name, d.credit_to, d.project, d.company, d.purchase_order,
+ d.supplier_name, d.credit_to, d.mode_of_payment, d.project, d.company, d.purchase_order,
purchase_receipt, expense_account, d.qty, d.base_net_rate, d.base_net_amount]
for tax in tax_accounts:
@@ -53,7 +53,8 @@
return [_("Item Code") + ":Link/Item:120", _("Item Name") + "::120",
_("Item Group") + ":Link/Item Group:100", _("Invoice") + ":Link/Purchase Invoice:120",
_("Posting Date") + ":Date:80", _("Supplier") + ":Link/Supplier:120",
- "Supplier Name::120", "Payable Account:Link/Account:120", _("Project") + ":Link/Project:80",
+ "Supplier Name::120", "Payable Account:Link/Account:120",
+ _("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80",
_("Company") + ":Link/Company:100", _("Purchase Order") + ":Link/Purchase Order:100",
_("Purchase Receipt") + ":Link/Purchase Receipt:100", _("Expense Account") + ":Link/Account:140",
_("Qty") + ":Float:120", _("Rate") + ":Currency/currency:120", _("Amount") + ":Currency/currency:120"
@@ -66,7 +67,8 @@
("supplier", " and pi.supplier = %(supplier)s"),
("item_code", " and pi_item.item_code = %(item_code)s"),
("from_date", " and pi.posting_date>=%(from_date)s"),
- ("to_date", " and pi.posting_date<=%(to_date)s")):
+ ("to_date", " and pi.posting_date<=%(to_date)s"),
+ ("mode_of_payment", " and ifnull(mode_of_payment, '') = %(mode_of_payment)s")):
if filters.get(opts[0]):
conditions += opts[1]
@@ -82,7 +84,7 @@
pi.supplier, pi.remarks, pi.base_net_total, pi_item.item_code, pi_item.item_name,
pi_item.item_group, pi_item.project, pi_item.purchase_order, pi_item.purchase_receipt,
pi_item.po_detail, pi_item.expense_account, pi_item.qty, pi_item.base_net_rate,
- pi_item.base_net_amount, pi.supplier_name
+ pi_item.base_net_amount, pi.supplier_name, pi.mode_of_payment
from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item
where pi.name = pi_item.parent and pi.docstatus = 1 %s %s
order by pi.posting_date desc, pi_item.item_code desc
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js
index d322406..142a55f 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js
@@ -28,6 +28,12 @@
"fieldtype": "Link",
"options": "Company",
"default": frappe.defaults.get_user_default("Company")
+ },
+ {
+ "fieldname":"mode_of_payment",
+ "label": __("Mode of Payment"),
+ "fieldtype": "Link",
+ "options": "Mode of Payment"
}
]
}
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
index beca96e..6fc7349 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
@@ -32,7 +32,7 @@
from `tabDelivery Note Item` where docstatus=1 and so_detail=%s""", d.so_detail))
row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, d.customer, d.customer_name,
- d.customer_group, d.debit_to, d.territory, d.project, d.company, d.sales_order,
+ d.customer_group, d.debit_to, d.mode_of_payment, d.territory, d.project, d.company, d.sales_order,
delivery_note, d.income_account, d.qty, d.base_net_rate, d.base_net_amount]
for tax in tax_accounts:
@@ -51,7 +51,8 @@
_("Item Group") + ":Link/Item Group:100", _("Invoice") + ":Link/Sales Invoice:120",
_("Posting Date") + ":Date:80", _("Customer") + ":Link/Customer:120",
_("Customer Name") + "::120", _("Customer Group") + ":Link/Customer Group:120",
- _("Receivable Account") + ":Link/Account:120", _("Territory") + ":Link/Territory:80",
+ _("Receivable Account") + ":Link/Account:120",
+ _("Mode of Payment") + ":Link/Mode of Payment:80", _("Territory") + ":Link/Territory:80",
_("Project") + ":Link/Project:80", _("Company") + ":Link/Company:100",
_("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100",
_("Income Account") + ":Link/Account:140", _("Qty") + ":Float:120",
@@ -65,7 +66,8 @@
("customer", " and si.customer = %(customer)s"),
("item_code", " and si_item.item_code = %(item_code)s"),
("from_date", " and si.posting_date>=%(from_date)s"),
- ("to_date", " and si.posting_date<=%(to_date)s")):
+ ("to_date", " and si.posting_date<=%(to_date)s"),
+ ("mode_of_payment", " and ifnull(mode_of_payment, '') = %(mode_of_payment)s")):
if filters.get(opts[0]):
conditions += opts[1]
@@ -80,7 +82,7 @@
si_item.item_code, si_item.item_name, si_item.item_group, si_item.sales_order,
si_item.delivery_note, si_item.income_account, si_item.qty,
si_item.base_net_rate, si_item.base_net_amount, si.customer_name,
- si.customer_group, si_item.so_detail
+ si.customer_group, si_item.so_detail, si.mode_of_payment
from `tabSales Invoice` si, `tabSales Invoice Item` si_item
where si.name = si_item.parent and si.docstatus = 1 %s
order by si.posting_date desc, si_item.item_code desc""" % conditions, filters, as_dict=1)
diff --git a/erpnext/accounts/report/purchase_register/purchase_register.js b/erpnext/accounts/report/purchase_register/purchase_register.js
index 15300c3..d32f7b6 100644
--- a/erpnext/accounts/report/purchase_register/purchase_register.js
+++ b/erpnext/accounts/report/purchase_register/purchase_register.js
@@ -28,6 +28,12 @@
"fieldtype": "Link",
"options": "Company",
"default": frappe.defaults.get_user_default("Company")
+ },
+ {
+ "fieldname":"mode_of_payment",
+ "label": __("Mode of Payment"),
+ "fieldtype": "Link",
+ "options": "Mode of Payment"
}
]
}
diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py
index 53cb7af66..9a90f2f 100644
--- a/erpnext/accounts/report/purchase_register/purchase_register.py
+++ b/erpnext/accounts/report/purchase_register/purchase_register.py
@@ -33,7 +33,7 @@
row = [inv.name, inv.posting_date, inv.supplier, inv.supplier_name,
supplier_details.get(inv.supplier),
- inv.credit_to, ", ".join(project), inv.bill_no, inv.bill_date, inv.remarks,
+ inv.credit_to, inv.mode_of_payment, ", ".join(project), inv.bill_no, inv.bill_date, inv.remarks,
", ".join(purchase_order), ", ".join(purchase_receipt), company_currency]
# map expense values
@@ -64,10 +64,10 @@
def get_columns(invoice_list):
"""return columns based on filters"""
columns = [
- _("Invoice") + ":Link/Purchase Invoice:120",
- _("Posting Date") + ":Date:80", _("Supplier Id") + "::120",
- _("Supplier Name") + "::120", _("Supplier Type") + ":Link/Supplier Type:120",
- _("Payable Account") + ":Link/Account:120", _("Project") + ":Link/Project:80",
+ _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80",
+ _("Supplier Id") + "::120", _("Supplier Name") + "::120",
+ _("Supplier Type") + ":Link/Supplier Type:120", _("Payable Account") + ":Link/Account:120",
+ _("Mode of Payment") + ":Link/Mode of Payment:80", _("Project") + ":Link/Project:80",
_("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150",
_("Purchase Order") + ":Link/Purchase Order:100",
_("Purchase Receipt") + ":Link/Purchase Receipt:100",
@@ -114,6 +114,8 @@
if filters.get("from_date"): conditions += " and posting_date>=%(from_date)s"
if filters.get("to_date"): conditions += " and posting_date<=%(to_date)s"
+
+ if filters.get("mode_of_payment"): conditions += " and ifnull(mode_of_payment, '') = %(mode_of_payment)s"
return conditions
@@ -121,8 +123,8 @@
conditions = get_conditions(filters)
return frappe.db.sql("""
select
- name, posting_date, credit_to, supplier, supplier_name,
- bill_no, bill_date, remarks, base_net_total, base_grand_total, outstanding_amount
+ name, posting_date, credit_to, supplier, supplier_name, bill_no, bill_date, remarks,
+ base_net_total, base_grand_total, outstanding_amount, mode_of_payment
from `tabPurchase Invoice`
where docstatus = 1 %s
order by posting_date desc, name desc""" % conditions, filters, as_dict=1)
diff --git a/erpnext/accounts/report/sales_register/sales_register.js b/erpnext/accounts/report/sales_register/sales_register.js
index 4764255..d7aac5a 100644
--- a/erpnext/accounts/report/sales_register/sales_register.js
+++ b/erpnext/accounts/report/sales_register/sales_register.js
@@ -28,6 +28,12 @@
"fieldtype": "Link",
"options": "Company",
"default": frappe.defaults.get_user_default("Company")
+ },
+ {
+ "fieldname":"mode_of_payment",
+ "label": __("Mode of Payment"),
+ "fieldtype": "Link",
+ "options": "Mode of Payment"
}
]
}
diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py
index d09cfc1..663c5c9 100644
--- a/erpnext/accounts/report/sales_register/sales_register.py
+++ b/erpnext/accounts/report/sales_register/sales_register.py
@@ -33,7 +33,7 @@
row = [inv.name, inv.posting_date, inv.customer, inv.customer_name,
customer_map.get(inv.customer, {}).get("customer_group"),
customer_map.get(inv.customer, {}).get("territory"),
- inv.debit_to, inv.project, inv.remarks,
+ inv.debit_to, inv.mode_of_payment, inv.project, inv.remarks,
", ".join(sales_order), ", ".join(delivery_note), company_currency]
# map income values
@@ -65,9 +65,11 @@
def get_columns(invoice_list):
"""return columns based on filters"""
columns = [
- _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80", _("Customer Id") + "::120",
- _("Customer Name") + "::120", _("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80",
- _("Receivable Account") + ":Link/Account:120", _("Project") +":Link/Project:80", _("Remarks") + "::150",
+ _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80",
+ _("Customer Id") + "::120", _("Customer Name") + "::120",
+ _("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80",
+ _("Receivable Account") + ":Link/Account:120", _("Mode of Payment") + ":Link/Mode of Payment:80",
+ _("Project") +":Link/Project:80", _("Remarks") + "::150",
_("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100",
{
"fieldname": "currency",
@@ -110,13 +112,15 @@
if filters.get("from_date"): conditions += " and posting_date >= %(from_date)s"
if filters.get("to_date"): conditions += " and posting_date <= %(to_date)s"
+
+ if filters.get("mode_of_payment"): conditions += " and ifnull(mode_of_payment, '') = %(mode_of_payment)s"
return conditions
def get_invoices(filters):
conditions = get_conditions(filters)
- return frappe.db.sql("""select name, posting_date, debit_to, project, customer,
- customer_name, remarks, base_net_total, base_grand_total, base_rounded_total, outstanding_amount
+ return frappe.db.sql("""select name, posting_date, debit_to, project, customer, customer_name, remarks,
+ base_net_total, base_grand_total, base_rounded_total, outstanding_amount, mode_of_payment
from `tabSales Invoice`
where docstatus = 1 %s order by posting_date desc, name desc""" %
conditions, filters, as_dict=1)
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 06197eb..48668fa 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -473,7 +473,8 @@
'posting_date': d.posting_date,
'invoice_amount': flt(d.invoice_amount),
'payment_amount': flt(d.payment_amount),
- 'outstanding_amount': flt(d.invoice_amount - d.payment_amount, precision)
+ 'outstanding_amount': flt(d.invoice_amount - d.payment_amount, precision),
+ 'due_date': frappe.db.get_value(d.voucher_type, d.voucher_no, "due_date")
})
return outstanding_invoices
diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py
index ac8a5df..a48d7b7 100644
--- a/erpnext/controllers/sales_and_purchase_return.py
+++ b/erpnext/controllers/sales_and_purchase_return.py
@@ -53,17 +53,18 @@
valid_items = frappe._dict()
- select_fields = "item_code, sum(qty) as qty, rate" if doc.doctype=="Purchase Invoice" \
- else "item_code, sum(qty) as qty, rate, serial_no, batch_no"
+ select_fields = "item_code, qty" if doc.doctype=="Purchase Invoice" \
+ else "item_code, qty, serial_no, batch_no"
- for d in frappe.db.sql("""select {0} from `tab{1} Item` where parent = %s
- group by item_code""".format(select_fields, doc.doctype), doc.return_against, as_dict=1):
- valid_items.setdefault(d.item_code, d)
+ for d in frappe.db.sql("""select {0} from `tab{1} Item` where parent = %s"""
+ .format(select_fields, doc.doctype), doc.return_against, as_dict=1):
+ valid_items = get_ref_item_dict(valid_items, d)
+
if doc.doctype in ("Delivery Note", "Sales Invoice"):
- for d in frappe.db.sql("""select item_code, sum(qty) as qty, serial_no, batch_no from `tabPacked Item`
- where parent = %s group by item_code""".format(doc.doctype), doc.return_against, as_dict=1):
- valid_items.setdefault(d.item_code, d)
+ for d in frappe.db.sql("""select item_code, qty, serial_no, batch_no from `tabPacked Item`
+ where parent = %s""".format(doc.doctype), doc.return_against, as_dict=1):
+ valid_items = get_ref_item_dict(valid_items, d)
already_returned_items = get_already_returned_items(doc)
@@ -86,7 +87,7 @@
elif abs(d.qty) > max_return_qty:
frappe.throw(_("Row # {0}: Cannot return more than {1} for Item {2}")
.format(d.idx, ref.qty, d.item_code), StockOverReturnError)
- elif ref.batch_no and d.batch_no != ref.batch_no:
+ elif ref.batch_no and d.batch_no not in ref.batch_no:
frappe.throw(_("Row # {0}: Batch No must be same as {1} {2}")
.format(d.idx, doc.doctype, doc.return_against))
elif ref.serial_no:
@@ -94,9 +95,8 @@
frappe.throw(_("Row # {0}: Serial No is mandatory").format(d.idx))
else:
serial_nos = get_serial_nos(d.serial_no)
- ref_serial_nos = get_serial_nos(ref.serial_no)
for s in serial_nos:
- if s not in ref_serial_nos:
+ if s not in ref.serial_no:
frappe.throw(_("Row # {0}: Serial No {1} does not match with {2} {3}")
.format(d.idx, s, doc.doctype, doc.return_against))
@@ -107,6 +107,25 @@
if not items_returned:
frappe.throw(_("Atleast one item should be entered with negative quantity in return document"))
+
+def get_ref_item_dict(valid_items, ref_item_row):
+ from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
+
+ valid_items.setdefault(ref_item_row.item_code, frappe._dict({
+ "qty": 0,
+ "serial_no": [],
+ "batch_no": []
+ }))
+ item_dict = valid_items[ref_item_row.item_code]
+ item_dict["qty"] += ref_item_row.qty
+
+ if ref_item_row.get("serial_no"):
+ item_dict["serial_no"] += get_serial_nos(ref_item_row.serial_no)
+
+ if ref_item_row.get("batch_no"):
+ item_dict["batch_no"].append(ref_item_row.batch_no)
+
+ return valid_items
def get_already_returned_items(doc):
return frappe._dict(frappe.db.sql("""
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 8850ce4..e3e11e1 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -7,7 +7,7 @@
app_description = """ERP made simple"""
app_icon = "icon-th"
app_color = "#e74c3c"
-app_version = "6.27.15"
+app_version = "6.27.17"
app_email = "info@erpnext.com"
app_license = "GNU General Public License (v3)"
source_link = "https://github.com/frappe/erpnext"
diff --git a/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.py b/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.py
index 061f606..fb58d75 100755
--- a/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.py
+++ b/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.py
@@ -21,4 +21,4 @@
user_role.role = "Leave Approver"
and user_role.parent = user.name and
user.name != %s
- """, name)
\ No newline at end of file
+ """, name or "")
\ No newline at end of file
diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json
index c92fbb8..17e667e 100644
--- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json
+++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.json
@@ -15,11 +15,14 @@
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -33,17 +36,20 @@
"bold": 0,
"collapsible": 0,
"description": "Leave blank if considered for all employee types",
- "fieldname": "employee_type",
+ "fieldname": "employment_type",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
- "label": "Employee Type",
+ "label": "Employment Type",
+ "length": 0,
"no_copy": 0,
"options": "Employment Type",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -60,13 +66,16 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Branch",
+ "length": 0,
"no_copy": 0,
"options": "Branch",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -83,13 +92,16 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Department",
+ "length": 0,
"no_copy": 0,
"options": "Department",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -106,13 +118,16 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Designation",
+ "length": 0,
"no_copy": 0,
"options": "Designation",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -128,11 +143,14 @@
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -149,13 +167,16 @@
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "From Date",
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -171,13 +192,16 @@
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "To Date",
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -193,13 +217,16 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Leave Type",
+ "length": 0,
"no_copy": 0,
"options": "Leave Type",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -216,12 +243,15 @@
"fieldtype": "Check",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Carry Forward",
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -237,12 +267,15 @@
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "New Leaves Allocated (In Days)",
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -258,13 +291,16 @@
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Allocate",
+ "length": 0,
"no_copy": 0,
"options": "allocate_leave",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -282,7 +318,8 @@
"is_submittable": 0,
"issingle": 1,
"istable": 0,
- "modified": "2015-10-28 16:23:57.733900",
+ "max_attachments": 0,
+ "modified": "2016-05-05 05:45:33.355366",
"modified_by": "Administrator",
"module": "HR",
"name": "Leave Control Panel",
diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
index 77c7ad9..b4561f1 100644
--- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
+++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
@@ -10,27 +10,24 @@
class LeaveControlPanel(Document):
def get_employees(self):
- lst1 = [[self.employee_type,"employment_type"],[self.branch,"branch"],[self.designation,"designation"],[self.department, "department"]]
- condition = "where "
- flag = 0
- for l in lst1:
- if(l[0]):
- if flag == 0:
- condition += l[1] + "= '" + l[0] +"'"
- else:
- condition += " and " + l[1]+ "= '" +l[0] +"'"
- flag = 1
- emp_query = "select name from `tabEmployee` "
- if flag == 1:
- emp_query += condition
- e = frappe.db.sql(emp_query)
+ conditions, values = [], []
+ for field in ["employment_type", "branch", "designation", "department"]:
+ if self.get(field):
+ conditions.append("{0}=%s".format(field))
+ values.append(self.get(field))
+
+ condition_str = " and " + " and ".join(conditions) if len(conditions) else ""
+
+ e = frappe.db.sql("select name from tabEmployee where status='Active' {condition}"
+ .format(condition=condition_str), tuple(values))
+
return e
def validate_values(self):
for f in ["from_date", "to_date", "leave_type", "no_of_days"]:
if not self.get(f):
frappe.throw(_("{0} is required").format(self.meta.get_label(f)))
-
+
def to_date_validation(self):
if date_diff(self.to_date, self.from_date) <= 0:
return "Invalid period"
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.json b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.json
index 9ccd55e..4fc3e87 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.json
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.json
@@ -17,6 +17,7 @@
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Get Items From",
@@ -44,6 +45,7 @@
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Filters",
@@ -67,6 +69,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Item",
@@ -92,6 +95,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Customer",
@@ -117,6 +121,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Warehouse",
@@ -143,6 +148,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Company",
@@ -167,6 +173,7 @@
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"length": 0,
@@ -190,6 +197,7 @@
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "From Date",
@@ -213,6 +221,7 @@
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "To Date",
@@ -237,6 +246,7 @@
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"length": 0,
@@ -261,6 +271,7 @@
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Get Sales Orders",
@@ -285,6 +296,7 @@
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Sales Orders",
@@ -310,6 +322,7 @@
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"length": 0,
@@ -334,6 +347,7 @@
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Get Material Request",
@@ -359,6 +373,7 @@
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Material Requests",
@@ -380,10 +395,12 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "description": "Enter items and planned qty for which you want to raise production orders or download raw materials for analysis.",
"fieldname": "items_for_production",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Select Items",
@@ -408,6 +425,7 @@
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Get Items",
@@ -435,6 +453,7 @@
"fieldtype": "Check",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Use Multi-Level BOM",
@@ -458,6 +477,7 @@
"fieldtype": "Table",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Items",
@@ -478,11 +498,12 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "description": "Enter items and planned qty for which you want to raise production orders or download raw materials for analysis.",
+ "description": "",
"fieldname": "create_production_orders",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Production Orders",
@@ -507,6 +528,7 @@
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Create Production Orders",
@@ -532,6 +554,7 @@
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Material Requirement",
@@ -555,6 +578,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Material Request For Warehouse",
@@ -575,11 +599,37 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "description": "Items to be requested which are \"Out of Stock\" considering all warehouses based on projected qty and minimum order qty",
+ "fieldname": "create_material_requests_for_all_required_qty",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Create Material Requests for All Required Qty",
+ "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,
+ "description": "Items to be requested which are \"Out of Stock\" considering all warehouses based on projected qty and minimum order qty, if \"Create Material Requests for All Required Qty\" is unchecked.",
"fieldname": "create_material_requests",
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Create Material Requests",
@@ -605,6 +655,7 @@
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Download Materials Required",
@@ -631,7 +682,7 @@
"issingle": 1,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-02-23 02:37:51.260645",
+ "modified": "2016-05-10 12:55:45.647372",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Production Planning Tool",
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index f698af2..25e3776 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -384,19 +384,24 @@
self.create_material_request()
def get_requested_items(self):
- item_projected_qty = self.get_projected_qty()
items_to_be_requested = frappe._dict()
+ if not self.create_material_requests_for_all_required_qty:
+ item_projected_qty = self.get_projected_qty()
+
for item, so_item_qty in self.item_dict.items():
- requested_qty = 0
total_qty = sum([flt(d[0]) for d in so_item_qty])
- if total_qty > item_projected_qty.get(item, 0):
+ requested_qty = 0
+
+ if self.create_material_requests_for_all_required_qty:
+ requested_qty = total_qty
+ elif total_qty > item_projected_qty.get(item, 0):
# shortage
requested_qty = total_qty - flt(item_projected_qty.get(item))
# consider minimum order qty
- if requested_qty < flt(so_item_qty[0][3]):
- requested_qty = flt(so_item_qty[0][3])
+ if requested_qty and requested_qty < flt(so_item_qty[0][3]):
+ requested_qty = flt(so_item_qty[0][3])
# distribute requested qty SO wise
for item_details in so_item_qty:
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 8ee6de9..0ce3cd1 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -139,19 +139,24 @@
pr_qty = flt(d.qty) * flt(d.conversion_factor)
if pr_qty:
- val_rate_db_precision = 6 if cint(self.precision("valuation_rate", d)) <= 6 else 9
- rate = flt(d.valuation_rate, val_rate_db_precision)
+
sle = self.get_sl_entries(d, {
"actual_qty": flt(pr_qty),
"serial_no": cstr(d.serial_no).strip()
})
if self.is_return:
+ original_incoming_rate = frappe.db.get_value("Stock Ledger Entry",
+ {"voucher_type": "Purchase Receipt", "voucher_no": self.return_against,
+ "item_code": d.item_code}, "incoming_rate")
+
sle.update({
- "outgoing_rate": rate
+ "outgoing_rate": original_incoming_rate
})
else:
+ val_rate_db_precision = 6 if cint(self.precision("valuation_rate", d)) <= 6 else 9
+ incoming_rate = flt(d.valuation_rate, val_rate_db_precision)
sle.update({
- "incoming_rate": rate
+ "incoming_rate": incoming_rate
})
sl_entries.append(sle)
@@ -302,12 +307,9 @@
for d in self.get("items"):
if d.item_code in stock_items and flt(d.valuation_rate) and flt(d.qty):
if warehouse_account.get(d.warehouse):
-
- val_rate_db_precision = 6 if cint(d.precision("valuation_rate")) <= 6 else 9
-
- # warehouse account
- stock_value_diff = flt(flt(d.valuation_rate, val_rate_db_precision) * flt(d.qty)
- * flt(d.conversion_factor), d.precision("base_net_amount"))
+ stock_value_diff = frappe.db.get_value("Stock Ledger Entry",
+ {"voucher_type": "Purchase Receipt", "voucher_no": self.name,
+ "voucher_detail_no": d.name}, "stock_value_difference")
gl_entries.append(self.get_gl_dict({
"account": warehouse_account[d.warehouse]["name"],
@@ -352,16 +354,20 @@
}, warehouse_account[self.supplier_warehouse]["account_currency"]))
# divisional loss adjustment
- sle_valuation_amount = flt(flt(d.valuation_rate, val_rate_db_precision) * flt(d.qty) * flt(d.conversion_factor),
- self.precision("base_net_amount", d))
-
- distributed_amount = flt(flt(d.base_net_amount, self.precision("base_net_amount", d))) + \
+ valuation_amount_as_per_doc = flt(d.base_net_amount, d.precision("base_net_amount")) + \
flt(d.landed_cost_voucher_amount) + flt(d.rm_supp_cost) + flt(d.item_tax_amount)
- divisional_loss = flt(distributed_amount - sle_valuation_amount, self.precision("base_net_amount", d))
+ divisional_loss = flt(valuation_amount_as_per_doc - stock_value_diff,
+ d.precision("base_net_amount"))
+
if divisional_loss:
+ if self.is_return or flt(d.item_tax_amount):
+ loss_account = expenses_included_in_valuation
+ else:
+ loss_account = stock_rbnb
+
gl_entries.append(self.get_gl_dict({
- "account": stock_rbnb,
+ "account": loss_account,
"against": warehouse_account[d.warehouse]["name"],
"cost_center": d.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
diff --git a/setup.py b/setup.py
index fb914f8..9ced174 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
from setuptools import setup, find_packages
from pip.req import parse_requirements
-version = "6.27.15"
+version = "6.27.17"
requirements = parse_requirements("requirements.txt", session="")
setup(