From 0beb5bdea643e940f21b6055badf5fc3de2a2003 Mon Sep 17 00:00:00 2001 From: robert schouten Date: Thu, 1 Dec 2016 08:51:03 +0800 Subject: [PATCH 01/14] calc timesheet dates on validate not just submit --- erpnext/projects/doctype/timesheet/timesheet.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py index 02e5f18f84..548332091e 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.py +++ b/erpnext/projects/doctype/timesheet/timesheet.py @@ -28,6 +28,7 @@ class Timesheet(Document): self.update_cost() self.calculate_total_amounts() self.calculate_percentage_billed() + self.set_dates() def set_employee_name(self): if self.employee and not self.employee_name: @@ -86,9 +87,6 @@ class Timesheet(Document): self.start_date = getdate(start_date) self.end_date = getdate(end_date) - def before_submit(self): - self.set_dates() - def before_cancel(self): self.set_status() From 81a5467c8fd4afc184629ecdaaaaafa7148896e8 Mon Sep 17 00:00:00 2001 From: robert schouten Date: Thu, 1 Dec 2016 09:02:17 +0800 Subject: [PATCH 02/14] [fix] Project wise Stock Tracking is script report --- .../project_wise_stock_tracking.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.json b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.json index f88050832d..e77315cd72 100644 --- a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.json +++ b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.json @@ -5,12 +5,12 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2014-06-03 07:18:17.229116", + "modified": "2016-12-1 09:18:17.229116", "modified_by": "Administrator", "module": "Projects", "name": "Project wise Stock Tracking", "owner": "Administrator", "ref_doctype": "Project", "report_name": "Project wise Stock Tracking ", - "report_type": "Report Builder" + "report_type": "Script Report" } \ No newline at end of file From faa525e4f1eba694e204a92327c47ca47577dd45 Mon Sep 17 00:00:00 2001 From: Kanchan Chauhan Date: Thu, 1 Dec 2016 15:31:38 +0530 Subject: [PATCH 03/14] [Fix] Fixed condition and formula issue in Salary Slip --- erpnext/hr/doctype/salary_slip/salary_slip.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py index 1bceff7803..3ffa4dd184 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/salary_slip.py @@ -84,6 +84,7 @@ class SalarySlip(TransactionBase): if d.amount_based_on_formula: if d.formula: amount = eval(d.formula, None, data) + if amount: data[d.abbr] = amount return amount From 2e8a94458d3789d87c47d177695753adaab65495 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 1 Dec 2016 16:00:10 +0530 Subject: [PATCH 04/14] allow user to edit serial no for credit note, debit note --- erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js | 2 +- erpnext/accounts/doctype/sales_invoice/sales_invoice.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index ccdd87ff1d..4ac81b1893 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -198,7 +198,7 @@ function hide_fields(doc) { item_fields_stock = ['warehouse_section', 'received_qty', 'rejected_qty']; cur_frm.fields_dict['items'].grid.set_column_disp(item_fields_stock, - (cint(doc.update_stock)==1 ? true : false)); + (cint(doc.update_stock)==1 || cint(doc.is_return)==1 ? true : false)); cur_frm.refresh_fields(); } diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 5609fcecac..57e0faa8ed 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -307,7 +307,7 @@ cur_frm.cscript.hide_fields = function(doc) { item_fields_stock = ['serial_no', 'batch_no', 'actual_qty', 'expense_account', 'warehouse', 'expense_account', 'warehouse'] cur_frm.fields_dict['items'].grid.set_column_disp(item_fields_stock, - (cint(doc.update_stock)==1 ? true : false)); + (cint(doc.update_stock)==1 || cint(doc.is_return)==1 ? true : false)); // India related fields if (frappe.boot.sysdefaults.country == 'India') unhide_field(['c_form_applicable', 'c_form_no']); From c92e2f904407df63ddf3357a93a771f6b01c1750 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 1 Dec 2016 16:12:35 +0530 Subject: [PATCH 05/14] Update project_wise_stock_tracking.json --- .../project_wise_stock_tracking.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.json b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.json index e77315cd72..f6a994da17 100644 --- a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.json +++ b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.json @@ -5,7 +5,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-12-1 09:18:17.229116", + "modified": "2016-12-01 09:18:17.229116", "modified_by": "Administrator", "module": "Projects", "name": "Project wise Stock Tracking", @@ -13,4 +13,4 @@ "ref_doctype": "Project", "report_name": "Project wise Stock Tracking ", "report_type": "Script Report" -} \ No newline at end of file +} From 4a888b4c912d97dbd13f35b3dd109204c42c9687 Mon Sep 17 00:00:00 2001 From: Kanchan Chauhan Date: Fri, 2 Dec 2016 17:04:53 +0530 Subject: [PATCH 06/14] [Fix] lwp issue fixed for salary slip without salary structure --- .../doctype/process_payroll/process_payroll.js | 10 ++++++++++ erpnext/hr/doctype/salary_slip/salary_slip.js | 17 +++++------------ erpnext/hr/doctype/salary_slip/salary_slip.py | 5 ++--- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/erpnext/hr/doctype/process_payroll/process_payroll.js b/erpnext/hr/doctype/process_payroll/process_payroll.js index 2ab6aef7b5..35c097ac0d 100644 --- a/erpnext/hr/doctype/process_payroll/process_payroll.js +++ b/erpnext/hr/doctype/process_payroll/process_payroll.js @@ -43,6 +43,16 @@ frappe.ui.form.on("Process Payroll", { } }) } + }, + account: function(frm) { + var account_types = ["Bank", "Cash"]; + return { + filters: { + "account_type": ["in", account_types], + "is_group": 0, + "company": frm.doc.company + } + } } }) diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.js b/erpnext/hr/doctype/salary_slip/salary_slip.js index bb27a4212a..e1120e8826 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.js +++ b/erpnext/hr/doctype/salary_slip/salary_slip.js @@ -114,22 +114,15 @@ var calculate_all = function(doc, dt, dn) { } cur_frm.cscript.amount = function(doc,dt,dn){ - calculate_earning_total(doc, dt, dn); - calculate_net_pay(doc, dt, dn); + var child = locals[dt][dn]; + if(!doc.salary_structure){ + frappe.model.set_value(dt,dn, "default_amount", child.amount) + } + calculate_all(doc, dt, dn); } cur_frm.cscript.depends_on_lwp = function(doc,dt,dn){ calculate_earning_total(doc, dt, dn, true); - calculate_net_pay(doc, dt, dn); -} -// Trigger on earning modified amount and depends on lwp -// ------------------------------------------------------------------------ -cur_frm.cscript.amount = function(doc,dt,dn){ - calculate_ded_total(doc, dt, dn); - calculate_net_pay(doc, dt, dn); -} - -cur_frm.cscript.depends_on_lwp = function(doc, dt, dn) { calculate_ded_total(doc, dt, dn, true); calculate_net_pay(doc, dt, dn); }; diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py index 3ffa4dd184..65a8dd3c6c 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/salary_slip.py @@ -10,7 +10,6 @@ from frappe.model.naming import make_autoname from frappe import msgprint, _ from erpnext.accounts.utils import get_fiscal_year from erpnext.setup.utils import get_company_currency -from erpnext.hr.utils import set_employee_name from erpnext.hr.doctype.process_payroll.process_payroll import get_month_details from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee from erpnext.utilities.transaction_base import TransactionBase @@ -84,7 +83,7 @@ class SalarySlip(TransactionBase): if d.amount_based_on_formula: if d.formula: amount = eval(d.formula, None, data) - if amount: + if amount: data[d.abbr] = amount return amount @@ -316,7 +315,7 @@ class SalarySlip(TransactionBase): def sum_components(self, component_type, total_field): for d in self.get(component_type): if cint(d.depends_on_lwp) == 1 and not self.salary_slip_based_on_timesheet: - d.amount = rounded((flt(d.amount) * flt(self.payment_days) + d.amount = rounded((flt(d.default_amount) * flt(self.payment_days) / cint(self.total_days_in_month)), self.precision("amount", component_type)) elif not self.payment_days and not self.salary_slip_based_on_timesheet: d.amount = 0 From 82fa27c36f97ad4ee32b09819fbf69f4319403bc Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 5 Dec 2016 14:36:55 +0530 Subject: [PATCH 07/14] [Fix] Status of sales order and purchase order --- erpnext/patches.txt | 3 +- .../patches/v7_0/update_status_of_po_so.py | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 erpnext/patches/v7_0/update_status_of_po_so.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 30e8e038f7..b578ac2cca 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -349,4 +349,5 @@ erpnext.patches.v7_0.set_base_amount_in_invoice_payment_table erpnext.patches.v7_1.update_invoice_status erpnext.patches.v7_0.po_status_issue_for_pr_return erpnext.patches.v7_1.update_missing_salary_component_type -erpnext.patches.v7_0.update_autoname_field \ No newline at end of file +erpnext.patches.v7_0.update_autoname_field +erpnext.patches.v7_0.update_status_of_po_so \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_status_of_po_so.py b/erpnext/patches/v7_0/update_status_of_po_so.py new file mode 100644 index 0000000000..0e2dd74a23 --- /dev/null +++ b/erpnext/patches/v7_0/update_status_of_po_so.py @@ -0,0 +1,62 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe.utils import cint, flt + +def execute(): + update_po_per_received_per_billed() + update_so_per_delivered_per_billed() + update_status() + +def update_po_per_received_per_billed(): + frappe.db.sql(""" + update + `tabPurchase Order` + set + `tabPurchase Order`.per_received = round((select sum(if(qty > ifnull(received_qty, 0), + ifnull(received_qty, 0), qty)) / sum(qty) *100 from `tabPurchase Order Item` + where parent = `tabPurchase Order`.name), 2), + `tabPurchase Order`.per_billed = round((select sum( if(amount > ifnull(billed_amt, 0), + ifnull(billed_amt, 0), amount)) / sum(amount) *100 from `tabPurchase Order Item` + where parent = `tabPurchase Order`.name), 2)""") + +def update_so_per_delivered_per_billed(): + frappe.db.sql(""" + update + `tabSales Order` + set + `tabSales Order`.per_delivered = round((select sum( if(qty > ifnull(delivered_qty, 0), + ifnull(delivered_qty, 0), qty)) / sum(qty) *100 from `tabSales Order Item` + where parent = `tabSales Order`.name), 2), + `tabSales Order`.per_billed = round((select sum( if(amount > ifnull(billed_amt, 0), + ifnull(billed_amt, 0), amount)) / sum(amount) *100 from `tabSales Order Item` + where parent = `tabSales Order`.name), 2)""") + +def update_status(): + frappe.db.sql(""" + update + `tabSales Order` + set status = (Case when status = 'Closed' then 'Closed' + When per_delivered < 100 and per_billed < 100 and docstatus = 1 then 'To Deliver and Bill' + when per_delivered = 100 and per_billed < 100 and docstatus = 1 then 'To Bill' + when per_delivered < 100 and per_billed = 100 and docstatus = 1 then 'To Deliver' + when per_delivered = 100 and per_billed = 100 and docstatus = 1 then 'Completed' + when order_type = 'Maintenance' and per_billed = 100 and docstatus = 1 then 'Completed' + when docstatus = 2 then 'Cancelled' + else 'Draft' + End)""") + + frappe.db.sql(""" + update + `tabPurchase Order` + set status = (Case when status = 'Closed' then 'Closed' + when status = 'Delivered' then 'Delivered' + When per_received < 100 and per_billed < 100 and docstatus = 1 then 'To Receive and Bill' + when per_received = 100 and per_billed < 100 and docstatus = 1 then 'To Bill' + when per_received < 100 and per_billed = 100 and docstatus = 1 then 'To Receive' + when per_received = 100 and per_billed = 100 and docstatus = 1 then 'Completed' + when docstatus = 2 then 'Cancelled' + else 'Draft' + End)""") \ No newline at end of file From c857f37f3a0c5c11fbc878a9d109dc425e87c56c Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 5 Dec 2016 17:09:30 +0530 Subject: [PATCH 08/14] [fix] currecny symbol for customer's total annual billing, total unpaid amount --- erpnext/public/js/utils.js | 4 ++-- erpnext/selling/doctype/customer/customer.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 6c8898dab0..466ff28479 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -112,9 +112,9 @@ $.extend(erpnext.utils, { if(frm.doc.__onload && frm.doc.__onload.dashboard_info) { var info = frm.doc.__onload.dashboard_info; frm.dashboard.add_indicator(__('Annual Billing: {0}', - [format_currency(info.billing_this_year, frm.doc.default_currency)]), 'blue'); + [format_currency(info.billing_this_year, info.currency)]), 'blue'); frm.dashboard.add_indicator(__('Total Unpaid: {0}', - [format_currency(info.total_unpaid, frm.doc.default_currency)]), + [format_currency(info.total_unpaid, info.currency)]), info.total_unpaid ? 'orange' : 'green'); } }, diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index 4ddeae9e27..48e2982c35 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -12,6 +12,7 @@ from erpnext.utilities.transaction_base import TransactionBase from erpnext.utilities.address_and_contact import load_address_and_contact from erpnext.accounts.party import validate_party_accounts, get_timeline_data # keep this from erpnext.accounts.party_status import get_party_status +from erpnext import get_default_currency class Customer(TransactionBase): def get_feed(self): @@ -24,7 +25,7 @@ class Customer(TransactionBase): def load_dashboard_info(self): billing_this_year = frappe.db.sql(""" - select sum(debit_in_account_currency) - sum(credit_in_account_currency) + select sum(debit_in_account_currency) - sum(credit_in_account_currency), account_currency from `tabGL Entry` where voucher_type='Sales Invoice' and party_type = 'Customer' and party=%s and fiscal_year = %s""", @@ -36,6 +37,7 @@ class Customer(TransactionBase): info = {} info["billing_this_year"] = billing_this_year[0][0] if billing_this_year else 0 + info["currency"] = billing_this_year[0][1] if billing_this_year else get_default_currency() info["total_unpaid"] = total_unpaid[0][0] if total_unpaid else 0 self.set_onload('dashboard_info', info) From bcc6ea450a17dff1bebc69f562754fd966dc8ca7 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 5 Dec 2016 18:32:57 +0530 Subject: [PATCH 09/14] [fix] test cases for customer credit --- erpnext/selling/doctype/customer/test_customer.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py index 36e4819ffe..23df503084 100644 --- a/erpnext/selling/doctype/customer/test_customer.py +++ b/erpnext/selling/doctype/customer/test_customer.py @@ -16,6 +16,9 @@ test_ignore = ["Price List"] test_records = frappe.get_test_records('Customer') class TestCustomer(unittest.TestCase): + def tearDown(self): + frappe.db.set_value("Customer", '_Test Customer', 'credit_limit', 0.0) + def test_party_details(self): from erpnext.accounts.party import get_party_details From 36a01d3464bd59f2c01d665b0710382415c5a4cb Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 5 Dec 2016 18:59:59 +0530 Subject: [PATCH 10/14] [Enhancement] Total row added for report builder --- .../report/employee_information/employee_information.json | 6 ++++-- .../report/item_shortage_report/item_shortage_report.json | 6 ++++-- .../item_wise_price_list_rate.json | 4 ++-- .../serial_no_service_contract_expiry.json | 4 ++-- erpnext/stock/report/serial_no_status/serial_no_status.json | 4 ++-- .../serial_no_warranty_expiry.json | 4 ++-- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/erpnext/hr/report/employee_information/employee_information.json b/erpnext/hr/report/employee_information/employee_information.json index 93b8cd2e70..51963d4286 100644 --- a/erpnext/hr/report/employee_information/employee_information.json +++ b/erpnext/hr/report/employee_information/employee_information.json @@ -1,12 +1,14 @@ { + "add_total_row": 0, "apply_user_permissions": 1, "creation": "2013-05-06 18:43:53", + "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 1, "is_standard": "Yes", - "json": "{\"filters\":[],\"columns\":[[\"name\",\"Employee\"],[\"employee_number\",\"Employee\"],[\"date_of_joining\",\"Employee\"],[\"branch\",\"Employee\"],[\"department\",\"Employee\"],[\"designation\",\"Employee\"],[\"gender\",\"Employee\"],[\"status\",\"Employee\"],[\"company\",\"Employee\"],[\"employment_type\",\"Employee\"],[\"reports_to\",\"Employee\"],[\"company_email\",\"Employee\"]],\"sort_by\":\"Employee.bank_ac_no\",\"sort_order\":\"desc\",\"sort_by_next\":\"\",\"sort_order_next\":\"desc\"}", - "modified": "2015-03-02 07:42:02.352823", + "json": "{\"add_total_row\": 0, \"sort_by\": \"Employee.bank_ac_no\", \"sort_order\": \"desc\", \"sort_by_next\": \"\", \"filters\": [], \"sort_order_next\": \"desc\", \"columns\": [[\"name\", \"Employee\"], [\"employee_number\", \"Employee\"], [\"date_of_joining\", \"Employee\"], [\"branch\", \"Employee\"], [\"department\", \"Employee\"], [\"designation\", \"Employee\"], [\"gender\", \"Employee\"], [\"status\", \"Employee\"], [\"company\", \"Employee\"], [\"employment_type\", \"Employee\"], [\"reports_to\", \"Employee\"], [\"company_email\", \"Employee\"]]}", + "modified": "2016-12-05 18:49:34.782552", "modified_by": "Administrator", "module": "HR", "name": "Employee Information", diff --git a/erpnext/stock/report/item_shortage_report/item_shortage_report.json b/erpnext/stock/report/item_shortage_report/item_shortage_report.json index b87a415962..3abdeadfc7 100644 --- a/erpnext/stock/report/item_shortage_report/item_shortage_report.json +++ b/erpnext/stock/report/item_shortage_report/item_shortage_report.json @@ -1,12 +1,14 @@ { + "add_total_row": 0, "apply_user_permissions": 1, "creation": "2013-08-20 13:43:30", + "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 1, "is_standard": "Yes", - "json": "{\"filters\":[[\"Bin\",\"projected_qty\",\"<\",\"0\"]],\"columns\":[[\"warehouse\",\"Bin\"],[\"item_code\",\"Bin\"],[\"actual_qty\",\"Bin\"],[\"ordered_qty\",\"Bin\"],[\"planned_qty\",\"Bin\"],[\"reserved_qty\",\"Bin\"],[\"projected_qty\",\"Bin\"]],\"sort_by\":\"Bin.projected_qty\",\"sort_order\":\"asc\",\"sort_by_next\":\"\",\"sort_order_next\":\"desc\"}", - "modified": "2014-06-03 07:18:17.092713", + "json": "{\"add_total_row\": 0, \"sort_by\": \"Bin.projected_qty\", \"sort_order\": \"asc\", \"sort_by_next\": \"\", \"filters\": [[\"Bin\", \"projected_qty\", \"<\", \"0\"]], \"sort_order_next\": \"desc\", \"columns\": [[\"warehouse\", \"Bin\"], [\"item_code\", \"Bin\"], [\"actual_qty\", \"Bin\"], [\"ordered_qty\", \"Bin\"], [\"planned_qty\", \"Bin\"], [\"reserved_qty\", \"Bin\"], [\"projected_qty\", \"Bin\"]]}", + "modified": "2016-12-05 18:49:41.909411", "modified_by": "Administrator", "module": "Stock", "name": "Item Shortage Report", diff --git a/erpnext/stock/report/item_wise_price_list_rate/item_wise_price_list_rate.json b/erpnext/stock/report/item_wise_price_list_rate/item_wise_price_list_rate.json index 6a8ddc362b..bcca0b41c5 100644 --- a/erpnext/stock/report/item_wise_price_list_rate/item_wise_price_list_rate.json +++ b/erpnext/stock/report/item_wise_price_list_rate/item_wise_price_list_rate.json @@ -7,8 +7,8 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "json": "{\"filters\":[],\"columns\":[[\"name\",\"Item Price\"],[\"price_list\",\"Item Price\"],[\"item_code\",\"Item Price\"],[\"item_name\",\"Item Price\"],[\"item_description\",\"Item Price\"],[\"price_list_rate\",\"Item Price\"],[\"buying\",\"Item Price\"],[\"selling\",\"Item Price\"],[\"currency\",\"Item Price\"]],\"sort_by\":\"Item Price.modified\",\"sort_order\":\"desc\",\"sort_by_next\":null,\"sort_order_next\":\"desc\"}", - "modified": "2016-02-01 14:31:04.075909", + "json": "{\"add_total_row\": 0, \"sort_by\": \"Item Price.modified\", \"sort_order\": \"desc\", \"sort_by_next\": null, \"filters\": [], \"sort_order_next\": \"desc\", \"columns\": [[\"name\", \"Item Price\"], [\"price_list\", \"Item Price\"], [\"item_code\", \"Item Price\"], [\"item_name\", \"Item Price\"], [\"item_description\", \"Item Price\"], [\"price_list_rate\", \"Item Price\"], [\"buying\", \"Item Price\"], [\"selling\", \"Item Price\"], [\"currency\", \"Item Price\"]]}", + "modified": "2016-12-05 18:49:15.693076", "modified_by": "Administrator", "module": "Stock", "name": "Item-wise Price List Rate", diff --git a/erpnext/stock/report/serial_no_service_contract_expiry/serial_no_service_contract_expiry.json b/erpnext/stock/report/serial_no_service_contract_expiry/serial_no_service_contract_expiry.json index 5ab5e643da..2879d9820b 100644 --- a/erpnext/stock/report/serial_no_service_contract_expiry/serial_no_service_contract_expiry.json +++ b/erpnext/stock/report/serial_no_service_contract_expiry/serial_no_service_contract_expiry.json @@ -7,8 +7,8 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "json": "{\"filters\":[[\"Serial No\",\"delivery_document_type\",\"in\",[\"Delivery Note\",\"Sales Invoice\"]],[\"Serial No\",\"warehouse\",\"=\",\"\"]],\"columns\":[[\"name\",\"Serial No\"],[\"item_code\",\"Serial No\"],[\"amc_expiry_date\",\"Serial No\"],[\"maintenance_status\",\"Serial No\"],[\"delivery_document_no\",\"Serial No\"],[\"customer\",\"Serial No\"],[\"customer_name\",\"Serial No\"],[\"item_name\",\"Serial No\"],[\"description\",\"Serial No\"],[\"item_group\",\"Serial No\"],[\"brand\",\"Serial No\"]],\"sort_by\":\"Serial No.modified\",\"sort_order\":\"desc\",\"sort_by_next\":null,\"sort_order_next\":\"desc\"}", - "modified": "2015-10-22 14:53:45.192497", + "json": "{\"add_total_row\": 0, \"sort_by\": \"Serial No.modified\", \"sort_order\": \"desc\", \"sort_by_next\": null, \"filters\": [[\"Serial No\", \"delivery_document_type\", \"in\", [\"Delivery Note\", \"Sales Invoice\"]], [\"Serial No\", \"warehouse\", \"=\", \"\"]], \"sort_order_next\": \"desc\", \"columns\": [[\"name\", \"Serial No\"], [\"item_code\", \"Serial No\"], [\"amc_expiry_date\", \"Serial No\"], [\"maintenance_status\", \"Serial No\"], [\"delivery_document_no\", \"Serial No\"], [\"customer\", \"Serial No\"], [\"customer_name\", \"Serial No\"], [\"item_name\", \"Serial No\"], [\"description\", \"Serial No\"], [\"item_group\", \"Serial No\"], [\"brand\", \"Serial No\"]]}", + "modified": "2016-12-05 18:49:22.748446", "modified_by": "Administrator", "module": "Stock", "name": "Serial No Service Contract Expiry", diff --git a/erpnext/stock/report/serial_no_status/serial_no_status.json b/erpnext/stock/report/serial_no_status/serial_no_status.json index dfc7afc3a2..cb4e70d030 100644 --- a/erpnext/stock/report/serial_no_status/serial_no_status.json +++ b/erpnext/stock/report/serial_no_status/serial_no_status.json @@ -7,8 +7,8 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "json": "{\"filters\":[],\"columns\":[[\"name\",\"Serial No\"],[\"item_code\",\"Serial No\"],[\"warehouse\",\"Serial No\"],[\"item_name\",\"Serial No\"],[\"description\",\"Serial No\"],[\"item_group\",\"Serial No\"],[\"brand\",\"Serial No\"],[\"purchase_document_no\",\"Serial No\"],[\"purchase_date\",\"Serial No\"],[\"customer\",\"Serial No\"],[\"customer_name\",\"Serial No\"],[\"purchase_rate\",\"Serial No\"],[\"delivery_document_no\",\"Serial No\"],[\"delivery_date\",\"Serial No\"],[\"supplier\",\"Serial No\"],[\"supplier_name\",\"Serial No\"]],\"sort_by\":\"Serial No.name\",\"sort_order\":\"desc\",\"sort_by_next\":null,\"sort_order_next\":\"desc\"}", - "modified": "2015-10-22 14:49:29.491790", + "json": "{\"add_total_row\": 0, \"sort_by\": \"Serial No.name\", \"sort_order\": \"desc\", \"sort_by_next\": null, \"filters\": [], \"sort_order_next\": \"desc\", \"columns\": [[\"name\", \"Serial No\"], [\"item_code\", \"Serial No\"], [\"warehouse\", \"Serial No\"], [\"item_name\", \"Serial No\"], [\"description\", \"Serial No\"], [\"item_group\", \"Serial No\"], [\"brand\", \"Serial No\"], [\"purchase_document_no\", \"Serial No\"], [\"purchase_date\", \"Serial No\"], [\"customer\", \"Serial No\"], [\"customer_name\", \"Serial No\"], [\"purchase_rate\", \"Serial No\"], [\"delivery_document_no\", \"Serial No\"], [\"delivery_date\", \"Serial No\"], [\"supplier\", \"Serial No\"], [\"supplier_name\", \"Serial No\"]]}", + "modified": "2016-12-05 18:49:31.424300", "modified_by": "Administrator", "module": "Stock", "name": "Serial No Status", diff --git a/erpnext/stock/report/serial_no_warranty_expiry/serial_no_warranty_expiry.json b/erpnext/stock/report/serial_no_warranty_expiry/serial_no_warranty_expiry.json index 2a919af648..6905671599 100644 --- a/erpnext/stock/report/serial_no_warranty_expiry/serial_no_warranty_expiry.json +++ b/erpnext/stock/report/serial_no_warranty_expiry/serial_no_warranty_expiry.json @@ -7,8 +7,8 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "json": "{\"filters\":[[\"Serial No\",\"delivery_document_type\",\"in\",[\"Delivery Note\",\"Sales Invoice\"]],[\"Serial No\",\"warehouse\",\"=\",\"\"]],\"columns\":[[\"name\",\"Serial No\"],[\"item_code\",\"Serial No\"],[\"warranty_expiry_date\",\"Serial No\"],[\"warranty_period\",\"Serial No\"],[\"maintenance_status\",\"Serial No\"],[\"purchase_document_no\",\"Serial No\"],[\"purchase_date\",\"Serial No\"],[\"supplier\",\"Serial No\"],[\"supplier_name\",\"Serial No\"],[\"delivery_document_no\",\"Serial No\"],[\"delivery_date\",\"Serial No\"],[\"customer\",\"Serial No\"],[\"customer_name\",\"Serial No\"],[\"item_name\",\"Serial No\"],[\"description\",\"Serial No\"],[\"item_group\",\"Serial No\"],[\"brand\",\"Serial No\"]],\"sort_by\":\"Serial No.modified\",\"sort_order\":\"desc\",\"sort_by_next\":null,\"sort_order_next\":\"desc\"}", - "modified": "2015-10-22 14:53:12.575608", + "json": "{\"add_total_row\": 0, \"sort_by\": \"Serial No.modified\", \"sort_order\": \"desc\", \"sort_by_next\": null, \"filters\": [[\"Serial No\", \"delivery_document_type\", \"in\", [\"Delivery Note\", \"Sales Invoice\"]], [\"Serial No\", \"warehouse\", \"=\", \"\"]], \"sort_order_next\": \"desc\", \"columns\": [[\"name\", \"Serial No\"], [\"item_code\", \"Serial No\"], [\"warranty_expiry_date\", \"Serial No\"], [\"warranty_period\", \"Serial No\"], [\"maintenance_status\", \"Serial No\"], [\"purchase_document_no\", \"Serial No\"], [\"purchase_date\", \"Serial No\"], [\"supplier\", \"Serial No\"], [\"supplier_name\", \"Serial No\"], [\"delivery_document_no\", \"Serial No\"], [\"delivery_date\", \"Serial No\"], [\"customer\", \"Serial No\"], [\"customer_name\", \"Serial No\"], [\"item_name\", \"Serial No\"], [\"description\", \"Serial No\"], [\"item_group\", \"Serial No\"], [\"brand\", \"Serial No\"]]}", + "modified": "2016-12-05 18:49:26.761364", "modified_by": "Administrator", "module": "Stock", "name": "Serial No Warranty Expiry", From 6f6a533d66e6c446560ac37cac2bc38a0a85ab06 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 5 Dec 2016 19:20:29 +0530 Subject: [PATCH 11/14] [fix] salary slip working days --- .../hr/doctype/salary_slip/test_salary_slip.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/erpnext/hr/doctype/salary_slip/test_salary_slip.py b/erpnext/hr/doctype/salary_slip/test_salary_slip.py index 8cf0688dd1..57a3711fc0 100644 --- a/erpnext/hr/doctype/salary_slip/test_salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/test_salary_slip.py @@ -55,8 +55,8 @@ class TestSalarySlip(unittest.TestCase): ss = frappe.get_doc("Salary Slip", self.make_employee_salary_slip("test_employee@salary.com")) - self.assertEquals(ss.total_days_in_month, 27) - self.assertEquals(ss.payment_days, 27) + self.assertEquals(ss.total_days_in_month, 28) + self.assertEquals(ss.payment_days, 28) self.assertEquals(ss.earnings[0].amount, 5000) self.assertEquals(ss.earnings[0].default_amount, 5000) self.assertEquals(ss.earnings[1].amount, 3000) @@ -76,23 +76,23 @@ class TestSalarySlip(unittest.TestCase): ss = frappe.get_doc("Salary Slip", self.make_employee_salary_slip("test_employee@salary.com")) - self.assertEquals(ss.total_days_in_month, 27) - self.assertEquals(ss.payment_days, 27) + self.assertEquals(ss.total_days_in_month, 28) + self.assertEquals(ss.payment_days, 28) # set relieving date in the same month frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", "12-12-2016") frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "status", "Left") - self.assertEquals(ss.total_days_in_month, 27) - self.assertEquals(ss.payment_days, 27) + self.assertEquals(ss.total_days_in_month, 28) + self.assertEquals(ss.payment_days, 28) ss.save() frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "relieving_date", None) frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "status", "Active") # Holidays included in working days frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1) - self.assertEquals(ss.total_days_in_month, 27) - self.assertEquals(ss.payment_days, 27) + self.assertEquals(ss.total_days_in_month, 28) + self.assertEquals(ss.payment_days, 28) ss.save() # # frappe.db.set_value("Employee", frappe.get_value("Employee", {"employee_name":"test_employee@salary.com"}, "name"), "date_of_joining", "2001-01-11") From 7f72cd0f974be7e016891db7c745d32da8b1f0bf Mon Sep 17 00:00:00 2001 From: robert schouten Date: Tue, 6 Dec 2016 08:51:40 +0800 Subject: [PATCH 12/14] [fix] email digest cache by frequency --- erpnext/setup/doctype/email_digest/email_digest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py index ac999ed23b..a7dfa7cb31 100644 --- a/erpnext/setup/doctype/email_digest/email_digest.py +++ b/erpnext/setup/doctype/email_digest/email_digest.py @@ -233,7 +233,7 @@ class EmailDigest(Document): "new_quotations","pending_quotations","sales_order","purchase_order","pending_sales_orders","pending_purchase_orders", "invoiced_amount", "payables", "bank_balance", "credit_balance"): if self.get(key): - cache_key = "email_digest:card:{0}:{1}".format(self.company, key) + cache_key = "email_digest:card:{0}:{1}:{2}".format(self.company, self.frequency, key) card = cache.get(cache_key) if card: From dc80b35104b2c9dfbe0c3c488ce779362625fde3 Mon Sep 17 00:00:00 2001 From: Kanchan Chauhan Date: Tue, 6 Dec 2016 12:50:46 +0530 Subject: [PATCH 13/14] [Minor] Apply Salary Slip validation only if it is submitted --- .../hr/doctype/leave_application/leave_application.py | 10 +++++++++- erpnext/hr/doctype/salary_slip/salary_slip.py | 7 ++++++- .../monthly_salary_register/monthly_salary_register.py | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py index a51e2b5315..a0a718e224 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -38,6 +38,7 @@ class LeaveApplication(Document): self.validate_block_days() self.validate_salary_processed_days() self.validate_leave_approver() + self.validate_attendance() def on_update(self): if (not self.previous_doc and self.leave_approver) or (self.previous_doc and \ @@ -102,7 +103,7 @@ class LeaveApplication(Document): last_processed_pay_slip = frappe.db.sql(""" select start_date, end_date from `tabSalary Slip` - where docstatus != 2 and employee = %s + where docstatus = 1 and employee = %s and ((%s between start_date and end_date) or (%s between start_date and end_date)) order by modified desc limit 1 """,(self.employee, self.to_date, self.from_date)) @@ -212,6 +213,13 @@ class LeaveApplication(Document): elif self.docstatus==1 and len(leave_approvers) and self.leave_approver != frappe.session.user: frappe.throw(_("Only the selected Leave Approver can submit this Leave Application"), LeaveApproverIdentityError) + + def validate_attendance(self): + attendance = frappe.db.sql("""select name from `tabAttendance` where employee = %s and (att_date between %s and %s) + and docstatus = 1""", + (self.employee, self.from_date, self.to_date)) + if attendance: + frappe.throw(_("Attendance for employee {0} is already marked for this day").format(self.employee)) def notify_employee(self, status): employee = frappe.get_doc("Employee", self.employee) diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py index 3ffa4dd184..9cba9b4535 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/salary_slip.py @@ -231,10 +231,15 @@ class SalarySlip(TransactionBase): if working_days < 0: frappe.throw(_("There are more holidays than working days this month.")) + actual_lwp = self.calculate_lwp(holidays, working_days) if not lwp: - lwp = self.calculate_lwp(holidays, working_days) + lwp = actual_lwp + elif lwp != actual_lwp: + frappe.msgprint(_("Leave Without Pay does not match with approved Leave Application records")) + self.total_days_in_month = working_days self.leave_without_pay = lwp + payment_days = flt(self.get_payment_days(joining_date, relieving_date)) - flt(lwp) self.payment_days = payment_days > 0 and payment_days or 0 diff --git a/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py b/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py index 6e1265e82e..1e9d03ee04 100644 --- a/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py +++ b/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py @@ -48,7 +48,7 @@ def get_columns(salary_slips): from `tabSalary Detail` sd, `tabSalary Component` sc where sc.name=sd.salary_component and sd.amount != 0 and sd.parent in (%s)""" % (', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]), as_dict=1): - salary_components[component.type].append(component.salary_component) + salary_components[_(component.type)].append(component.salary_component) columns = columns + [(e + ":Currency:120") for e in salary_components[_("Earning")]] + \ [ _("Arrear Amount") + ":Currency:120", _("Leave Encashment Amount") + ":Currency:150", From bc2deafcf9ef09ef6a936cb14f1d2a629cb7eba2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 6 Dec 2016 16:44:44 +0600 Subject: [PATCH 14/14] bumped to version 7.1.21 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 85ac9103ef..2d1a24d1c1 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '7.1.20' +__version__ = '7.1.21' def get_default_company(user=None): '''Get default company for user'''