From e1a6022c8c3e45281db49621f449b1d7e839d26e Mon Sep 17 00:00:00 2001 From: Prasad R Date: Fri, 19 Apr 2019 10:57:21 +0530 Subject: [PATCH 01/13] fix: Allow system manager to access share ledger --- erpnext/accounts/report/share_ledger/share_ledger.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/share_ledger/share_ledger.json b/erpnext/accounts/report/share_ledger/share_ledger.json index d374bb7747c..fe158a6f003 100644 --- a/erpnext/accounts/report/share_ledger/share_ledger.json +++ b/erpnext/accounts/report/share_ledger/share_ledger.json @@ -1,23 +1,27 @@ { "add_total_row": 0, - "apply_user_permissions": 1, "creation": "2017-12-27 16:15:52.615453", + "disable_prepared_report": 0, "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2017-12-27 16:46:54.422356", + "modified": "2019-04-19 10:50:36.061588", "modified_by": "Administrator", "module": "Accounts", "name": "Share Ledger", "owner": "Administrator", + "prepared_report": 0, "ref_doctype": "Share Transfer", "report_name": "Share Ledger", "report_type": "Script Report", "roles": [ { "role": "Administrator" + }, + { + "role": "System Manager" } ] } \ No newline at end of file From 198c7ae73d34d3ec9a337e36c413b8dcb62c3e6a Mon Sep 17 00:00:00 2001 From: Prasad R Date: Fri, 19 Apr 2019 12:17:19 +0530 Subject: [PATCH 02/13] fix: show 2 missing doctypes in Accounts --- erpnext/config/accounting.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/erpnext/config/accounting.py b/erpnext/config/accounting.py index afe35f8078f..4a04f267bc1 100644 --- a/erpnext/config/accounting.py +++ b/erpnext/config/accounting.py @@ -78,6 +78,11 @@ def get_data(): "name": "Payment Entry", "description": _("Bank/Cash transactions against party or for internal transfer") }, + { + "type": "doctype", + "name": "Payment Term", + "description": _("Payment Terms based on conditions") + } # Reports { @@ -131,6 +136,11 @@ def get_data(): "name": "Currency Exchange", "description": _("Currency exchange rate master.") }, + { + "type": "doctype", + "name": "Exchange Rate Revaluation", + "description": _("Exchange Rate Revaluation master.") + }, { "type": "doctype", "name": "Payment Gateway Account", From a216844d2c88bde052ad2e4a3d1534da454be853 Mon Sep 17 00:00:00 2001 From: Saif Ur Rehman Date: Mon, 22 Apr 2019 12:10:40 +0500 Subject: [PATCH 03/13] fix: Set Allocate Advance Automatically disabled by default --- .../doctype/purchase_invoice/purchase_invoice.json | 12 +++++++----- .../doctype/sales_invoice/sales_invoice.json | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index bd845069cd8..5f4833c34cf 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -1882,6 +1882,7 @@ "collapsible": 0, "collapsible_depends_on": "", "columns": 0, + "fetch_if_empty": 0, "fieldname": "pricing_rule_details", "fieldtype": "Section Break", "hidden": 0, @@ -1915,6 +1916,7 @@ "collapsible": 0, "collapsible_depends_on": "", "columns": 0, + "fetch_if_empty": 0, "fieldname": "pricing_rules", "fieldtype": "Table", "hidden": 0, @@ -2318,6 +2320,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "tax_category", "fieldtype": "Link", "hidden": 0, @@ -2449,6 +2452,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "taxes_and_charges", "fieldtype": "Link", "hidden": 0, @@ -2483,6 +2487,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "taxes", "fieldtype": "Table", "hidden": 0, @@ -3947,7 +3952,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "1", + "default": "", "fetch_if_empty": 0, "fieldname": "allocate_advances_automatically", "fieldtype": "Check", @@ -4957,18 +4962,16 @@ } ], "has_web_view": 0, - "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-file-text", "idx": 204, - "image_view": 0, "in_create": 0, "is_submittable": 1, "issingle": 0, "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2019-04-11 16:08:22.288425", + "modified": "2019-04-22 12:08:12.648559", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", @@ -5073,7 +5076,6 @@ ], "quick_entry": 0, "read_only": 0, - "read_only_onload": 1, "search_fields": "posting_date, supplier, bill_no, base_grand_total, outstanding_amount", "show_name_in_global_search": 1, "sort_field": "modified", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index ffc5a1d3984..1ded27211ba 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -3731,7 +3731,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "1", + "default": "", "fetch_if_empty": 0, "fieldname": "allocate_advances_automatically", "fieldtype": "Check", @@ -5915,7 +5915,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2019-04-11 17:08:11.629845", + "modified": "2019-04-22 12:07:58.168803", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", @@ -6010,4 +6010,4 @@ "track_changes": 1, "track_seen": 1, "track_views": 0 -} \ No newline at end of file +} From 35e52b5596d78077a923457b02cb94544767efbe Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Tue, 16 Apr 2019 16:52:55 +0530 Subject: [PATCH 04/13] fix: fixed spelling --- erpnext/patches.txt | 1 + .../patches/v11_1/set_salary_details_submittable.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 erpnext/patches/v11_1/set_salary_details_submittable.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index ccfd37d4da9..e0002ab5bd5 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -597,3 +597,4 @@ erpnext.patches.v10_0.item_barcode_childtable_migrate # 16-02-2019 erpnext.patches.v12_0.move_item_tax_to_item_tax_template erpnext.patches.v11_1.set_variant_based_on erpnext.patches.v11_1.woocommerce_set_creation_user +erpnext.patches.v11_1.set_salary_details_submittable diff --git a/erpnext/patches/v11_1/set_salary_details_submittable.py b/erpnext/patches/v11_1/set_salary_details_submittable.py new file mode 100644 index 00000000000..36e78792ecb --- /dev/null +++ b/erpnext/patches/v11_1/set_salary_details_submittable.py @@ -0,0 +1,12 @@ +from __future__ import unicode_literals +import frappe +import itertools + +def execute(): + salary_structure = frappe.get_all("Salary Structure", filters={"docstatus": 1}, as_list=1) + salary_structure = list(itertools.chain(*salary_structure)) + salary_structure = "', '".join(map(str, salary_structure)) + + query = ''' update `tabSalary Detail` set docstatus=1 where parent in ('{0}')'''.format(salary_structure) + frappe.db.sql(query) + From 36561801c2279551e9839192901ffa73f98c37ca Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 22 Apr 2019 11:16:47 +0530 Subject: [PATCH 05/13] Update set_salary_details_submitable.py --- .../patches/v11_1/set_salary_details_submittable.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/erpnext/patches/v11_1/set_salary_details_submittable.py b/erpnext/patches/v11_1/set_salary_details_submittable.py index 36e78792ecb..f4477d9fd6d 100644 --- a/erpnext/patches/v11_1/set_salary_details_submittable.py +++ b/erpnext/patches/v11_1/set_salary_details_submittable.py @@ -1,12 +1,11 @@ from __future__ import unicode_literals import frappe -import itertools def execute(): - salary_structure = frappe.get_all("Salary Structure", filters={"docstatus": 1}, as_list=1) - salary_structure = list(itertools.chain(*salary_structure)) - salary_structure = "', '".join(map(str, salary_structure)) - - query = ''' update `tabSalary Detail` set docstatus=1 where parent in ('{0}')'''.format(salary_structure) - frappe.db.sql(query) + frappe.db.sql(""" + update `tabSalary Structure` ss, `tabSalary Detail` sd + set sd.docstatus=1 + where ss.name=sd.parent and ss.docstatus=1 and sd.parenttype='Salary Structure' + """) + From d3cd98c45e1352b5c2c8095c529291cf2ea0b78d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 22 Apr 2019 13:24:02 +0530 Subject: [PATCH 06/13] fix: Renamed depends_on_lwp to depends_on_payment_days --- .../additional_salary/additional_salary.py | 2 +- .../employee_benefit_application.py | 12 +- .../employee_benefit_claim.py | 2 +- .../salary_component/salary_component.js | 2 +- .../salary_component/salary_component.json | 38 ++++++- .../doctype/salary_detail/salary_detail.json | 28 ++++- erpnext/hr/doctype/salary_slip/salary_slip.js | 13 +-- erpnext/hr/doctype/salary_slip/salary_slip.py | 20 ++-- .../salary_structure/salary_structure.js | 2 +- .../salary_structure/salary_structure.py | 4 +- .../salary_slip_based_on_timesheet.json | 30 ++--- .../salary_slip_standard.json | 38 +++---- erpnext/patches.txt | 1 + .../patches/v11_1/rename_depends_on_lwp.py | 13 +++ .../v11_1/set_salary_details_submittable.py | 2 - .../patches/v7_0/rename_salary_components.py | 106 +++++++++--------- 16 files changed, 185 insertions(+), 128 deletions(-) create mode 100644 erpnext/patches/v11_1/rename_depends_on_lwp.py diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.py b/erpnext/hr/doctype/additional_salary/additional_salary.py index 968a1c4571c..9ca1260fe06 100644 --- a/erpnext/hr/doctype/additional_salary/additional_salary.py +++ b/erpnext/hr/doctype/additional_salary/additional_salary.py @@ -51,7 +51,7 @@ def get_additional_salary_component(employee, start_date, end_date): for d in additional_components: component = frappe.get_doc("Salary Component", d.salary_component) struct_row = {'salary_component': d.salary_component} - for field in ["depends_on_lwp", "abbr", "is_tax_applicable", "variable_based_on_taxable_salary", "is_additional_component"]: + for field in ["depends_on_payment_days", "abbr", "is_tax_applicable", "variable_based_on_taxable_salary", "is_additional_component"]: struct_row[field] = component.get(field) additional_components_list.append({ diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py index 9b6dba5ff81..c613a13223e 100644 --- a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py +++ b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py @@ -113,7 +113,7 @@ def get_max_benefits(employee, on_date): def get_max_benefits_remaining(employee, on_date, payroll_period): max_benefits = get_max_benefits(employee, on_date) if max_benefits and max_benefits > 0: - have_depends_on_lwp = False + have_depends_on_payment_days = False per_day_amount_total = 0 payroll_period_days = get_payroll_period_days(on_date, on_date, employee)[0] payroll_period_obj = frappe.get_doc("Payroll Period", payroll_period) @@ -122,22 +122,22 @@ def get_max_benefits_remaining(employee, on_date, payroll_period): prev_sal_slip_flexi_total = get_sal_slip_total_benefit_given(employee, payroll_period_obj) if prev_sal_slip_flexi_total > 0: - # Check salary structure hold depends_on_lwp component + # Check salary structure hold depends_on_payment_days component # If yes then find the amount per day of each component and find the sum sal_struct_name = get_assigned_salary_structure(employee, on_date) if sal_struct_name: sal_struct = frappe.get_doc("Salary Structure", sal_struct_name) for sal_struct_row in sal_struct.get("earnings"): salary_component = frappe.get_doc("Salary Component", sal_struct_row.salary_component) - if salary_component.depends_on_lwp == 1 and salary_component.pay_against_benefit_claim != 1: - have_depends_on_lwp = True + if salary_component.depends_on_payment_days == 1 and salary_component.pay_against_benefit_claim != 1: + have_depends_on_payment_days = True benefit_amount = get_benefit_pro_rata_ratio_amount(sal_struct, salary_component.max_benefit_amount) amount_per_day = benefit_amount / payroll_period_days per_day_amount_total += amount_per_day # Then the sum multiply with the no of lwp in that period # Include that amount to the prev_sal_slip_flexi_total to get the actual - if have_depends_on_lwp and per_day_amount_total > 0: + if have_depends_on_payment_days and per_day_amount_total > 0: holidays = get_holidays_for_employee(employee, payroll_period_obj.start_date, on_date) working_days = date_diff(on_date, payroll_period_obj.start_date) + 1 leave_days = calculate_lwp(employee, payroll_period_obj.start_date, holidays, working_days) @@ -185,7 +185,7 @@ def get_benefit_component_amount(employee, start_date, end_date, struct_row, sal 'payroll_period': payroll_period }) - if frappe.db.get_value("Salary Component", struct_row.salary_component, "depends_on_lwp") != 1: + if frappe.db.get_value("Salary Component", struct_row.salary_component, "depends_on_payment_days") != 1: if frequency == "Monthly" and actual_payroll_days in range(360, 370): period_length = 1 period_factor = 12 diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py index bf150b12322..8be67a866ab 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py @@ -170,7 +170,7 @@ def get_last_payroll_period_benefits(employee, sal_slip_start_date, sal_slip_end amount += current_claimed_amount struct_row = {} salary_components_dict = {} - struct_row['depends_on_lwp'] = salary_component.depends_on_lwp + struct_row['depends_on_payment_days'] = salary_component.depends_on_payment_days struct_row['salary_component'] = salary_component.name struct_row['abbr'] = salary_component.salary_component_abbr struct_row['do_not_include_in_total'] = salary_component.do_not_include_in_total diff --git a/erpnext/hr/doctype/salary_component/salary_component.js b/erpnext/hr/doctype/salary_component/salary_component.js index b33451bc35c..1d398ccd59c 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.js +++ b/erpnext/hr/doctype/salary_component/salary_component.js @@ -75,5 +75,5 @@ var set_value_for_condition_and_formula = function(frm) { frm.set_value("amount_based_on_formula", 0); frm.set_value("statistical_component", 0); frm.set_value("do_not_include_in_total", 0); - frm.set_value("depends_on_lwp", 0); + frm.set_value("depends_on_payment_days", 0); }; diff --git a/erpnext/hr/doctype/salary_component/salary_component.json b/erpnext/hr/doctype/salary_component/salary_component.json index f7ce08c737a..697d224092c 100644 --- a/erpnext/hr/doctype/salary_component/salary_component.json +++ b/erpnext/hr/doctype/salary_component/salary_component.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_events_in_timeline": 0, "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, @@ -19,6 +20,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "salary_component", "fieldtype": "Data", "hidden": 0, @@ -51,6 +53,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "salary_component_abbr", "fieldtype": "Data", "hidden": 0, @@ -85,6 +88,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "type", "fieldtype": "Select", "hidden": 0, @@ -119,6 +123,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.is_flexible_benefit != 1", + "fetch_if_empty": 0, "fieldname": "is_additional_component", "fieldtype": "Check", "hidden": 0, @@ -153,6 +158,7 @@ "columns": 0, "default": "1", "depends_on": "eval:doc.type == \"Earning\"", + "fetch_if_empty": 0, "fieldname": "is_tax_applicable", "fieldtype": "Check", "hidden": 0, @@ -186,6 +192,7 @@ "collapsible": 0, "columns": 0, "default": "1", + "fetch_if_empty": 0, "fieldname": "is_payable", "fieldtype": "Check", "hidden": 0, @@ -218,7 +225,9 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "depends_on_lwp", + "default": "1", + "fetch_if_empty": 0, + "fieldname": "depends_on_payment_days", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, @@ -227,7 +236,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Depends on Leave Without Pay", + "label": "Depends on Payment Days", "length": 0, "no_copy": 0, "permlevel": 0, @@ -250,6 +259,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "do_not_include_in_total", "fieldtype": "Check", "hidden": 0, @@ -282,6 +292,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_4", "fieldtype": "Column Break", "hidden": 0, @@ -313,6 +324,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "disabled", "fieldtype": "Check", "hidden": 0, @@ -345,6 +357,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "description", "fieldtype": "Small Text", "hidden": 0, @@ -378,6 +391,7 @@ "collapsible": 0, "columns": 0, "description": "If selected, the value specified or calculated in this component will not contribute to the earnings or deductions. However, it's value can be referenced by other components that can be added or deducted. ", + "fetch_if_empty": 0, "fieldname": "statistical_component", "fieldtype": "Check", "hidden": 0, @@ -411,6 +425,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.type==\"Earning\" && doc.is_additional_component != 1 && doc.statistical_component!=1", + "fetch_if_empty": 0, "fieldname": "flexible_benefits", "fieldtype": "Section Break", "hidden": 0, @@ -444,6 +459,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.is_additional_component != 1", + "fetch_if_empty": 0, "fieldname": "is_flexible_benefit", "fieldtype": "Check", "hidden": 0, @@ -477,6 +493,7 @@ "collapsible": 0, "columns": 0, "depends_on": "is_flexible_benefit", + "fetch_if_empty": 0, "fieldname": "max_benefit_amount", "fieldtype": "Currency", "hidden": 0, @@ -509,6 +526,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_9", "fieldtype": "Column Break", "hidden": 0, @@ -541,6 +559,7 @@ "collapsible": 0, "columns": 0, "depends_on": "is_flexible_benefit", + "fetch_if_empty": 0, "fieldname": "pay_against_benefit_claim", "fieldtype": "Check", "hidden": 0, @@ -574,6 +593,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.is_flexible_benefit == 1 & doc.create_separate_payment_entry_against_benefit_claim !=1", + "fetch_if_empty": 0, "fieldname": "only_tax_impact", "fieldtype": "Check", "hidden": 0, @@ -607,6 +627,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.is_flexible_benefit == 1 & doc.only_tax_impact !=1", + "fetch_if_empty": 0, "fieldname": "create_separate_payment_entry_against_benefit_claim", "fieldtype": "Check", "hidden": 0, @@ -640,6 +661,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.type=='Deduction'", + "fetch_if_empty": 0, "fieldname": "section_break_11", "fieldtype": "Section Break", "hidden": 0, @@ -671,6 +693,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "variable_based_on_taxable_salary", "fieldtype": "Check", "hidden": 0, @@ -704,6 +727,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.statistical_component != 1", + "fetch_if_empty": 0, "fieldname": "section_break_5", "fieldtype": "Section Break", "hidden": 0, @@ -736,6 +760,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "accounts", "fieldtype": "Table", "hidden": 0, @@ -771,6 +796,7 @@ "collapsible_depends_on": "", "columns": 0, "depends_on": "eval:doc.is_flexible_benefit != 1 && doc.variable_based_on_taxable_salary != 1", + "fetch_if_empty": 0, "fieldname": "condition_and_formula", "fieldtype": "Section Break", "hidden": 0, @@ -803,6 +829,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "condition", "fieldtype": "Code", "hidden": 0, @@ -836,6 +863,7 @@ "collapsible": 0, "columns": 0, "default": "", + "fetch_if_empty": 0, "fieldname": "amount_based_on_formula", "fieldtype": "Check", "hidden": 0, @@ -869,6 +897,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.amount_based_on_formula!==0", + "fetch_if_empty": 0, "fieldname": "formula", "fieldtype": "Code", "hidden": 0, @@ -902,6 +931,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.amount_based_on_formula!==1", + "fetch_if_empty": 0, "fieldname": "amount", "fieldtype": "Currency", "hidden": 0, @@ -934,6 +964,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_28", "fieldtype": "Column Break", "hidden": 0, @@ -965,6 +996,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "help", "fieldtype": "HTML", "hidden": 0, @@ -1003,7 +1035,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-09-20 16:44:58.876044", + "modified": "2019-04-16 19:08:55.323567", "modified_by": "Administrator", "module": "HR", "name": "Salary Component", diff --git a/erpnext/hr/doctype/salary_detail/salary_detail.json b/erpnext/hr/doctype/salary_detail/salary_detail.json index 0ec3cd64138..8f2649ad21b 100644 --- a/erpnext/hr/doctype/salary_detail/salary_detail.json +++ b/erpnext/hr/doctype/salary_detail/salary_detail.json @@ -19,6 +19,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "salary_component", "fieldtype": "Link", "hidden": 0, @@ -55,6 +56,7 @@ "default": "", "depends_on": "eval:doc.parenttype=='Salary Structure'", "fetch_from": "salary_component.salary_component_abbr", + "fetch_if_empty": 0, "fieldname": "abbr", "fieldtype": "Data", "hidden": 0, @@ -88,6 +90,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_3", "fieldtype": "Column Break", "hidden": 0, @@ -121,6 +124,7 @@ "columns": 0, "description": "If selected, the value specified or calculated in this component will not contribute to the earnings or deductions. However, it's value can be referenced by other components that can be added or deducted. ", "fetch_from": "salary_component.statistical_component", + "fetch_if_empty": 0, "fieldname": "statistical_component", "fieldtype": "Check", "hidden": 0, @@ -154,6 +158,7 @@ "collapsible": 0, "columns": 0, "fetch_from": "salary_component.is_tax_applicable", + "fetch_if_empty": 0, "fieldname": "is_tax_applicable", "fieldtype": "Check", "hidden": 0, @@ -187,6 +192,7 @@ "collapsible": 0, "columns": 0, "fetch_from": "salary_component.is_flexible_benefit", + "fetch_if_empty": 0, "fieldname": "is_flexible_benefit", "fieldtype": "Check", "hidden": 0, @@ -221,6 +227,7 @@ "columns": 0, "default": "", "fetch_from": "salary_component.is_additional_component", + "fetch_if_empty": 0, "fieldname": "is_additional_component", "fieldtype": "Check", "hidden": 1, @@ -255,6 +262,7 @@ "columns": 0, "default": "", "fetch_from": "salary_component.variable_based_on_taxable_salary", + "fetch_if_empty": 0, "fieldname": "variable_based_on_taxable_salary", "fieldtype": "Check", "hidden": 0, @@ -288,8 +296,9 @@ "collapsible": 0, "columns": 0, "depends_on": "", - "fetch_from": "salary_component.depends_on_lwp", - "fieldname": "depends_on_lwp", + "fetch_from": "salary_component.depends_on_payment_days", + "fetch_if_empty": 0, + "fieldname": "depends_on_payment_days", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, @@ -298,7 +307,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Depends on Leave Without Pay", + "label": "Depends on Payment Days", "length": 0, "no_copy": 0, "permlevel": 0, @@ -322,6 +331,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.is_flexible_benefit != 1", + "fetch_if_empty": 0, "fieldname": "section_break_2", "fieldtype": "Section Break", "hidden": 0, @@ -354,6 +364,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.parenttype=='Salary Structure'", + "fetch_if_empty": 0, "fieldname": "condition", "fieldtype": "Code", "hidden": 0, @@ -389,6 +400,7 @@ "default": "0", "depends_on": "eval:doc.parenttype=='Salary Structure'", "fetch_from": "", + "fetch_if_empty": 0, "fieldname": "amount_based_on_formula", "fieldtype": "Check", "hidden": 0, @@ -425,6 +437,7 @@ "default": "", "depends_on": "eval:doc.amount_based_on_formula!==0 && doc.parenttype==='Salary Structure'", "description": "", + "fetch_if_empty": 0, "fieldname": "formula", "fieldtype": "Code", "hidden": 0, @@ -458,6 +471,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.amount_based_on_formula!==1 || doc.parenttype==='Salary Slip'", + "fetch_if_empty": 0, "fieldname": "amount", "fieldtype": "Currency", "hidden": 0, @@ -491,6 +505,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "do_not_include_in_total", "fieldtype": "Check", "hidden": 0, @@ -524,6 +539,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.parenttype=='Salary Structure'", + "fetch_if_empty": 0, "fieldname": "default_amount", "fieldtype": "Currency", "hidden": 0, @@ -558,6 +574,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.parenttype=='Salary Slip' && doc.parentfield=='deductions' && doc.variable_based_on_taxable_salary == 1", + "fetch_if_empty": 0, "fieldname": "tax_on_flexible_benefit", "fieldtype": "Currency", "hidden": 0, @@ -591,6 +608,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.parenttype=='Salary Slip' && doc.parentfield=='deductions' && doc.variable_based_on_taxable_salary == 1", + "fetch_if_empty": 0, "fieldname": "tax_on_additional_salary", "fieldtype": "Currency", "hidden": 0, @@ -624,6 +642,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.parenttype=='Salary Structure'", + "fetch_if_empty": 0, "fieldname": "section_break_11", "fieldtype": "Column Break", "hidden": 0, @@ -656,6 +675,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.parenttype=='Salary Structure'", + "fetch_if_empty": 0, "fieldname": "condition_and_formula_help", "fieldtype": "HTML", "hidden": 0, @@ -693,7 +713,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2019-02-04 14:41:56.030991", + "modified": "2019-04-16 19:09:31.726597", "modified_by": "Administrator", "module": "HR", "name": "Salary Detail", diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.js b/erpnext/hr/doctype/salary_slip/salary_slip.js index 86c50d08ba1..4e9fcce8982 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.js +++ b/erpnext/hr/doctype/salary_slip/salary_slip.js @@ -132,9 +132,6 @@ var get_emp_and_leave_details = function(doc, dt, dn) { }); } -cur_frm.cscript.employee = function(doc,dt,dn){ - get_emp_and_leave_details(doc, dt, dn); -} cur_frm.cscript.leave_without_pay = function(doc,dt,dn){ if (doc.employee && doc.start_date && doc.end_date) { @@ -160,7 +157,7 @@ cur_frm.cscript.amount = function(doc,dt,dn){ calculate_all(doc, dt, dn); } -cur_frm.cscript.depends_on_lwp = function(doc,dt,dn){ +cur_frm.cscript.depends_on_payment_days = function(doc,dt,dn){ calculate_earning_total(doc, dt, dn, true); calculate_ded_total(doc, dt, dn, true); calculate_net_pay(doc, dt, dn); @@ -174,7 +171,7 @@ var calculate_earning_total = function(doc, dt, dn, reset_amount) { var tbl = doc.earnings || []; var total_earn = 0; for(var i = 0; i < tbl.length; i++){ - if(cint(tbl[i].depends_on_lwp) == 1) { + if(cint(tbl[i].depends_on_payment_days) == 1) { tbl[i].amount = Math.round(tbl[i].default_amount)*(flt(doc.payment_days) / cint(doc.total_working_days)*100)/100; } else if(reset_amount && tbl[i].default_amount) { @@ -196,7 +193,7 @@ var calculate_ded_total = function(doc, dt, dn, reset_amount) { var tbl = doc.deductions || []; var total_ded = 0; for(var i = 0; i < tbl.length; i++){ - if(cint(tbl[i].depends_on_lwp) == 1) { + if(cint(tbl[i].depends_on_payment_days) == 1) { tbl[i].amount = Math.round(tbl[i].default_amount)*(flt(doc.payment_days)/cint(doc.total_working_days)*100)/100; } else if(reset_amount && tbl[i].default_amount) { tbl[i].amount = tbl[i].default_amount; @@ -209,16 +206,12 @@ var calculate_ded_total = function(doc, dt, dn, reset_amount) { refresh_many(['deductions', 'total_deduction']); } -// Calculate net payable amount -// ------------------------------------------------------------------------ var calculate_net_pay = function(doc, dt, dn) { doc.net_pay = flt(doc.gross_pay) - flt(doc.total_deduction); doc.rounded_total = Math.round(doc.net_pay); refresh_many(['net_pay', 'rounded_total']); } -// validate -// ------------------------------------------------------------------------ cur_frm.cscript.validate = function(doc, dt, dn) { calculate_all(doc, dt, dn); } diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py index 3568e2da4d3..9e13cb6739d 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/salary_slip.py @@ -131,11 +131,12 @@ class SalarySlip(TransactionBase): for d in self.get(key): if d.salary_component == struct_row.salary_component: component_row = d + if not component_row: self.append(key, { 'amount': amount, 'default_amount': amount, - 'depends_on_lwp' : struct_row.depends_on_lwp, + 'depends_on_payment_days' : struct_row.depends_on_payment_days, 'salary_component' : struct_row.salary_component, 'abbr' : struct_row.abbr, 'do_not_include_in_total' : struct_row.do_not_include_in_total, @@ -147,12 +148,11 @@ class SalarySlip(TransactionBase): 'tax_on_additional_salary': additional_tax }) else: - if overwrite: - component_row.default_amount = amount - component_row.amount = amount - else: - component_row.default_amount += amount - component_row.amount = component_row.default_amount + if not overwrite: + amount += struct_row.get("default_amount", 0) + + component_row.default_amount = amount + component_row.amount = amount component_row.tax_on_flexible_benefit = benefit_tax component_row.tax_on_additional_salary = additional_tax @@ -418,7 +418,7 @@ class SalarySlip(TransactionBase): for d in self.get(component_type): if (self.salary_structure and - cint(d.depends_on_lwp) and + cint(d.depends_on_payment_days) and (not self.salary_slip_based_on_timesheet or getdate(self.start_date) < joining_date or @@ -431,7 +431,7 @@ class SalarySlip(TransactionBase): ) elif not self.payment_days and not self.salary_slip_based_on_timesheet and \ - cint(d.depends_on_lwp): + cint(d.depends_on_payment_days): d.amount = 0 elif not d.amount: d.amount = d.default_amount @@ -787,7 +787,7 @@ class SalarySlip(TransactionBase): component = frappe.get_doc("Salary Component", salary_component) # Data for update_component_row struct_row = {} - struct_row['depends_on_lwp'] = component.depends_on_lwp + struct_row['depends_on_payment_days'] = component.depends_on_payment_days struct_row['salary_component'] = component.name struct_row['abbr'] = component.salary_component_abbr struct_row['do_not_include_in_total'] = component.do_not_include_in_total diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.js b/erpnext/hr/doctype/salary_structure/salary_structure.js index 79d75bfdf6e..e3f37e71059 100755 --- a/erpnext/hr/doctype/salary_structure/salary_structure.js +++ b/erpnext/hr/doctype/salary_structure/salary_structure.js @@ -246,7 +246,7 @@ frappe.ui.form.on('Salary Detail', { frappe.model.set_value(cdt, cdn, 'amount', result.amount); } frappe.model.set_value(cdt, cdn, 'statistical_component', result.statistical_component); - frappe.model.set_value(cdt, cdn, 'depends_on_lwp', result.depends_on_lwp); + frappe.model.set_value(cdt, cdn, 'depends_on_payment_days', result.depends_on_payment_days); frappe.model.set_value(cdt, cdn, 'do_not_include_in_total', result.do_not_include_in_total); frappe.model.set_value(cdt, cdn, 'variable_based_on_taxable_salary', result.variable_based_on_taxable_salary); frappe.model.set_value(cdt, cdn, 'is_tax_applicable', result.is_tax_applicable); diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.py b/erpnext/hr/doctype/salary_structure/salary_structure.py index 202ae9bcfe5..26efd00d473 100644 --- a/erpnext/hr/doctype/salary_structure/salary_structure.py +++ b/erpnext/hr/doctype/salary_structure/salary_structure.py @@ -18,7 +18,7 @@ class SalaryStructure(Document): self.validate_max_benefits_with_flexi() def set_missing_values(self): - overwritten_fields = ["depends_on_lwp", "variable_based_on_taxable_salary", "is_tax_applicable", "is_flexible_benefit"] + overwritten_fields = ["depends_on_payment_days", "variable_based_on_taxable_salary", "is_tax_applicable", "is_flexible_benefit"] overwritten_fields_if_missing = ["amount_based_on_formula", "formula", "amount"] for table in ["earnings", "deductions"]: for d in self.get(table): @@ -126,7 +126,7 @@ def create_salary_structures_assignment(employee, salary_structure, from_date, b def get_existing_assignments(employees, salary_structure,from_date): salary_structures_assignments = frappe.db.sql_list(""" - select distinct employee from `tabSalary Structure Assignment` + select distinct employee from `tabSalary Structure Assignment` where salary_structure=%s and employee in (%s) and from_date=%s and docstatus=1 """ % ('%s', ', '.join(['%s']*len(employees)),'%s'), [salary_structure] + employees+[from_date]) diff --git a/erpnext/hr/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json b/erpnext/hr/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json index 20c7d232494..ceaf4a6ac71 100644 --- a/erpnext/hr/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json +++ b/erpnext/hr/print_format/salary_slip_based_on_timesheet/salary_slip_based_on_timesheet.json @@ -1,18 +1,18 @@ { - "creation": "2016-07-07 12:38:32.447281", - "custom_format": 0, - "disabled": 0, - "doc_type": "Salary Slip", - "docstatus": 0, - "doctype": "Print Format", - "font": "Default", - "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"HTML\", \"options\": \"

{{doc.name}}


\"}, {\"fieldtype\": \"Section Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"employee\"}, {\"print_hide\": 0, \"fieldname\": \"employee_name\"}, {\"print_hide\": 0, \"fieldname\": \"department\"}, {\"print_hide\": 0, \"fieldname\": \"designation\"}, {\"print_hide\": 0, \"fieldname\": \"branch\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"start_date\"}, {\"print_hide\": 0, \"fieldname\": \"end_date\"}, {\"print_hide\": 0, \"fieldname\": \"total_working_hours\"}, {\"print_hide\": 0, \"fieldname\": \"hour_rate\"}, {\"fieldtype\": \"Section Break\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"time_sheet\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"working_hours\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"timesheets\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Section Break\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"salary_component\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"depends_on_lwp\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"earnings\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"salary_component\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"depends_on_lwp\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"deductions\"}, {\"fieldtype\": \"Section Break\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"gross_pay\"}, {\"print_hide\": 0, \"fieldname\": \"total_deduction\"}, {\"print_hide\": 0, \"fieldname\": \"net_pay\"}, {\"print_hide\": 0, \"fieldname\": \"rounded_total\"}, {\"print_hide\": 0, \"fieldname\": \"total_in_words\"}]", - "idx": 0, - "modified": "2016-08-21 21:02:59.896033", - "modified_by": "Administrator", - "name": "Salary Slip based on Timesheet", - "owner": "Administrator", - "print_format_builder": 1, - "print_format_type": "Server", + "creation": "2016-07-07 12:38:32.447281", + "custom_format": 0, + "disabled": 0, + "doc_type": "Salary Slip", + "docstatus": 0, + "doctype": "Print Format", + "font": "Default", + "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"HTML\", \"options\": \"

{{doc.name}}


\"}, {\"fieldtype\": \"Section Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"employee\"}, {\"print_hide\": 0, \"fieldname\": \"employee_name\"}, {\"print_hide\": 0, \"fieldname\": \"department\"}, {\"print_hide\": 0, \"fieldname\": \"designation\"}, {\"print_hide\": 0, \"fieldname\": \"branch\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"start_date\"}, {\"print_hide\": 0, \"fieldname\": \"end_date\"}, {\"print_hide\": 0, \"fieldname\": \"total_working_hours\"}, {\"print_hide\": 0, \"fieldname\": \"hour_rate\"}, {\"fieldtype\": \"Section Break\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"time_sheet\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"working_hours\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"timesheets\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Section Break\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"salary_component\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"depends_on_payment_days\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"earnings\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"salary_component\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"depends_on_payment_days\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"deductions\"}, {\"fieldtype\": \"Section Break\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"gross_pay\"}, {\"print_hide\": 0, \"fieldname\": \"total_deduction\"}, {\"print_hide\": 0, \"fieldname\": \"net_pay\"}, {\"print_hide\": 0, \"fieldname\": \"rounded_total\"}, {\"print_hide\": 0, \"fieldname\": \"total_in_words\"}]", + "idx": 0, + "modified": "2016-08-21 21:02:59.896033", + "modified_by": "Administrator", + "name": "Salary Slip based on Timesheet", + "owner": "Administrator", + "print_format_builder": 1, + "print_format_type": "Server", "standard": "Yes" } \ No newline at end of file diff --git a/erpnext/hr/print_format/salary_slip_standard/salary_slip_standard.json b/erpnext/hr/print_format/salary_slip_standard/salary_slip_standard.json index 9f299df0ed3..b01239fe02d 100644 --- a/erpnext/hr/print_format/salary_slip_standard/salary_slip_standard.json +++ b/erpnext/hr/print_format/salary_slip_standard/salary_slip_standard.json @@ -1,22 +1,22 @@ { - "align_labels_right": 0, - "creation": "2016-07-07 11:45:14.872204", - "custom_format": 0, - "disabled": 0, - "doc_type": "Salary Slip", - "docstatus": 0, - "doctype": "Print Format", - "font": "Default", - "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"

{{doc.name}}

\\n
\\n
\\n
\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"employee\", \"label\": \"Employee\"}, {\"print_hide\": 0, \"fieldname\": \"company\", \"label\": \"Company\"}, {\"print_hide\": 0, \"fieldname\": \"employee_name\", \"label\": \"Employee Name\"}, {\"print_hide\": 0, \"fieldname\": \"department\", \"label\": \"Department\"}, {\"print_hide\": 0, \"fieldname\": \"designation\", \"label\": \"Designation\"}, {\"print_hide\": 0, \"fieldname\": \"branch\", \"label\": \"Branch\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"start_date\", \"label\": \"Start Date\"}, {\"print_hide\": 0, \"fieldname\": \"end_date\", \"label\": \"End Date\"}, {\"print_hide\": 0, \"fieldname\": \"total_working_days\", \"label\": \"Working Days\"}, {\"print_hide\": 0, \"fieldname\": \"leave_without_pay\", \"label\": \"Leave Without Pay\"}, {\"print_hide\": 0, \"fieldname\": \"payment_days\", \"label\": \"Payment Days\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"salary_component\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"earnings\", \"label\": \"Earnings\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"salary_component\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"depends_on_lwp\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"deductions\", \"label\": \"Deductions\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"gross_pay\", \"label\": \"Gross Pay\"}, {\"print_hide\": 0, \"fieldname\": \"total_deduction\", \"label\": \"Total Deduction\"}, {\"print_hide\": 0, \"fieldname\": \"net_pay\", \"label\": \"Net Pay\"}, {\"print_hide\": 0, \"fieldname\": \"rounded_total\", \"label\": \"Rounded Total\"}, {\"print_hide\": 0, \"fieldname\": \"total_in_words\", \"label\": \"Total in words\"}]", - "idx": 0, - "line_breaks": 0, - "modified": "2018-07-24 19:31:39.040701", - "modified_by": "Administrator", - "module": "HR", - "name": "Salary Slip Standard", - "owner": "Administrator", - "print_format_builder": 1, - "print_format_type": "Server", - "show_section_headings": 0, + "align_labels_right": 0, + "creation": "2016-07-07 11:45:14.872204", + "custom_format": 0, + "disabled": 0, + "doc_type": "Salary Slip", + "docstatus": 0, + "doctype": "Print Format", + "font": "Default", + "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"

{{doc.name}}

\\n
\\n
\\n
\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"employee\", \"label\": \"Employee\"}, {\"print_hide\": 0, \"fieldname\": \"company\", \"label\": \"Company\"}, {\"print_hide\": 0, \"fieldname\": \"employee_name\", \"label\": \"Employee Name\"}, {\"print_hide\": 0, \"fieldname\": \"department\", \"label\": \"Department\"}, {\"print_hide\": 0, \"fieldname\": \"designation\", \"label\": \"Designation\"}, {\"print_hide\": 0, \"fieldname\": \"branch\", \"label\": \"Branch\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"start_date\", \"label\": \"Start Date\"}, {\"print_hide\": 0, \"fieldname\": \"end_date\", \"label\": \"End Date\"}, {\"print_hide\": 0, \"fieldname\": \"total_working_days\", \"label\": \"Working Days\"}, {\"print_hide\": 0, \"fieldname\": \"leave_without_pay\", \"label\": \"Leave Without Pay\"}, {\"print_hide\": 0, \"fieldname\": \"payment_days\", \"label\": \"Payment Days\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"salary_component\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"earnings\", \"label\": \"Earnings\"}, {\"fieldtype\": \"Column Break\"}, {\"visible_columns\": [{\"print_hide\": 0, \"fieldname\": \"salary_component\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"amount\", \"print_width\": \"\"}, {\"print_hide\": 0, \"fieldname\": \"depends_on_payment_days\", \"print_width\": \"\"}], \"print_hide\": 0, \"fieldname\": \"deductions\", \"label\": \"Deductions\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldtype\": \"Column Break\"}, {\"print_hide\": 0, \"fieldname\": \"gross_pay\", \"label\": \"Gross Pay\"}, {\"print_hide\": 0, \"fieldname\": \"total_deduction\", \"label\": \"Total Deduction\"}, {\"print_hide\": 0, \"fieldname\": \"net_pay\", \"label\": \"Net Pay\"}, {\"print_hide\": 0, \"fieldname\": \"rounded_total\", \"label\": \"Rounded Total\"}, {\"print_hide\": 0, \"fieldname\": \"total_in_words\", \"label\": \"Total in words\"}]", + "idx": 0, + "line_breaks": 0, + "modified": "2018-07-24 19:31:39.040701", + "modified_by": "Administrator", + "module": "HR", + "name": "Salary Slip Standard", + "owner": "Administrator", + "print_format_builder": 1, + "print_format_type": "Server", + "show_section_headings": 0, "standard": "Yes" } \ No newline at end of file diff --git a/erpnext/patches.txt b/erpnext/patches.txt index e0002ab5bd5..6daa85fb85d 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -598,3 +598,4 @@ erpnext.patches.v12_0.move_item_tax_to_item_tax_template erpnext.patches.v11_1.set_variant_based_on erpnext.patches.v11_1.woocommerce_set_creation_user erpnext.patches.v11_1.set_salary_details_submittable +erpnext.patches.v11_1.rename_depends_on_lwp diff --git a/erpnext/patches/v11_1/rename_depends_on_lwp.py b/erpnext/patches/v11_1/rename_depends_on_lwp.py new file mode 100644 index 00000000000..20d8867e1d2 --- /dev/null +++ b/erpnext/patches/v11_1/rename_depends_on_lwp.py @@ -0,0 +1,13 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe import scrub +from frappe.model.utils.rename_field import rename_field + +def execute(): + for doctype in ("Salary Component", "Salary Detail"): + if "depends_on_lwp" in frappe.db.get_table_columns(doctype): + frappe.reload_doc("hr", "doctype", scrub(doctype)) + rename_field(doctype, "depends_on_lwp", "depends_on_payment_days") \ No newline at end of file diff --git a/erpnext/patches/v11_1/set_salary_details_submittable.py b/erpnext/patches/v11_1/set_salary_details_submittable.py index f4477d9fd6d..6d847ec3d05 100644 --- a/erpnext/patches/v11_1/set_salary_details_submittable.py +++ b/erpnext/patches/v11_1/set_salary_details_submittable.py @@ -7,5 +7,3 @@ def execute(): set sd.docstatus=1 where ss.name=sd.parent and ss.docstatus=1 and sd.parenttype='Salary Structure' """) - - diff --git a/erpnext/patches/v7_0/rename_salary_components.py b/erpnext/patches/v7_0/rename_salary_components.py index de92fc6083b..bc48e343174 100644 --- a/erpnext/patches/v7_0/rename_salary_components.py +++ b/erpnext/patches/v7_0/rename_salary_components.py @@ -5,79 +5,79 @@ from frappe.model.utils.rename_field import update_property_setters def execute(): if not frappe.db.exists("DocType", "Salary Structure Earning"): return - + frappe.reload_doc("hr", "doctype", "salary_detail") frappe.reload_doc("hr", "doctype", "salary_component") - + standard_cols = ["name", "creation", "modified", "owner", "modified_by", "parent", "parenttype", "parentfield", "idx"] - + dt_cols = { "Salary Structure Deduction": ["d_type", "d_modified_amt", "depend_on_lwp"], "Salary Structure Earning": ["e_type", "modified_value", "depend_on_lwp"], "Salary Slip Earning": ["e_type", "e_modified_amount", "e_depends_on_lwp", "e_amount"], "Salary Slip Deduction": ["d_type", "d_modified_amount", "d_depends_on_lwp", "d_amount"], } - + earning_type_exists = True if "earning_type" in frappe.db.get_table_columns("Salary Slip Earning") else False e_type_exists = True if "e_type" in frappe.db.get_table_columns("Salary Slip Earning") else False - - + + if e_type_exists and earning_type_exists: - frappe.db.sql("""update `tabSalary Slip Earning` + frappe.db.sql("""update `tabSalary Slip Earning` set e_type = earning_type, e_modified_amount = earning_amount where e_type is null and earning_type is not null""") - frappe.db.sql("""update `tabSalary Structure Earning` set e_type = earning_type + frappe.db.sql("""update `tabSalary Structure Earning` set e_type = earning_type where e_type is null and earning_type is not null""") - frappe.db.sql("""update `tabSalary Slip Deduction` set + frappe.db.sql("""update `tabSalary Slip Deduction` set d_type = deduction_type, d_modified_amount = deduction_amount where d_type is null and deduction_type is not null""") - frappe.db.sql("""update `tabSalary Structure Deduction` set d_type = deduction_type + frappe.db.sql("""update `tabSalary Structure Deduction` set d_type = deduction_type where d_type is null and deduction_type is not null""") - + if earning_type_exists and not e_type_exists: for val in dt_cols.values(): if val[0] == "e_type": val[0] = "earning_type" - + if val[0] == "d_type": val[0] = "deduction_type" - + if val[1] == "e_modified_amount": val[1] ="earning_amount" - + if val[1] == "d_modified_amount": val[1] ="deduction_amount" - - - target_cols = standard_cols + ["salary_component", "amount", "depends_on_lwp", "default_amount"] - target_cols = "`" + "`, `".join(target_cols) + "`" - - for doctype, cols in dt_cols.items(): + + + target_cols = standard_cols + ["salary_component", "amount", "depends_on_payment_days", "default_amount"] + target_cols = "`" + "`, `".join(target_cols) + "`" + + for doctype, cols in dt_cols.items(): source_cols = "`" + "`, `".join(standard_cols + cols) + "`" if len(cols) == 3: source_cols += ", 0" - - + + frappe.db.sql("""INSERT INTO `tabSalary Detail` ({0}) SELECT {1} FROM `tab{2}`""" .format(target_cols, source_cols, doctype)) - - + + dt_cols_de = { "Deduction Type": ["deduction_name", "description"], "Earning Type": ["earning_name", "description"], } - + standard_cols_de = standard_cols - + target_cols = standard_cols_de + ["salary_component", "description"] - target_cols = "`" + "`, `".join(target_cols) + "`" - - for doctype, cols in dt_cols_de.items(): + target_cols = "`" + "`, `".join(target_cols) + "`" + + for doctype, cols in dt_cols_de.items(): source_cols = "`" + "`, `".join(standard_cols_de + cols) + "`" try: frappe.db.sql("""INSERT INTO `tabSalary Component` ({0}) SELECT {1} FROM `tab{2}`""" @@ -85,10 +85,10 @@ def execute(): except Exception as e: if e.args[0]==1062: pass - + update_customizations() - - for doctype in ["Salary Structure Deduction", "Salary Structure Earning", "Salary Slip Earning", + + for doctype in ["Salary Structure Deduction", "Salary Structure Earning", "Salary Slip Earning", "Salary Slip Deduction", "Deduction Type", "Earning Type"] : frappe.delete_doc("DocType", doctype) @@ -96,35 +96,35 @@ def execute(): def update_customizations(): dt_cols = { "Salary Structure Deduction": { - "d_type": "salary_component", - "deduction_type": "salary_component", + "d_type": "salary_component", + "deduction_type": "salary_component", "d_modified_amt": "amount", - "depend_on_lwp": "depends_on_lwp" + "depend_on_lwp": "depends_on_payment_days" }, "Salary Structure Earning": { - "e_type": "salary_component", - "earning_type": "salary_component", + "e_type": "salary_component", + "earning_type": "salary_component", "modified_value": "amount", - "depend_on_lwp": "depends_on_lwp" + "depend_on_lwp": "depends_on_payment_days" }, "Salary Slip Earning": { - "e_type": "salary_component", - "earning_type": "salary_component", + "e_type": "salary_component", + "earning_type": "salary_component", "e_modified_amount": "amount", "e_amount" : "default_amount", - "e_depends_on_lwp": "depends_on_lwp" + "e_depends_on_lwp": "depends_on_payment_days" }, "Salary Slip Deduction": { - "d_type": "salary_component", - "deduction_type": "salary_component", + "d_type": "salary_component", + "deduction_type": "salary_component", "d_modified_amount": "amount", "d_amount" : "default_amount", - "d_depends_on_lwp": "depends_on_lwp" + "d_depends_on_lwp": "depends_on_payment_days" } } - + update_property_setters_and_custom_fields("Salary Detail", dt_cols) - + dt_cols = { "Earning Type": { "earning_name": "salary_component" @@ -133,17 +133,17 @@ def update_customizations(): "deduction_name": "salary_component" } } - + update_property_setters_and_custom_fields("Salary Component", dt_cols) - - - - + + + + def update_property_setters_and_custom_fields(new_dt, dt_cols): for doctype, cols in dt_cols.items(): frappe.db.sql("update `tabProperty Setter` set doc_type = %s where doc_type=%s", (new_dt, doctype)) frappe.db.sql("update `tabCustom Field` set dt = %s where dt=%s", (new_dt, doctype)) - - + + for old_fieldname, new_fieldname in cols.items(): update_property_setters(new_dt, old_fieldname, new_fieldname) From 270d4e9f4e4c163abe376d8324a575d28f63b133 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 19 Apr 2019 11:20:41 +0530 Subject: [PATCH 07/13] fix: moved erpnext related methods from frappe to erpnext --- erpnext/crm/doctype/lead/lead.py | 27 +++++++++++++++++++ .../crm/doctype/opportunity/opportunity.py | 21 +++++++++++++++ erpnext/public/js/communication.js | 6 ++--- erpnext/support/doctype/issue/issue.py | 17 ++++++++++++ 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index 442b6c2db2b..d42502dc3ba 100644 --- a/erpnext/crm/doctype/lead/lead.py +++ b/erpnext/crm/doctype/lead/lead.py @@ -10,6 +10,7 @@ from frappe.model.mapper import get_mapped_doc from erpnext.controllers.selling_controller import SellingController from frappe.contacts.address_and_contact import load_address_and_contact from erpnext.accounts.party import set_taxes +from frappe.email.inbox import link_communication_to_document sender_field = "email_id" @@ -199,3 +200,29 @@ def get_lead_details(lead, posting_date=None, company=None): out['taxes_and_charges'] = taxes_and_charges return out + +@frappe.whitelist() +def make_lead_from_communication(communication, ignore_communication_links=False): + """ raise a issue from email """ + + doc = frappe.get_doc("Communication", communication) + lead_name = None + if doc.sender: + lead_name = frappe.db.get_value("Lead", {"email_id": doc.sender}) + if not lead_name and doc.phone_no: + lead_name = frappe.db.get_value("Lead", {"mobile_no": doc.phone_no}) + if not lead_name: + lead = frappe.get_doc({ + "doctype": "Lead", + "lead_name": doc.sender_full_name, + "email_id": doc.sender, + "mobile_no": doc.phone_no + }) + lead.flags.ignore_mandatory = True + lead.flags.ignore_permissions = True + lead.insert() + + lead_name = lead.name + + link_communication_to_document(doc, "Lead", lead_name, ignore_communication_links) + return lead_name \ No newline at end of file diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py index 2e02e75b739..4d4593641a8 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.py +++ b/erpnext/crm/doctype/opportunity/opportunity.py @@ -10,6 +10,7 @@ from erpnext.setup.utils import get_exchange_rate from erpnext.utilities.transaction_base import TransactionBase from erpnext.accounts.party import get_party_account_currency from frappe.desk.form import assign_to +from frappe.email.inbox import link_communication_to_document subject_field = "title" sender_field = "contact_email" @@ -349,3 +350,23 @@ def assign_to_user(doc, subject_field): "name": doc.name, "description": doc.get(subject_field) }) +@frappe.whitelist() +def make_opportunity_from_communication(communication, ignore_communication_links=False): + from erpnext.crm.doctype.lead.lead import make_lead_from_communication + doc = frappe.get_doc("Communication", communication) + + lead = doc.reference_name if doc.reference_doctype == "Lead" else None + if not lead: + lead = make_lead_from_communication(communication, ignore_communication_links=True) + + enquiry_from = "Lead" + + opportunity = frappe.get_doc({ + "doctype": "Opportunity", + "enquiry_from": enquiry_from, + "lead": lead + }).insert(ignore_permissions=True) + + link_communication_to_document(doc, "Opportunity", opportunity.name, ignore_communication_links) + + return opportunity.name diff --git a/erpnext/public/js/communication.js b/erpnext/public/js/communication.js index 49701b88b61..5316eb45b5b 100644 --- a/erpnext/public/js/communication.js +++ b/erpnext/public/js/communication.js @@ -33,7 +33,7 @@ frappe.ui.form.on("Communication", { make_lead_from_communication: (frm) => { return frappe.call({ - method: "frappe.email.inbox.make_lead_from_communication", + method: "erpnext.crm.doctype.lead.lead.make_lead_from_communication", args: { communication: frm.doc.name }, @@ -48,7 +48,7 @@ frappe.ui.form.on("Communication", { make_issue_from_communication: (frm) => { return frappe.call({ - method: "frappe.email.inbox.make_issue_from_communication", + method: "erpnext.support.doctype.issue.issue.make_issue_from_communication", args: { communication: frm.doc.name }, @@ -63,7 +63,7 @@ frappe.ui.form.on("Communication", { make_opportunity_from_communication: (frm) => { return frappe.call({ - method: "frappe.email.inbox.make_opportunity_from_communication", + method: "erpnext.crm.doctype.opportunity.opportunity.make_opportunity_from_communication", args: { communication: frm.doc.name }, diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py index 01677ae34c4..d626def6655 100644 --- a/erpnext/support/doctype/issue/issue.py +++ b/erpnext/support/doctype/issue/issue.py @@ -13,6 +13,7 @@ from frappe.model.mapper import get_mapped_doc from frappe.utils.user import is_website_user from ..service_level_agreement.service_level_agreement import get_active_service_level_agreement_for from erpnext.crm.doctype.opportunity.opportunity import assign_to_user +from frappe.email.inbox import link_communication_to_document sender_field = "raised_by" @@ -294,3 +295,19 @@ def make_task(source_name, target_doc=None): "doctype": "Task" } }, target_doc) +@frappe.whitelist() +def make_issue_from_communication(communication, ignore_communication_links=False): + """ raise a issue from email """ + + doc = frappe.get_doc("Communication", communication) + issue = frappe.get_doc({ + "doctype": "Issue", + "subject": doc.subject, + "communication_medium": doc.communication_medium, + "raised_by": doc.sender or "", + "raised_by_phone": doc.phone_no or "" + }).insert(ignore_permissions=True) + + link_communication_to_document(doc, "Issue", issue.name, ignore_communication_links) + + return issue.name From 15a7b7ce710ef689c7d16c0fd12bd8098813162c Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Mon, 22 Apr 2019 15:22:36 +0530 Subject: [PATCH 08/13] fix: GSTR 3b report fixes (#17317) * fix: GSTR-3b report total taxable value fixes * fix: Test Cases --- erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py | 8 +++++++- .../doctype/gstr_3b_report/test_gstr_3b_report.py | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py index a9aa1d58be2..7faabf43ec9 100644 --- a/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py +++ b/erpnext/regional/doctype/gstr_3b_report/gstr_3b_report.py @@ -227,12 +227,18 @@ class GSTR3BReport(Document): for d in inter_state_supply.get("Unregistered", []): self.report_dict["inter_sup"]["unreg_details"].append(d) + self.report_dict["sup_details"]["osup_det"]["txval"] += d["txval"] + self.report_dict["sup_details"]["osup_det"]["iamt"] += d["iamt"] for d in inter_state_supply.get("Registered Composition", []): self.report_dict["inter_sup"]["comp_details"].append(d) + self.report_dict["sup_details"]["osup_det"]["txval"] += d["txval"] + self.report_dict["sup_details"]["osup_det"]["iamt"] += d["iamt"] for d in inter_state_supply.get("UIN Holders", []): self.report_dict["inter_sup"]["uin_details"].append(d) + self.report_dict["sup_details"]["osup_det"]["txval"] += d["txval"] + self.report_dict["sup_details"]["osup_det"]["iamt"] += d["iamt"] def get_total_taxable_value(self, doctype, reverse_charge): @@ -296,7 +302,7 @@ class GSTR3BReport(Document): inter_state_supply_details[d.gst_category].append({ "pos": get_state_code(d.gst_state), - "txval": d.total, + "txval": d.total - d.tax_amount, "iamt": d.tax_amount }) diff --git a/erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py b/erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py index d50eaebefcd..466710754ab 100644 --- a/erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py +++ b/erpnext/regional/doctype/gstr_3b_report/test_gstr_3b_report.py @@ -57,7 +57,7 @@ class TestGSTR3BReport(unittest.TestCase): output = json.loads(report.json_output) - self.assertEqual(output["sup_details"]["osup_det"]["iamt"], 18), + self.assertEqual(output["sup_details"]["osup_det"]["iamt"], 36), self.assertEqual(output["sup_details"]["osup_zero"]["iamt"], 18), self.assertEqual(output["inter_sup"]["unreg_details"][0]["iamt"], 18), self.assertEqual(output["sup_details"]["osup_nil_exmp"]["txval"], 100), From 3bf71cc18e6e6237cc5d5d987d3aa9ea878e1cdf Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 22 Apr 2019 15:24:28 +0530 Subject: [PATCH 09/13] fix(splash): revert to old image --- erpnext/hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index d8532fa1167..608e8b2225e 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -74,7 +74,7 @@ website_generators = ["Item Group", "Item", "BOM", "Sales Partner", website_context = { "favicon": "/assets/erpnext/images/favicon.png", - "splash_image": "/assets/erpnext/images/erpnext-12.svg" + "splash_image": "/assets/erpnext/images/erp-icon.svg" } website_route_rules = [ From 28a7aec124ed9a67c5dcdcb3be6f9296aa71c881 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 22 Apr 2019 15:35:13 +0530 Subject: [PATCH 10/13] Update accounting.py --- erpnext/config/accounting.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/config/accounting.py b/erpnext/config/accounting.py index 4a04f267bc1..39d625e3d0f 100644 --- a/erpnext/config/accounting.py +++ b/erpnext/config/accounting.py @@ -82,7 +82,7 @@ def get_data(): "type": "doctype", "name": "Payment Term", "description": _("Payment Terms based on conditions") - } + }, # Reports { From 2ef70223859ea262dd75b52af1cdd84232d166bc Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Mon, 22 Apr 2019 19:25:18 +0530 Subject: [PATCH 11/13] fix: Remove print statements (#17333) --- erpnext/regional/report/irs_1099/irs_1099.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/erpnext/regional/report/irs_1099/irs_1099.py b/erpnext/regional/report/irs_1099/irs_1099.py index 0cb4a3a360e..67834d12210 100644 --- a/erpnext/regional/report/irs_1099/irs_1099.py +++ b/erpnext/regional/report/irs_1099/irs_1099.py @@ -97,9 +97,7 @@ def irs_1099_print(filters): row["recipient_street_address"], row["recipient_city_state"] = get_street_address_html("Supplier", row.supplier) row["payments"] = fmt_money(row["payments"], precision=0, currency="USD") frappe._dict(row) - print(row) pdf = get_pdf(render_template(template, row), output=output if output else None) - print(pdf) frappe.local.response.filename = filters.fiscal_year + " " + filters.company + " IRS 1099 Forms" frappe.local.response.filecontent = read_multi_pdf(output) frappe.local.response.type = "download" From 77b82894ff556b5e8c8a0e2182adcdb53887bc64 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 23 Apr 2019 07:57:15 +0530 Subject: [PATCH 12/13] fix(style): buttons in address and contact --- erpnext/public/js/templates/address_list.html | 4 ++-- erpnext/public/js/templates/contact_list.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/public/js/templates/address_list.html b/erpnext/public/js/templates/address_list.html index 0bc86edb082..2379ef6b487 100644 --- a/erpnext/public/js/templates/address_list.html +++ b/erpnext/public/js/templates/address_list.html @@ -9,7 +9,7 @@ ({%= __("Shipping") %}){% } %} {%= __("Edit") %}

@@ -19,5 +19,5 @@ {% if(!addr_list.length) { %}

{%= __("No address added yet.") %}

{% } %} -

+

diff --git a/erpnext/public/js/templates/contact_list.html b/erpnext/public/js/templates/contact_list.html index 21448939616..893b4e0ec20 100644 --- a/erpnext/public/js/templates/contact_list.html +++ b/erpnext/public/js/templates/contact_list.html @@ -10,7 +10,7 @@ – {%= contact_list[i].designation %} {% } %} {%= __("Edit") %}

@@ -33,6 +33,6 @@ {% if(!contact_list.length) { %}

{%= __("No contacts added yet.") %}

{% } %} -

\ No newline at end of file From cb2c13fa50f499a622ca2527d0e1022f0ff86629 Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Tue, 23 Apr 2019 17:29:59 +0530 Subject: [PATCH 13/13] fix: Stock Ledger report fix (#17343) --- erpnext/stock/report/stock_ledger/stock_ledger.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py index 20b5e45e19c..70da5b5980a 100644 --- a/erpnext/stock/report/stock_ledger/stock_ledger.py +++ b/erpnext/stock/report/stock_ledger/stock_ledger.py @@ -154,10 +154,10 @@ def get_opening_balance(filters, columns): "posting_date": filters.from_date, "posting_time": "00:00:00" }) - row = [""]*len(columns) - row[1] = _("'Opening'") - for i, v in ((9, 'qty_after_transaction'), (11, 'valuation_rate'), (12, 'stock_value')): - row[i] = last_entry.get(v, 0) + row = {} + row["item_code"] = _("'Opening'") + for dummy, v in ((9, 'qty_after_transaction'), (11, 'valuation_rate'), (12, 'stock_value')): + row[v] = last_entry.get(v, 0) return row