From c9aa7268187748c0cbb5189768d463b71b9880f5 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 16 Sep 2020 20:30:24 +0530 Subject: [PATCH 01/53] feat: Tax deduction against advance payments --- .../advance_taxes_and_charges/__init__.py | 0 .../advance_taxes_and_charges.json | 201 ++++++++++++++++++ .../advance_taxes_and_charges.py | 10 + 3 files changed, 211 insertions(+) create mode 100644 erpnext/accounts/doctype/advance_taxes_and_charges/__init__.py create mode 100644 erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json create mode 100644 erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.py diff --git a/erpnext/accounts/doctype/advance_taxes_and_charges/__init__.py b/erpnext/accounts/doctype/advance_taxes_and_charges/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json new file mode 100644 index 0000000000..79eda8c5fe --- /dev/null +++ b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json @@ -0,0 +1,201 @@ +{ + "actions": [], + "creation": "2020-09-12 22:26:19.594367", + "doctype": "DocType", + "document_type": "Setup", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "add_deduct_tax", + "charge_type", + "row_id", + "account_head", + "col_break_1", + "description", + "accounting_dimensions_section", + "cost_center", + "dimension_col_break", + "section_break_8", + "rate", + "section_break_9", + "tax_amount", + "total", + "column_break_13", + "base_tax_amount", + "base_total" + ], + "fields": [ + { + "columns": 2, + "fieldname": "charge_type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Type", + "oldfieldname": "charge_type", + "oldfieldtype": "Select", + "options": "\nActual\nOn Paid Amount\nOn Previous Row Amount\nOn Previous Row Total", + "reqd": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "depends_on": "eval:[\"On Previous Row Amount\", \"On Previous Row Total\"].indexOf(doc.charge_type)!==-1", + "fieldname": "row_id", + "fieldtype": "Data", + "label": "Reference Row #", + "oldfieldname": "row_id", + "oldfieldtype": "Data", + "show_days": 1, + "show_seconds": 1 + }, + { + "columns": 2, + "fieldname": "account_head", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Account Head", + "oldfieldname": "account_head", + "oldfieldtype": "Link", + "options": "Account", + "reqd": 1, + "search_index": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "col_break_1", + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1, + "width": "50%" + }, + { + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Description", + "oldfieldname": "description", + "oldfieldtype": "Small Text", + "print_width": "300px", + "reqd": 1, + "show_days": 1, + "show_seconds": 1, + "width": "300px" + }, + { + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions", + "show_days": 1, + "show_seconds": 1 + }, + { + "default": ":Company", + "fieldname": "cost_center", + "fieldtype": "Link", + "label": "Cost Center", + "oldfieldname": "cost_center_other_charges", + "oldfieldtype": "Link", + "options": "Cost Center", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "section_break_8", + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "columns": 2, + "fieldname": "rate", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Rate", + "oldfieldname": "rate", + "oldfieldtype": "Currency", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "section_break_9", + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "columns": 2, + "fieldname": "tax_amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Amount", + "options": "currency", + "show_days": 1, + "show_seconds": 1 + }, + { + "columns": 2, + "fieldname": "total", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Total", + "options": "currency", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "column_break_13", + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "base_tax_amount", + "fieldtype": "Currency", + "label": "Amount (Company Currency)", + "oldfieldname": "tax_amount", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "base_total", + "fieldtype": "Currency", + "label": "Total (Company Currency)", + "oldfieldname": "total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "add_deduct_tax", + "fieldtype": "Select", + "label": "Add Or Deduct", + "options": "Add\nDeduct", + "reqd": 1, + "show_days": 1, + "show_seconds": 1 + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2020-09-12 22:30:36.150935", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Advance Taxes and Charges", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "ASC" +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.py b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.py new file mode 100644 index 0000000000..597d2ccc62 --- /dev/null +++ b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +# import frappe +from frappe.model.document import Document + +class AdvanceTaxesandCharges(Document): + pass From 61c5e478afada33b5d8ffe43fc174d345f581e03 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 1 Oct 2020 13:56:55 +0530 Subject: [PATCH 02/53] feat: Tax deduction against advance payments --- .../doctype/payment_entry/payment_entry.js | 137 ++++++- .../doctype/payment_entry/payment_entry.json | 358 ++++++++++++++---- .../doctype/payment_entry/payment_entry.py | 114 +++++- .../payment_entry_deduction.json | 196 +++------- erpnext/controllers/accounts_controller.py | 10 + erpnext/public/js/controllers/accounts.js | 2 +- 6 files changed, 607 insertions(+), 210 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index b80e8ada38..29e4a31dad 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -3,6 +3,8 @@ {% include "erpnext/public/js/controllers/accounts.js" %} frappe.provide("erpnext.accounts.dimensions"); +cur_frm.cscript.tax_table = "Advance Taxes and Charges"; + frappe.ui.form.on('Payment Entry', { onload: function(frm) { if(frm.doc.__islocal) { @@ -182,6 +184,8 @@ frappe.ui.form.on('Payment Entry', { frm.doc.paid_from_account_currency != frm.doc.paid_to_account_currency)); frm.toggle_display("base_paid_amount", frm.doc.paid_from_account_currency != company_currency); + frm.toggle_display("base_total_taxes_and_charges", frm.doc.total_taxes_and_charges && + (frm.doc.paid_from_account_currency != company_currency)); frm.toggle_display("base_received_amount", ( frm.doc.paid_to_account_currency != company_currency @@ -843,12 +847,12 @@ frappe.ui.form.on('Payment Entry', { if(frm.doc.payment_type == "Receive" && frm.doc.base_total_allocated_amount < frm.doc.base_received_amount + total_deductions && frm.doc.total_allocated_amount < frm.doc.paid_amount + (total_deductions / frm.doc.source_exchange_rate)) { - unallocated_amount = (frm.doc.base_received_amount + total_deductions - - frm.doc.base_total_allocated_amount) / frm.doc.source_exchange_rate; + unallocated_amount = (frm.doc.base_received_amount + total_deductions + frm.doc.base_total_taxes_and_charges + + frm.doc.base_total_allocated_amount) / frm.doc.source_exchange_rate; } else if (frm.doc.payment_type == "Pay" && frm.doc.base_total_allocated_amount < frm.doc.base_paid_amount - total_deductions && frm.doc.total_allocated_amount < frm.doc.received_amount + (total_deductions / frm.doc.target_exchange_rate)) { - unallocated_amount = (frm.doc.base_paid_amount - (total_deductions + unallocated_amount = (frm.doc.base_paid_amount + frm.doc.base_total_taxes_and_charges - (total_deductions + frm.doc.base_total_allocated_amount)) / frm.doc.target_exchange_rate; } } @@ -874,7 +878,8 @@ frappe.ui.form.on('Payment Entry', { var total_deductions = frappe.utils.sum($.map(frm.doc.deductions || [], function(d) { return flt(d.amount) })); - frm.set_value("difference_amount", difference_amount - total_deductions); + frm.set_value("difference_amount", difference_amount - total_deductions + + frm.doc.base_total_taxes_and_charges); frm.events.hide_unhide_fields(frm); }, @@ -1002,7 +1007,107 @@ frappe.ui.form.on('Payment Entry', { } }); } - } + }, + + sales_taxes_and_charges_template: function(frm) { + frm.trigger('fetch_taxes_from_template'); + }, + + purchase_taxes_and_charges_template: function(frm) { + frm.trigger('fetch_taxes_from_template'); + }, + + fetch_taxes_from_template: function(frm) { + let master_doctype = ''; + let taxes_and_charges = ''; + + if (frm.doc.party_type == 'Supplier') { + master_doctype = 'Purchase Taxes and Charges Template'; + taxes_and_charges = frm.doc.purchase_taxes_and_charges_template; + } else if (frm.doc.party_type == 'Customer') { + master_doctype = 'Sales Taxes and Charges Template'; + taxes_and_charges = frm.doc.sales_taxes_and_charges_template; + } + + if (!taxes_and_charges) { + return; + } + + frappe.call({ + method: "erpnext.controllers.accounts_controller.get_taxes_and_charges", + args: { + "master_doctype": master_doctype, + "master_name": taxes_and_charges + }, + callback: function(r) { + if(!r.exc && r.message) { + // set taxes table + if(r.message) { + for (let tax of r.message) { + if (tax.charge_type === 'On Net Total') { + tax.charge_type = 'On Paid Amount'; + } + me.frm.add_child("taxes", tax); + } + frm.trigger('calculate_taxes'); + frm.events.set_unallocated_amount(frm); + } + } + } + }); + }, + + calculate_taxes: function(frm) { + frm.doc.total_taxes_and_charges = 0.0; + frm.doc.base_total_taxes_and_charges = 0.0; + + $.each(me.frm.doc["taxes"] || [], function(i, tax) { + let tax_rate = tax.rate; + let current_tax_amount = 0.0; + + // To set row_id by default as previous row. + if(["On Previous Row Amount", "On Previous Row Total"].includes(tax.charge_type)) { + if (tax.idx === 1) { + frappe.throw(__("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")); + } + if (!tax.row_id) { + tax.row_id = tax.idx - 1; + } + } + + if(tax.charge_type == "Actual") { + current_tax_amount = flt(tax.tax_amount, precision("tax_amount", tax)); + } else if(tax.charge_type == "On Paid Amount") { + current_tax_amount = (tax_rate / 100.0) * frm.doc.paid_amount; + } else if(tax.charge_type == "On Previous Row Amount") { + current_tax_amount = (tax_rate / 100.0) * + frm.doc["taxes"][cint(tax.row_id) - 1].tax_amount; + + } else if(tax.charge_type == "On Previous Row Total") { + current_tax_amount = (tax_rate / 100.0) * + frm.doc["taxes"][cint(tax.row_id) - 1].total; + } + + tax.tax_amount = current_tax_amount; + tax.base_tax_amount = tax.tax_amount * frm.doc.source_exchange_rate; + + current_tax_amount *= (tax.add_deduct_tax == "Deduct") ? -1.0 : 1.0; + + if(i==0) { + tax.total = flt(frm.doc.paid_amount + current_tax_amount, precision("total", tax)); + } else { + tax.total = flt(frm.doc["taxes"][i-1].total + current_tax_amount, precision("total", tax)); + } + + tax.base_total = tax.total * frm.doc.source_exchange_rate; + frm.doc.total_taxes_and_charges += current_tax_amount; + frm.doc.base_total_taxes_and_charges += current_tax_amount * frm.doc.source_exchange_rate; + + frm.refresh_field('taxes'); + frm.refresh_field('total_taxes_and_charges'); + frm.refresh_field('base_total_taxes_and_charges'); + }); + }, }); @@ -1049,6 +1154,28 @@ frappe.ui.form.on('Payment Entry Reference', { } }) +frappe.ui.form.on('Advance Taxes and Charges', { + rate: function(frm) { + frm.events.calculate_taxes(frm); + frm.events.set_unallocated_amount(frm); + }, + + tax_amount : function(frm) { + frm.events.calculate_taxes(frm); + frm.events.set_unallocated_amount(frm); + }, + + row_id: function(frm) { + frm.events.calculate_taxes(frm); + frm.events.set_unallocated_amount(frm); + }, + + taxes_remove: function(frm) { + frm.events.calculate_taxes(frm); + frm.events.set_unallocated_amount(frm); + } +}) + frappe.ui.form.on('Payment Entry Deduction', { amount: function(frm) { frm.events.set_unallocated_amount(frm); diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 328584a61a..11ae17093f 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -24,6 +24,10 @@ "party_bank_account", "contact_person", "contact_email", + "tds_details_section", + "tax_withholding_category", + "column_break_20", + "apply_tax_withholding_amount", "payment_accounts_section", "party_balance", "paid_from", @@ -52,6 +56,12 @@ "unallocated_amount", "difference_amount", "write_off_difference_amount", + "taxes_and_charges_section", + "purchase_taxes_and_charges_template", + "sales_taxes_and_charges_template", + "taxes", + "base_total_taxes_and_charges", + "total_taxes_and_charges", "deductions_or_loss_section", "deductions", "transaction_references", @@ -82,7 +92,9 @@ { "fieldname": "type_of_payment", "fieldtype": "Section Break", - "label": "Type of Payment" + "label": "Type of Payment", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -92,7 +104,9 @@ "options": "ACC-PAY-.YYYY.-", "print_hide": 1, "reqd": 1, - "set_only_once": 1 + "set_only_once": 1, + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -103,11 +117,15 @@ "label": "Payment Type", "options": "Receive\nPay\nInternal Transfer", "print_hide": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_5", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -116,7 +134,9 @@ "fieldtype": "Date", "in_list_view": 1, "label": "Posting Date", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "company", @@ -125,26 +145,34 @@ "options": "Company", "print_hide": 1, "remember_last_selected_value": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "cost_center", "fieldtype": "Link", "label": "Cost Center", - "options": "Cost Center" + "options": "Cost Center", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "mode_of_payment", "fieldtype": "Link", "in_list_view": 1, "label": "Mode of Payment", - "options": "Mode of Payment" + "options": "Mode of Payment", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:in_list([\"Receive\", \"Pay\"], doc.payment_type)", "fieldname": "party_section", "fieldtype": "Section Break", - "label": "Payment From / To" + "label": "Payment From / To", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:in_list([\"Receive\", \"Pay\"], doc.payment_type) && doc.docstatus==0", @@ -154,7 +182,9 @@ "label": "Party Type", "options": "DocType", "print_hide": 1, - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -163,7 +193,9 @@ "fieldtype": "Dynamic Link", "in_standard_filter": 1, "label": "Party", - "options": "party_type" + "options": "party_type", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -171,18 +203,24 @@ "fieldname": "party_name", "fieldtype": "Data", "in_global_search": 1, - "label": "Party Name" + "label": "Party Name", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_11", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "party", "fieldname": "contact_person", "fieldtype": "Link", "label": "Contact", - "options": "Contact" + "options": "Contact", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "contact_person", @@ -190,13 +228,17 @@ "fieldtype": "Data", "label": "Email", "options": "Email", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "payment_accounts_section", "fieldtype": "Section Break", - "label": "Accounts" + "label": "Accounts", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "party", @@ -204,7 +246,9 @@ "fieldtype": "Currency", "label": "Party Balance", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -215,7 +259,9 @@ "label": "Account Paid From", "options": "Account", "print_hide": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "paid_from", @@ -225,7 +271,9 @@ "options": "Currency", "print_hide": 1, "read_only": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "paid_from", @@ -234,11 +282,15 @@ "label": "Account Balance", "options": "paid_from_account_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_18", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:(in_list([\"Internal Transfer\", \"Receive\"], doc.payment_type) || doc.party)", @@ -248,7 +300,9 @@ "label": "Account Paid To", "options": "Account", "print_hide": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "paid_to", @@ -258,7 +312,9 @@ "options": "Currency", "print_hide": 1, "read_only": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "paid_to", @@ -267,13 +323,17 @@ "label": "Account Balance", "options": "paid_to_account_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:(doc.paid_to && doc.paid_from)", "fieldname": "payment_amounts_section", "fieldtype": "Section Break", - "label": "Amount" + "label": "Amount", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -281,14 +341,18 @@ "fieldtype": "Currency", "label": "Paid Amount", "options": "paid_from_account_currency", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "source_exchange_rate", "fieldtype": "Float", "label": "Exchange Rate", "print_hide": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_paid_amount", @@ -297,11 +361,15 @@ "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_21", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -310,14 +378,18 @@ "label": "Received Amount", "options": "paid_to_account_currency", "print_hide": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "target_exchange_rate", "fieldtype": "Float", "label": "Exchange Rate", "print_hide": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_received_amount", @@ -326,30 +398,40 @@ "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:(doc.party && doc.paid_from && doc.paid_to && doc.paid_amount && doc.received_amount)", "fieldname": "section_break_14", "fieldtype": "Section Break", - "label": "Reference" + "label": "Reference", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.docstatus==0", "fieldname": "get_outstanding_invoice", "fieldtype": "Button", - "label": "Get Outstanding Invoice" + "label": "Get Outstanding Invoice", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "references", "fieldtype": "Table", "label": "Payment References", - "options": "Payment Entry Reference" + "options": "Payment Entry Reference", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_34", "fieldtype": "Section Break", - "label": "Writeoff" + "label": "Writeoff", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -358,7 +440,9 @@ "fieldtype": "Currency", "label": "Total Allocated Amount", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_total_allocated_amount", @@ -366,23 +450,31 @@ "label": "Total Allocated Amount (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "set_exchange_gain_loss", "fieldtype": "Button", - "label": "Set Exchange Gain / Loss" + "label": "Set Exchange Gain / Loss", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_36", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:(doc.paid_amount && doc.received_amount && doc.references)", "fieldname": "unallocated_amount", "fieldtype": "Currency", "label": "Unallocated Amount", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -392,13 +484,17 @@ "label": "Difference Amount (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "difference_amount", "fieldname": "write_off_difference_amount", "fieldtype": "Button", - "label": "Write Off Difference Amount" + "label": "Write Off Difference Amount", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -406,29 +502,39 @@ "depends_on": "eval:(doc.paid_amount && doc.received_amount)", "fieldname": "deductions_or_loss_section", "fieldtype": "Section Break", - "label": "Deductions or Loss" + "label": "Deductions or Loss", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "deductions", "fieldtype": "Table", "label": "Payment Deductions or Loss", - "options": "Payment Entry Deduction" + "options": "Payment Entry Deduction", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "transaction_references", "fieldtype": "Section Break", - "label": "Transaction ID" + "label": "Transaction ID", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, "depends_on": "eval:(doc.paid_from && doc.paid_to)", "fieldname": "reference_no", "fieldtype": "Data", - "label": "Cheque/Reference No" + "label": "Cheque/Reference No", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_23", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -436,7 +542,9 @@ "fieldname": "reference_date", "fieldtype": "Date", "label": "Cheque/Reference Date", - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.docstatus==1", @@ -445,21 +553,27 @@ "label": "Clearance Date", "no_copy": 1, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "depends_on": "eval:(doc.paid_from && doc.paid_to && doc.paid_amount && doc.received_amount)", "fieldname": "section_break_12", "fieldtype": "Section Break", - "label": "More Information" + "label": "More Information", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "project", "fieldtype": "Link", "label": "Project", "options": "Project", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "remarks", @@ -470,33 +584,43 @@ }, { "fieldname": "column_break_16", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "letter_head", "fieldtype": "Link", "label": "Letter Head", "options": "Letter Head", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "print_heading", "fieldtype": "Link", "label": "Print Heading", "options": "Print Heading", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fetch_from": "bank_account.bank", "fieldname": "bank", "fieldtype": "Read Only", - "label": "Bank" + "label": "Bank", + "show_days": 1, + "show_seconds": 1 }, { "fetch_from": "bank_account.bank_account_no", "fieldname": "bank_account_no", "fieldtype": "Read Only", - "label": "Bank Account No" + "label": "Bank Account No", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payment_order", @@ -505,12 +629,16 @@ "no_copy": 1, "options": "Payment Order", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "subscription_section", "fieldtype": "Section Break", - "label": "Subscription Section" + "label": "Subscription Section", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -520,7 +648,9 @@ "no_copy": 1, "options": "Auto Repeat", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "amended_from", @@ -529,7 +659,9 @@ "no_copy": 1, "options": "Payment Entry", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "title", @@ -544,14 +676,18 @@ "fieldname": "bank_account", "fieldtype": "Link", "label": "Company Bank Account", - "options": "Bank Account" + "options": "Bank Account", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "party", "fieldname": "party_bank_account", "fieldtype": "Link", "label": "Party Bank Account", - "options": "Bank Account" + "options": "Bank Account", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payment_order_status", @@ -559,17 +695,23 @@ "hidden": 1, "label": "Payment Order Status", "options": "Initiated\nPayment Ordered", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", - "label": "Accounting Dimensions" + "label": "Accounting Dimensions", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "dimension_col_break", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "Draft", @@ -584,12 +726,94 @@ "fieldname": "custom_remarks", "fieldtype": "Check", "label": "Custom Remarks" + }, + { + "depends_on": "eval: doc.payment_type == 'Pay' && doc.party_type == 'Supplier'", + "fieldname": "tds_details_section", + "fieldtype": "Section Break", + "label": "TDS Details", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "tax_withholding_category", + "fieldtype": "Link", + "label": "Tax Withholding Category", + "options": "Tax Withholding Category", + "show_days": 1, + "show_seconds": 1 + }, + { + "default": "0", + "fieldname": "apply_tax_withholding_amount", + "fieldtype": "Check", + "label": "Apply Tax Withholding Amount", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "column_break_20", + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "collapsible": 1, + "fieldname": "taxes_and_charges_section", + "fieldtype": "Section Break", + "label": "Taxes and Charges", + "show_days": 1, + "show_seconds": 1 + }, + { + "depends_on": "eval:doc.party_type == 'Supplier'", + "fieldname": "purchase_taxes_and_charges_template", + "fieldtype": "Link", + "label": "Taxes and Charges Template", + "options": "Purchase Taxes and Charges Template", + "show_days": 1, + "show_seconds": 1 + }, + { + "depends_on": "eval: doc.party_type == 'Customer'", + "fieldname": "sales_taxes_and_charges_template", + "fieldtype": "Link", + "label": "Taxes and Charges Template", + "options": "Sales Taxes and Charges Template", + "show_days": 1, + "show_seconds": 1 + }, + { + "depends_on": "eval: doc.party_type == 'Supplier' || doc.party_type == 'Customer'", + "fieldname": "taxes", + "fieldtype": "Table", + "label": "Advance Taxes and Charges", + "options": "Advance Taxes and Charges", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "base_total_taxes_and_charges", + "fieldtype": "Currency", + "label": "Total Taxes and Charges (Company Currency)", + "options": "Company:company:default_currency", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "total_taxes_and_charges", + "fieldtype": "Currency", + "label": "Total Taxes and Charges", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2021-03-08 13:05:16.958866", + "modified": "2020-09-13 22:33:59.860146", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 62ab76c323..a41b4512a1 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe, erpnext, json from frappe import _, scrub, ValidationError -from frappe.utils import flt, comma_or, nowdate, getdate +from frappe.utils import flt, comma_or, nowdate, getdate, cint from erpnext.accounts.utils import get_outstanding_invoices, get_account_currency, get_balance_on from erpnext.accounts.party import get_party_account from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account @@ -15,6 +15,7 @@ from erpnext.hr.doctype.expense_claim.expense_claim import update_reimbursed_amo from erpnext.accounts.doctype.bank_account.bank_account import get_party_bank_account, get_bank_account_details from erpnext.controllers.accounts_controller import AccountsController, get_supplier_block_status from erpnext.accounts.doctype.invoice_discounting.invoice_discounting import get_party_account_based_on_invoice_discounting +from erpnext.accounts.doctype.tax_withholding_category.tax_withholding_category import get_party_tax_withholding_details from six import string_types, iteritems @@ -52,6 +53,8 @@ class PaymentEntry(AccountsController): self.set_exchange_rate() self.validate_mandatory() self.validate_reference_documents() + self.set_tax_withholding() + self.calculate_taxes() self.set_amounts() self.clear_unallocated_reference_document_rows() self.validate_payment_against_negative_invoice() @@ -386,6 +389,43 @@ class PaymentEntry(AccountsController): else: self.status = 'Draft' + def set_tax_withholding(self): + if not self.party_type == 'Supplier': + return + + if not self.apply_tax_withholding_amount: + return + + if self.references: + return + + args = frappe._dict({ + 'company': self.company, + 'supplier': self.party, + 'posting_date': self.posting_date, + 'net_total': self.paid_amount + }) + + tax_withholding_details = get_party_tax_withholding_details(args, self.tax_withholding_category) + + if not tax_withholding_details: + return + + accounts = [] + for d in self.taxes: + if d.account_head == tax_withholding_details.get("account_head"): + d.update(tax_withholding_details) + accounts.append(d.account_head) + + if not accounts or tax_withholding_details.get("account_head") not in accounts: + self.append("taxes", tax_withholding_details) + + to_remove = [d for d in self.taxes + if not d.tax_amount and d.account_head == tax_withholding_details.get("account_head")] + + for d in to_remove: + self.remove(d) + def set_amounts(self): self.set_amounts_in_company_currency() self.set_total_allocated_amount() @@ -423,12 +463,12 @@ class PaymentEntry(AccountsController): if self.payment_type == "Receive" \ and self.base_total_allocated_amount < self.base_received_amount + total_deductions \ and self.total_allocated_amount < self.paid_amount + (total_deductions / self.source_exchange_rate): - self.unallocated_amount = (self.base_received_amount + total_deductions - + self.unallocated_amount = (self.base_received_amount + self.base_total_taxes_and_charges + total_deductions - self.base_total_allocated_amount) / self.source_exchange_rate elif self.payment_type == "Pay" \ and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions) \ and self.total_allocated_amount < self.received_amount + (total_deductions / self.target_exchange_rate): - self.unallocated_amount = (self.base_paid_amount - (total_deductions + + self.unallocated_amount = (self.base_paid_amount + self.base_total_taxes_and_charges - (total_deductions + self.base_total_allocated_amount)) / self.target_exchange_rate def set_difference_amount(self): @@ -446,7 +486,7 @@ class PaymentEntry(AccountsController): total_deductions = sum([flt(d.amount) for d in self.get("deductions")]) - self.difference_amount = flt(self.difference_amount - total_deductions, + self.difference_amount = flt(self.difference_amount - total_deductions + self.base_total_taxes_and_charges, self.precision("difference_amount")) # Paid amount is auto allocated in the reference document by default. @@ -532,6 +572,7 @@ class PaymentEntry(AccountsController): self.add_party_gl_entries(gl_entries) self.add_bank_gl_entries(gl_entries) self.add_deductions_gl_entries(gl_entries) + self.add_tax_gl_entries(gl_entries) make_gl_entries(gl_entries, cancel=cancel, adv_adj=adv_adj) @@ -607,6 +648,26 @@ class PaymentEntry(AccountsController): }, item=self) ) + def add_tax_gl_entries(self, gl_entries): + for d in self.get('taxes'): + account_currency = get_account_currency(d.account_head) + if account_currency != self.company_currency: + frappe.throw(_("Currency for {0} must be {1}").format(d.account_head, self.company_currency)) + + dr_or_cr = "credit" if d.add_deduct_tax == "Add" else "debit" + + gl_entries.append( + self.get_gl_dict({ + "account": d.account_head, + "against": self.party if self.payment_type=="Receive" else self.paid_from, + dr_or_cr: d.base_tax_amount, + dr_or_cr + "_in_account_currency": d.base_tax_amount \ + if account_currency==self.company_currency \ + else d.tax_amount, + "cost_center": d.cost_center + }, account_currency, item=d) + ) + def add_deductions_gl_entries(self, gl_entries): for d in self.get("deductions"): if d.amount: @@ -671,6 +732,51 @@ class PaymentEntry(AccountsController): self.append('deductions', row) self.set_unallocated_amount() + def calculate_taxes(self): + self.total_taxes_and_charges = 0.0 + self.base_total_taxes_and_charges = 0.0 + + for i, tax in enumerate(self.taxes): + tax_rate = tax.rate + current_tax_rate = 0.0 + + # To set row_id by default as previous row. + if tax.charge_type in ["On Previous Row Amount", "On Previous Row Total"]: + if tax.idx == 1: + frappe.throw(_("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")) + + if not tax.row_id: + tax.row_id = tax.idx - 1 + + if tax.charge_type == "Actual": + current_tax_amount = flt(tax.tax_amount, self.precision("tax_amount", tax)) + elif tax.charge_type == "On Paid Amount": + current_tax_amount = (tax_rate / 100.0) * self.paid_amount + elif tax.charge_type == "On Previous Row Amount": + current_tax_amount = (tax_rate / 100.0) * \ + self.taxes[cint(tax.row_id) - 1].tax_amount + + elif tax.charge_type == "On Previous Row Total": + current_tax_amount = (tax_rate / 100.0) * \ + self.taxes[cint(tax.row_id) - 1].total + + tax.tax_amount = current_tax_amount + tax.base_tax_amount = tax.tax_amount * self.source_exchange_rate + + if tax.add_deduct_tax == "Deduct": + current_tax_amount *= -1.0 + else: + current_tax_amount *= 1.0 + + if i == 0: + tax.total = flt(self.paid_amount + current_tax_amount, self.precision("total", tax)) + else: + tax.total = flt(self.taxes[i-1].total + current_tax_amount, self.precision("total", tax)) + + tax.base_total = tax.total * self.source_exchange_rate + self.total_taxes_and_charges += current_tax_amount + self.base_total_taxes_and_charges += current_tax_amount * self.source_exchange_rate + @frappe.whitelist() def get_outstanding_reference_documents(args): diff --git a/erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json b/erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json index 7060d11691..61a1462dd7 100644 --- a/erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json +++ b/erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json @@ -1,140 +1,70 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2016-06-15 15:56:30.815503", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, + "actions": [], + "creation": "2016-06-15 15:56:30.815503", + "doctype": "DocType", + "editable_grid": 1, + "field_order": [ + "account", + "cost_center", + "amount", + "column_break_2", + "description" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Account", - "length": 0, - "no_copy": 0, - "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "account", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Account", + "options": "Account", + "reqd": 1, + "show_days": 1, + "show_seconds": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "cost_center", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Cost Center", - "length": 0, - "no_copy": 0, - "options": "Cost Center", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "cost_center", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Cost Center", + "options": "Cost Center", + "print_hide": 1, + "reqd": 1, + "show_days": 1, + "show_seconds": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Amount", + "reqd": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "column_break_2", + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Description", + "show_days": 1, + "show_seconds": 1 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2019-01-07 16:52:07.040146", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Payment Entry Deduction", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2020-09-12 20:38:08.110674", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Payment Entry Deduction", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 544e624725..65e5823b91 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -617,6 +617,10 @@ class AccountsController(TransactionBase): payment_entries = get_advance_payment_entries(party_type, party, party_account, order_doctype, order_list, include_unallocated) + payment_entry_list = [d.reference_name for d in payment_entries] + + payment_entry_taxes = get_payment_entry_taxes(payment_entry_list) + res = journal_entries + payment_entries return res @@ -1241,6 +1245,12 @@ def get_advance_payment_entries(party_type, party, party_account, order_doctype, return list(payment_entries_against_order) + list(unallocated_payment_entries) +def get_payment_entry_taxes(payment_entry_list): + taxes = frappe.db.sql(""" + SELECT t.parent, t.add_deduct_tax, t.charge_type, t.account_head, t.cost_center, + t.tax_amount FROM `tabAdvance Taxes and Charges` where t.parent in %s""" + ,(payment_entry_list, ), as_dict=1) + def update_invoice_status(): # Daily update the status of the invoices diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js index ceeecb28a2..23d636061c 100644 --- a/erpnext/public/js/controllers/accounts.js +++ b/erpnext/public/js/controllers/accounts.js @@ -165,7 +165,7 @@ cur_frm.cscript.validate_taxes_and_charges = function(cdt, cdn) { msg = __("Please select Charge Type first"); d.row_id = ""; d.rate = d.tax_amount = 0.0; - } else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) { + } else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total' || d.charge_type == 'On Paid Amount') && d.row_id) { msg = __("Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'"); d.row_id = ""; } else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) { From c26de286138426f74f4752c6139ce243c5bf854e Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 2 Nov 2020 19:57:27 +0530 Subject: [PATCH 03/53] fix: TDS against Purhase Orders --- .../advance_taxes_and_charges.json | 4 +- .../doctype/payment_entry/payment_entry.js | 12 +- .../doctype/payment_entry/payment_entry.json | 31 +- .../doctype/payment_entry/payment_entry.py | 25 +- .../purchase_invoice/purchase_invoice.json | 597 +++++++++++++----- .../purchase_invoice/purchase_invoice.py | 5 +- .../purchase_taxes_and_charges.json | 101 ++- erpnext/controllers/accounts_controller.py | 11 - erpnext/controllers/taxes_and_totals.py | 40 ++ erpnext/public/js/payment/payments.js | 18 +- 10 files changed, 635 insertions(+), 209 deletions(-) diff --git a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json index 79eda8c5fe..5b3299e656 100644 --- a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json +++ b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json @@ -33,7 +33,7 @@ "label": "Type", "oldfieldname": "charge_type", "oldfieldtype": "Select", - "options": "\nActual\nOn Paid Amount\nOn Previous Row Amount\nOn Previous Row Total", + "options": "\nActual\nOn Paid Amount\nIncluded In Paid Amount\nOn Previous Row Amount\nOn Previous Row Total", "reqd": 1, "show_days": 1, "show_seconds": 1 @@ -190,7 +190,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2020-09-12 22:30:36.150935", + "modified": "2020-10-27 20:02:34.734260", "modified_by": "Administrator", "module": "Accounts", "name": "Advance Taxes and Charges", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 29e4a31dad..3e11bc0e59 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -220,7 +220,7 @@ frappe.ui.form.on('Payment Entry', { var company_currency = frm.doc.company? frappe.get_doc(":Company", frm.doc.company).default_currency: ""; frm.set_currency_labels(["base_paid_amount", "base_received_amount", "base_total_allocated_amount", - "difference_amount"], company_currency); + "difference_amount", "base_paid_amount_after_tax"], company_currency); frm.set_currency_labels(["paid_amount"], frm.doc.paid_from_account_currency); frm.set_currency_labels(["received_amount"], frm.doc.paid_to_account_currency); @@ -368,6 +368,16 @@ frappe.ui.form.on('Payment Entry', { } }, + apply_tax_withholding_amount: function(frm) { + if (!frm.doc.apply_tax_withholding_amount) { + frm.set_value("tax_withholding_category", ''); + } else { + frappe.db.get_value('Supplier', frm.doc.party, 'tax_withholding_category', (values) => { + frm.set_value("tax_withholding_category", values.tax_withholding_category); + }); + } + }, + paid_from: function(frm) { if(frm.set_party_account_based_on_party) return; diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 11ae17093f..f158345af6 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -25,9 +25,9 @@ "contact_person", "contact_email", "tds_details_section", - "tax_withholding_category", - "column_break_20", "apply_tax_withholding_amount", + "column_break_20", + "tax_withholding_category", "payment_accounts_section", "party_balance", "paid_from", @@ -39,8 +39,10 @@ "paid_to_account_balance", "payment_amounts_section", "paid_amount", + "paid_amount_after_tax", "source_exchange_rate", "base_paid_amount", + "base_paid_amount_after_tax", "column_break_21", "received_amount", "target_exchange_rate", @@ -580,7 +582,9 @@ "fieldtype": "Small Text", "label": "Remarks", "no_copy": 1, - "read_only_depends_on": "eval:doc.custom_remarks == 0" + "read_only_depends_on": "eval:doc.custom_remarks == 0", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_16", @@ -736,6 +740,7 @@ "show_seconds": 1 }, { + "depends_on": "eval:doc.apply_tax_withholding_amount", "fieldname": "tax_withholding_category", "fieldtype": "Link", "label": "Tax Withholding Category", @@ -808,12 +813,30 @@ "read_only": 1, "show_days": 1, "show_seconds": 1 + }, + { + "fieldname": "paid_amount_after_tax", + "fieldtype": "Currency", + "hidden": 1, + "label": "Paid Amount After Tax", + "options": "paid_from_account_currency", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "base_paid_amount_after_tax", + "fieldtype": "Currency", + "label": "Paid Amount After Tax (Company Currency)", + "options": "Company:company:default_currency", + "show_days": 1, + "show_seconds": 1 } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2020-09-13 22:33:59.860146", + "modified": "2020-10-25 20:50:14.896628", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index a41b4512a1..a21deb5431 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -396,9 +396,6 @@ class PaymentEntry(AccountsController): if not self.apply_tax_withholding_amount: return - if self.references: - return - args = frappe._dict({ 'company': self.company, 'supplier': self.party, @@ -427,11 +424,18 @@ class PaymentEntry(AccountsController): self.remove(d) def set_amounts(self): + self.set_amounts_after_tax() self.set_amounts_in_company_currency() self.set_total_allocated_amount() self.set_unallocated_amount() self.set_difference_amount() + def set_amounts_after_tax(self): + self.paid_amount_after_tax = flt(flt(self.paid_amount) + flt(self.total_taxes_and_charges), + self.precision("paid_amount_after_tax")) + self.base_paid_amount_after_tax = flt(flt(self.paid_amount_after_tax) * flt(self.source_exchange_rate), + self.precision("base_paid_amount_after_tax")) + def set_amounts_in_company_currency(self): self.base_paid_amount, self.base_received_amount, self.difference_amount = 0, 0, 0 if self.paid_amount: @@ -463,12 +467,12 @@ class PaymentEntry(AccountsController): if self.payment_type == "Receive" \ and self.base_total_allocated_amount < self.base_received_amount + total_deductions \ and self.total_allocated_amount < self.paid_amount + (total_deductions / self.source_exchange_rate): - self.unallocated_amount = (self.base_received_amount + self.base_total_taxes_and_charges + total_deductions - + self.unallocated_amount = (self.base_received_amount + total_deductions - self.base_total_allocated_amount) / self.source_exchange_rate elif self.payment_type == "Pay" \ and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions) \ and self.total_allocated_amount < self.received_amount + (total_deductions / self.target_exchange_rate): - self.unallocated_amount = (self.base_paid_amount + self.base_total_taxes_and_charges - (total_deductions + + self.unallocated_amount = (self.base_paid_amount - (total_deductions + self.base_total_allocated_amount)) / self.target_exchange_rate def set_difference_amount(self): @@ -486,7 +490,7 @@ class PaymentEntry(AccountsController): total_deductions = sum([flt(d.amount) for d in self.get("deductions")]) - self.difference_amount = flt(self.difference_amount - total_deductions + self.base_total_taxes_and_charges, + self.difference_amount = flt(self.difference_amount - total_deductions, self.precision("difference_amount")) # Paid amount is auto allocated in the reference document by default. @@ -631,8 +635,8 @@ class PaymentEntry(AccountsController): "account": self.paid_from, "account_currency": self.paid_from_account_currency, "against": self.party if self.payment_type=="Pay" else self.paid_to, - "credit_in_account_currency": self.paid_amount, - "credit": self.base_paid_amount, + "credit_in_account_currency": self.paid_amount_after_tax, + "credit": self.base_paid_amount_after_tax, "cost_center": self.cost_center }, item=self) ) @@ -654,7 +658,10 @@ class PaymentEntry(AccountsController): if account_currency != self.company_currency: frappe.throw(_("Currency for {0} must be {1}").format(d.account_head, self.company_currency)) - dr_or_cr = "credit" if d.add_deduct_tax == "Add" else "debit" + if self.payment_type == 'Pay': + dr_or_cr = "debit" if d.add_deduct_tax == "Add" else "credit" + elif self.payment_type == 'Receive': + dr_or_cr = "credit" if d.add_deduct_tax == "Add" else "debit" gl_entries.append( self.get_gl_dict({ diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index d3d3ffa17f..36450a9255 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -127,6 +127,7 @@ "write_off_cost_center", "advances_section", "allocate_advances_automatically", + "adjust_advance_taxes", "get_advances", "advances", "payment_schedule_section", @@ -175,7 +176,9 @@ "hidden": 1, "label": "Title", "no_copy": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "naming_series", @@ -187,7 +190,9 @@ "options": "ACC-PINV-.YYYY.-\nACC-PINV-RET-.YYYY.-", "print_hide": 1, "reqd": 1, - "set_only_once": 1 + "set_only_once": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "supplier", @@ -199,7 +204,9 @@ "options": "Supplier", "print_hide": 1, "reqd": 1, - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -211,7 +218,9 @@ "label": "Supplier Name", "oldfieldname": "supplier_name", "oldfieldtype": "Data", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fetch_from": "supplier.tax_id", @@ -219,21 +228,27 @@ "fieldtype": "Read Only", "label": "Tax Id", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "due_date", "fieldtype": "Date", "label": "Due Date", "oldfieldname": "due_date", - "oldfieldtype": "Date" + "oldfieldtype": "Date", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "is_paid", "fieldtype": "Check", "label": "Is Paid", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "0", @@ -241,19 +256,25 @@ "fieldtype": "Check", "label": "Is Return (Debit Note)", "no_copy": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "apply_tds", "fieldtype": "Check", "label": "Apply Tax Withholding Amount", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break1", "fieldtype": "Column Break", "oldfieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -263,13 +284,17 @@ "label": "Company", "options": "Company", "print_hide": 1, - "remember_last_selected_value": 1 + "remember_last_selected_value": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "cost_center", "fieldtype": "Link", "label": "Cost Center", - "options": "Cost Center" + "options": "Cost Center", + "show_days": 1, + "show_seconds": 1 }, { "default": "Today", @@ -281,7 +306,9 @@ "oldfieldtype": "Date", "print_hide": 1, "reqd": 1, - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "posting_time", @@ -290,6 +317,8 @@ "no_copy": 1, "print_hide": 1, "print_width": "100px", + "show_days": 1, + "show_seconds": 1, "width": "100px" }, { @@ -298,7 +327,9 @@ "fieldname": "set_posting_time", "fieldtype": "Check", "label": "Edit Posting Date and Time", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "amended_from", @@ -310,44 +341,58 @@ "oldfieldtype": "Link", "options": "Purchase Invoice", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "collapsible_depends_on": "eval:doc.on_hold", "fieldname": "sb_14", "fieldtype": "Section Break", - "label": "Hold Invoice" + "label": "Hold Invoice", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "on_hold", "fieldtype": "Check", - "label": "Hold Invoice" + "label": "Hold Invoice", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.on_hold", "description": "Once set, this invoice will be on hold till the set date", "fieldname": "release_date", "fieldtype": "Date", - "label": "Release Date" + "label": "Release Date", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "cb_17", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.on_hold", "fieldname": "hold_comment", "fieldtype": "Small Text", - "label": "Reason For Putting On Hold" + "label": "Reason For Putting On Hold", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "collapsible_depends_on": "bill_no", "fieldname": "supplier_invoice_details", "fieldtype": "Section Break", - "label": "Supplier Invoice Details" + "label": "Supplier Invoice Details", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "bill_no", @@ -355,11 +400,15 @@ "label": "Supplier Invoice No", "oldfieldname": "bill_no", "oldfieldtype": "Data", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_15", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "bill_date", @@ -368,13 +417,17 @@ "no_copy": 1, "oldfieldname": "bill_date", "oldfieldtype": "Date", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "return_against", "fieldname": "returns", "fieldtype": "Section Break", - "label": "Returns" + "label": "Returns", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "return_against", @@ -384,26 +437,34 @@ "no_copy": 1, "options": "Purchase Invoice", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "section_addresses", "fieldtype": "Section Break", - "label": "Address and Contact" + "label": "Address and Contact", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "supplier_address", "fieldtype": "Link", "label": "Select Supplier Address", "options": "Address", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "address_display", "fieldtype": "Small Text", "label": "Address", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "contact_person", @@ -411,51 +472,67 @@ "in_global_search": 1, "label": "Contact Person", "options": "Contact", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "contact_display", "fieldtype": "Small Text", "label": "Contact", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "contact_mobile", "fieldtype": "Small Text", "label": "Mobile No", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "contact_email", "fieldtype": "Small Text", "label": "Contact Email", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "col_break_address", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "shipping_address", "fieldtype": "Link", "label": "Select Shipping Address", "options": "Address", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "shipping_address_display", "fieldtype": "Small Text", "label": "Shipping Address", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "currency_and_price_list", "fieldtype": "Section Break", "label": "Currency and Price List", - "options": "fa fa-tag" + "options": "fa fa-tag", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "currency", @@ -464,7 +541,9 @@ "oldfieldname": "currency", "oldfieldtype": "Select", "options": "Currency", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "conversion_rate", @@ -473,18 +552,24 @@ "oldfieldname": "conversion_rate", "oldfieldtype": "Currency", "precision": "9", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break2", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "buying_price_list", "fieldtype": "Link", "label": "Price List", "options": "Price List", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "price_list_currency", @@ -492,14 +577,18 @@ "label": "Price List Currency", "options": "Currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "plc_conversion_rate", "fieldtype": "Float", "label": "Price List Exchange Rate", "precision": "9", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "0", @@ -508,11 +597,15 @@ "label": "Ignore Pricing Rule", "no_copy": 1, "permlevel": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "sec_warehouse", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "update_stock", @@ -521,7 +614,9 @@ "fieldtype": "Link", "label": "Set Accepted Warehouse", "options": "Warehouse", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "update_stock", @@ -531,11 +626,15 @@ "label": "Rejected Warehouse", "no_copy": 1, "options": "Warehouse", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "col_break_warehouse", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "No", @@ -543,25 +642,33 @@ "fieldtype": "Select", "label": "Raw Materials Supplied", "options": "No\nYes", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "items_section", "fieldtype": "Section Break", "oldfieldtype": "Section Break", - "options": "fa fa-shopping-cart" + "options": "fa fa-shopping-cart", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "update_stock", "fieldtype": "Check", "label": "Update Stock", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "scan_barcode", "fieldtype": "Data", - "label": "Scan Barcode" + "label": "Scan Barcode", + "show_days": 1, + "show_seconds": 1 }, { "allow_bulk_edit": 1, @@ -571,42 +678,56 @@ "oldfieldname": "entries", "oldfieldtype": "Table", "options": "Purchase Invoice Item", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "pricing_rule_details", "fieldtype": "Section Break", - "label": "Pricing Rules" + "label": "Pricing Rules", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "pricing_rules", "fieldtype": "Table", "label": "Pricing Rule Detail", "options": "Pricing Rule Detail", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible_depends_on": "supplied_items", "fieldname": "raw_materials_supplied", "fieldtype": "Section Break", - "label": "Raw Materials Supplied" + "label": "Raw Materials Supplied", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "supplied_items", "fieldtype": "Table", "label": "Supplied Items", "options": "Purchase Receipt Item Supplied", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_26", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_qty", "fieldtype": "Float", "label": "Total Quantity", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_total", @@ -614,7 +735,9 @@ "label": "Total (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_net_total", @@ -624,18 +747,24 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_28", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total", "fieldtype": "Currency", "label": "Total", "options": "currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "net_total", @@ -645,42 +774,56 @@ "oldfieldtype": "Currency", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_net_weight", "fieldtype": "Float", "label": "Total Net Weight", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "taxes_section", "fieldtype": "Section Break", "oldfieldtype": "Section Break", - "options": "fa fa-money" + "options": "fa fa-money", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "tax_category", "fieldtype": "Link", "label": "Tax Category", "options": "Tax Category", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_49", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "shipping_rule", "fieldtype": "Link", "label": "Shipping Rule", "options": "Shipping Rule", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_51", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "taxes_and_charges", @@ -689,7 +832,9 @@ "oldfieldname": "purchase_other_charges", "oldfieldtype": "Link", "options": "Purchase Taxes and Charges Template", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "taxes", @@ -697,13 +842,17 @@ "label": "Purchase Taxes and Charges", "oldfieldname": "purchase_tax_details", "oldfieldtype": "Table", - "options": "Purchase Taxes and Charges" + "options": "Purchase Taxes and Charges", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "sec_tax_breakup", "fieldtype": "Section Break", - "label": "Tax Breakup" + "label": "Tax Breakup", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "other_charges_calculation", @@ -712,13 +861,17 @@ "no_copy": 1, "oldfieldtype": "HTML", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "totals", "fieldtype": "Section Break", "oldfieldtype": "Section Break", - "options": "fa fa-money" + "options": "fa fa-money", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_taxes_and_charges_added", @@ -728,7 +881,9 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_taxes_and_charges_deducted", @@ -738,7 +893,9 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_total_taxes_and_charges", @@ -748,11 +905,15 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_40", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "taxes_and_charges_added", @@ -762,7 +923,9 @@ "oldfieldtype": "Currency", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "taxes_and_charges_deducted", @@ -772,7 +935,9 @@ "oldfieldtype": "Currency", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_taxes_and_charges", @@ -780,14 +945,18 @@ "label": "Total Taxes and Charges", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "collapsible_depends_on": "discount_amount", "fieldname": "section_break_44", "fieldtype": "Section Break", - "label": "Additional Discount" + "label": "Additional Discount", + "show_days": 1, + "show_seconds": 1 }, { "default": "Grand Total", @@ -795,7 +964,9 @@ "fieldtype": "Select", "label": "Apply Additional Discount On", "options": "\nGrand Total\nNet Total", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_discount_amount", @@ -803,28 +974,38 @@ "label": "Additional Discount Amount (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_46", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "additional_discount_percentage", "fieldtype": "Float", "label": "Additional Discount Percentage", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "discount_amount", "fieldtype": "Currency", "label": "Additional Discount Amount", "options": "currency", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_49", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_grand_total", @@ -834,7 +1015,9 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_rounding_adjustment", @@ -843,7 +1026,9 @@ "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:!doc.disable_rounded_total", @@ -853,7 +1038,9 @@ "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_in_words", @@ -863,13 +1050,17 @@ "oldfieldname": "in_words", "oldfieldtype": "Data", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break8", "fieldtype": "Column Break", "oldfieldtype": "Column Break", "print_hide": 1, + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -880,7 +1071,9 @@ "oldfieldname": "grand_total_import", "oldfieldtype": "Currency", "options": "currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "rounding_adjustment", @@ -889,7 +1082,9 @@ "no_copy": 1, "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:!doc.disable_rounded_total", @@ -899,7 +1094,9 @@ "no_copy": 1, "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "in_words", @@ -909,7 +1106,9 @@ "oldfieldname": "in_words_import", "oldfieldtype": "Data", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_advance", @@ -920,7 +1119,9 @@ "oldfieldtype": "Currency", "options": "party_account_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "outstanding_amount", @@ -931,14 +1132,18 @@ "oldfieldtype": "Currency", "options": "party_account_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "depends_on": "grand_total", "fieldname": "disable_rounded_total", "fieldtype": "Check", - "label": "Disable Rounded Total" + "label": "Disable Rounded Total", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -946,20 +1151,26 @@ "depends_on": "eval:doc.is_paid===1||(doc.advances && doc.advances.length>0)", "fieldname": "payments_section", "fieldtype": "Section Break", - "label": "Payments" + "label": "Payments", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "mode_of_payment", "fieldtype": "Link", "label": "Mode of Payment", "options": "Mode of Payment", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "cash_bank_account", "fieldtype": "Link", "label": "Cash/Bank Account", - "options": "Account" + "options": "Account", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "clearance_date", @@ -967,11 +1178,15 @@ "label": "Clearance Date", "no_copy": 1, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "col_br_payments", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "is_paid", @@ -980,7 +1195,9 @@ "label": "Paid Amount", "no_copy": 1, "options": "currency", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_paid_amount", @@ -989,7 +1206,9 @@ "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -997,7 +1216,9 @@ "depends_on": "grand_total", "fieldname": "write_off", "fieldtype": "Section Break", - "label": "Write Off" + "label": "Write Off", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "write_off_amount", @@ -1005,7 +1226,9 @@ "label": "Write Off Amount", "no_copy": 1, "options": "currency", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_write_off_amount", @@ -1014,11 +1237,15 @@ "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_61", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:flt(doc.write_off_amount)!=0", @@ -1026,7 +1253,9 @@ "fieldtype": "Link", "label": "Write Off Account", "options": "Account", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:flt(doc.write_off_amount)!=0", @@ -1034,7 +1263,9 @@ "fieldtype": "Link", "label": "Write Off Cost Center", "options": "Cost Center", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -1044,13 +1275,17 @@ "label": "Advance Payments", "oldfieldtype": "Section Break", "options": "fa fa-money", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "allocate_advances_automatically", "fieldtype": "Check", - "label": "Set Advances and Allocate (FIFO)" + "label": "Set Advances and Allocate (FIFO)", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:!doc.allocate_advances_automatically", @@ -1058,7 +1293,9 @@ "fieldtype": "Button", "label": "Get Advances Paid", "oldfieldtype": "Button", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "advances", @@ -1068,20 +1305,26 @@ "oldfieldname": "advance_allocation_details", "oldfieldtype": "Table", "options": "Purchase Invoice Advance", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "collapsible_depends_on": "eval:(!doc.is_return)", "fieldname": "payment_schedule_section", "fieldtype": "Section Break", - "label": "Payment Terms" + "label": "Payment Terms", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payment_terms_template", "fieldtype": "Link", "label": "Payment Terms Template", - "options": "Payment Terms Template" + "options": "Payment Terms Template", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payment_schedule", @@ -1089,7 +1332,9 @@ "label": "Payment Schedule", "no_copy": 1, "options": "Payment Schedule", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -1097,25 +1342,33 @@ "fieldname": "terms_section_break", "fieldtype": "Section Break", "label": "Terms and Conditions", - "options": "fa fa-legal" + "options": "fa fa-legal", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "tc_name", "fieldtype": "Link", "label": "Terms", "options": "Terms and Conditions", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "terms", "fieldtype": "Text Editor", - "label": "Terms and Conditions1" + "label": "Terms and Conditions1", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "printing_settings", "fieldtype": "Section Break", - "label": "Printing Settings" + "label": "Printing Settings", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -1123,7 +1376,9 @@ "fieldtype": "Link", "label": "Letter Head", "options": "Letter Head", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -1131,11 +1386,15 @@ "fieldname": "group_same_items", "fieldtype": "Check", "label": "Group same items", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_112", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -1147,14 +1406,18 @@ "oldfieldtype": "Link", "options": "Print Heading", "print_hide": 1, - "report_hide": 1 + "report_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "language", "fieldtype": "Data", "label": "Print Language", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -1163,7 +1426,9 @@ "label": "More Information", "oldfieldtype": "Section Break", "options": "fa fa-file-text", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "credit_to", @@ -1174,7 +1439,9 @@ "options": "Account", "print_hide": 1, "reqd": 1, - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "party_account_currency", @@ -1184,7 +1451,9 @@ "no_copy": 1, "options": "Currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "No", @@ -1194,7 +1463,9 @@ "oldfieldname": "is_opening", "oldfieldtype": "Select", "options": "No\nYes", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "against_expense_account", @@ -1204,11 +1475,15 @@ "no_copy": 1, "oldfieldname": "against_expense_account", "oldfieldtype": "Small Text", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_63", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "Draft", @@ -1235,14 +1510,18 @@ "no_copy": 1, "oldfieldname": "remarks", "oldfieldtype": "Text", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "subscription_section", "fieldtype": "Section Break", "label": "Subscription Section", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -1251,7 +1530,9 @@ "fieldtype": "Date", "label": "From Date", "no_copy": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -1260,11 +1541,15 @@ "fieldtype": "Date", "label": "To Date", "no_copy": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_114", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "auto_repeat", @@ -1273,24 +1558,32 @@ "no_copy": 1, "options": "Auto Repeat", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, "depends_on": "eval: doc.auto_repeat", "fieldname": "update_auto_repeat_reference", "fieldtype": "Button", - "label": "Update Auto Repeat Reference" + "label": "Update Auto Repeat Reference", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", - "label": "Accounting Dimensions " + "label": "Accounting Dimensions ", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "dimension_col_break", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", @@ -1298,7 +1591,9 @@ "fieldname": "is_internal_supplier", "fieldtype": "Check", "label": "Is Internal Supplier", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "tax_withholding_category", @@ -1306,19 +1601,25 @@ "hidden": 1, "label": "Tax Withholding Category", "options": "Tax Withholding Category", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "billing_address", "fieldtype": "Link", "label": "Select Billing Address", - "options": "Address" + "options": "Address", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "billing_address_display", "fieldtype": "Small Text", "label": "Billing Address", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "project", @@ -1380,7 +1681,7 @@ "idx": 204, "is_submittable": 1, "links": [], - "modified": "2021-04-30 22:45:58.334107", + "modified": "2020-10-27 21:21:22.647349", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 83e9f7583e..84dd491a56 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -1088,9 +1088,10 @@ class PurchaseInvoice(BuyingController): accounts = [] for d in self.taxes: - if d.account_head == tax_withholding_details.get("account_head"): + if d.account_head == tax_withholding_details.get("account_head") and not d.is_advance_tax: d.update(tax_withholding_details) - accounts.append(d.account_head) + if not d.is_advance_tax: + accounts.append(d.account_head) if not accounts or tax_withholding_details.get("account_head") not in accounts: self.append("taxes", tax_withholding_details) diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json index f9fdc4b605..de7ef2ac96 100644 --- a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json +++ b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json @@ -28,7 +28,8 @@ "base_tax_amount", "base_total", "base_tax_amount_after_discount_amount", - "item_wise_tax_detail" + "item_wise_tax_detail", + "is_advance_tax" ], "fields": [ { @@ -39,7 +40,9 @@ "oldfieldname": "category", "oldfieldtype": "Select", "options": "Valuation and Total\nValuation\nTotal", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "Add", @@ -49,7 +52,9 @@ "oldfieldname": "add_deduct_tax", "oldfieldtype": "Select", "options": "Add\nDeduct", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "columns": 2, @@ -61,7 +66,9 @@ "oldfieldname": "charge_type", "oldfieldtype": "Select", "options": "\nActual\nOn Net Total\nOn Previous Row Amount\nOn Previous Row Total\nOn Item Quantity", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:[\"On Previous Row Amount\", \"On Previous Row Total\"].indexOf(doc.charge_type)!==-1", @@ -69,7 +76,9 @@ "fieldtype": "Data", "label": "Reference Row #", "oldfieldname": "row_id", - "oldfieldtype": "Data" + "oldfieldtype": "Data", + "show_days": 1, + "show_seconds": 1 }, { "default": "0", @@ -77,11 +86,15 @@ "fieldname": "included_in_print_rate", "fieldtype": "Check", "label": "Is this Tax included in Basic Rate?", - "report_hide": 1 + "report_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "col_break1", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "columns": 2, @@ -92,7 +105,9 @@ "oldfieldname": "account_head", "oldfieldtype": "Link", "options": "Account", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": ":Company", @@ -101,7 +116,9 @@ "label": "Cost Center", "oldfieldname": "cost_center", "oldfieldtype": "Link", - "options": "Cost Center" + "options": "Cost Center", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "description", @@ -111,11 +128,15 @@ "oldfieldtype": "Small Text", "print_width": "300px", "reqd": 1, + "show_days": 1, + "show_seconds": 1, "width": "300px" }, { "fieldname": "section_break_10", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "columns": 2, @@ -124,11 +145,15 @@ "in_list_view": 1, "label": "Rate", "oldfieldname": "rate", - "oldfieldtype": "Currency" + "oldfieldtype": "Currency", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_9", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "columns": 2, @@ -138,7 +163,9 @@ "label": "Amount", "oldfieldname": "tax_amount", "oldfieldtype": "Currency", - "options": "currency" + "options": "currency", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "tax_amount_after_discount_amount", @@ -146,7 +173,9 @@ "label": "Tax Amount After Discount Amount", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "columns": 2, @@ -157,11 +186,15 @@ "oldfieldname": "total", "oldfieldtype": "Currency", "options": "currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_14", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_tax_amount", @@ -169,7 +202,9 @@ "label": "Amount (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_total", @@ -177,7 +212,9 @@ "hidden": 1, "label": "Total (Company Currency)", "options": "Company:company:default_currency", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_tax_amount_after_discount_amount", @@ -185,7 +222,9 @@ "label": "Tax Amount After Discount Amount", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "item_wise_tax_detail", @@ -195,22 +234,38 @@ "oldfieldname": "item_wise_tax_detail", "oldfieldtype": "Small Text", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", - "label": "Accounting Dimensions" + "label": "Accounting Dimensions", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "dimension_col_break", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "default": "0", + "fieldname": "is_advance_tax", + "fieldtype": "Check", + "hidden": 1, + "label": "Is Advance Tax", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 } ], "idx": 1, "istable": 1, "links": [], - "modified": "2020-09-18 17:26:09.703215", + "modified": "2020-10-25 18:24:43.487567", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Taxes and Charges", diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 65e5823b91..a805dc4e91 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -617,10 +617,6 @@ class AccountsController(TransactionBase): payment_entries = get_advance_payment_entries(party_type, party, party_account, order_doctype, order_list, include_unallocated) - payment_entry_list = [d.reference_name for d in payment_entries] - - payment_entry_taxes = get_payment_entry_taxes(payment_entry_list) - res = journal_entries + payment_entries return res @@ -1245,13 +1241,6 @@ def get_advance_payment_entries(party_type, party, party_account, order_doctype, return list(payment_entries_against_order) + list(unallocated_payment_entries) -def get_payment_entry_taxes(payment_entry_list): - taxes = frappe.db.sql(""" - SELECT t.parent, t.add_deduct_tax, t.charge_type, t.account_head, t.cost_center, - t.tax_amount FROM `tabAdvance Taxes and Charges` where t.parent in %s""" - ,(payment_entry_list, ), as_dict=1) - - def update_invoice_status(): # Daily update the status of the invoices diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 9fae49482d..f3d7b2635e 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -40,6 +40,7 @@ class calculate_taxes_and_totals(object): self.validate_conversion_rate() self.calculate_item_values() self.validate_item_tax_template() + self.apply_advance_taxes() self.initialize_taxes() self.determine_exclusive_rate() self.calculate_net_total() @@ -683,6 +684,32 @@ class calculate_taxes_and_totals(object): self.calculate_paid_amount() + def apply_advance_taxes(self): + if cint(self.doc.get('adjust_advance_taxes')): + if self.doc.get('advances'): + payment_entry_list = [d.reference_name for d in self.doc.get('advances')] + advance_taxes = get_advance_taxes(payment_entry_list) + accounts = [] + + # Remove already added advance taxes if any + for tax in self.doc.get('taxes'): + if tax.is_advance_tax: + self.doc.remove(tax) + else: + accounts.append(tax.account_head) + + for tax in advance_taxes: + # Reverse add deduct from payment entry in invoice + if tax.account_head in accounts: + add_deduct_tax = 'Deduct' if tax.add_deduct_tax == 'Add' else 'Add' + tax.update({ + 'add_deduct_tax': add_deduct_tax, + 'category': tax.get('category') or 'Total', + 'is_advance_tax': 1, + 'charge_type': 'On Net Total' if tax.charge_type == 'On Paid Amount' else tax.charge_type + }) + + self.doc.append('taxes', tax) def get_itemised_tax_breakup_html(doc): if not doc.taxes: @@ -820,3 +847,16 @@ class init_landed_taxes_and_totals(object): for d in self.doc.get(self.tax_field): d.amount = flt(d.amount, d.precision("amount")) d.base_amount = flt(d.amount * flt(d.exchange_rate), d.precision("base_amount")) + +def get_advance_taxes(payment_entry_list): + taxes = [] + if payment_entry_list: + taxes = frappe.db.sql( + """ + SELECT t.parent, t.add_deduct_tax, t.charge_type, t.rate, + t.account_head, t.cost_center, t.tax_amount, t.description + FROM `tabAdvance Taxes and Charges` t, `tabPayment Entry` p + WHERE t.parent = p.name AND t.parent in %s + """, (payment_entry_list, ), as_dict=1) + + return taxes diff --git a/erpnext/public/js/payment/payments.js b/erpnext/public/js/payment/payments.js index 0d656bc1fb..b168952e40 100644 --- a/erpnext/public/js/payment/payments.js +++ b/erpnext/public/js/payment/payments.js @@ -8,7 +8,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.dialog = new frappe.ui.Dialog({ title: 'Payment' }); - + this.dialog.show(); this.$body = this.dialog.body; this.set_payment_primary_action(); @@ -25,7 +25,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ set_payment_primary_action: function(){ var me = this; - + this.dialog.set_primary_action(__("Submit"), function() { // Allow no ZERO payment $.each(me.frm.doc.payments, function (index, data) { @@ -100,7 +100,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.selected_mode.select() this.bind_amount_change_event(); }, - + bind_keyboard_event: function(){ var me = this; this.payment_val = ''; @@ -114,17 +114,17 @@ erpnext.payments = erpnext.stock.StockController.extend({ me.idx = $(this).attr("idx"); me.set_outstanding_amount() }) - + $(this.$body).find('.form-control').click(function(){ me.idx = $(this).attr("idx"); me.set_outstanding_amount(); me.update_paid_amount(true); }) - + $(this.$body).find('.write_off_amount').change(function(){ me.write_off_amount(flt($(this).val()), precision("write_off_amount")); }) - + $(this.$body).find('.change_amount').change(function(){ me.change_amount(flt($(this).val()), precision("change_amount")); }) @@ -138,7 +138,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ $(this.$body).find('.amount').attr('disabled', true); this.selected_mode.attr('disabled', false); }, - + bind_numeric_keys_event: function(){ var me = this; $(this.$body).find('.pos-keyboard-key').click(function(){ @@ -147,7 +147,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ me.idx = me.selected_mode.attr("idx") me.update_paid_amount() }) - + $(this.$body).find('.delete-btn').click(function(){ me.payment_val = cstr(flt(me.selected_mode.val())).slice(0, -1); me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency)); @@ -156,7 +156,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ }) }, - + bind_amount_change_event: function(){ var me = this; this.selected_mode.change(function(){ From d18dde77577cb041ce06e4cf7971087157ceb933 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 29 Nov 2020 21:40:04 +0530 Subject: [PATCH 04/53] fix: Add tds in PO and code cleanup --- .../advance_taxes_and_charges.json | 31 +- .../doctype/payment_entry/payment_entry.json | 66 ++- .../doctype/payment_entry/payment_entry.py | 89 +++- .../purchase_invoice/purchase_invoice.py | 48 +- .../purchase_taxes_and_charges.json | 15 +- .../doctype/sales_invoice/sales_invoice.py | 42 ++ .../doctype/purchase_order/purchase_order.js | 8 + .../purchase_order/purchase_order.json | 481 +++++++++++++----- .../doctype/purchase_order/purchase_order.py | 35 ++ erpnext/controllers/accounts_controller.py | 30 ++ erpnext/controllers/taxes_and_totals.py | 28 - 11 files changed, 676 insertions(+), 197 deletions(-) diff --git a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json index 5b3299e656..aac7eb6bcb 100644 --- a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json +++ b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json @@ -12,6 +12,7 @@ "account_head", "col_break_1", "description", + "included_in_paid_amount", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -20,9 +21,11 @@ "section_break_9", "tax_amount", "total", + "allocated_amount", "column_break_13", "base_tax_amount", - "base_total" + "base_total", + "base_allocated_amount" ], "fields": [ { @@ -185,12 +188,36 @@ "reqd": 1, "show_days": 1, "show_seconds": 1 + }, + { + "default": "0", + "fieldname": "included_in_paid_amount", + "fieldtype": "Check", + "label": "Included In Paid Amount", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "allocated_amount", + "fieldtype": "Currency", + "label": "Allocated Amount", + "options": "currency", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "base_allocated_amount", + "fieldtype": "Currency", + "label": "Allocated Amount (Company Currency)", + "options": "Company:company:default_currency", + "show_days": 1, + "show_seconds": 1 } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2020-10-27 20:02:34.734260", + "modified": "2020-11-29 19:06:14.666460", "modified_by": "Administrator", "module": "Accounts", "name": "Advance Taxes and Charges", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index f158345af6..ec92db0708 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -24,15 +24,12 @@ "party_bank_account", "contact_person", "contact_email", - "tds_details_section", - "apply_tax_withholding_amount", - "column_break_20", - "tax_withholding_category", "payment_accounts_section", "party_balance", "paid_from", "paid_from_account_currency", "paid_from_account_balance", + "advance_tax_account", "column_break_18", "paid_to", "paid_to_account_currency", @@ -45,8 +42,10 @@ "base_paid_amount_after_tax", "column_break_21", "received_amount", + "received_amount_after_tax", "target_exchange_rate", "base_received_amount", + "base_received_amount_after_tax", "section_break_14", "get_outstanding_invoice", "references", @@ -61,6 +60,10 @@ "taxes_and_charges_section", "purchase_taxes_and_charges_template", "sales_taxes_and_charges_template", + "column_break_55", + "apply_tax_withholding_amount", + "tax_withholding_category", + "section_break_56", "taxes", "base_total_taxes_and_charges", "total_taxes_and_charges", @@ -731,14 +734,6 @@ "fieldtype": "Check", "label": "Custom Remarks" }, - { - "depends_on": "eval: doc.payment_type == 'Pay' && doc.party_type == 'Supplier'", - "fieldname": "tds_details_section", - "fieldtype": "Section Break", - "label": "TDS Details", - "show_days": 1, - "show_seconds": 1 - }, { "depends_on": "eval:doc.apply_tax_withholding_amount", "fieldname": "tax_withholding_category", @@ -750,18 +745,13 @@ }, { "default": "0", + "depends_on": "eval:doc.party_type == 'Supplier'", "fieldname": "apply_tax_withholding_amount", "fieldtype": "Check", "label": "Apply Tax Withholding Amount", "show_days": 1, "show_seconds": 1 }, - { - "fieldname": "column_break_20", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 - }, { "collapsible": 1, "fieldname": "taxes_and_charges_section", @@ -829,6 +819,44 @@ "fieldtype": "Currency", "label": "Paid Amount After Tax (Company Currency)", "options": "Company:company:default_currency", + "read_only": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "column_break_55", + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "section_break_56", + "fieldtype": "Section Break", + "hide_border": 1, + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "advance_tax_account", + "fieldtype": "Link", + "label": "Advance Tax Account", + "options": "Account", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "received_amount_after_tax", + "fieldtype": "Currency", + "label": "Received Amount After Tax", + "options": "paid_to_account_currency", + "show_days": 1, + "show_seconds": 1 + }, + { + "fieldname": "base_received_amount_after_tax", + "fieldtype": "Currency", + "label": "Received Amount After Tax (Company Currency)", + "options": "Company:company:default_currency", "show_days": 1, "show_seconds": 1 } @@ -836,7 +864,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2020-10-25 20:50:14.896628", + "modified": "2020-11-29 20:03:57.772062", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index a21deb5431..251b581723 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -65,6 +65,7 @@ class PaymentEntry(AccountsController): self.validate_allocated_amount() self.validate_paid_invoices() self.ensure_supplier_is_not_blocked() + self.validate_advance_tax_account() self.set_status() def on_submit(self): @@ -310,6 +311,9 @@ class PaymentEntry(AccountsController): + "

" + _("If this is undesirable please cancel the corresponding Payment Entry."), title=_("Warning"), indicator="orange") + def validate_advance_tax_account(self): + if self.get('taxes') and not self.advance_tax_account: + frappe.throw(_('Please select advance tax account')) def validate_journal_entry(self): for d in self.get("references"): @@ -396,11 +400,29 @@ class PaymentEntry(AccountsController): if not self.apply_tax_withholding_amount: return + reference_doclist = [] + net_total = self.paid_amount + included_in_paid_amount = 0 + + if self.get('references'): + for doc in self.get('references'): + if doc.reference_doctype == 'Purchase Order': + reference_doclist.append(doc.reference_name) + + if reference_doclist: + order_amount = frappe.db.get_all('Purchase Order', fields=['sum(net_total)'], + filters = {'name': ('in', reference_doclist), 'docstatus': 1, + 'apply_tds': 1}, as_list=1) + + if order_amount: + net_total = order_amount[0][0] + included_in_paid_amount = 1 + args = frappe._dict({ 'company': self.company, 'supplier': self.party, 'posting_date': self.posting_date, - 'net_total': self.paid_amount + 'net_total': net_total }) tax_withholding_details = get_party_tax_withholding_details(args, self.tax_withholding_category) @@ -408,6 +430,8 @@ class PaymentEntry(AccountsController): if not tax_withholding_details: return + tax_withholding_details.update({'included_in_paid_amount': included_in_paid_amount}) + accounts = [] for d in self.taxes: if d.account_head == tax_withholding_details.get("account_head"): @@ -424,18 +448,37 @@ class PaymentEntry(AccountsController): self.remove(d) def set_amounts(self): - self.set_amounts_after_tax() + self.set_received_amount() self.set_amounts_in_company_currency() + self.set_amounts_after_tax() self.set_total_allocated_amount() self.set_unallocated_amount() self.set_difference_amount() + def set_received_amount(self): + self.base_received_amount = self.base_paid_amount + def set_amounts_after_tax(self): - self.paid_amount_after_tax = flt(flt(self.paid_amount) + flt(self.total_taxes_and_charges), + applicable_tax = 0 + base_applicable_tax = 0 + for tax in self.get('taxes'): + if not tax.included_in_paid_amount: + amount = -1 * tax.tax_amount if tax.add_deduct_tax == 'Deduct' else tax.tax_amount + base_amount = -1 * tax.base_tax_amount if tax.add_deduct_tax == 'Deduct' else tax.base_tax_amount + + applicable_tax += amount + base_applicable_tax += base_amount + + self.paid_amount_after_tax = flt(flt(self.paid_amount) + flt(applicable_tax), self.precision("paid_amount_after_tax")) self.base_paid_amount_after_tax = flt(flt(self.paid_amount_after_tax) * flt(self.source_exchange_rate), self.precision("base_paid_amount_after_tax")) + self.received_amount_after_tax = flt(flt(self.received_amount) + flt(applicable_tax), + self.precision("paid_amount_after_tax")) + self.base_received_amount_after_tax = flt(flt(self.received_amount_after_tax) * flt(self.source_exchange_rate), + self.precision("base_paid_amount_after_tax")) + def set_amounts_in_company_currency(self): self.base_paid_amount, self.base_received_amount, self.difference_amount = 0, 0, 0 if self.paid_amount: @@ -465,14 +508,14 @@ class PaymentEntry(AccountsController): if self.party: total_deductions = sum([flt(d.amount) for d in self.get("deductions")]) if self.payment_type == "Receive" \ - and self.base_total_allocated_amount < self.base_received_amount + total_deductions \ - and self.total_allocated_amount < self.paid_amount + (total_deductions / self.source_exchange_rate): - self.unallocated_amount = (self.base_received_amount + total_deductions - + and self.base_total_allocated_amount < self.base_received_amount_after_tax + total_deductions \ + and self.total_allocated_amount < self.paid_amount_after_tax + (total_deductions / self.source_exchange_rate): + self.unallocated_amount = (self.received_amount_after_tax + total_deductions - self.base_total_allocated_amount) / self.source_exchange_rate elif self.payment_type == "Pay" \ - and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions) \ - and self.total_allocated_amount < self.received_amount + (total_deductions / self.target_exchange_rate): - self.unallocated_amount = (self.base_paid_amount - (total_deductions + + and self.base_total_allocated_amount < (self.base_paid_amount_after_tax - total_deductions) \ + and self.total_allocated_amount < self.received_amount_after_tax + (total_deductions / self.target_exchange_rate): + self.unallocated_amount = (self.base_paid_amount_after_tax - (total_deductions + self.base_total_allocated_amount)) / self.target_exchange_rate def set_difference_amount(self): @@ -482,11 +525,11 @@ class PaymentEntry(AccountsController): base_party_amount = flt(self.base_total_allocated_amount) + flt(base_unallocated_amount) if self.payment_type == "Receive": - self.difference_amount = base_party_amount - self.base_received_amount + self.difference_amount = base_party_amount - self.base_received_amount_after_tax elif self.payment_type == "Pay": - self.difference_amount = self.base_paid_amount - base_party_amount + self.difference_amount = self.base_paid_amount_after_tax - base_party_amount else: - self.difference_amount = self.base_paid_amount - flt(self.base_received_amount) + self.difference_amount = self.base_paid_amount_after_tax - flt(self.base_received_amount_after_tax) total_deductions = sum([flt(d.amount) for d in self.get("deductions")]) @@ -616,7 +659,7 @@ class PaymentEntry(AccountsController): gl_entries.append(gle) if self.unallocated_amount: - base_unallocated_amount = base_unallocated_amount = self.unallocated_amount * \ + base_unallocated_amount = self.unallocated_amount * \ (self.source_exchange_rate if self.payment_type=="Receive" else self.target_exchange_rate) gle = party_gl_dict.copy() @@ -646,8 +689,8 @@ class PaymentEntry(AccountsController): "account": self.paid_to, "account_currency": self.paid_to_account_currency, "against": self.party if self.payment_type=="Receive" else self.paid_from, - "debit_in_account_currency": self.received_amount, - "debit": self.base_received_amount, + "debit_in_account_currency": self.received_amount_after_tax, + "debit": self.base_received_amount_after_tax, "cost_center": self.cost_center }, item=self) ) @@ -660,8 +703,10 @@ class PaymentEntry(AccountsController): if self.payment_type == 'Pay': dr_or_cr = "debit" if d.add_deduct_tax == "Add" else "credit" + rev_dr_cr = "credit" if d.add_deduct_tax == "Add" else "debit" elif self.payment_type == 'Receive': dr_or_cr = "credit" if d.add_deduct_tax == "Add" else "debit" + rev_dr_cr = "debit" if d.add_deduct_tax == "Add" else "credit" gl_entries.append( self.get_gl_dict({ @@ -672,8 +717,18 @@ class PaymentEntry(AccountsController): if account_currency==self.company_currency \ else d.tax_amount, "cost_center": d.cost_center - }, account_currency, item=d) - ) + }, account_currency, item=d)) + + gl_entries.append( + self.get_gl_dict({ + "account": self.advance_tax_account, + "against": self.party if self.payment_type=="Receive" else self.paid_from, + rev_dr_cr: d.base_tax_amount, + rev_dr_cr + "_in_account_currency": d.base_tax_amount \ + if account_currency==self.company_currency \ + else d.tax_amount, + "cost_center": d.cost_center + }, account_currency, item=d)) def add_deductions_gl_entries(self, gl_entries): for d in self.get("deductions"): diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 84dd491a56..8f7248f1e6 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -456,6 +456,8 @@ class PurchaseInvoice(BuyingController): self.make_tax_gl_entries(gl_entries) self.make_internal_transfer_gl_entries(gl_entries) + self.allocate_advance_taxes(gl_entries) + gl_entries = make_regional_gl_entries(gl_entries, self) gl_entries = merge_similar_entries(gl_entries) @@ -899,6 +901,46 @@ class PurchaseInvoice(BuyingController): "cost_center": self.cost_center }, account_currency, item=self)) + def allocate_advance_taxes(self, gl_entries): + tax_map = self.get_tax_map() + for pe in self.get('advances'): + pe = frappe.get_doc('Payment Entry', pe.reference_name) + for tax in pe.get('taxes'): + account_currency = get_account_currency(tax.account_head) + dr_or_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" + rev_dr_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" + + unallocated_amount = tax.tax_amount - tax.allocated_amount + if tax_map.get(tax.account_head): + amount = tax_map.get(tax.account_head) + if amount < unallocated_amount: + unallocated_amount = amount + + gl_entries.append( + self.get_gl_dict({ + "account": tax.account_head, + "against": self.supplier, + dr_or_cr: unallocated_amount, + dr_or_cr + "_in_account_currency": unallocated_amount \ + if account_currency==self.company_currency \ + else unallocated_amount, + 'cost_center': tax.cost_center + }, account_currency, item=tax)) + + gl_entries.append( + self.get_gl_dict({ + "account": pe.advance_tax_account, + "against": self.supplier, + rev_dr_cr: unallocated_amount, + rev_dr_cr + "_in_account_currency": unallocated_amount \ + if account_currency==self.company_currency \ + else unallocated_amount, + 'cost_center': tax.cost_center + }, account_currency, item=tax)) + + frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) + tax_map[tax.account_head] -= unallocated_amount + def make_payment_gl_entries(self, gl_entries): # Make Cash GL Entries if cint(self.is_paid) and self.cash_bank_account and self.paid_amount: @@ -1088,10 +1130,10 @@ class PurchaseInvoice(BuyingController): accounts = [] for d in self.taxes: - if d.account_head == tax_withholding_details.get("account_head") and not d.is_advance_tax: + if d.account_head == tax_withholding_details.get("account_head"): d.update(tax_withholding_details) - if not d.is_advance_tax: - accounts.append(d.account_head) + + accounts.append(d.account_head) if not accounts or tax_withholding_details.get("account_head") not in accounts: self.append("taxes", tax_withholding_details) diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json index de7ef2ac96..0db0b6823d 100644 --- a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json +++ b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json @@ -28,8 +28,7 @@ "base_tax_amount", "base_total", "base_tax_amount_after_discount_amount", - "item_wise_tax_detail", - "is_advance_tax" + "item_wise_tax_detail" ], "fields": [ { @@ -250,22 +249,12 @@ "fieldtype": "Column Break", "show_days": 1, "show_seconds": 1 - }, - { - "default": "0", - "fieldname": "is_advance_tax", - "fieldtype": "Check", - "hidden": 1, - "label": "Is Advance Tax", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 } ], "idx": 1, "istable": 1, "links": [], - "modified": "2020-10-25 18:24:43.487567", + "modified": "2020-11-29 19:11:58.826078", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Taxes and Charges", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index a008742390..9af94fd780 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -842,6 +842,8 @@ class SalesInvoice(SellingController): self.make_tax_gl_entries(gl_entries) self.make_internal_transfer_gl_entries(gl_entries) + self.allocate_advance_taxes(gl_entries) + self.make_item_gl_entries(gl_entries) # merge gl entries before adding pos entries @@ -911,6 +913,46 @@ class SalesInvoice(SellingController): "cost_center": self.cost_center }, account_currency, item=self)) + def allocate_advance_taxes(self, gl_entries): + tax_map = self.get_tax_map() + for pe in self.get('advances'): + pe = frappe.get_doc('Payment Entry', pe.reference_name) + for tax in pe.get('taxes'): + account_currency = get_account_currency(tax.account_head) + dr_or_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" + rev_dr_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" + + unallocated_amount = tax.tax_amount - tax.allocated_amount + if tax_map.get(tax.account_head): + amount = tax_map.get(tax.account_head) + if amount < unallocated_amount: + unallocated_amount = amount + + gl_entries.append( + self.get_gl_dict({ + "account": tax.account_head, + "against": self.customer, + dr_or_cr: unallocated_amount, + dr_or_cr + "_in_account_currency": unallocated_amount \ + if account_currency==self.company_currency \ + else unallocated_amount, + 'cost_center': tax.cost_center + }, account_currency, item=tax)) + + gl_entries.append( + self.get_gl_dict({ + "account": pe.advance_tax_account, + "against": self.customer, + rev_dr_cr: unallocated_amount, + rev_dr_cr + "_in_account_currency": unallocated_amount \ + if account_currency==self.company_currency \ + else unallocated_amount, + 'cost_center': tax.cost_center + }, account_currency, item=tax)) + + frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) + tax_map[tax.account_head] -= unallocated_amount + def make_item_gl_entries(self, gl_entries): # income account gl entries for item in self.get("items"): diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index dd0f065848..139aa72c08 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -45,6 +45,14 @@ frappe.ui.form.on("Purchase Order", { }); erpnext.accounts.dimensions.setup_dimension_filters(frm, frm.doctype); + }, + + apply_tds: function(frm) { + if (!frm.doc.apply_tds) { + frm.set_value("tax_withholding_category", ''); + } else { + frm.set_value("tax_withholding_category", frm.supplier_tds); + } } }); diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index ee2beea67f..64eda5f280 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -14,6 +14,8 @@ "supplier", "get_items_from_open_material_requests", "supplier_name", + "apply_tds", + "tax_withholding_category", "column_break1", "company", "transaction_date", @@ -142,7 +144,9 @@ { "fieldname": "supplier_section", "fieldtype": "Section Break", - "options": "fa fa-user" + "options": "fa fa-user", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -152,7 +156,9 @@ "hidden": 1, "label": "Title", "no_copy": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "naming_series", @@ -164,7 +170,9 @@ "options": "PUR-ORD-.YYYY.-", "print_hide": 1, "reqd": 1, - "set_only_once": 1 + "set_only_once": 1, + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -178,14 +186,18 @@ "options": "Supplier", "print_hide": 1, "reqd": 1, - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.supplier && doc.docstatus===0 && (!(doc.items && doc.items.length) || (doc.items.length==1 && !doc.items[0].item_code))", "description": "Fetch items based on Default Supplier.", "fieldname": "get_items_from_open_material_requests", "fieldtype": "Button", - "label": "Get Items from Open Material Requests" + "label": "Get Items from Open Material Requests", + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -194,7 +206,9 @@ "fieldtype": "Data", "in_global_search": 1, "label": "Supplier Name", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "company", @@ -206,13 +220,17 @@ "options": "Company", "print_hide": 1, "remember_last_selected_value": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break1", "fieldtype": "Column Break", "oldfieldtype": "Column Break", "print_width": "50%", + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -224,27 +242,35 @@ "oldfieldname": "transaction_date", "oldfieldtype": "Date", "reqd": 1, - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, "fieldname": "schedule_date", "fieldtype": "Date", - "label": "Required By" + "label": "Required By", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, "depends_on": "eval:doc.docstatus===1", "fieldname": "order_confirmation_no", "fieldtype": "Data", - "label": "Order Confirmation No" + "label": "Order Confirmation No", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, "depends_on": "eval:doc.order_confirmation_no", "fieldname": "order_confirmation_date", "fieldtype": "Date", - "label": "Order Confirmation Date" + "label": "Order Confirmation Date", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "amended_from", @@ -256,19 +282,25 @@ "oldfieldtype": "Data", "options": "Purchase Order", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "drop_ship", "fieldtype": "Section Break", - "label": "Drop Ship" + "label": "Drop Ship", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "customer", "fieldtype": "Link", "label": "Customer", "options": "Customer", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "bold": 1, @@ -276,31 +308,41 @@ "fieldtype": "Data", "label": "Customer Name", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_19", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "customer_contact_person", "fieldtype": "Link", "label": "Customer Contact", - "options": "Contact" + "options": "Contact", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "customer_contact_display", "fieldtype": "Small Text", "hidden": 1, "label": "Customer Contact", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "customer_contact_mobile", "fieldtype": "Small Text", "hidden": 1, "label": "Customer Mobile No", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "customer_contact_email", @@ -308,27 +350,35 @@ "hidden": 1, "label": "Customer Contact Email", "options": "Email", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "section_addresses", "fieldtype": "Section Break", - "label": "Address and Contact" + "label": "Address and Contact", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "supplier_address", "fieldtype": "Link", "label": "Supplier Address", "options": "Address", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "contact_person", "fieldtype": "Link", "label": "Supplier Contact", "options": "Contact", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "address_display", @@ -355,32 +405,42 @@ "label": "Contact Email", "options": "Email", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "col_break_address", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "shipping_address", "fieldtype": "Link", "label": "Company Shipping Address", "options": "Address", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "shipping_address_display", "fieldtype": "Small Text", "label": "Shipping Address Details", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "currency_and_price_list", "fieldtype": "Section Break", "label": "Currency and Price List", - "options": "fa fa-tag" + "options": "fa fa-tag", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "currency", @@ -390,7 +450,9 @@ "oldfieldtype": "Select", "options": "Currency", "print_hide": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "conversion_rate", @@ -400,18 +462,24 @@ "oldfieldtype": "Currency", "precision": "9", "print_hide": 1, - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "cb_price_list", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "buying_price_list", "fieldtype": "Link", "label": "Price List", "options": "Price List", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "price_list_currency", @@ -419,14 +487,18 @@ "label": "Price List Currency", "options": "Currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "plc_conversion_rate", "fieldtype": "Float", "label": "Price List Exchange Rate", "precision": "9", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "0", @@ -435,7 +507,9 @@ "label": "Ignore Pricing Rule", "no_copy": 1, "permlevel": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "sec_warehouse", @@ -448,11 +522,15 @@ "fieldtype": "Link", "label": "Set Target Warehouse", "options": "Warehouse", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "col_break_warehouse", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "No", @@ -461,26 +539,34 @@ "in_standard_filter": 1, "label": "Supply Raw Materials", "options": "No\nYes", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.is_subcontracted==\"Yes\"", "fieldname": "supplier_warehouse", "fieldtype": "Link", "label": "Supplier Warehouse", - "options": "Warehouse" + "options": "Warehouse", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "items_section", "fieldtype": "Section Break", "hide_border": 1, "oldfieldtype": "Section Break", - "options": "fa fa-shopping-cart" + "options": "fa fa-shopping-cart", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "scan_barcode", "fieldtype": "Data", - "label": "Scan Barcode" + "label": "Scan Barcode", + "show_days": 1, + "show_seconds": 1 }, { "allow_bulk_edit": 1, @@ -490,26 +576,34 @@ "oldfieldname": "po_details", "oldfieldtype": "Table", "options": "Purchase Order Item", - "reqd": 1 + "reqd": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "section_break_48", "fieldtype": "Section Break", - "label": "Pricing Rules" + "label": "Pricing Rules", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "pricing_rules", "fieldtype": "Table", "label": "Purchase Order Pricing Rule", "options": "Pricing Rule Detail", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible_depends_on": "supplied_items", "fieldname": "raw_material_details", "fieldtype": "Section Break", - "label": "Raw Materials Supplied" + "label": "Raw Materials Supplied", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "supplied_items", @@ -519,17 +613,23 @@ "oldfieldtype": "Table", "options": "Purchase Order Item Supplied", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "sb_last_purchase", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_qty", "fieldtype": "Float", "label": "Total Quantity", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_total", @@ -537,7 +637,9 @@ "label": "Total (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_net_total", @@ -548,18 +650,24 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_26", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total", "fieldtype": "Currency", "label": "Total", "options": "currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "net_total", @@ -569,20 +677,26 @@ "oldfieldtype": "Currency", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "total_net_weight", "fieldtype": "Float", "label": "Total Net Weight", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "taxes_section", "fieldtype": "Section Break", "oldfieldtype": "Section Break", - "options": "fa fa-money" + "options": "fa fa-money", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "taxes_and_charges", @@ -591,18 +705,24 @@ "oldfieldname": "purchase_other_charges", "oldfieldtype": "Link", "options": "Purchase Taxes and Charges Template", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_50", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "shipping_rule", "fieldtype": "Link", "label": "Shipping Rule", "options": "Shipping Rule", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "section_break_52", @@ -615,13 +735,17 @@ "label": "Purchase Taxes and Charges", "oldfieldname": "purchase_tax_details", "oldfieldtype": "Table", - "options": "Purchase Taxes and Charges" + "options": "Purchase Taxes and Charges", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "sec_tax_breakup", "fieldtype": "Section Break", - "label": "Tax Breakup" + "label": "Tax Breakup", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "other_charges_calculation", @@ -630,14 +754,18 @@ "no_copy": 1, "oldfieldtype": "HTML", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "totals", "fieldtype": "Section Break", "label": "Taxes and Charges", "oldfieldtype": "Section Break", - "options": "fa fa-money" + "options": "fa fa-money", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "base_taxes_and_charges_added", @@ -648,7 +776,9 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "base_taxes_and_charges_deducted", @@ -659,7 +789,9 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "base_total_taxes_and_charges", @@ -671,11 +803,15 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_39", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "taxes_and_charges_added", @@ -686,7 +822,9 @@ "oldfieldtype": "Currency", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "taxes_and_charges_deducted", @@ -697,7 +835,9 @@ "oldfieldtype": "Currency", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "total_taxes_and_charges", @@ -706,14 +846,18 @@ "label": "Total Taxes and Charges", "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "collapsible_depends_on": "apply_discount_on", "fieldname": "discount_section", "fieldtype": "Section Break", - "label": "Additional Discount" + "label": "Additional Discount", + "show_days": 1, + "show_seconds": 1 }, { "default": "Grand Total", @@ -721,7 +865,9 @@ "fieldtype": "Select", "label": "Apply Additional Discount On", "options": "\nGrand Total\nNet Total", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_discount_amount", @@ -729,24 +875,32 @@ "label": "Additional Discount Amount (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_45", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "additional_discount_percentage", "fieldtype": "Float", "label": "Additional Discount Percentage", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "discount_amount", "fieldtype": "Currency", "label": "Additional Discount Amount", "options": "currency", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "totals_section", @@ -762,7 +916,9 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_rounding_adjustment", @@ -771,7 +927,9 @@ "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "description": "In Words will be visible once you save the Purchase Order.", @@ -782,7 +940,9 @@ "oldfieldname": "in_words", "oldfieldtype": "Data", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "base_rounded_total", @@ -792,12 +952,16 @@ "oldfieldtype": "Currency", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break4", "fieldtype": "Column Break", - "oldfieldtype": "Column Break" + "oldfieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "grand_total", @@ -807,7 +971,9 @@ "oldfieldname": "grand_total_import", "oldfieldtype": "Currency", "options": "currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "rounding_adjustment", @@ -816,20 +982,26 @@ "no_copy": 1, "options": "currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "rounded_total", "fieldtype": "Currency", "label": "Rounded Total", "options": "currency", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "default": "0", "fieldname": "disable_rounded_total", "fieldtype": "Check", - "label": "Disable Rounded Total" + "label": "Disable Rounded Total", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "in_words", @@ -839,7 +1011,9 @@ "oldfieldname": "in_words_import", "oldfieldtype": "Data", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "advance_paid", @@ -848,19 +1022,25 @@ "no_copy": 1, "options": "party_account_currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "payment_schedule_section", "fieldtype": "Section Break", - "label": "Payment Terms" + "label": "Payment Terms", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payment_terms_template", "fieldtype": "Link", "label": "Payment Terms Template", - "options": "Payment Terms Template" + "options": "Payment Terms Template", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "payment_schedule", @@ -868,7 +1048,9 @@ "label": "Payment Schedule", "no_copy": 1, "options": "Payment Schedule", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -877,7 +1059,9 @@ "fieldtype": "Section Break", "label": "Terms and Conditions", "oldfieldtype": "Section Break", - "options": "fa fa-legal" + "options": "fa fa-legal", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "tc_name", @@ -886,21 +1070,27 @@ "oldfieldname": "tc_name", "oldfieldtype": "Link", "options": "Terms and Conditions", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "terms", "fieldtype": "Text Editor", "label": "Terms and Conditions", "oldfieldname": "terms", - "oldfieldtype": "Text Editor" + "oldfieldtype": "Text Editor", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "more_info", "fieldtype": "Section Break", "label": "More Information", - "oldfieldtype": "Section Break" + "oldfieldtype": "Section Break", + "show_days": 1, + "show_seconds": 1 }, { "default": "Draft", @@ -915,7 +1105,9 @@ "print_hide": 1, "read_only": 1, "reqd": 1, - "search_index": 1 + "search_index": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "ref_sq", @@ -926,7 +1118,9 @@ "oldfieldtype": "Data", "options": "Supplier Quotation", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "party_account_currency", @@ -936,18 +1130,24 @@ "no_copy": 1, "options": "Currency", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "inter_company_order_reference", "fieldtype": "Link", "label": "Inter Company Order Reference", "options": "Sales Order", - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_74", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:!doc.__islocal", @@ -957,7 +1157,9 @@ "label": "% Received", "no_copy": 1, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:!doc.__islocal", @@ -967,7 +1169,9 @@ "label": "% Billed", "no_copy": 1, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -977,6 +1181,8 @@ "oldfieldtype": "Column Break", "print_hide": 1, "print_width": "50%", + "show_days": 1, + "show_seconds": 1, "width": "50%" }, { @@ -987,7 +1193,9 @@ "oldfieldname": "letter_head", "oldfieldtype": "Select", "options": "Letter Head", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -999,11 +1207,15 @@ "oldfieldtype": "Link", "options": "Print Heading", "print_hide": 1, - "report_hide": 1 + "report_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_86", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -1011,19 +1223,25 @@ "fieldname": "group_same_items", "fieldtype": "Check", "label": "Group same items", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "language", "fieldtype": "Data", "label": "Print Language", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, "fieldname": "subscription_section", "fieldtype": "Section Break", - "label": "Subscription Section" + "label": "Subscription Section", + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -1031,7 +1249,9 @@ "fieldtype": "Date", "label": "From Date", "no_copy": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, @@ -1039,11 +1259,15 @@ "fieldtype": "Date", "label": "To Date", "no_copy": 1, - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "column_break_97", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "auto_repeat", @@ -1052,27 +1276,35 @@ "no_copy": 1, "options": "Auto Repeat", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "allow_on_submit": 1, "depends_on": "eval: doc.auto_repeat", "fieldname": "update_auto_repeat_reference", "fieldtype": "Button", - "label": "Update Auto Repeat Reference" + "label": "Update Auto Repeat Reference", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "tax_category", "fieldtype": "Link", "label": "Tax Category", - "options": "Tax Category" + "options": "Tax Category", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "supplied_items", "fieldname": "set_reserve_warehouse", "fieldtype": "Link", "label": "Set Reserve Warehouse", - "options": "Warehouse" + "options": "Warehouse", + "show_days": 1, + "show_seconds": 1 }, { "collapsible": 1, @@ -1082,7 +1314,9 @@ }, { "fieldname": "column_break_75", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "billing_address", @@ -1118,13 +1352,30 @@ "label": "Represents Company", "options": "Company", "read_only": 1 + }, + { + "default": "0", + "fieldname": "apply_tds", + "fieldtype": "Check", + "label": "Apply Tax Withholding Amount", + "show_days": 1, + "show_seconds": 1 + }, + { + "depends_on": "eval: doc.apply_tds", + "fieldname": "tax_withholding_category", + "fieldtype": "Link", + "label": "Tax Withholding Category", + "options": "Tax Withholding Category", + "show_days": 1, + "show_seconds": 1 } ], "icon": "fa fa-file-text", "idx": 105, "is_submittable": 1, "links": [], - "modified": "2021-01-20 22:07:23.487138", + "modified": "2020-11-28 17:42:25.177827", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index ef9372eeb6..782593a5c5 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -17,6 +17,7 @@ from erpnext.accounts.party import get_party_account_currency from six import string_types from erpnext.stock.doctype.item.item import get_item_defaults from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults +from erpnext.accounts.doctype.tax_withholding_category.tax_withholding_category import get_party_tax_withholding_details from erpnext.accounts.doctype.sales_invoice.sales_invoice import validate_inter_company_party, update_linked_doc,\ unlink_inter_company_doc @@ -39,11 +40,18 @@ class PurchaseOrder(BuyingController): 'percent_join_field': 'material_request' }] + def onload(self): + supplier_tds = frappe.db.get_value("Supplier", self.supplier, "tax_withholding_category") + self.set_onload("supplier_tds", supplier_tds) + def validate(self): super(PurchaseOrder, self).validate() self.set_status() + # apply tax withholding only if checked and applicable + self.set_tax_withholding() + self.validate_supplier() self.validate_schedule_date() validate_for_items(self) @@ -87,6 +95,33 @@ class PurchaseOrder(BuyingController): if cint(frappe.db.get_single_value('Buying Settings', 'maintain_same_rate')): self.validate_rate_with_reference_doc([["Supplier Quotation", "supplier_quotation", "supplier_quotation_item"]]) + def set_tax_withholding(self): + if not self.apply_tds: + return + + tax_withholding_details = get_party_tax_withholding_details(self, self.tax_withholding_category) + + if not tax_withholding_details: + return + + accounts = [] + for d in self.taxes: + if d.account_head == tax_withholding_details.get("account_head"): + d.update(tax_withholding_details) + accounts.append(d.account_head) + + if not accounts or tax_withholding_details.get("account_head") not in accounts: + self.append("taxes", tax_withholding_details) + + to_remove = [d for d in self.taxes + if not d.tax_amount and d.account_head == tax_withholding_details.get("account_head")] + + for d in to_remove: + self.remove(d) + + # calculate totals again after applying TDS + self.calculate_taxes_and_totals() + def validate_supplier(self): prevent_po = frappe.db.get_value("Supplier", self.supplier, 'prevent_pos') if prevent_po: diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index a805dc4e91..da88853a96 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -700,6 +700,7 @@ class AccountsController(TransactionBase): from erpnext.accounts.utils import unlink_ref_doc_from_payment_entries if self.doctype in ["Sales Invoice", "Purchase Invoice"]: + self.update_allocated_advance_taxes() if frappe.db.get_single_value('Accounts Settings', 'unlink_payment_on_cancellation_of_invoice'): unlink_ref_doc_from_payment_entries(self) @@ -707,6 +708,35 @@ class AccountsController(TransactionBase): if frappe.db.get_single_value('Accounts Settings', 'unlink_advance_payment_on_cancelation_of_order'): unlink_ref_doc_from_payment_entries(self) + def get_tax_map(self): + tax_map = {} + for tax in self.get('taxes'): + tax_map.setdefault(tax.account_head, 0.0) + tax_map[tax.account_head] += tax.tax_amount + + return tax_map + + def update_allocated_advance_taxes(self): + if self.get('advances'): + tax_accounts = [d.account_head for d in self.get('taxes')] + allocated_tax_map = frappe._dict(frappe.get_all('GL Entry', fields=['account', 'sum(credit - debit)'], + filters={'voucher_no': self.name, 'account': ('in', tax_accounts)}, + group_by='account', as_list=1)) + + tax_map = self.get_tax_map() + + for pe in self.get('advances'): + pe = frappe.get_doc('Payment Entry', pe.reference_name) + for tax in pe.get('taxes'): + allocated_amount = tax_map.get(tax.account_head) - allocated_tax_map.get(tax.account_head) + if allocated_amount > tax.tax_amount: + allocated_amount = tax.tax_amount + + if allocated_amount: + frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount - allocated_amount) + tax_map[tax.account_head] -= allocated_amount + allocated_tax_map[tax.account_head] -= allocated_amount + def validate_multiple_billing(self, ref_dt, item_ref_dn, based_on, parentfield): from erpnext.controllers.status_updater import get_allowance_for item_allowance = {} diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index f3d7b2635e..a6b54eb590 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -40,7 +40,6 @@ class calculate_taxes_and_totals(object): self.validate_conversion_rate() self.calculate_item_values() self.validate_item_tax_template() - self.apply_advance_taxes() self.initialize_taxes() self.determine_exclusive_rate() self.calculate_net_total() @@ -684,33 +683,6 @@ class calculate_taxes_and_totals(object): self.calculate_paid_amount() - def apply_advance_taxes(self): - if cint(self.doc.get('adjust_advance_taxes')): - if self.doc.get('advances'): - payment_entry_list = [d.reference_name for d in self.doc.get('advances')] - advance_taxes = get_advance_taxes(payment_entry_list) - accounts = [] - - # Remove already added advance taxes if any - for tax in self.doc.get('taxes'): - if tax.is_advance_tax: - self.doc.remove(tax) - else: - accounts.append(tax.account_head) - - for tax in advance_taxes: - # Reverse add deduct from payment entry in invoice - if tax.account_head in accounts: - add_deduct_tax = 'Deduct' if tax.add_deduct_tax == 'Add' else 'Add' - tax.update({ - 'add_deduct_tax': add_deduct_tax, - 'category': tax.get('category') or 'Total', - 'is_advance_tax': 1, - 'charge_type': 'On Net Total' if tax.charge_type == 'On Paid Amount' else tax.charge_type - }) - - self.doc.append('taxes', tax) - def get_itemised_tax_breakup_html(doc): if not doc.taxes: return From 79b422c0a96f425b4098516b331b5a96d17c5aec Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 28 Feb 2021 18:07:21 +0530 Subject: [PATCH 05/53] fix: Advance TDS in TDS payable monthly report --- .../doctype/payment_entry/payment_entry.js | 19 ++- .../doctype/payment_entry/payment_entry.json | 2 +- .../doctype/payment_entry/payment_entry.py | 26 ++-- .../purchase_invoice/purchase_invoice.py | 2 +- .../tax_withholding_category.py | 6 +- .../tds_payable_monthly.js | 41 +++++- .../tds_payable_monthly.py | 127 ++++++++++++++---- .../purchase_order/purchase_order.json | 2 +- erpnext/setup/doctype/company/company.js | 2 +- 9 files changed, 175 insertions(+), 52 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 3e11bc0e59..19d73b1ad4 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -93,6 +93,15 @@ frappe.ui.form.on('Payment Entry', { } }); + frm.set_query("advance_tax_account", function() { + return { + filters: { + "company": frm.doc.company, + "root_type": ["in", ["Asset", "Liability"]] + } + } + }); + frm.set_query("reference_doctype", "references", function() { if (frm.doc.party_type == "Customer") { var doctypes = ["Sales Order", "Sales Invoice", "Journal Entry", "Dunning"]; @@ -1103,10 +1112,12 @@ frappe.ui.form.on('Payment Entry', { current_tax_amount *= (tax.add_deduct_tax == "Deduct") ? -1.0 : 1.0; - if(i==0) { - tax.total = flt(frm.doc.paid_amount + current_tax_amount, precision("total", tax)); - } else { - tax.total = flt(frm.doc["taxes"][i-1].total + current_tax_amount, precision("total", tax)); + if (!tax.included_in_paid_amount) { + if(i==0) { + tax.total = flt(frm.doc.paid_amount + current_tax_amount, precision("total", tax)); + } else { + tax.total = flt(frm.doc["taxes"][i-1].total + current_tax_amount, precision("total", tax)); + } } tax.base_total = tax.total * frm.doc.source_exchange_rate; diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index ec92db0708..d239c41fd8 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -864,7 +864,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2020-11-29 20:03:57.772062", + "modified": "2021-02-27 13:56:20.007336", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 251b581723..33eb6f2f26 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -65,7 +65,7 @@ class PaymentEntry(AccountsController): self.validate_allocated_amount() self.validate_paid_invoices() self.ensure_supplier_is_not_blocked() - self.validate_advance_tax_account() + self.set_advance_tax_account() self.set_status() def on_submit(self): @@ -311,9 +311,13 @@ class PaymentEntry(AccountsController): + "

" + _("If this is undesirable please cancel the corresponding Payment Entry."), title=_("Warning"), indicator="orange") - def validate_advance_tax_account(self): + def set_advance_tax_account(self): if self.get('taxes') and not self.advance_tax_account: - frappe.throw(_('Please select advance tax account')) + unrealized_profit_loss_account = frappe.db.get_value('Company', self.company, 'unrealized_profit_loss_account') + if not unrealized_profit_loss_account: + frappe.throw(_("Please select advance tax account or add Unrealized Profit / Loss Account in company master")) + + self.advance_tax_account = unrealized_profit_loss_account def validate_journal_entry(self): for d in self.get("references"): @@ -418,8 +422,10 @@ class PaymentEntry(AccountsController): net_total = order_amount[0][0] included_in_paid_amount = 1 + # Adding args as purchase invoice to get TDS amount args = frappe._dict({ 'company': self.company, + 'doctype': 'Purchase Invoice', 'supplier': self.party, 'posting_date': self.posting_date, 'net_total': net_total @@ -727,7 +733,7 @@ class PaymentEntry(AccountsController): rev_dr_cr + "_in_account_currency": d.base_tax_amount \ if account_currency==self.company_currency \ else d.tax_amount, - "cost_center": d.cost_center + "cost_center": d.cost_center or self.cost_center }, account_currency, item=d)) def add_deductions_gl_entries(self, gl_entries): @@ -830,12 +836,14 @@ class PaymentEntry(AccountsController): else: current_tax_amount *= 1.0 - if i == 0: - tax.total = flt(self.paid_amount + current_tax_amount, self.precision("total", tax)) - else: - tax.total = flt(self.taxes[i-1].total + current_tax_amount, self.precision("total", tax)) + if not tax.included_in_paid_amount: + if i == 0: + tax.total = flt(self.paid_amount + current_tax_amount, self.precision("total", tax)) + else: + tax.total = flt(self.taxes[i-1].total + current_tax_amount, self.precision("total", tax)) + + tax.base_total = tax.total * self.source_exchange_rate - tax.base_total = tax.total * self.source_exchange_rate self.total_taxes_and_charges += current_tax_amount self.base_total_taxes_and_charges += current_tax_amount * self.source_exchange_rate diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 8f7248f1e6..5d4796c916 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -935,7 +935,7 @@ class PurchaseInvoice(BuyingController): rev_dr_cr + "_in_account_currency": unallocated_amount \ if account_currency==self.company_currency \ else unallocated_amount, - 'cost_center': tax.cost_center + 'cost_center': tax.cost_center or self.cost_center }, account_currency, item=tax)) frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py index 5c1cbaa4aa..b9ee4a0963 100644 --- a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py +++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py @@ -49,7 +49,7 @@ def get_party_tax_withholding_details(inv, tax_withholding_category=None): if not parties: parties.append(party) - fiscal_year = get_fiscal_year(inv.posting_date, company=inv.company) + fiscal_year = get_fiscal_year(inv.get('posting_date') or inv.get('transaction_date'), company=inv.company) tax_details = get_tax_withholding_details(tax_withholding_category, fiscal_year[0], inv.company) if not tax_details: @@ -154,7 +154,7 @@ def get_tax_amount(party_type, parties, inv, tax_details, fiscal_year_details, p tax_deducted = get_deducted_tax(taxable_vouchers, fiscal_year, tax_details) tax_amount = 0 - posting_date = inv.posting_date + posting_date = inv.get('posting_date') or inv.get('transaction_date') if party_type == 'Supplier': ldc = get_lower_deduction_certificate(fiscal_year, pan_no) if tax_deducted: @@ -257,7 +257,7 @@ def get_tds_amount(ldc, parties, inv, tax_details, fiscal_year_details, tax_dedu if ((threshold and inv.net_total >= threshold) or (cumulative_threshold and supp_credit_amt >= cumulative_threshold)): if ldc and is_valid_certificate( ldc.valid_from, ldc.valid_upto, - inv.posting_date, tax_deducted, + inv.get('posting_date') or inv.get('transaction_date'), tax_deducted, inv.net_total, ldc.certificate_limit ): tds_amount = get_ltds_amount(supp_credit_amt, 0, ldc.certificate_limit, ldc.rate, tax_details) diff --git a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.js b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.js index 344539eef6..011c29621a 100644 --- a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.js +++ b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.js @@ -54,6 +54,32 @@ frappe.query_reports["TDS Payable Monthly"] = { frappe.query_report.refresh(); } }, + { + "fieldname":"purchase_order", + "label": __("Purchase Order"), + "fieldtype": "Link", + "options": "Purchase Order", + "get_query": function() { + return { + "filters": { + "name": ["in", frappe.query_report.invoices] + } + } + }, + on_change: function() { + let supplier = frappe.query_report.get_filter_value('supplier'); + if(!supplier) return; // return if no supplier selected + + // filter order based on selected supplier + let orders = []; + frappe.query_report.order_data.map(d => { + if(d.supplier==supplier) + orders.push(d.name) + }); + frappe.query_report.orders = orders; + frappe.query_report.refresh(); + } + }, { "fieldname":"from_date", "label": __("From Date"), @@ -75,15 +101,24 @@ frappe.query_reports["TDS Payable Monthly"] = { onload: function(report) { // fetch all tds applied invoices frappe.call({ - "method": "erpnext.accounts.report.tds_payable_monthly.tds_payable_monthly.get_tds_invoices", + "method": "erpnext.accounts.report.tds_payable_monthly.tds_payable_monthly.get_tds_invoices_and_orders", callback: function(r) { let invoices = []; - r.message.map(d => { + let orders = []; + + r.message.invoices.map(d => { invoices.push(d.name); }); - report["invoice_data"] = r.message; + r.message.orders.map(d => { + orders.push(d.name); + }); + + report["invoice_data"] = r.message.invoices; report["invoices"] = invoices; + + report["order_data"] = r.message.orders; + report["invoices"] = orders; } }); } diff --git a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py index a9fb237a04..7ce61f4a28 100644 --- a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py +++ b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py @@ -8,14 +8,18 @@ from frappe.utils import getdate def execute(filters=None): filters["invoices"] = frappe.cache().hget("invoices", frappe.session.user) + filters["orders"] = frappe.cache().hget("orders", frappe.session.user) validate_filters(filters) set_filters(filters) + # TDS payment entries + payment_entries = get_payment_entires(filters) + columns = get_columns(filters) - if not filters["invoices"]: + if not (filters.get("invoices") and filters.get('orders')): return columns, [] - res = get_result(filters) + res = get_result(filters, payment_entries) return columns, res @@ -26,9 +30,14 @@ def validate_filters(filters): def set_filters(filters): invoices = [] + orders = [] + + if not filters.get("invoices"): + filters["invoices"] = get_tds_invoices_and_orders()['invoices'] + + if not filters.get("orders"): + filters["orders"] = get_tds_invoices_and_orders()['orders'] - if not filters["invoices"]: - filters["invoices"] = get_tds_invoices() if filters.supplier and filters.purchase_invoice: for d in filters["invoices"]: if d.name == filters.purchase_invoice and d.supplier == filters.supplier: @@ -42,12 +51,28 @@ def set_filters(filters): if d.name == filters.purchase_invoice: invoices.append(d) + if filters.supplier and filters.purchase_order: + for d in filters.get("orders"): + if d.name == filters.purchase_order and d.supplier == filters.supplier: + orders.append(d) + elif filters.supplier and not filters.purchase_order: + for d in filters.get("orders"): + if d.supplier == filters.supplier: + orders.append(d) + elif filters.purchase_order and not filters.supplier: + for d in filters.get("invoices"): + if d.name == filters.purchase_order: + orders.append(d) + filters["invoices"] = invoices if invoices else filters["invoices"] + filters["orders"] = orders if orders else filters["orders"] filters.naming_series = frappe.db.get_single_value('Buying Settings', 'supp_master_name') -def get_result(filters): - supplier_map, tds_docs = get_supplier_map(filters) - gle_map = get_gle_map(filters) +def get_result(filters, payment_entries): + supplier_map, tds_docs = get_supplier_map(filters, payment_entries) + documents = [d.get('name') for d in filters.get('invoices')] + [d.get('name') for d in payment_entries] + + gle_map = get_gle_map(filters, documents) out = [] for d in gle_map: @@ -62,10 +87,11 @@ def get_result(filters): for k in gle_map[d]: if k.party == supplier_map[d] and k.credit > 0: - total_amount_credited += k.credit - elif account_list and k.account == account and k.credit > 0: - tds_deducted = k.credit - total_amount_credited += k.credit + total_amount_credited += (k.credit - k.debit) + elif account_list and k.account == account and (k.credit - k.debit) > 0: + tds_deducted = (k.credit - k.debit) + total_amount_credited += (k.credit - k.debit) + voucher_type = k.voucher_type rate = [i.tax_withholding_rate for i in tds_doc.rates if i.fiscal_year == gle_map[d][0].fiscal_year] @@ -73,32 +99,40 @@ def get_result(filters): if rate and len(rate) > 0 and tds_deducted: rate = rate[0] - if getdate(filters.from_date) <= gle_map[d][0].posting_date \ - and getdate(filters.to_date) >= gle_map[d][0].posting_date: - row = [supplier.pan, supplier.name] + row = [supplier.pan, supplier.name] - if filters.naming_series == 'Naming Series': - row.append(supplier.supplier_name) + if filters.naming_series == 'Naming Series': + row.append(supplier.supplier_name) - row.extend([tds_doc.name, supplier.supplier_type, rate, total_amount_credited, - tds_deducted, gle_map[d][0].posting_date, "Purchase Invoice", d]) - out.append(row) + row.extend([tds_doc.name, supplier.supplier_type, rate, total_amount_credited, + tds_deducted, gle_map[d][0].posting_date, voucher_type, d]) + out.append(row) return out -def get_supplier_map(filters): +def get_supplier_map(filters, payment_entries): # create a supplier_map of the form {"purchase_invoice": {supplier_name, pan, tds_name}} # pre-fetch all distinct applicable tds docs supplier_map, tds_docs = {}, {} pan = "pan" if frappe.db.has_column("Supplier", "pan") else "tax_id" + supplier_list = [d.supplier for d in filters["invoices"]] + [d.supplier for d in filters["orders"]] + supplier_detail = frappe.db.get_all('Supplier', - {"name": ["in", [d.supplier for d in filters["invoices"]]]}, + {"name": ["in", supplier_list]}, ["tax_withholding_category", "name", pan+" as pan", "supplier_type", "supplier_name"]) for d in filters["invoices"]: supplier_map[d.get("name")] = [k for k in supplier_detail if k.name == d.get("supplier")][0] + for d in filters["orders"]: + supplier_map[d.get("name")] = [k for k in supplier_detail + if k.name == d.get("supplier")][0] + + for d in payment_entries: + supplier_map[d.get("name")] = [k for k in supplier_detail + if k.name == d.get("supplier")][0] + for d in supplier_detail: if d.get("tax_withholding_category") not in tds_docs: tds_docs[d.get("tax_withholding_category")] = \ @@ -106,13 +140,19 @@ def get_supplier_map(filters): return supplier_map, tds_docs -def get_gle_map(filters): +def get_gle_map(filters, documents): # create gle_map of the form # {"purchase_invoice": list of dict of all gle created for this invoice} gle_map = {} - gle = frappe.db.get_all('GL Entry',\ - {"voucher_no": ["in", [d.get("name") for d in filters["invoices"]]], 'is_cancelled': 0}, - ["fiscal_year", "credit", "debit", "account", "voucher_no", "posting_date"]) + filter_obj = {} + gle = frappe.db.get_all('GL Entry', + { + "voucher_no": ["in", documents], + 'is_cancelled': 0, + 'posting_date': ("between", [filters.get('from_date'), filters.get('to_date')]), + }, + ["fiscal_year", "credit", "debit", "account", "voucher_no", "posting_date", "voucher_type"], + ) for d in gle: if not d.voucher_no in gle_map: @@ -201,8 +241,28 @@ def get_columns(filters): return columns +def get_payment_entires(filters): + filter_dict = { + 'posting_date': ("between", [filters.get('from_date'), filters.get('to_date')]), + 'party_type': 'Supplier', + 'apply_tax_withholding_amount': 1 + } + + if filters.get('purchase_order') or filters.get('purchase_invoice'): + parent = frappe.db.get_all('Payment Entry Reference', + { + 'reference_name': ('in', [d.get('name') for d in filters.get('orders')] + + [d.get('name') for d in filters.get('invoices')]) + }, ['parent']) + filter_dict.update({'name': ('in', [d.get('parent') for d in parent])}) + + payment_entries = frappe.get_all('Payment Entry', fields=['name', 'party_name as supplier'], + filters=filter_dict) + + return payment_entries + @frappe.whitelist() -def get_tds_invoices(): +def get_tds_invoices_and_orders(): # fetch tds applicable supplier and fetch invoices for these suppliers suppliers = [d.name for d in frappe.db.get_list("Supplier", {"tax_withholding_category": ["!=", ""]}, ["name"])] @@ -210,7 +270,16 @@ def get_tds_invoices(): invoices = frappe.db.get_list("Purchase Invoice", {"supplier": ["in", suppliers]}, ["name", "supplier"]) - invoices = [d for d in invoices if d.supplier] - frappe.cache().hset("invoices", frappe.session.user, invoices) + orders = frappe.db.get_list("Purchase Order", + {"supplier": ["in", suppliers]}, ["name", "supplier"]) - return invoices + invoices = [d for d in invoices if d.supplier] + orders = [d for d in orders if d.supplier] + + frappe.cache().hset("invoices", frappe.session.user, invoices) + frappe.cache().hset("orders", frappe.session.user, invoices) + + return { + 'invoices': invoices, + 'orders': orders + } diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 64eda5f280..47ec212b12 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -1375,7 +1375,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2020-11-28 17:42:25.177827", + "modified": "2021-02-27 22:07:23.487138", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index 9957aad019..9dc7fc42ef 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -276,7 +276,7 @@ erpnext.company.setup_queries = function(frm) { ["expenses_included_in_asset_valuation", {"account_type": "Expenses Included In Asset Valuation"}], ["capital_work_in_progress_account", {"account_type": "Capital Work in Progress"}], ["asset_received_but_not_billed", {"account_type": "Asset Received But Not Billed"}], - ["unrealized_profit_loss_account", {"root_type": "Liability"},] + ["unrealized_profit_loss_account", {"root_type": ["in", ["Liability", "Asset"]]}] ], function(i, v) { erpnext.company.set_custom_query(frm, v); }); From a87e3fcb7c5ddd476fa492b5c22f18f2ba79556e Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 28 Feb 2021 23:28:25 +0530 Subject: [PATCH 06/53] fix: TDS report cleanup --- .../doctype/payment_entry/payment_entry.py | 5 +- .../purchase_invoice/purchase_invoice.json | 21 +++++--- .../tds_payable_monthly.js | 19 +++----- .../tds_payable_monthly.py | 48 +++++++------------ 4 files changed, 42 insertions(+), 51 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 33eb6f2f26..c0feb44a7f 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -967,7 +967,7 @@ def split_invoices_based_on_payment_terms(outstanding_invoices): outstanding_invoices.pop(idx - 1) outstanding_invoices += invoice_ref_based_on_payment_terms[idx] - + return outstanding_invoices def get_orders_to_be_billed(posting_date, party_type, party, @@ -1411,6 +1411,9 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= }) pe.set_difference_amount() + if doc.doctype == 'Purchase Order' and doc.apply_tds: + pe.apply_tax_withholding_amount = 1 + return pe def get_bank_cash_account(doc, bank_account): diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 36450a9255..7fef60cde1 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -127,7 +127,6 @@ "write_off_cost_center", "advances_section", "allocate_advances_automatically", - "adjust_advance_taxes", "get_advances", "advances", "payment_schedule_section", @@ -1492,7 +1491,9 @@ "in_standard_filter": 1, "label": "Status", "options": "\nDraft\nReturn\nDebit Note Issued\nSubmitted\nPaid\nUnpaid\nOverdue\nCancelled\nInternal Transfer", - "print_hide": 1 + "print_hide": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "inter_company_invoice_reference", @@ -1501,7 +1502,9 @@ "no_copy": 1, "options": "Sales Invoice", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_days": 1, + "show_seconds": 1 }, { "fieldname": "remarks", @@ -1633,7 +1636,9 @@ "fieldname": "unrealized_profit_loss_account", "fieldtype": "Link", "label": "Unrealized Profit / Loss Account", - "options": "Account" + "options": "Account", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.is_internal_supplier", @@ -1642,7 +1647,9 @@ "fieldname": "represents_company", "fieldtype": "Link", "label": "Represents Company", - "options": "Company" + "options": "Company", + "show_days": 1, + "show_seconds": 1 }, { "depends_on": "eval:doc.update_stock && doc.is_internal_supplier", @@ -1654,6 +1661,8 @@ "options": "Warehouse", "print_hide": 1, "print_width": "50px", + "show_days": 1, + "show_seconds": 1, "width": "50px" }, { @@ -1681,7 +1690,7 @@ "idx": 204, "is_submittable": 1, "links": [], - "modified": "2020-10-27 21:21:22.647349", + "modified": "2021-02-28 22:33:15.728392", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.js b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.js index 011c29621a..72de318a48 100644 --- a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.js +++ b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.js @@ -70,13 +70,13 @@ frappe.query_reports["TDS Payable Monthly"] = { let supplier = frappe.query_report.get_filter_value('supplier'); if(!supplier) return; // return if no supplier selected - // filter order based on selected supplier - let orders = []; - frappe.query_report.order_data.map(d => { + // filter invoices based on selected supplier + let invoices = []; + frappe.query_report.invoice_data.map(d => { if(d.supplier==supplier) - orders.push(d.name) + invoices.push(d.name) }); - frappe.query_report.orders = orders; + frappe.query_report.invoices = invoices; frappe.query_report.refresh(); } }, @@ -104,21 +104,14 @@ frappe.query_reports["TDS Payable Monthly"] = { "method": "erpnext.accounts.report.tds_payable_monthly.tds_payable_monthly.get_tds_invoices_and_orders", callback: function(r) { let invoices = []; - let orders = []; - r.message.invoices.map(d => { + r.message.map(d => { invoices.push(d.name); }); - r.message.orders.map(d => { - orders.push(d.name); - }); - report["invoice_data"] = r.message.invoices; report["invoices"] = invoices; - report["order_data"] = r.message.orders; - report["invoices"] = orders; } }); } diff --git a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py index 7ce61f4a28..5101e3d752 100644 --- a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py +++ b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py @@ -8,7 +8,6 @@ from frappe.utils import getdate def execute(filters=None): filters["invoices"] = frappe.cache().hget("invoices", frappe.session.user) - filters["orders"] = frappe.cache().hget("orders", frappe.session.user) validate_filters(filters) set_filters(filters) @@ -16,7 +15,7 @@ def execute(filters=None): payment_entries = get_payment_entires(filters) columns = get_columns(filters) - if not (filters.get("invoices") and filters.get('orders')): + if not filters.get("invoices"): return columns, [] res = get_result(filters, payment_entries) @@ -30,13 +29,9 @@ def validate_filters(filters): def set_filters(filters): invoices = [] - orders = [] if not filters.get("invoices"): - filters["invoices"] = get_tds_invoices_and_orders()['invoices'] - - if not filters.get("orders"): - filters["orders"] = get_tds_invoices_and_orders()['orders'] + filters["invoices"] = get_tds_invoices_and_orders() if filters.supplier and filters.purchase_invoice: for d in filters["invoices"]: @@ -50,24 +45,25 @@ def set_filters(filters): for d in filters["invoices"]: if d.name == filters.purchase_invoice: invoices.append(d) - - if filters.supplier and filters.purchase_order: - for d in filters.get("orders"): + elif filters.supplier and filters.purchase_order: + for d in filters.get("invoices"): if d.name == filters.purchase_order and d.supplier == filters.supplier: - orders.append(d) + invoices.append(d) elif filters.supplier and not filters.purchase_order: - for d in filters.get("orders"): + for d in filters.get("invoices"): if d.supplier == filters.supplier: - orders.append(d) + invoices.append(d) elif filters.purchase_order and not filters.supplier: for d in filters.get("invoices"): if d.name == filters.purchase_order: - orders.append(d) + print("$#$#$$#") + invoices.append(d) filters["invoices"] = invoices if invoices else filters["invoices"] - filters["orders"] = orders if orders else filters["orders"] filters.naming_series = frappe.db.get_single_value('Buying Settings', 'supp_master_name') + #print(filters.get('invoices')) + def get_result(filters, payment_entries): supplier_map, tds_docs = get_supplier_map(filters, payment_entries) documents = [d.get('name') for d in filters.get('invoices')] + [d.get('name') for d in payment_entries] @@ -115,7 +111,7 @@ def get_supplier_map(filters, payment_entries): # pre-fetch all distinct applicable tds docs supplier_map, tds_docs = {}, {} pan = "pan" if frappe.db.has_column("Supplier", "pan") else "tax_id" - supplier_list = [d.supplier for d in filters["invoices"]] + [d.supplier for d in filters["orders"]] + supplier_list = [d.supplier for d in filters["invoices"]] supplier_detail = frappe.db.get_all('Supplier', {"name": ["in", supplier_list]}, @@ -125,10 +121,6 @@ def get_supplier_map(filters, payment_entries): supplier_map[d.get("name")] = [k for k in supplier_detail if k.name == d.get("supplier")][0] - for d in filters["orders"]: - supplier_map[d.get("name")] = [k for k in supplier_detail - if k.name == d.get("supplier")][0] - for d in payment_entries: supplier_map[d.get("name")] = [k for k in supplier_detail if k.name == d.get("supplier")][0] @@ -248,12 +240,10 @@ def get_payment_entires(filters): 'apply_tax_withholding_amount': 1 } - if filters.get('purchase_order') or filters.get('purchase_invoice'): + if filters.get('purchase_invoice') or filters.get('purchase_order'): parent = frappe.db.get_all('Payment Entry Reference', - { - 'reference_name': ('in', [d.get('name') for d in filters.get('orders')] + - [d.get('name') for d in filters.get('invoices')]) - }, ['parent']) + { 'reference_name': ('in', [d.get('name') for d in filters.get('invoices')])}, ['parent']) + filter_dict.update({'name': ('in', [d.get('parent') for d in parent])}) payment_entries = frappe.get_all('Payment Entry', fields=['name', 'party_name as supplier'], @@ -273,13 +263,9 @@ def get_tds_invoices_and_orders(): orders = frappe.db.get_list("Purchase Order", {"supplier": ["in", suppliers]}, ["name", "supplier"]) + invoices = invoices + orders invoices = [d for d in invoices if d.supplier] - orders = [d for d in orders if d.supplier] frappe.cache().hset("invoices", frappe.session.user, invoices) - frappe.cache().hset("orders", frappe.session.user, invoices) - return { - 'invoices': invoices, - 'orders': orders - } + return invoices From fd380d34f99b70616cfa06fb6ce30cdccce931fe Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 13 May 2021 14:04:51 +0530 Subject: [PATCH 07/53] fix: Linting errors --- .../doctype/payment_entry/payment_entry.py | 17 +++--- .../purchase_invoice/purchase_invoice.py | 8 +-- .../doctype/sales_invoice/sales_invoice.py | 8 +-- .../tds_payable_monthly.py | 4 +- erpnext/public/js/controllers/accounts.js | 12 ++-- erpnext/public/js/payment/payments.js | 56 +++++++++---------- 6 files changed, 52 insertions(+), 53 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index c0feb44a7f..736048fe3e 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -516,13 +516,13 @@ class PaymentEntry(AccountsController): if self.payment_type == "Receive" \ and self.base_total_allocated_amount < self.base_received_amount_after_tax + total_deductions \ and self.total_allocated_amount < self.paid_amount_after_tax + (total_deductions / self.source_exchange_rate): - self.unallocated_amount = (self.received_amount_after_tax + total_deductions - - self.base_total_allocated_amount) / self.source_exchange_rate + self.unallocated_amount = (self.received_amount_after_tax + total_deductions - + self.base_total_allocated_amount) / self.source_exchange_rate elif self.payment_type == "Pay" \ and self.base_total_allocated_amount < (self.base_paid_amount_after_tax - total_deductions) \ and self.total_allocated_amount < self.received_amount_after_tax + (total_deductions / self.target_exchange_rate): - self.unallocated_amount = (self.base_paid_amount_after_tax - (total_deductions + - self.base_total_allocated_amount)) / self.target_exchange_rate + self.unallocated_amount = (self.base_paid_amount_after_tax - (total_deductions + + self.base_total_allocated_amount)) / self.target_exchange_rate def set_difference_amount(self): base_unallocated_amount = flt(self.unallocated_amount) * (flt(self.source_exchange_rate) @@ -719,8 +719,8 @@ class PaymentEntry(AccountsController): "account": d.account_head, "against": self.party if self.payment_type=="Receive" else self.paid_from, dr_or_cr: d.base_tax_amount, - dr_or_cr + "_in_account_currency": d.base_tax_amount \ - if account_currency==self.company_currency \ + dr_or_cr + "_in_account_currency": d.base_tax_amount + if account_currency==self.company_currency else d.tax_amount, "cost_center": d.cost_center }, account_currency, item=d)) @@ -730,8 +730,8 @@ class PaymentEntry(AccountsController): "account": self.advance_tax_account, "against": self.party if self.payment_type=="Receive" else self.paid_from, rev_dr_cr: d.base_tax_amount, - rev_dr_cr + "_in_account_currency": d.base_tax_amount \ - if account_currency==self.company_currency \ + rev_dr_cr + "_in_account_currency": d.base_tax_amount + if account_currency==self.company_currency else d.tax_amount, "cost_center": d.cost_center or self.cost_center }, account_currency, item=d)) @@ -806,7 +806,6 @@ class PaymentEntry(AccountsController): for i, tax in enumerate(self.taxes): tax_rate = tax.rate - current_tax_rate = 0.0 # To set row_id by default as previous row. if tax.charge_type in ["On Previous Row Amount", "On Previous Row Total"]: diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 5d4796c916..83c55cc653 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -921,8 +921,8 @@ class PurchaseInvoice(BuyingController): "account": tax.account_head, "against": self.supplier, dr_or_cr: unallocated_amount, - dr_or_cr + "_in_account_currency": unallocated_amount \ - if account_currency==self.company_currency \ + dr_or_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency else unallocated_amount, 'cost_center': tax.cost_center }, account_currency, item=tax)) @@ -932,8 +932,8 @@ class PurchaseInvoice(BuyingController): "account": pe.advance_tax_account, "against": self.supplier, rev_dr_cr: unallocated_amount, - rev_dr_cr + "_in_account_currency": unallocated_amount \ - if account_currency==self.company_currency \ + rev_dr_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency else unallocated_amount, 'cost_center': tax.cost_center or self.cost_center }, account_currency, item=tax)) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 9af94fd780..44b8325c62 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -933,8 +933,8 @@ class SalesInvoice(SellingController): "account": tax.account_head, "against": self.customer, dr_or_cr: unallocated_amount, - dr_or_cr + "_in_account_currency": unallocated_amount \ - if account_currency==self.company_currency \ + dr_or_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency else unallocated_amount, 'cost_center': tax.cost_center }, account_currency, item=tax)) @@ -944,8 +944,8 @@ class SalesInvoice(SellingController): "account": pe.advance_tax_account, "against": self.customer, rev_dr_cr: unallocated_amount, - rev_dr_cr + "_in_account_currency": unallocated_amount \ - if account_currency==self.company_currency \ + rev_dr_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency else unallocated_amount, 'cost_center': tax.cost_center }, account_currency, item=tax)) diff --git a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py index 5101e3d752..619d799d06 100644 --- a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py +++ b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py @@ -136,7 +136,7 @@ def get_gle_map(filters, documents): # create gle_map of the form # {"purchase_invoice": list of dict of all gle created for this invoice} gle_map = {} - filter_obj = {} + gle = frappe.db.get_all('GL Entry', { "voucher_no": ["in", documents], @@ -242,7 +242,7 @@ def get_payment_entires(filters): if filters.get('purchase_invoice') or filters.get('purchase_order'): parent = frappe.db.get_all('Payment Entry Reference', - { 'reference_name': ('in', [d.get('name') for d in filters.get('invoices')])}, ['parent']) + {'reference_name': ('in', [d.get('name') for d in filters.get('invoices')])}, ['parent']) filter_dict.update({'name': ('in', [d.get('parent') for d in parent])}) diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js index 23d636061c..7b997a1153 100644 --- a/erpnext/public/js/controllers/accounts.js +++ b/erpnext/public/js/controllers/accounts.js @@ -156,31 +156,31 @@ cur_frm.cscript.validate_taxes_and_charges = function(cdt, cdn) { var d = locals[cdt][cdn]; var msg = ""; - if(d.account_head && !d.description) { + if (d.account_head && !d.description) { // set description from account head d.description = d.account_head.split(' - ').slice(0, -1).join(' - '); } - if(!d.charge_type && (d.row_id || d.rate || d.tax_amount)) { + if (!d.charge_type && (d.row_id || d.rate || d.tax_amount)) { msg = __("Please select Charge Type first"); d.row_id = ""; d.rate = d.tax_amount = 0.0; - } else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total' || d.charge_type == 'On Paid Amount') && d.row_id) { + } else if ((d.charge_type == 'Actual' || d.charge_type == 'On Net Total' || d.charge_type == 'On Paid Amount') && d.row_id) { msg = __("Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'"); d.row_id = ""; - } else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) { + } else if ((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) { if (d.idx == 1) { msg = __("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"); d.charge_type = ''; } else if (!d.row_id) { msg = __("Please specify a valid Row ID for row {0} in table {1}", [d.idx, __(d.doctype)]); d.row_id = ""; - } else if(d.row_id && d.row_id >= d.idx) { + } else if (d.row_id && d.row_id >= d.idx) { msg = __("Cannot refer row number greater than or equal to current row number for this Charge type"); d.row_id = ""; } } - if(msg) { + if (msg) { frappe.validated = false; refresh_field("taxes"); frappe.throw(msg); diff --git a/erpnext/public/js/payment/payments.js b/erpnext/public/js/payment/payments.js index b168952e40..e2bd602ba7 100644 --- a/erpnext/public/js/payment/payments.js +++ b/erpnext/public/js/payment/payments.js @@ -16,14 +16,14 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.select_text() }, - select_text: function(){ + select_text: function() { var me = this; - $(this.$body).find('.form-control').click(function(){ + $(this.$body).find('.form-control').click(function() { $(this).select(); }) }, - set_payment_primary_action: function(){ + set_payment_primary_action: function() { var me = this; this.dialog.set_primary_action(__("Submit"), function() { @@ -38,7 +38,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ }) }, - make_keyboard: function(){ + make_keyboard: function() { var me = this; $(this.$body).empty(); $(this.$body).html(frappe.render_template('pos_payment', this.frm.doc)) @@ -47,10 +47,10 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.clear_amount() }, - make_multimode_payment: function(){ + make_multimode_payment: function() { var me = this; - if(this.frm.doc.change_amount > 0){ + if(this.frm.doc.change_amount > 0) { me.payment_val = me.doc.outstanding_amount } @@ -59,7 +59,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.payments.amount = flt(this.payment_val); }, - show_payment_details: function(){ + show_payment_details: function() { var me = this; var multimode_payments = $(this.$body).find('.multimode-payments').empty(); if(this.frm.doc.payments.length){ @@ -84,7 +84,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ } }, - set_outstanding_amount: function(){ + set_outstanding_amount: function() { this.selected_mode = $(this.$body).find(repl("input[idx='%(idx)s']",{'idx': this.idx})); this.highlight_selected_row() this.payment_val = 0.0 @@ -101,45 +101,45 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.bind_amount_change_event(); }, - bind_keyboard_event: function(){ + bind_keyboard_event: function() { var me = this; this.payment_val = ''; this.bind_form_control_event(); this.bind_numeric_keys_event(); }, - bind_form_control_event: function(){ + bind_form_control_event: function() { var me = this; - $(this.$body).find('.pos-payment-row').click(function(){ + $(this.$body).find('.pos-payment-row').click(function() { me.idx = $(this).attr("idx"); me.set_outstanding_amount() - }) + }); - $(this.$body).find('.form-control').click(function(){ + $(this.$body).find('.form-control').click(function() { me.idx = $(this).attr("idx"); me.set_outstanding_amount(); me.update_paid_amount(true); - }) + }); - $(this.$body).find('.write_off_amount').change(function(){ + $(this.$body).find('.write_off_amount').change(function() { me.write_off_amount(flt($(this).val()), precision("write_off_amount")); - }) + }); - $(this.$body).find('.change_amount').change(function(){ + $(this.$body).find('.change_amount').change(function() { me.change_amount(flt($(this).val()), precision("change_amount")); - }) + }); }, - highlight_selected_row: function(){ + highlight_selected_row: function() { var me = this; - var selected_row = $(this.$body).find(repl(".pos-payment-row[idx='%(idx)s']",{'idx': this.idx})); + var selected_row = $(this.$body).find(repl(".pos-payment-row[idx='%(idx)s']", {'idx': this.idx})); $(this.$body).find('.pos-payment-row').removeClass('selected-payment-mode') selected_row.addClass('selected-payment-mode') $(this.$body).find('.amount').attr('disabled', true); this.selected_mode.attr('disabled', false); }, - bind_numeric_keys_event: function(){ + bind_numeric_keys_event: function() { var me = this; $(this.$body).find('.pos-keyboard-key').click(function(){ me.payment_val += $(this).text(); @@ -148,7 +148,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ me.update_paid_amount() }) - $(this.$body).find('.delete-btn').click(function(){ + $(this.$body).find('.delete-btn').click(function() { me.payment_val = cstr(flt(me.selected_mode.val())).slice(0, -1); me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency)); me.idx = me.selected_mode.attr("idx") @@ -157,9 +157,9 @@ erpnext.payments = erpnext.stock.StockController.extend({ }, - bind_amount_change_event: function(){ + bind_amount_change_event: function() { var me = this; - this.selected_mode.change(function(){ + this.selected_mode.change(function() { me.payment_val = flt($(this).val()) || 0.0; me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency)) me.idx = me.selected_mode.attr("idx") @@ -169,7 +169,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ clear_amount: function() { var me = this; - $(this.$body).find('.clr').click(function(e){ + $(this.$body).find('.clr').click(function(e) { e.stopPropagation(); me.idx = $(this).attr("idx"); me.selected_mode = $(me.$body).find(repl("input[idx='%(idx)s']",{'idx': me.idx})); @@ -215,10 +215,10 @@ erpnext.payments = erpnext.stock.StockController.extend({ } }, - update_payment_amount: function(){ + update_payment_amount: function() { var me = this; - $.each(this.frm.doc.payments, function(index, data){ + $.each(this.frm.doc.payments, function(index, data) { if(cint(me.idx) == cint(data.idx)){ data.amount = flt(me.selected_mode.val(), 2) } @@ -228,7 +228,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.show_amounts(); }, - show_amounts: function(){ + show_amounts: function() { var me = this; $(this.$body).find(".write_off_amount").val(format_currency(this.frm.doc.write_off_amount, this.frm.doc.currency)); $(this.$body).find('.paid_amount').text(format_currency(this.frm.doc.paid_amount, this.frm.doc.currency)); From 77dcee9d677c3f1833c213c50a9369c373991589 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 16 May 2021 17:45:45 +0530 Subject: [PATCH 08/53] fix: Test Cases --- .../doctype/payment_entry/payment_entry.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 736048fe3e..ac8e7070f5 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -482,7 +482,7 @@ class PaymentEntry(AccountsController): self.received_amount_after_tax = flt(flt(self.received_amount) + flt(applicable_tax), self.precision("paid_amount_after_tax")) - self.base_received_amount_after_tax = flt(flt(self.received_amount_after_tax) * flt(self.source_exchange_rate), + self.base_received_amount_after_tax = flt(flt(self.received_amount_after_tax) * flt(self.target_exchange_rate), self.precision("base_paid_amount_after_tax")) def set_amounts_in_company_currency(self): @@ -720,8 +720,8 @@ class PaymentEntry(AccountsController): "against": self.party if self.payment_type=="Receive" else self.paid_from, dr_or_cr: d.base_tax_amount, dr_or_cr + "_in_account_currency": d.base_tax_amount - if account_currency==self.company_currency - else d.tax_amount, + if account_currency==self.company_currency + else d.tax_amount, "cost_center": d.cost_center }, account_currency, item=d)) @@ -731,8 +731,8 @@ class PaymentEntry(AccountsController): "against": self.party if self.payment_type=="Receive" else self.paid_from, rev_dr_cr: d.base_tax_amount, rev_dr_cr + "_in_account_currency": d.base_tax_amount - if account_currency==self.company_currency - else d.tax_amount, + if account_currency==self.company_currency + else d.tax_amount, "cost_center": d.cost_center or self.cost_center }, account_currency, item=d)) @@ -804,7 +804,7 @@ class PaymentEntry(AccountsController): self.total_taxes_and_charges = 0.0 self.base_total_taxes_and_charges = 0.0 - for i, tax in enumerate(self.taxes): + for i, tax in enumerate(self.get('taxes')): tax_rate = tax.rate # To set row_id by default as previous row. @@ -821,11 +821,11 @@ class PaymentEntry(AccountsController): current_tax_amount = (tax_rate / 100.0) * self.paid_amount elif tax.charge_type == "On Previous Row Amount": current_tax_amount = (tax_rate / 100.0) * \ - self.taxes[cint(tax.row_id) - 1].tax_amount + self.get('taxes')[cint(tax.row_id) - 1].tax_amount elif tax.charge_type == "On Previous Row Total": current_tax_amount = (tax_rate / 100.0) * \ - self.taxes[cint(tax.row_id) - 1].total + self.get('taxes')[cint(tax.row_id) - 1].total tax.tax_amount = current_tax_amount tax.base_tax_amount = tax.tax_amount * self.source_exchange_rate @@ -839,7 +839,7 @@ class PaymentEntry(AccountsController): if i == 0: tax.total = flt(self.paid_amount + current_tax_amount, self.precision("total", tax)) else: - tax.total = flt(self.taxes[i-1].total + current_tax_amount, self.precision("total", tax)) + tax.total = flt(self.get('taxes')[i-1].total + current_tax_amount, self.precision("total", tax)) tax.base_total = tax.total * self.source_exchange_rate From e2f83ffaa4c5770210fedb8ec22d433fb21378b3 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 16 May 2021 17:46:07 +0530 Subject: [PATCH 09/53] fix: Linting fixes and other checks --- .../doctype/payment_entry/payment_entry.json | 2 +- .../purchase_invoice/purchase_invoice.py | 31 +++++----- .../doctype/sales_invoice/sales_invoice.py | 8 +-- .../doctype/purchase_order/purchase_order.js | 4 +- erpnext/public/js/payment/payments.js | 62 +++++++++---------- 5 files changed, 53 insertions(+), 54 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index d239c41fd8..afc72045e6 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -864,7 +864,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2021-02-27 13:56:20.007336", + "modified": "2021-05-15 13:05:16.958866", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 83c55cc653..a4bac3550d 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -251,11 +251,9 @@ class PurchaseInvoice(BuyingController): if self.update_stock and (not item.from_warehouse): if for_validate and item.expense_account and item.expense_account != warehouse_account[item.warehouse]["account"]: - msg = _("Row {}: Expense Head changed to {} ").format(item.idx, frappe.bold(warehouse_account[item.warehouse]["account"])) - msg += _("because account {} is not linked to warehouse {} ").format(frappe.bold(item.expense_account), frappe.bold(item.warehouse)) - msg += _("or it is not the default inventory account") + msg = _("Row {0}: Expense Head changed to {1} because account {2} is not linked to warehouse {3} or it is not the default inventory account").format( + item.idx, frappe.bold(warehouse_account[item.warehouse]["account"]), frappe.bold(item.expense_account), frappe.bold(item.warehouse)) frappe.msgprint(msg, title=_("Expense Head Changed")) - item.expense_account = warehouse_account[item.warehouse]["account"] else: # check if 'Stock Received But Not Billed' account is credited in Purchase receipt or not @@ -266,8 +264,8 @@ class PurchaseInvoice(BuyingController): if negative_expense_booked_in_pr: if for_validate and item.expense_account and item.expense_account != stock_not_billed_account: - msg = _("Row {}: Expense Head changed to {} ").format(item.idx, frappe.bold(stock_not_billed_account)) - msg += _("because expense is booked against this account in Purchase Receipt {}").format(frappe.bold(item.purchase_receipt)) + msg = _("Row {0}: Expense Head changed to {1} because expense is booked against this account in Purchase Receipt {2}").format( + item.idx, frappe.bold(stock_not_billed_account), frappe.bold(item.purchase_receipt)) frappe.msgprint(msg, title=_("Expense Head Changed")) item.expense_account = stock_not_billed_account @@ -275,8 +273,9 @@ class PurchaseInvoice(BuyingController): # If no purchase receipt present then book expense in 'Stock Received But Not Billed' # This is done in cases when Purchase Invoice is created before Purchase Receipt if for_validate and item.expense_account and item.expense_account != stock_not_billed_account: - msg = _("Row {}: Expense Head changed to {} ").format(item.idx, frappe.bold(stock_not_billed_account)) - msg += _("as no Purchase Receipt is created against Item {}. ").format(frappe.bold(item.item_code)) + msg = _("Row {0}: Expense Head changed to {1} as no Purchase Receipt is created against Item {2}.").format( + item.idx, frappe.bold(stock_not_billed_account), frappe.bold(item.item_code)) + msg += "
" msg += _("This is done to handle accounting for cases when Purchase Receipt is created after Purchase Invoice") frappe.msgprint(msg, title=_("Expense Head Changed")) @@ -308,8 +307,8 @@ class PurchaseInvoice(BuyingController): if not d.purchase_order: msg = _("Purchase Order Required for item {}").format(frappe.bold(d.item_code)) msg += "

" - msg += _("To submit the invoice without purchase order please set {} ").format(frappe.bold(_('Purchase Order Required'))) - msg += _("as {} in {}").format(frappe.bold('No'), get_link_to_form('Buying Settings', 'Buying Settings', 'Buying Settings')) + msg += _("To submit the invoice without purchase order please set {0} as {1} in {2}").format( + frappe.bold(_('Purchase Order Required')), frappe.bold('No'), get_link_to_form('Buying Settings', 'Buying Settings', 'Buying Settings')) throw(msg, title=_("Mandatory Purchase Order")) def pr_required(self): @@ -323,8 +322,8 @@ class PurchaseInvoice(BuyingController): if not d.purchase_receipt and d.item_code in stock_items: msg = _("Purchase Receipt Required for item {}").format(frappe.bold(d.item_code)) msg += "

" - msg += _("To submit the invoice without purchase receipt please set {} ").format(frappe.bold(_('Purchase Receipt Required'))) - msg += _("as {} in {}").format(frappe.bold('No'), get_link_to_form('Buying Settings', 'Buying Settings', 'Buying Settings')) + msg += _("To submit the invoice without purchase receipt please set {0} as {1} in {2}").format( + frappe.bold(_('Purchase Receipt Required')), frappe.bold('No'), get_link_to_form('Buying Settings', 'Buying Settings', 'Buying Settings')) throw(msg, title=_("Mandatory Purchase Receipt")) def validate_write_off_account(self): @@ -922,8 +921,8 @@ class PurchaseInvoice(BuyingController): "against": self.supplier, dr_or_cr: unallocated_amount, dr_or_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, + if account_currency==self.company_currency + else unallocated_amount, 'cost_center': tax.cost_center }, account_currency, item=tax)) @@ -933,8 +932,8 @@ class PurchaseInvoice(BuyingController): "against": self.supplier, rev_dr_cr: unallocated_amount, rev_dr_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, + if account_currency==self.company_currency + else unallocated_amount, 'cost_center': tax.cost_center or self.cost_center }, account_currency, item=tax)) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 44b8325c62..9a596f2b32 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -934,8 +934,8 @@ class SalesInvoice(SellingController): "against": self.customer, dr_or_cr: unallocated_amount, dr_or_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, + if account_currency==self.company_currency + else unallocated_amount, 'cost_center': tax.cost_center }, account_currency, item=tax)) @@ -945,8 +945,8 @@ class SalesInvoice(SellingController): "against": self.customer, rev_dr_cr: unallocated_amount, rev_dr_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, + if account_currency==self.company_currency + else unallocated_amount, 'cost_center': tax.cost_center }, account_currency, item=tax)) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 139aa72c08..ccb3ce33ec 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -321,7 +321,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( if(me.values) { me.values.sub_con_rm_items.map((row,i) => { if (!row.item_code || !row.rm_item_code || !row.warehouse || !row.qty || row.qty === 0) { - frappe.throw(__("Item Code, warehouse, quantity are required on row {0}", [i+1])); + frappe.throw(__("Item Code and warehouse and quantity are required on row {0}", [i+1])); } }) me._make_rm_stock_entry(me.dialog.fields_dict.sub_con_rm_items.grid.get_selected_children()) @@ -517,7 +517,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( args: { reference_doctype: me.frm.doctype, reference_name: me.frm.docname, - content: __('Reason for hold: ')+data.reason_for_hold, + content: __('Reason for hold:') + " " +data.reason_for_hold, comment_email: frappe.session.user, comment_by: frappe.session.user_fullname }, diff --git a/erpnext/public/js/payment/payments.js b/erpnext/public/js/payment/payments.js index e2bd602ba7..9fb2f3ee7f 100644 --- a/erpnext/public/js/payment/payments.js +++ b/erpnext/public/js/payment/payments.js @@ -13,7 +13,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.$body = this.dialog.body; this.set_payment_primary_action(); this.make_keyboard(); - this.select_text() + this.select_text(); }, select_text: function() { @@ -43,15 +43,15 @@ erpnext.payments = erpnext.stock.StockController.extend({ $(this.$body).empty(); $(this.$body).html(frappe.render_template('pos_payment', this.frm.doc)) this.show_payment_details(); - this.bind_keyboard_event() - this.clear_amount() + this.bind_keyboard_event(); + this.clear_amount(); }, make_multimode_payment: function() { var me = this; - if(this.frm.doc.change_amount > 0) { - me.payment_val = me.doc.outstanding_amount + if (this.frm.doc.change_amount > 0) { + me.payment_val = me.doc.outstanding_amount; } this.payments = frappe.model.add_child(this.frm.doc, 'Multi Mode Payment', "payments"); @@ -112,7 +112,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ var me = this; $(this.$body).find('.pos-payment-row').click(function() { me.idx = $(this).attr("idx"); - me.set_outstanding_amount() + me.set_outstanding_amount(); }); $(this.$body).find('.form-control').click(function() { @@ -133,8 +133,8 @@ erpnext.payments = erpnext.stock.StockController.extend({ highlight_selected_row: function() { var me = this; var selected_row = $(this.$body).find(repl(".pos-payment-row[idx='%(idx)s']", {'idx': this.idx})); - $(this.$body).find('.pos-payment-row').removeClass('selected-payment-mode') - selected_row.addClass('selected-payment-mode') + $(this.$body).find('.pos-payment-row').removeClass('selected-payment-mode'); + selected_row.addClass('selected-payment-mode'); $(this.$body).find('.amount').attr('disabled', true); this.selected_mode.attr('disabled', false); }, @@ -143,15 +143,15 @@ erpnext.payments = erpnext.stock.StockController.extend({ var me = this; $(this.$body).find('.pos-keyboard-key').click(function(){ me.payment_val += $(this).text(); - me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency)) - me.idx = me.selected_mode.attr("idx") - me.update_paid_amount() - }) + me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency)); + me.idx = me.selected_mode.attr("idx"); + me.update_paid_amount(); + }); $(this.$body).find('.delete-btn').click(function() { me.payment_val = cstr(flt(me.selected_mode.val())).slice(0, -1); me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency)); - me.idx = me.selected_mode.attr("idx") + me.idx = me.selected_mode.attr("idx"); me.update_paid_amount(); }) @@ -161,10 +161,10 @@ erpnext.payments = erpnext.stock.StockController.extend({ var me = this; this.selected_mode.change(function() { me.payment_val = flt($(this).val()) || 0.0; - me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency)) - me.idx = me.selected_mode.attr("idx") - me.update_payment_amount() - }) + me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency)); + me.idx = me.selected_mode.attr("idx"); + me.update_payment_amount(); + }); }, clear_amount: function() { @@ -177,7 +177,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ me.selected_mode.val(0.0); me.highlight_selected_row(); me.update_payment_amount(); - }) + }); }, write_off_amount: function(write_off_amount) { @@ -186,32 +186,32 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.frm.doc.write_off_amount = flt(write_off_amount, precision("write_off_amount")); this.frm.doc.base_write_off_amount = flt(this.frm.doc.write_off_amount * this.frm.doc.conversion_rate, precision("base_write_off_amount")); - this.calculate_outstanding_amount(false) - this.show_amounts() + this.calculate_outstanding_amount(false); + this.show_amounts(); }, change_amount: function(change_amount) { var me = this; this.frm.doc.change_amount = flt(change_amount, precision("change_amount")); - this.calculate_write_off_amount() - this.show_amounts() + this.calculate_write_off_amount(); + this.show_amounts(); }, update_paid_amount: function(update_write_off) { var me = this; - if(in_list(['change_amount', 'write_off_amount'], this.idx)){ + if (in_list(['change_amount', 'write_off_amount'], this.idx)) { var value = me.selected_mode.val(); - if(me.idx == 'change_amount'){ - me.change_amount(value) + if (me.idx == 'change_amount') { + me.change_amount(value); } else{ if(flt(value) == 0 && update_write_off && me.frm.doc.outstanding_amount > 0) { value = flt(me.frm.doc.outstanding_amount / me.frm.doc.conversion_rate, precision(me.idx)); } - me.write_off_amount(value) + me.write_off_amount(value); } - }else{ - this.update_payment_amount() + } else { + this.update_payment_amount(); } }, @@ -220,7 +220,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ $.each(this.frm.doc.payments, function(index, data) { if(cint(me.idx) == cint(data.idx)){ - data.amount = flt(me.selected_mode.val(), 2) + data.amount = flt(me.selected_mode.val(), 2); } }) @@ -232,8 +232,8 @@ erpnext.payments = erpnext.stock.StockController.extend({ var me = this; $(this.$body).find(".write_off_amount").val(format_currency(this.frm.doc.write_off_amount, this.frm.doc.currency)); $(this.$body).find('.paid_amount').text(format_currency(this.frm.doc.paid_amount, this.frm.doc.currency)); - $(this.$body).find('.change_amount').val(format_currency(this.frm.doc.change_amount, this.frm.doc.currency)) - $(this.$body).find('.outstanding_amount').text(format_currency(this.frm.doc.outstanding_amount, frappe.get_doc(":Company", this.frm.doc.company).default_currency)) + $(this.$body).find('.change_amount').val(format_currency(this.frm.doc.change_amount, this.frm.doc.currency)); + $(this.$body).find('.outstanding_amount').text(format_currency(this.frm.doc.outstanding_amount, frappe.get_doc(":Company", this.frm.doc.company).default_currency)); this.update_invoice(); } }) \ No newline at end of file From a23aaf43f47d515a8ec2a848a9341b560aa92706 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 17 May 2021 20:58:50 +0530 Subject: [PATCH 10/53] fix: Allocate advance taxes only for payment entry --- .../purchase_invoice/purchase_invoice.py | 65 ++++++++++--------- .../doctype/sales_invoice/sales_invoice.py | 65 ++++++++++--------- erpnext/controllers/accounts_controller.py | 19 +++--- 3 files changed, 76 insertions(+), 73 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index a4bac3550d..f925bcf5ba 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -903,42 +903,43 @@ class PurchaseInvoice(BuyingController): def allocate_advance_taxes(self, gl_entries): tax_map = self.get_tax_map() for pe in self.get('advances'): - pe = frappe.get_doc('Payment Entry', pe.reference_name) - for tax in pe.get('taxes'): - account_currency = get_account_currency(tax.account_head) - dr_or_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" - rev_dr_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" + if pe.reference_type == 'Payment Entry': + pe = frappe.get_doc('Payment Entry', pe.reference_name) + for tax in pe.get('taxes'): + account_currency = get_account_currency(tax.account_head) + dr_or_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" + rev_dr_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" - unallocated_amount = tax.tax_amount - tax.allocated_amount - if tax_map.get(tax.account_head): - amount = tax_map.get(tax.account_head) - if amount < unallocated_amount: - unallocated_amount = amount + unallocated_amount = tax.tax_amount - tax.allocated_amount + if tax_map.get(tax.account_head): + amount = tax_map.get(tax.account_head) + if amount < unallocated_amount: + unallocated_amount = amount - gl_entries.append( - self.get_gl_dict({ - "account": tax.account_head, - "against": self.supplier, - dr_or_cr: unallocated_amount, - dr_or_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, - 'cost_center': tax.cost_center - }, account_currency, item=tax)) + gl_entries.append( + self.get_gl_dict({ + "account": tax.account_head, + "against": self.supplier, + dr_or_cr: unallocated_amount, + dr_or_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency + else unallocated_amount, + 'cost_center': tax.cost_center + }, account_currency, item=tax)) - gl_entries.append( - self.get_gl_dict({ - "account": pe.advance_tax_account, - "against": self.supplier, - rev_dr_cr: unallocated_amount, - rev_dr_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, - 'cost_center': tax.cost_center or self.cost_center - }, account_currency, item=tax)) + gl_entries.append( + self.get_gl_dict({ + "account": pe.advance_tax_account, + "against": self.supplier, + rev_dr_cr: unallocated_amount, + rev_dr_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency + else unallocated_amount, + 'cost_center': tax.cost_center or self.cost_center + }, account_currency, item=tax)) - frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) - tax_map[tax.account_head] -= unallocated_amount + frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) + tax_map[tax.account_head] -= unallocated_amount def make_payment_gl_entries(self, gl_entries): # Make Cash GL Entries diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 9a596f2b32..664b3ab0f2 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -916,42 +916,43 @@ class SalesInvoice(SellingController): def allocate_advance_taxes(self, gl_entries): tax_map = self.get_tax_map() for pe in self.get('advances'): - pe = frappe.get_doc('Payment Entry', pe.reference_name) - for tax in pe.get('taxes'): - account_currency = get_account_currency(tax.account_head) - dr_or_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" - rev_dr_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" + if pe.reference_type == 'Payment Entry': + pe = frappe.get_doc('Payment Entry', pe.reference_name) + for tax in pe.get('taxes'): + account_currency = get_account_currency(tax.account_head) + dr_or_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" + rev_dr_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" - unallocated_amount = tax.tax_amount - tax.allocated_amount - if tax_map.get(tax.account_head): - amount = tax_map.get(tax.account_head) - if amount < unallocated_amount: - unallocated_amount = amount + unallocated_amount = tax.tax_amount - tax.allocated_amount + if tax_map.get(tax.account_head): + amount = tax_map.get(tax.account_head) + if amount < unallocated_amount: + unallocated_amount = amount - gl_entries.append( - self.get_gl_dict({ - "account": tax.account_head, - "against": self.customer, - dr_or_cr: unallocated_amount, - dr_or_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, - 'cost_center': tax.cost_center - }, account_currency, item=tax)) + gl_entries.append( + self.get_gl_dict({ + "account": tax.account_head, + "against": self.customer, + dr_or_cr: unallocated_amount, + dr_or_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency + else unallocated_amount, + 'cost_center': tax.cost_center + }, account_currency, item=tax)) - gl_entries.append( - self.get_gl_dict({ - "account": pe.advance_tax_account, - "against": self.customer, - rev_dr_cr: unallocated_amount, - rev_dr_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, - 'cost_center': tax.cost_center - }, account_currency, item=tax)) + gl_entries.append( + self.get_gl_dict({ + "account": pe.advance_tax_account, + "against": self.customer, + rev_dr_cr: unallocated_amount, + rev_dr_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency + else unallocated_amount, + 'cost_center': tax.cost_center + }, account_currency, item=tax)) - frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) - tax_map[tax.account_head] -= unallocated_amount + frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) + tax_map[tax.account_head] -= unallocated_amount def make_item_gl_entries(self, gl_entries): # income account gl entries diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index da88853a96..11a9d90a1f 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -726,16 +726,17 @@ class AccountsController(TransactionBase): tax_map = self.get_tax_map() for pe in self.get('advances'): - pe = frappe.get_doc('Payment Entry', pe.reference_name) - for tax in pe.get('taxes'): - allocated_amount = tax_map.get(tax.account_head) - allocated_tax_map.get(tax.account_head) - if allocated_amount > tax.tax_amount: - allocated_amount = tax.tax_amount + if pe.reference_type == 'Payment Entry': + pe = frappe.get_doc('Payment Entry', pe.reference_name) + for tax in pe.get('taxes'): + allocated_amount = tax_map.get(tax.account_head) - allocated_tax_map.get(tax.account_head) + if allocated_amount > tax.tax_amount: + allocated_amount = tax.tax_amount - if allocated_amount: - frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount - allocated_amount) - tax_map[tax.account_head] -= allocated_amount - allocated_tax_map[tax.account_head] -= allocated_amount + if allocated_amount: + frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount - allocated_amount) + tax_map[tax.account_head] -= allocated_amount + allocated_tax_map[tax.account_head] -= allocated_amount def validate_multiple_billing(self, ref_dt, item_ref_dn, based_on, parentfield): from erpnext.controllers.status_updater import get_allowance_for From c9da1fc568db4d6a163b3ba755ec69e776bcea69 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 19 May 2021 18:38:35 +0530 Subject: [PATCH 11/53] chore: Test case for adance TDS allocation --- .../doctype/payment_entry/payment_entry.json | 333 +++++------------- .../doctype/payment_entry/payment_entry.py | 6 +- .../purchase_invoice/purchase_invoice.py | 41 --- .../purchase_invoice/test_purchase_invoice.py | 90 +++++ .../doctype/sales_invoice/sales_invoice.py | 41 --- erpnext/controllers/accounts_controller.py | 56 ++- 6 files changed, 233 insertions(+), 334 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index afc72045e6..b4b92f926e 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -97,9 +97,7 @@ { "fieldname": "type_of_payment", "fieldtype": "Section Break", - "label": "Type of Payment", - "show_days": 1, - "show_seconds": 1 + "label": "Type of Payment" }, { "bold": 1, @@ -109,9 +107,7 @@ "options": "ACC-PAY-.YYYY.-", "print_hide": 1, "reqd": 1, - "set_only_once": 1, - "show_days": 1, - "show_seconds": 1 + "set_only_once": 1 }, { "bold": 1, @@ -122,15 +118,11 @@ "label": "Payment Type", "options": "Receive\nPay\nInternal Transfer", "print_hide": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "fieldname": "column_break_5", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "bold": 1, @@ -139,9 +131,7 @@ "fieldtype": "Date", "in_list_view": 1, "label": "Posting Date", - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "fieldname": "company", @@ -150,34 +140,26 @@ "options": "Company", "print_hide": 1, "remember_last_selected_value": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "fieldname": "cost_center", "fieldtype": "Link", "label": "Cost Center", - "options": "Cost Center", - "show_days": 1, - "show_seconds": 1 + "options": "Cost Center" }, { "fieldname": "mode_of_payment", "fieldtype": "Link", "in_list_view": 1, "label": "Mode of Payment", - "options": "Mode of Payment", - "show_days": 1, - "show_seconds": 1 + "options": "Mode of Payment" }, { "depends_on": "eval:in_list([\"Receive\", \"Pay\"], doc.payment_type)", "fieldname": "party_section", "fieldtype": "Section Break", - "label": "Payment From / To", - "show_days": 1, - "show_seconds": 1 + "label": "Payment From / To" }, { "depends_on": "eval:in_list([\"Receive\", \"Pay\"], doc.payment_type) && doc.docstatus==0", @@ -187,9 +169,7 @@ "label": "Party Type", "options": "DocType", "print_hide": 1, - "search_index": 1, - "show_days": 1, - "show_seconds": 1 + "search_index": 1 }, { "bold": 1, @@ -198,9 +178,7 @@ "fieldtype": "Dynamic Link", "in_standard_filter": 1, "label": "Party", - "options": "party_type", - "show_days": 1, - "show_seconds": 1 + "options": "party_type" }, { "allow_on_submit": 1, @@ -208,24 +186,18 @@ "fieldname": "party_name", "fieldtype": "Data", "in_global_search": 1, - "label": "Party Name", - "show_days": 1, - "show_seconds": 1 + "label": "Party Name" }, { "fieldname": "column_break_11", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "depends_on": "party", "fieldname": "contact_person", "fieldtype": "Link", "label": "Contact", - "options": "Contact", - "show_days": 1, - "show_seconds": 1 + "options": "Contact" }, { "depends_on": "contact_person", @@ -233,17 +205,13 @@ "fieldtype": "Data", "label": "Email", "options": "Email", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "collapsible": 1, "fieldname": "payment_accounts_section", "fieldtype": "Section Break", - "label": "Accounts", - "show_days": 1, - "show_seconds": 1 + "label": "Accounts" }, { "depends_on": "party", @@ -251,9 +219,7 @@ "fieldtype": "Currency", "label": "Party Balance", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "bold": 1, @@ -264,9 +230,7 @@ "label": "Account Paid From", "options": "Account", "print_hide": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "depends_on": "paid_from", @@ -276,9 +240,7 @@ "options": "Currency", "print_hide": 1, "read_only": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "depends_on": "paid_from", @@ -287,15 +249,11 @@ "label": "Account Balance", "options": "paid_from_account_currency", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "column_break_18", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "depends_on": "eval:(in_list([\"Internal Transfer\", \"Receive\"], doc.payment_type) || doc.party)", @@ -305,9 +263,7 @@ "label": "Account Paid To", "options": "Account", "print_hide": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "depends_on": "paid_to", @@ -317,9 +273,7 @@ "options": "Currency", "print_hide": 1, "read_only": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "depends_on": "paid_to", @@ -328,17 +282,13 @@ "label": "Account Balance", "options": "paid_to_account_currency", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "depends_on": "eval:(doc.paid_to && doc.paid_from)", "fieldname": "payment_amounts_section", "fieldtype": "Section Break", - "label": "Amount", - "show_days": 1, - "show_seconds": 1 + "label": "Amount" }, { "bold": 1, @@ -346,18 +296,14 @@ "fieldtype": "Currency", "label": "Paid Amount", "options": "paid_from_account_currency", - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "fieldname": "source_exchange_rate", "fieldtype": "Float", "label": "Exchange Rate", "print_hide": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "fieldname": "base_paid_amount", @@ -366,15 +312,11 @@ "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "fieldname": "column_break_21", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "bold": 1, @@ -383,18 +325,14 @@ "label": "Received Amount", "options": "paid_to_account_currency", "print_hide": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "fieldname": "target_exchange_rate", "fieldtype": "Float", "label": "Exchange Rate", "print_hide": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "fieldname": "base_received_amount", @@ -403,40 +341,30 @@ "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1, - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "depends_on": "eval:(doc.party && doc.paid_from && doc.paid_to && doc.paid_amount && doc.received_amount)", "fieldname": "section_break_14", "fieldtype": "Section Break", - "label": "Reference", - "show_days": 1, - "show_seconds": 1 + "label": "Reference" }, { "depends_on": "eval:doc.docstatus==0", "fieldname": "get_outstanding_invoice", "fieldtype": "Button", - "label": "Get Outstanding Invoice", - "show_days": 1, - "show_seconds": 1 + "label": "Get Outstanding Invoice" }, { "fieldname": "references", "fieldtype": "Table", "label": "Payment References", - "options": "Payment Entry Reference", - "show_days": 1, - "show_seconds": 1 + "options": "Payment Entry Reference" }, { "fieldname": "section_break_34", "fieldtype": "Section Break", - "label": "Writeoff", - "show_days": 1, - "show_seconds": 1 + "label": "Writeoff" }, { "bold": 1, @@ -445,9 +373,7 @@ "fieldtype": "Currency", "label": "Total Allocated Amount", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "base_total_allocated_amount", @@ -455,31 +381,23 @@ "label": "Total Allocated Amount (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "set_exchange_gain_loss", "fieldtype": "Button", - "label": "Set Exchange Gain / Loss", - "show_days": 1, - "show_seconds": 1 + "label": "Set Exchange Gain / Loss" }, { "fieldname": "column_break_36", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "depends_on": "eval:(doc.paid_amount && doc.received_amount && doc.references)", "fieldname": "unallocated_amount", "fieldtype": "Currency", "label": "Unallocated Amount", - "print_hide": 1, - "show_days": 1, - "show_seconds": 1 + "print_hide": 1 }, { "bold": 1, @@ -489,17 +407,13 @@ "label": "Difference Amount (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "depends_on": "difference_amount", "fieldname": "write_off_difference_amount", "fieldtype": "Button", - "label": "Write Off Difference Amount", - "show_days": 1, - "show_seconds": 1 + "label": "Write Off Difference Amount" }, { "collapsible": 1, @@ -507,39 +421,29 @@ "depends_on": "eval:(doc.paid_amount && doc.received_amount)", "fieldname": "deductions_or_loss_section", "fieldtype": "Section Break", - "label": "Deductions or Loss", - "show_days": 1, - "show_seconds": 1 + "label": "Deductions or Loss" }, { "fieldname": "deductions", "fieldtype": "Table", "label": "Payment Deductions or Loss", - "options": "Payment Entry Deduction", - "show_days": 1, - "show_seconds": 1 + "options": "Payment Entry Deduction" }, { "fieldname": "transaction_references", "fieldtype": "Section Break", - "label": "Transaction ID", - "show_days": 1, - "show_seconds": 1 + "label": "Transaction ID" }, { "bold": 1, "depends_on": "eval:(doc.paid_from && doc.paid_to)", "fieldname": "reference_no", "fieldtype": "Data", - "label": "Cheque/Reference No", - "show_days": 1, - "show_seconds": 1 + "label": "Cheque/Reference No" }, { "fieldname": "column_break_23", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "bold": 1, @@ -547,9 +451,7 @@ "fieldname": "reference_date", "fieldtype": "Date", "label": "Cheque/Reference Date", - "search_index": 1, - "show_days": 1, - "show_seconds": 1 + "search_index": 1 }, { "depends_on": "eval:doc.docstatus==1", @@ -558,76 +460,58 @@ "label": "Clearance Date", "no_copy": 1, "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "collapsible": 1, "depends_on": "eval:(doc.paid_from && doc.paid_to && doc.paid_amount && doc.received_amount)", "fieldname": "section_break_12", "fieldtype": "Section Break", - "label": "More Information", - "show_days": 1, - "show_seconds": 1 + "label": "More Information" }, { "fieldname": "project", "fieldtype": "Link", "label": "Project", "options": "Project", - "print_hide": 1, - "show_days": 1, - "show_seconds": 1 + "print_hide": 1 }, { "fieldname": "remarks", "fieldtype": "Small Text", "label": "Remarks", "no_copy": 1, - "read_only_depends_on": "eval:doc.custom_remarks == 0", - "show_days": 1, - "show_seconds": 1 + "read_only_depends_on": "eval:doc.custom_remarks == 0" }, { "fieldname": "column_break_16", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "fieldname": "letter_head", "fieldtype": "Link", "label": "Letter Head", "options": "Letter Head", - "print_hide": 1, - "show_days": 1, - "show_seconds": 1 + "print_hide": 1 }, { "fieldname": "print_heading", "fieldtype": "Link", "label": "Print Heading", "options": "Print Heading", - "print_hide": 1, - "show_days": 1, - "show_seconds": 1 + "print_hide": 1 }, { "fetch_from": "bank_account.bank", "fieldname": "bank", "fieldtype": "Read Only", - "label": "Bank", - "show_days": 1, - "show_seconds": 1 + "label": "Bank" }, { "fetch_from": "bank_account.bank_account_no", "fieldname": "bank_account_no", "fieldtype": "Read Only", - "label": "Bank Account No", - "show_days": 1, - "show_seconds": 1 + "label": "Bank Account No" }, { "fieldname": "payment_order", @@ -636,16 +520,12 @@ "no_copy": 1, "options": "Payment Order", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "subscription_section", "fieldtype": "Section Break", - "label": "Subscription Section", - "show_days": 1, - "show_seconds": 1 + "label": "Subscription Section" }, { "allow_on_submit": 1, @@ -655,9 +535,7 @@ "no_copy": 1, "options": "Auto Repeat", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "amended_from", @@ -666,9 +544,7 @@ "no_copy": 1, "options": "Payment Entry", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "title", @@ -683,18 +559,14 @@ "fieldname": "bank_account", "fieldtype": "Link", "label": "Company Bank Account", - "options": "Bank Account", - "show_days": 1, - "show_seconds": 1 + "options": "Bank Account" }, { "depends_on": "party", "fieldname": "party_bank_account", "fieldtype": "Link", "label": "Party Bank Account", - "options": "Bank Account", - "show_days": 1, - "show_seconds": 1 + "options": "Bank Account" }, { "fieldname": "payment_order_status", @@ -702,23 +574,17 @@ "hidden": 1, "label": "Payment Order Status", "options": "Initiated\nPayment Ordered", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "collapsible": 1, "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", - "label": "Accounting Dimensions", - "show_days": 1, - "show_seconds": 1 + "label": "Accounting Dimensions" }, { "fieldname": "dimension_col_break", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "default": "Draft", @@ -739,70 +605,55 @@ "fieldname": "tax_withholding_category", "fieldtype": "Link", "label": "Tax Withholding Category", - "options": "Tax Withholding Category", - "show_days": 1, - "show_seconds": 1 + "mandatory_depends_on": "eval:doc.apply_tax_withholding_amount", + "options": "Tax Withholding Category" }, { "default": "0", "depends_on": "eval:doc.party_type == 'Supplier'", "fieldname": "apply_tax_withholding_amount", "fieldtype": "Check", - "label": "Apply Tax Withholding Amount", - "show_days": 1, - "show_seconds": 1 + "label": "Apply Tax Withholding Amount" }, { "collapsible": 1, "fieldname": "taxes_and_charges_section", "fieldtype": "Section Break", - "label": "Taxes and Charges", - "show_days": 1, - "show_seconds": 1 + "label": "Taxes and Charges" }, { "depends_on": "eval:doc.party_type == 'Supplier'", "fieldname": "purchase_taxes_and_charges_template", "fieldtype": "Link", "label": "Taxes and Charges Template", - "options": "Purchase Taxes and Charges Template", - "show_days": 1, - "show_seconds": 1 + "options": "Purchase Taxes and Charges Template" }, { "depends_on": "eval: doc.party_type == 'Customer'", "fieldname": "sales_taxes_and_charges_template", "fieldtype": "Link", "label": "Taxes and Charges Template", - "options": "Sales Taxes and Charges Template", - "show_days": 1, - "show_seconds": 1 + "options": "Sales Taxes and Charges Template" }, { "depends_on": "eval: doc.party_type == 'Supplier' || doc.party_type == 'Customer'", "fieldname": "taxes", "fieldtype": "Table", "label": "Advance Taxes and Charges", - "options": "Advance Taxes and Charges", - "show_days": 1, - "show_seconds": 1 + "options": "Advance Taxes and Charges" }, { "fieldname": "base_total_taxes_and_charges", "fieldtype": "Currency", "label": "Total Taxes and Charges (Company Currency)", "options": "Company:company:default_currency", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "total_taxes_and_charges", "fieldtype": "Currency", "label": "Total Taxes and Charges", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "paid_amount_after_tax", @@ -810,61 +661,47 @@ "hidden": 1, "label": "Paid Amount After Tax", "options": "paid_from_account_currency", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "base_paid_amount_after_tax", "fieldtype": "Currency", "label": "Paid Amount After Tax (Company Currency)", "options": "Company:company:default_currency", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "column_break_55", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "fieldname": "section_break_56", "fieldtype": "Section Break", - "hide_border": 1, - "show_days": 1, - "show_seconds": 1 + "hide_border": 1 }, { "fieldname": "advance_tax_account", "fieldtype": "Link", "label": "Advance Tax Account", - "options": "Account", - "show_days": 1, - "show_seconds": 1 + "options": "Account" }, { "fieldname": "received_amount_after_tax", "fieldtype": "Currency", "label": "Received Amount After Tax", - "options": "paid_to_account_currency", - "show_days": 1, - "show_seconds": 1 + "options": "paid_to_account_currency" }, { "fieldname": "base_received_amount_after_tax", "fieldtype": "Currency", "label": "Received Amount After Tax (Company Currency)", - "options": "Company:company:default_currency", - "show_days": 1, - "show_seconds": 1 + "options": "Company:company:default_currency" } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2021-05-15 13:05:16.958866", + "modified": "2021-05-19 02:33:08.192932", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", @@ -908,4 +745,4 @@ "sort_order": "DESC", "title_field": "title", "track_changes": 1 -} +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index ac8e7070f5..cbe8045fd1 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -436,7 +436,10 @@ class PaymentEntry(AccountsController): if not tax_withholding_details: return - tax_withholding_details.update({'included_in_paid_amount': included_in_paid_amount}) + tax_withholding_details.update({ + 'included_in_paid_amount': included_in_paid_amount, + 'cost_center': self.cost_center or erpnext.get_default_cost_center(self.company) + }) accounts = [] for d in self.taxes: @@ -1412,6 +1415,7 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= if doc.doctype == 'Purchase Order' and doc.apply_tds: pe.apply_tax_withholding_amount = 1 + pe.tax_withholding_category = doc.tax_withholding_category return pe diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index f925bcf5ba..934c731cf1 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -900,47 +900,6 @@ class PurchaseInvoice(BuyingController): "cost_center": self.cost_center }, account_currency, item=self)) - def allocate_advance_taxes(self, gl_entries): - tax_map = self.get_tax_map() - for pe in self.get('advances'): - if pe.reference_type == 'Payment Entry': - pe = frappe.get_doc('Payment Entry', pe.reference_name) - for tax in pe.get('taxes'): - account_currency = get_account_currency(tax.account_head) - dr_or_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" - rev_dr_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" - - unallocated_amount = tax.tax_amount - tax.allocated_amount - if tax_map.get(tax.account_head): - amount = tax_map.get(tax.account_head) - if amount < unallocated_amount: - unallocated_amount = amount - - gl_entries.append( - self.get_gl_dict({ - "account": tax.account_head, - "against": self.supplier, - dr_or_cr: unallocated_amount, - dr_or_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, - 'cost_center': tax.cost_center - }, account_currency, item=tax)) - - gl_entries.append( - self.get_gl_dict({ - "account": pe.advance_tax_account, - "against": self.supplier, - rev_dr_cr: unallocated_amount, - rev_dr_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, - 'cost_center': tax.cost_center or self.cost_center - }, account_currency, item=tax)) - - frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) - tax_map[tax.account_head] -= unallocated_amount - def make_payment_gl_entries(self, gl_entries): # Make Cash GL Entries if cint(self.is_paid) and self.cash_bank_account and self.paid_amount: diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 66be11ff23..0da46e9886 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -950,6 +950,96 @@ class TestPurchaseInvoice(unittest.TestCase): acc_settings.submit_journal_entriessubmit_journal_entries = 0 acc_settings.save() + def test_purchase_invoice_advance_taxes(self): + from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order + from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry + from erpnext.buying.doctype.purchase_order.purchase_order import get_mapped_purchase_invoice + + # Update tax withholding category with current fiscal year and rate details + update_tax_witholding_category('_Test Company', 'TDS Payable - _TC', nowdate()) + + # Create Purchase Order with TDS applied + po = create_purchase_order(do_not_save=1, rate=3000) + po.apply_tds = 1 + po.tax_withholding_category = 'TDS - 194 - Dividends - Individual' + po.save() + po.submit() + + # Update Unrealized Profit / Loss Account which is used as default advance tax account + frappe.db.set_value('Company', '_Test Company', 'unrealized_profit_loss_account', '_Test Account Excise Duty - _TC') + + # Create Payment Entry Against the order + payment_entry = get_payment_entry(dt='Purchase Order', dn=po.name) + payment_entry.save() + payment_entry.submit() + + # Check GLE for Payment Entry + expected_gle = [ + ['_Test Account Excise Duty - _TC', 6000, 0], + ['Cash - _TC', 0, 24000], + ['Creditors - _TC', 24000, 0], + ['TDS Payable - _TC', 0, 6000], + ] + + gl_entries = frappe.db.sql("""select account, debit, credit + from `tabGL Entry` + where voucher_type='Payment Entry' and voucher_no=%s + order by account asc""", (payment_entry.name), as_dict=1) + + for i, gle in enumerate(gl_entries): + self.assertEqual(expected_gle[i][0], gle.account) + self.assertEqual(expected_gle[i][1], gle.debit) + self.assertEqual(expected_gle[i][2], gle.credit) + + # Create Purchase Invoice against Purchase Order + purchase_invoice = get_mapped_purchase_invoice(po.name) + purchase_invoice.allocate_advances_automatically = 1 + purchase_invoice.save() + purchase_invoice.submit() + + # Check GLE for Purchase Invoice + # Zero net effect on final TDS Payable on invoice + expected_gle = [ + ['_Test Account Excise Duty - _TC', 0, 6000], + ['Cost of Goods Sold - _TC', 30000, 0], + ['Creditors - _TC', 0, 24000], + ['TDS Payable - _TC', 6000, 6000], + ] + + gl_entries = frappe.db.sql("""select account, debit, credit + from `tabGL Entry` + where voucher_type='Purchase Invoice' and voucher_no=%s + order by account asc""", (purchase_invoice.name), as_dict=1) + + for i, gle in enumerate(gl_entries): + self.assertEqual(expected_gle[i][0], gle.account) + self.assertEqual(expected_gle[i][1], gle.debit) + self.assertEqual(expected_gle[i][2], gle.credit) + +def update_tax_witholding_category(company, account, date): + from erpnext.accounts.utils import get_fiscal_year + + fiscal_year = get_fiscal_year(date=date, company=company) + + if not frappe.db.get_value('Tax Withholding Rate', + {'parent': 'TDS - 194 - Dividends - Individual', 'fiscal_year': fiscal_year[0]}): + tds_category = frappe.get_doc('Tax Withholding Category', 'TDS - 194 - Dividends - Individual') + tds_category.append('rates', { + 'fiscal_year': fiscal_year[0], + 'tax_withholding_rate': 20, + 'single_threshold': 2500, + 'cumulative_threshold': 0 + }) + tds_category.save() + + if not frappe.db.get_value('Tax Withholding Account', + {'parent': 'TDS - 194 - Dividends - Individual', 'account': account}): + tds_category = frappe.get_doc('Tax Withholding Category', 'TDS - 194 - Dividends - Individual') + tds_category.append('accounts', { + 'company': company, + 'account': account + }) + tds_category.save() def unlink_payment_on_cancel_of_invoice(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 664b3ab0f2..485ae18bf0 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -913,47 +913,6 @@ class SalesInvoice(SellingController): "cost_center": self.cost_center }, account_currency, item=self)) - def allocate_advance_taxes(self, gl_entries): - tax_map = self.get_tax_map() - for pe in self.get('advances'): - if pe.reference_type == 'Payment Entry': - pe = frappe.get_doc('Payment Entry', pe.reference_name) - for tax in pe.get('taxes'): - account_currency = get_account_currency(tax.account_head) - dr_or_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" - rev_dr_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" - - unallocated_amount = tax.tax_amount - tax.allocated_amount - if tax_map.get(tax.account_head): - amount = tax_map.get(tax.account_head) - if amount < unallocated_amount: - unallocated_amount = amount - - gl_entries.append( - self.get_gl_dict({ - "account": tax.account_head, - "against": self.customer, - dr_or_cr: unallocated_amount, - dr_or_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, - 'cost_center': tax.cost_center - }, account_currency, item=tax)) - - gl_entries.append( - self.get_gl_dict({ - "account": pe.advance_tax_account, - "against": self.customer, - rev_dr_cr: unallocated_amount, - rev_dr_cr + "_in_account_currency": unallocated_amount - if account_currency==self.company_currency - else unallocated_amount, - 'cost_center': tax.cost_center - }, account_currency, item=tax)) - - frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount + unallocated_amount) - tax_map[tax.account_head] -= unallocated_amount - def make_item_gl_entries(self, gl_entries): # income account gl entries for item in self.get("items"): diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 11a9d90a1f..1e85433a60 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -700,7 +700,7 @@ class AccountsController(TransactionBase): from erpnext.accounts.utils import unlink_ref_doc_from_payment_entries if self.doctype in ["Sales Invoice", "Purchase Invoice"]: - self.update_allocated_advance_taxes() + self.update_allocated_advance_taxes_on_cancel() if frappe.db.get_single_value('Accounts Settings', 'unlink_payment_on_cancellation_of_invoice'): unlink_ref_doc_from_payment_entries(self) @@ -716,7 +716,7 @@ class AccountsController(TransactionBase): return tax_map - def update_allocated_advance_taxes(self): + def update_allocated_advance_taxes_on_cancel(self): if self.get('advances'): tax_accounts = [d.account_head for d in self.get('taxes')] allocated_tax_map = frappe._dict(frappe.get_all('GL Entry', fields=['account', 'sum(credit - debit)'], @@ -734,10 +734,60 @@ class AccountsController(TransactionBase): allocated_amount = tax.tax_amount if allocated_amount: - frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', tax.allocated_amount - allocated_amount) + frappe.db.set_value('Advance Taxes and Charges', tax.name, 'allocated_amount', + tax.allocated_amount - allocated_amount) tax_map[tax.account_head] -= allocated_amount allocated_tax_map[tax.account_head] -= allocated_amount + def allocate_advance_taxes(self, gl_entries): + tax_map = self.get_tax_map() + for pe in self.get("advances"): + if pe.reference_type == "Payment Entry": + pe = frappe.get_doc("Payment Entry", pe.reference_name) + for tax in pe.get("taxes"): + account_currency = get_account_currency(tax.account_head) + + if self.doctype == "Purchase Invoice": + dr_or_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" + rev_dr_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" + else: + dr_or_cr = "debit" if tax.add_deduct_tax == "Add" else "credit" + rev_dr_cr = "credit" if tax.add_deduct_tax == "Add" else "debit" + + party = self.supplier if self.doctype == "Purchase Invoice" else self.customer + unallocated_amount = tax.tax_amount - tax.allocated_amount + if tax_map.get(tax.account_head): + amount = tax_map.get(tax.account_head) + if amount < unallocated_amount: + unallocated_amount = amount + + gl_entries.append( + self.get_gl_dict({ + "account": tax.account_head, + "against": party, + dr_or_cr: unallocated_amount, + dr_or_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency + else unallocated_amount, + "cost_center": tax.cost_center + }, account_currency, item=tax)) + + gl_entries.append( + self.get_gl_dict({ + "account": pe.advance_tax_account, + "against": party, + rev_dr_cr: unallocated_amount, + rev_dr_cr + "_in_account_currency": unallocated_amount + if account_currency==self.company_currency + else unallocated_amount, + "cost_center": tax.cost_center + }, account_currency, item=tax)) + + frappe.db.set_value("Advance Taxes and Charges", tax.name, "allocated_amount", + tax.allocated_amount + unallocated_amount) + + tax_map[tax.account_head] -= unallocated_amount + def validate_multiple_billing(self, ref_dt, item_ref_dn, based_on, parentfield): from erpnext.controllers.status_updater import get_allowance_for item_allowance = {} From b07f7d1b70352a6a85549541fc4a635df6ff393a Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 20 May 2021 17:08:57 +0530 Subject: [PATCH 12/53] fix: Linting and other fixes --- .../doctype/payment_entry/payment_entry.js | 19 ++++++--- .../doctype/payment_entry/payment_entry.json | 4 +- .../doctype/payment_entry/payment_entry.py | 19 ++++++--- .../purchase_invoice/test_purchase_invoice.py | 40 +++++++++---------- .../doctype/purchase_order/purchase_order.js | 3 +- erpnext/public/js/payment/payments.js | 33 +++++++-------- 6 files changed, 66 insertions(+), 52 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 19d73b1ad4..a7fcbd7e3b 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -1112,12 +1112,16 @@ frappe.ui.form.on('Payment Entry', { current_tax_amount *= (tax.add_deduct_tax == "Deduct") ? -1.0 : 1.0; + let applicable_tax_amount = 0 + if (!tax.included_in_paid_amount) { - if(i==0) { - tax.total = flt(frm.doc.paid_amount + current_tax_amount, precision("total", tax)); - } else { - tax.total = flt(frm.doc["taxes"][i-1].total + current_tax_amount, precision("total", tax)); - } + applicable_tax_amount = current_tax_amount + } + + if(i==0) { + tax.total = flt(frm.doc.paid_amount + applicable_tax_amount, precision("total", tax)); + } else { + tax.total = flt(frm.doc["taxes"][i-1].total + applicable_tax_amount, precision("total", tax)); } tax.base_total = tax.total * frm.doc.source_exchange_rate; @@ -1194,6 +1198,11 @@ frappe.ui.form.on('Advance Taxes and Charges', { taxes_remove: function(frm) { frm.events.calculate_taxes(frm); frm.events.set_unallocated_amount(frm); + }, + + included_in_paid_amount: function(frm) { + frm.events.calculate_taxes(frm); + frm.events.set_unallocated_amount(frm); } }) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index b4b92f926e..1e2bd8194a 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -29,7 +29,6 @@ "paid_from", "paid_from_account_currency", "paid_from_account_balance", - "advance_tax_account", "column_break_18", "paid_to", "paid_to_account_currency", @@ -60,6 +59,7 @@ "taxes_and_charges_section", "purchase_taxes_and_charges_template", "sales_taxes_and_charges_template", + "advance_tax_account", "column_break_55", "apply_tax_withholding_amount", "tax_withholding_category", @@ -701,7 +701,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2021-05-19 02:33:08.192932", + "modified": "2021-05-20 02:04:56.766124", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index cbe8045fd1..d960156670 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -444,6 +444,11 @@ class PaymentEntry(AccountsController): accounts = [] for d in self.taxes: if d.account_head == tax_withholding_details.get("account_head"): + + # Preserve user updated included in paid amount + if d.included_in_paid_amount: + tax_withholding_details.update({'included_in_paid_amount': d.included_in_paid_amount}) + d.update(tax_withholding_details) accounts.append(d.account_head) @@ -839,12 +844,16 @@ class PaymentEntry(AccountsController): current_tax_amount *= 1.0 if not tax.included_in_paid_amount: - if i == 0: - tax.total = flt(self.paid_amount + current_tax_amount, self.precision("total", tax)) - else: - tax.total = flt(self.get('taxes')[i-1].total + current_tax_amount, self.precision("total", tax)) + applicable_tax = current_tax_amount + else: + applicable_tax = 0 - tax.base_total = tax.total * self.source_exchange_rate + if i == 0: + tax.total = flt(self.paid_amount + applicable_tax, self.precision("total", tax)) + else: + tax.total = flt(self.get('taxes')[i-1].total + applicable_tax, self.precision("total", tax)) + + tax.base_total = tax.total * self.source_exchange_rate self.total_taxes_and_charges += current_tax_amount self.base_total_taxes_and_charges += current_tax_amount * self.source_exchange_rate diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 0da46e9886..aa56ddfdf3 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -992,29 +992,29 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual(expected_gle[i][2], gle.credit) # Create Purchase Invoice against Purchase Order - purchase_invoice = get_mapped_purchase_invoice(po.name) - purchase_invoice.allocate_advances_automatically = 1 - purchase_invoice.save() - purchase_invoice.submit() + # purchase_invoice = get_mapped_purchase_invoice(po.name) + # purchase_invoice.allocate_advances_automatically = 1 + # purchase_invoice.save() + # purchase_invoice.submit() - # Check GLE for Purchase Invoice - # Zero net effect on final TDS Payable on invoice - expected_gle = [ - ['_Test Account Excise Duty - _TC', 0, 6000], - ['Cost of Goods Sold - _TC', 30000, 0], - ['Creditors - _TC', 0, 24000], - ['TDS Payable - _TC', 6000, 6000], - ] + # # Check GLE for Purchase Invoice + # # Zero net effect on final TDS Payable on invoice + # expected_gle = [ + # ['_Test Account Excise Duty - _TC', 0, 6000], + # ['Cost of Goods Sold - _TC', 30000, 0], + # ['Creditors - _TC', 0, 24000], + # ['TDS Payable - _TC', 6000, 6000], + # ] - gl_entries = frappe.db.sql("""select account, debit, credit - from `tabGL Entry` - where voucher_type='Purchase Invoice' and voucher_no=%s - order by account asc""", (purchase_invoice.name), as_dict=1) + # gl_entries = frappe.db.sql("""select account, debit, credit + # from `tabGL Entry` + # where voucher_type='Purchase Invoice' and voucher_no=%s + # order by account asc""", (purchase_invoice.name), as_dict=1) - for i, gle in enumerate(gl_entries): - self.assertEqual(expected_gle[i][0], gle.account) - self.assertEqual(expected_gle[i][1], gle.debit) - self.assertEqual(expected_gle[i][2], gle.credit) + # for i, gle in enumerate(gl_entries): + # self.assertEqual(expected_gle[i][0], gle.account) + # self.assertEqual(expected_gle[i][1], gle.debit) + # self.assertEqual(expected_gle[i][2], gle.credit) def update_tax_witholding_category(company, account, date): from erpnext.accounts.utils import get_fiscal_year diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index ccb3ce33ec..0f6d927b36 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -321,7 +321,8 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( if(me.values) { me.values.sub_con_rm_items.map((row,i) => { if (!row.item_code || !row.rm_item_code || !row.warehouse || !row.qty || row.qty === 0) { - frappe.throw(__("Item Code and warehouse and quantity are required on row {0}", [i+1])); + let row_id = i+1; + frappe.throw(__("Item Code, warehouse and quantity are required on row {0}", [row_id])); } }) me._make_rm_stock_entry(me.dialog.fields_dict.sub_con_rm_items.grid.get_selected_children()) diff --git a/erpnext/public/js/payment/payments.js b/erpnext/public/js/payment/payments.js index 9fb2f3ee7f..b9e933a38e 100644 --- a/erpnext/public/js/payment/payments.js +++ b/erpnext/public/js/payment/payments.js @@ -16,12 +16,11 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.select_text(); }, - select_text: function() { - var me = this; + select_text() { $(this.$body).find('.form-control').click(function() { $(this).select(); - }) - }, + }); + } set_payment_primary_action: function() { var me = this; @@ -62,8 +61,8 @@ erpnext.payments = erpnext.stock.StockController.extend({ show_payment_details: function() { var me = this; var multimode_payments = $(this.$body).find('.multimode-payments').empty(); - if(this.frm.doc.payments.length){ - $.each(this.frm.doc.payments, function(index, data){ + if (this.frm.doc.payments.length) { + $.each(this.frm.doc.payments, function(index, data) { $(frappe.render_template('payment_details', { mode_of_payment: data.mode_of_payment, amount: data.amount, @@ -88,12 +87,12 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.selected_mode = $(this.$body).find(repl("input[idx='%(idx)s']",{'idx': this.idx})); this.highlight_selected_row() this.payment_val = 0.0 - if(this.frm.doc.outstanding_amount > 0 && flt(this.selected_mode.val()) == 0.0){ + if (this.frm.doc.outstanding_amount > 0 && flt(this.selected_mode.val()) == 0.0) { //When user first time click on row this.payment_val = flt(this.frm.doc.outstanding_amount / this.frm.doc.conversion_rate, precision("outstanding_amount")) this.selected_mode.val(format_currency(this.payment_val, this.frm.doc.currency)); - this.update_payment_amount() - }else if(flt(this.selected_mode.val()) > 0){ + this.update_payment_amount(); + } else if (flt(this.selected_mode.val()) > 0) { //If user click on existing row which has value this.payment_val = flt(this.selected_mode.val()); } @@ -101,8 +100,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ this.bind_amount_change_event(); }, - bind_keyboard_event: function() { - var me = this; + bind_keyboard_event() { this.payment_val = ''; this.bind_form_control_event(); this.bind_numeric_keys_event(); @@ -130,8 +128,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ }); }, - highlight_selected_row: function() { - var me = this; + highlight_selected_row() { var selected_row = $(this.$body).find(repl(".pos-payment-row[idx='%(idx)s']", {'idx': this.idx})); $(this.$body).find('.pos-payment-row').removeClass('selected-payment-mode'); selected_row.addClass('selected-payment-mode'); @@ -157,7 +154,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ }, - bind_amount_change_event: function() { + bind_amount_change_event() { var me = this; this.selected_mode.change(function() { me.payment_val = flt($(this).val()) || 0.0; @@ -180,9 +177,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ }); }, - write_off_amount: function(write_off_amount) { - var me = this; - + write_off_amount(write_off_amount) { this.frm.doc.write_off_amount = flt(write_off_amount, precision("write_off_amount")); this.frm.doc.base_write_off_amount = flt(this.frm.doc.write_off_amount * this.frm.doc.conversion_rate, precision("base_write_off_amount")); @@ -204,7 +199,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ var value = me.selected_mode.val(); if (me.idx == 'change_amount') { me.change_amount(value); - } else{ + } else { if(flt(value) == 0 && update_write_off && me.frm.doc.outstanding_amount > 0) { value = flt(me.frm.doc.outstanding_amount / me.frm.doc.conversion_rate, precision(me.idx)); } @@ -219,7 +214,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ var me = this; $.each(this.frm.doc.payments, function(index, data) { - if(cint(me.idx) == cint(data.idx)){ + if (cint(me.idx) == cint(data.idx)) { data.amount = flt(me.selected_mode.val(), 2); } }) From 6f84cee6feb1f2160bd1b48a6e4f45f8ee9cf952 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Fri, 21 May 2021 11:15:18 +0530 Subject: [PATCH 13/53] fix: Uncommentt test --- .../purchase_invoice/test_purchase_invoice.py | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index aa56ddfdf3..e71a416f3d 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -991,30 +991,30 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual(expected_gle[i][1], gle.debit) self.assertEqual(expected_gle[i][2], gle.credit) - # Create Purchase Invoice against Purchase Order - # purchase_invoice = get_mapped_purchase_invoice(po.name) - # purchase_invoice.allocate_advances_automatically = 1 - # purchase_invoice.save() - # purchase_invoice.submit() + Create Purchase Invoice against Purchase Order + purchase_invoice = get_mapped_purchase_invoice(po.name) + purchase_invoice.allocate_advances_automatically = 1 + purchase_invoice.save() + purchase_invoice.submit() - # # Check GLE for Purchase Invoice - # # Zero net effect on final TDS Payable on invoice - # expected_gle = [ - # ['_Test Account Excise Duty - _TC', 0, 6000], - # ['Cost of Goods Sold - _TC', 30000, 0], - # ['Creditors - _TC', 0, 24000], - # ['TDS Payable - _TC', 6000, 6000], - # ] + # Check GLE for Purchase Invoice + # Zero net effect on final TDS Payable on invoice + expected_gle = [ + ['_Test Account Excise Duty - _TC', 0, 6000], + ['Cost of Goods Sold - _TC', 30000, 0], + ['Creditors - _TC', 0, 24000], + ['TDS Payable - _TC', 6000, 6000], + ] - # gl_entries = frappe.db.sql("""select account, debit, credit - # from `tabGL Entry` - # where voucher_type='Purchase Invoice' and voucher_no=%s - # order by account asc""", (purchase_invoice.name), as_dict=1) + gl_entries = frappe.db.sql("""select account, debit, credit + from `tabGL Entry` + where voucher_type='Purchase Invoice' and voucher_no=%s + order by account asc""", (purchase_invoice.name), as_dict=1) - # for i, gle in enumerate(gl_entries): - # self.assertEqual(expected_gle[i][0], gle.account) - # self.assertEqual(expected_gle[i][1], gle.debit) - # self.assertEqual(expected_gle[i][2], gle.credit) + for i, gle in enumerate(gl_entries): + self.assertEqual(expected_gle[i][0], gle.account) + self.assertEqual(expected_gle[i][1], gle.debit) + self.assertEqual(expected_gle[i][2], gle.credit) def update_tax_witholding_category(company, account, date): from erpnext.accounts.utils import get_fiscal_year From 36d47f97f400630ffaa259e7dc50fe7b120e0c35 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Fri, 21 May 2021 11:16:26 +0530 Subject: [PATCH 14/53] fix: Linting issues --- erpnext/public/js/payment/payments.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/public/js/payment/payments.js b/erpnext/public/js/payment/payments.js index b9e933a38e..ddf8706809 100644 --- a/erpnext/public/js/payment/payments.js +++ b/erpnext/public/js/payment/payments.js @@ -20,7 +20,7 @@ erpnext.payments = erpnext.stock.StockController.extend({ $(this.$body).find('.form-control').click(function() { $(this).select(); }); - } + }, set_payment_primary_action: function() { var me = this; @@ -85,8 +85,8 @@ erpnext.payments = erpnext.stock.StockController.extend({ set_outstanding_amount: function() { this.selected_mode = $(this.$body).find(repl("input[idx='%(idx)s']",{'idx': this.idx})); - this.highlight_selected_row() - this.payment_val = 0.0 + this.highlight_selected_row(); + this.payment_val = 0.0; if (this.frm.doc.outstanding_amount > 0 && flt(this.selected_mode.val()) == 0.0) { //When user first time click on row this.payment_val = flt(this.frm.doc.outstanding_amount / this.frm.doc.conversion_rate, precision("outstanding_amount")) From 55a3fb57dd213993907114615bb3c406a191d9e7 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sat, 22 May 2021 20:30:18 +0530 Subject: [PATCH 15/53] fix: Linting Issues --- .../accounts/doctype/purchase_invoice/test_purchase_invoice.py | 2 +- .../accounts/report/tds_payable_monthly/tds_payable_monthly.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index e71a416f3d..0da46e9886 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -991,7 +991,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual(expected_gle[i][1], gle.debit) self.assertEqual(expected_gle[i][2], gle.credit) - Create Purchase Invoice against Purchase Order + # Create Purchase Invoice against Purchase Order purchase_invoice = get_mapped_purchase_invoice(po.name) purchase_invoice.allocate_advances_automatically = 1 purchase_invoice.save() diff --git a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py index 619d799d06..ceefa31cfa 100644 --- a/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py +++ b/erpnext/accounts/report/tds_payable_monthly/tds_payable_monthly.py @@ -56,7 +56,6 @@ def set_filters(filters): elif filters.purchase_order and not filters.supplier: for d in filters.get("invoices"): if d.name == filters.purchase_order: - print("$#$#$$#") invoices.append(d) filters["invoices"] = invoices if invoices else filters["invoices"] From 84f270e73223313dc789bb5617911ded5efbc0a7 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 25 May 2021 18:03:42 +0530 Subject: [PATCH 16/53] fix: Remove unwanted commits --- erpnext/controllers/taxes_and_totals.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index a6b54eb590..0b89750766 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -819,16 +819,3 @@ class init_landed_taxes_and_totals(object): for d in self.doc.get(self.tax_field): d.amount = flt(d.amount, d.precision("amount")) d.base_amount = flt(d.amount * flt(d.exchange_rate), d.precision("base_amount")) - -def get_advance_taxes(payment_entry_list): - taxes = [] - if payment_entry_list: - taxes = frappe.db.sql( - """ - SELECT t.parent, t.add_deduct_tax, t.charge_type, t.rate, - t.account_head, t.cost_center, t.tax_amount, t.description - FROM `tabAdvance Taxes and Charges` t, `tabPayment Entry` p - WHERE t.parent = p.name AND t.parent in %s - """, (payment_entry_list, ), as_dict=1) - - return taxes From 8fddd0f0c1a4b4f51af8e7834e37d7f48a08576a Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 25 May 2021 22:03:50 +0530 Subject: [PATCH 17/53] fix: Update TDS rate for test --- .../doctype/purchase_invoice/test_purchase_invoice.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 0da46e9886..319808ac95 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -975,10 +975,10 @@ class TestPurchaseInvoice(unittest.TestCase): # Check GLE for Payment Entry expected_gle = [ - ['_Test Account Excise Duty - _TC', 6000, 0], + ['_Test Account Excise Duty - _TC', 3000, 0], ['Cash - _TC', 0, 24000], ['Creditors - _TC', 24000, 0], - ['TDS Payable - _TC', 0, 6000], + ['TDS Payable - _TC', 0, 3000], ] gl_entries = frappe.db.sql("""select account, debit, credit @@ -1000,10 +1000,10 @@ class TestPurchaseInvoice(unittest.TestCase): # Check GLE for Purchase Invoice # Zero net effect on final TDS Payable on invoice expected_gle = [ - ['_Test Account Excise Duty - _TC', 0, 6000], + ['_Test Account Excise Duty - _TC', 0, 3000], ['Cost of Goods Sold - _TC', 30000, 0], ['Creditors - _TC', 0, 24000], - ['TDS Payable - _TC', 6000, 6000], + ['TDS Payable - _TC', 6000, 3000], ] gl_entries = frappe.db.sql("""select account, debit, credit @@ -1026,7 +1026,7 @@ def update_tax_witholding_category(company, account, date): tds_category = frappe.get_doc('Tax Withholding Category', 'TDS - 194 - Dividends - Individual') tds_category.append('rates', { 'fiscal_year': fiscal_year[0], - 'tax_withholding_rate': 20, + 'tax_withholding_rate': 10, 'single_threshold': 2500, 'cumulative_threshold': 0 }) From 5e27c7dae21c317bde812547cc6ae1f6c69ba61d Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 25 May 2021 22:34:58 +0530 Subject: [PATCH 18/53] fix: Add non group filter for account --- erpnext/accounts/doctype/payment_entry/payment_entry.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index a7fcbd7e3b..a4022ef40a 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -97,7 +97,8 @@ frappe.ui.form.on('Payment Entry', { return { filters: { "company": frm.doc.company, - "root_type": ["in", ["Asset", "Liability"]] + "root_type": ["in", ["Asset", "Liability"]], + "is_group": 0 } } }); From be3671fe7b3965be2f34fb902e68d25c3f5c174b Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 27 May 2021 13:27:17 +0530 Subject: [PATCH 19/53] fix: Create new supplier for test case --- .../purchase_invoice/test_purchase_invoice.py | 15 ++++++++++----- .../doctype/purchase_order/test_purchase_order.py | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 319808ac95..2610a69471 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -16,6 +16,7 @@ from erpnext.stock.doctype.stock_entry.test_stock_entry import get_qty_after_tra from erpnext.projects.doctype.project.test_project import make_project from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account from erpnext.stock.doctype.item.test_item import create_item +from erpnext.buying.doctype.supplier.test_supplier import create_supplier test_dependencies = ["Item", "Cost Center", "Payment Term", "Payment Terms Template"] test_ignore = ["Serial No"] @@ -955,11 +956,15 @@ class TestPurchaseInvoice(unittest.TestCase): from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.buying.doctype.purchase_order.purchase_order import get_mapped_purchase_invoice + # create a new supplier to test + supplier = create_supplier(supplier_name = '_Test TDS Advance Supplier', + tax_withholding_category = 'TDS - 194 - Dividends - Individual') + # Update tax withholding category with current fiscal year and rate details update_tax_witholding_category('_Test Company', 'TDS Payable - _TC', nowdate()) # Create Purchase Order with TDS applied - po = create_purchase_order(do_not_save=1, rate=3000) + po = create_purchase_order(do_not_save=1, supplier=supplier.name, rate=3000) po.apply_tds = 1 po.tax_withholding_category = 'TDS - 194 - Dividends - Individual' po.save() @@ -976,8 +981,8 @@ class TestPurchaseInvoice(unittest.TestCase): # Check GLE for Payment Entry expected_gle = [ ['_Test Account Excise Duty - _TC', 3000, 0], - ['Cash - _TC', 0, 24000], - ['Creditors - _TC', 24000, 0], + ['Cash - _TC', 0, 27000], + ['Creditors - _TC', 27000, 0], ['TDS Payable - _TC', 0, 3000], ] @@ -1002,8 +1007,8 @@ class TestPurchaseInvoice(unittest.TestCase): expected_gle = [ ['_Test Account Excise Duty - _TC', 0, 3000], ['Cost of Goods Sold - _TC', 30000, 0], - ['Creditors - _TC', 0, 24000], - ['TDS Payable - _TC', 6000, 3000], + ['Creditors - _TC', 0, 27000], + ['TDS Payable - _TC', 3000, 3000], ] gl_entries = frappe.db.sql("""select account, debit, credit diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index aaa98f2f1f..39171960d8 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -1111,7 +1111,7 @@ def create_purchase_order(**args): po.schedule_date = add_days(nowdate(), 1) po.company = args.company or "_Test Company" - po.supplier = args.customer or "_Test Supplier" + po.supplier = args.supplier or "_Test Supplier" po.is_subcontracted = args.is_subcontracted or "No" po.currency = args.currency or frappe.get_cached_value('Company', po.company, "default_currency") po.conversion_factor = args.conversion_factor or 1 From ea18230274725f2cf0a3fa62b8b6f756af4dea79 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 27 May 2021 16:40:37 +0530 Subject: [PATCH 20/53] fix: Update GL Entry ordering --- .../accounts/doctype/purchase_invoice/test_purchase_invoice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 2610a69471..07f9b42fbf 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1005,8 +1005,8 @@ class TestPurchaseInvoice(unittest.TestCase): # Check GLE for Purchase Invoice # Zero net effect on final TDS Payable on invoice expected_gle = [ + ['_Test Account Cost for Goods Sold - _TC', 30000, 0], ['_Test Account Excise Duty - _TC', 0, 3000], - ['Cost of Goods Sold - _TC', 30000, 0], ['Creditors - _TC', 0, 27000], ['TDS Payable - _TC', 3000, 3000], ] From 740c68d075c4583045052df5e3192039d2cd4576 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 27 May 2021 17:43:53 +0530 Subject: [PATCH 21/53] fix: Debug Test --- .../accounts/doctype/purchase_invoice/test_purchase_invoice.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 07f9b42fbf..8bb9d7dacf 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1016,6 +1016,9 @@ class TestPurchaseInvoice(unittest.TestCase): where voucher_type='Purchase Invoice' and voucher_no=%s order by account asc""", (purchase_invoice.name), as_dict=1) + for gle in gl_entries: + print(gle.account, gle.debit, gle.credit) + for i, gle in enumerate(gl_entries): self.assertEqual(expected_gle[i][0], gle.account) self.assertEqual(expected_gle[i][1], gle.debit) From 2e83cb77ca0147b8ab6fd5b0b999cfb5e6f213ea Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 27 May 2021 20:09:45 +0530 Subject: [PATCH 22/53] fix: Split GL Entry --- .../accounts/doctype/purchase_invoice/test_purchase_invoice.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 8bb9d7dacf..1ec49d178f 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1008,7 +1008,8 @@ class TestPurchaseInvoice(unittest.TestCase): ['_Test Account Cost for Goods Sold - _TC', 30000, 0], ['_Test Account Excise Duty - _TC', 0, 3000], ['Creditors - _TC', 0, 27000], - ['TDS Payable - _TC', 3000, 3000], + ['TDS Payable - _TC', 0, 3000], + ['TDS Payable - _TC', 3000, 0] ] gl_entries = frappe.db.sql("""select account, debit, credit From a150645b5712f4d7b595a1966c4f0b8600b917f2 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 27 May 2021 20:10:50 +0530 Subject: [PATCH 23/53] fix: Remove GL Entry from print --- .../accounts/doctype/purchase_invoice/test_purchase_invoice.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 1ec49d178f..1c4350f8dc 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1017,9 +1017,6 @@ class TestPurchaseInvoice(unittest.TestCase): where voucher_type='Purchase Invoice' and voucher_no=%s order by account asc""", (purchase_invoice.name), as_dict=1) - for gle in gl_entries: - print(gle.account, gle.debit, gle.credit) - for i, gle in enumerate(gl_entries): self.assertEqual(expected_gle[i][0], gle.account) self.assertEqual(expected_gle[i][1], gle.debit) From 2f5885627db3f33d3e3f5138bf29ad57f6f46f09 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 1 Jun 2021 11:07:18 +0530 Subject: [PATCH 24/53] fix: Labeling and other fixes --- .../advance_taxes_and_charges.json | 80 ++++--------- .../doctype/payment_entry/payment_entry.js | 6 +- .../doctype/payment_entry/payment_entry.json | 5 +- .../purchase_taxes_and_charges.json | 105 +++++++----------- .../sales_taxes_and_charges.json | 38 ++++--- .../public/js/controllers/taxes_and_totals.js | 2 +- 6 files changed, 92 insertions(+), 144 deletions(-) diff --git a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json index aac7eb6bcb..c127601259 100644 --- a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json +++ b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json @@ -36,10 +36,8 @@ "label": "Type", "oldfieldname": "charge_type", "oldfieldtype": "Select", - "options": "\nActual\nOn Paid Amount\nIncluded In Paid Amount\nOn Previous Row Amount\nOn Previous Row Total", - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "options": "\nActual\nOn Paid Amount\nOn Previous Row Amount\nOn Previous Row Total", + "reqd": 1 }, { "depends_on": "eval:[\"On Previous Row Amount\", \"On Previous Row Total\"].indexOf(doc.charge_type)!==-1", @@ -47,9 +45,7 @@ "fieldtype": "Data", "label": "Reference Row #", "oldfieldname": "row_id", - "oldfieldtype": "Data", - "show_days": 1, - "show_seconds": 1 + "oldfieldtype": "Data" }, { "columns": 2, @@ -61,15 +57,11 @@ "oldfieldtype": "Link", "options": "Account", "reqd": 1, - "search_index": 1, - "show_days": 1, - "show_seconds": 1 + "search_index": 1 }, { "fieldname": "col_break_1", "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1, "width": "50%" }, { @@ -80,16 +72,12 @@ "oldfieldtype": "Small Text", "print_width": "300px", "reqd": 1, - "show_days": 1, - "show_seconds": 1, "width": "300px" }, { "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", - "label": "Accounting Dimensions", - "show_days": 1, - "show_seconds": 1 + "label": "Accounting Dimensions" }, { "default": ":Company", @@ -98,21 +86,15 @@ "label": "Cost Center", "oldfieldname": "cost_center_other_charges", "oldfieldtype": "Link", - "options": "Cost Center", - "show_days": 1, - "show_seconds": 1 + "options": "Cost Center" }, { "fieldname": "dimension_col_break", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "fieldname": "section_break_8", - "fieldtype": "Section Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Section Break" }, { "columns": 2, @@ -121,15 +103,11 @@ "in_list_view": 1, "label": "Rate", "oldfieldname": "rate", - "oldfieldtype": "Currency", - "show_days": 1, - "show_seconds": 1 + "oldfieldtype": "Currency" }, { "fieldname": "section_break_9", - "fieldtype": "Section Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Section Break" }, { "columns": 2, @@ -137,9 +115,7 @@ "fieldtype": "Currency", "in_list_view": 1, "label": "Amount", - "options": "currency", - "show_days": 1, - "show_seconds": 1 + "options": "currency" }, { "columns": 2, @@ -148,15 +124,11 @@ "in_list_view": 1, "label": "Total", "options": "currency", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "column_break_13", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "fieldname": "base_tax_amount", @@ -165,9 +137,7 @@ "oldfieldname": "tax_amount", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "base_total", @@ -176,48 +146,38 @@ "oldfieldname": "total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "add_deduct_tax", "fieldtype": "Select", "label": "Add Or Deduct", "options": "Add\nDeduct", - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "default": "0", "fieldname": "included_in_paid_amount", "fieldtype": "Check", - "label": "Included In Paid Amount", - "show_days": 1, - "show_seconds": 1 + "label": "Included In Paid Amount" }, { "fieldname": "allocated_amount", "fieldtype": "Currency", "label": "Allocated Amount", - "options": "currency", - "show_days": 1, - "show_seconds": 1 + "options": "currency" }, { "fieldname": "base_allocated_amount", "fieldtype": "Currency", "label": "Allocated Amount (Company Currency)", - "options": "Company:company:default_currency", - "show_days": 1, - "show_seconds": 1 + "options": "Company:company:default_currency" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2020-11-29 19:06:14.666460", + "modified": "2021-05-31 02:03:57.444647", "modified_by": "Administrator", "module": "Accounts", "name": "Advance Taxes and Charges", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index a4022ef40a..b1cf9e02e6 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -230,7 +230,7 @@ frappe.ui.form.on('Payment Entry', { var company_currency = frm.doc.company? frappe.get_doc(":Company", frm.doc.company).default_currency: ""; frm.set_currency_labels(["base_paid_amount", "base_received_amount", "base_total_allocated_amount", - "difference_amount", "base_paid_amount_after_tax"], company_currency); + "difference_amount", "base_paid_amount_after_tax", "base_received_amount_after_tax"], company_currency); frm.set_currency_labels(["paid_amount"], frm.doc.paid_from_account_currency); frm.set_currency_labels(["received_amount"], frm.doc.paid_to_account_currency); @@ -238,11 +238,13 @@ frappe.ui.form.on('Payment Entry', { var party_account_currency = frm.doc.payment_type=="Receive" ? frm.doc.paid_from_account_currency : frm.doc.paid_to_account_currency; - frm.set_currency_labels(["total_allocated_amount", "unallocated_amount"], party_account_currency); + frm.set_currency_labels(["total_allocated_amount", "unallocated_amount", + "total_taxes_and_charges"], party_account_currency); var currency_field = (frm.doc.payment_type=="Receive") ? "paid_from_account_currency" : "paid_to_account_currency" frm.set_df_property("total_allocated_amount", "options", currency_field); frm.set_df_property("unallocated_amount", "options", currency_field); + frm.set_df_property("total_taxes_and_charges", "options", currency_field); frm.set_df_property("party_balance", "options", currency_field); frm.set_currency_labels(["total_amount", "outstanding_amount", "allocated_amount"], diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 1e2bd8194a..0b4178a547 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -335,6 +335,7 @@ "reqd": 1 }, { + "depends_on": "doc.received_amount", "fieldname": "base_received_amount", "fieldtype": "Currency", "label": "Received Amount (Company Currency)", @@ -683,6 +684,7 @@ "fieldname": "advance_tax_account", "fieldtype": "Link", "label": "Advance Tax Account", + "mandatory_depends_on": "doc.base_total_taxes_and_charges", "options": "Account" }, { @@ -692,6 +694,7 @@ "options": "paid_to_account_currency" }, { + "depends_on": "doc.received_amount", "fieldname": "base_received_amount_after_tax", "fieldtype": "Currency", "label": "Received Amount After Tax (Company Currency)", @@ -701,7 +704,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2021-05-20 02:04:56.766124", + "modified": "2021-05-31 01:54:18.378910", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json index 0db0b6823d..f6703315fa 100644 --- a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json +++ b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json @@ -12,6 +12,7 @@ "charge_type", "row_id", "included_in_print_rate", + "included_in_paid_amount", "col_break1", "account_head", "description", @@ -21,6 +22,7 @@ "cost_center", "dimension_col_break", "section_break_9", + "currency", "tax_amount", "tax_amount_after_discount_amount", "total", @@ -39,9 +41,7 @@ "oldfieldname": "category", "oldfieldtype": "Select", "options": "Valuation and Total\nValuation\nTotal", - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "default": "Add", @@ -51,9 +51,7 @@ "oldfieldname": "add_deduct_tax", "oldfieldtype": "Select", "options": "Add\nDeduct", - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "columns": 2, @@ -65,9 +63,7 @@ "oldfieldname": "charge_type", "oldfieldtype": "Select", "options": "\nActual\nOn Net Total\nOn Previous Row Amount\nOn Previous Row Total\nOn Item Quantity", - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "depends_on": "eval:[\"On Previous Row Amount\", \"On Previous Row Total\"].indexOf(doc.charge_type)!==-1", @@ -75,9 +71,7 @@ "fieldtype": "Data", "label": "Reference Row #", "oldfieldname": "row_id", - "oldfieldtype": "Data", - "show_days": 1, - "show_seconds": 1 + "oldfieldtype": "Data" }, { "default": "0", @@ -85,15 +79,11 @@ "fieldname": "included_in_print_rate", "fieldtype": "Check", "label": "Is this Tax included in Basic Rate?", - "report_hide": 1, - "show_days": 1, - "show_seconds": 1 + "report_hide": 1 }, { "fieldname": "col_break1", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "columns": 2, @@ -104,9 +94,7 @@ "oldfieldname": "account_head", "oldfieldtype": "Link", "options": "Account", - "reqd": 1, - "show_days": 1, - "show_seconds": 1 + "reqd": 1 }, { "default": ":Company", @@ -115,9 +103,7 @@ "label": "Cost Center", "oldfieldname": "cost_center", "oldfieldtype": "Link", - "options": "Cost Center", - "show_days": 1, - "show_seconds": 1 + "options": "Cost Center" }, { "fieldname": "description", @@ -127,15 +113,11 @@ "oldfieldtype": "Small Text", "print_width": "300px", "reqd": 1, - "show_days": 1, - "show_seconds": 1, "width": "300px" }, { "fieldname": "section_break_10", - "fieldtype": "Section Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Section Break" }, { "columns": 2, @@ -144,15 +126,11 @@ "in_list_view": 1, "label": "Rate", "oldfieldname": "rate", - "oldfieldtype": "Currency", - "show_days": 1, - "show_seconds": 1 + "oldfieldtype": "Currency" }, { "fieldname": "section_break_9", - "fieldtype": "Section Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Section Break" }, { "columns": 2, @@ -162,9 +140,7 @@ "label": "Amount", "oldfieldname": "tax_amount", "oldfieldtype": "Currency", - "options": "currency", - "show_days": 1, - "show_seconds": 1 + "options": "currency" }, { "fieldname": "tax_amount_after_discount_amount", @@ -172,9 +148,7 @@ "label": "Tax Amount After Discount Amount", "options": "currency", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "columns": 2, @@ -185,15 +159,11 @@ "oldfieldname": "total", "oldfieldtype": "Currency", "options": "currency", - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "column_break_14", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "fieldname": "base_tax_amount", @@ -201,9 +171,7 @@ "label": "Amount (Company Currency)", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "base_total", @@ -211,9 +179,7 @@ "hidden": 1, "label": "Total (Company Currency)", "options": "Company:company:default_currency", - "print_hide": 1, - "show_days": 1, - "show_seconds": 1 + "print_hide": 1 }, { "fieldname": "base_tax_amount_after_discount_amount", @@ -221,9 +187,7 @@ "label": "Tax Amount After Discount Amount", "options": "Company:company:default_currency", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "item_wise_tax_detail", @@ -233,28 +197,37 @@ "oldfieldname": "item_wise_tax_detail", "oldfieldtype": "Small Text", "print_hide": 1, - "read_only": 1, - "show_days": 1, - "show_seconds": 1 + "read_only": 1 }, { "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", - "label": "Accounting Dimensions", - "show_days": 1, - "show_seconds": 1 + "label": "Accounting Dimensions" }, { "fieldname": "dimension_col_break", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" + }, + { + "fetch_from": "account_head.account_currency", + "fieldname": "currency", + "fieldtype": "Link", + "label": "Account Currency", + "options": "Currency", + "read_only": 1 + }, + { + "default": "0", + "description": "If checked, the tax amount will be considered as already included in the Paid Amount in Payment Entry", + "fieldname": "included_in_paid_amount", + "fieldtype": "Check", + "label": "Included In Paid Amount" } ], "idx": 1, "istable": 1, "links": [], - "modified": "2020-11-29 19:11:58.826078", + "modified": "2021-05-31 03:41:38.298937", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Taxes and Charges", diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json b/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json index 3c8cb6b851..36fd634b50 100644 --- a/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json +++ b/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json @@ -1,8 +1,10 @@ { + "actions": [], "creation": "2013-04-24 11:39:32", "doctype": "DocType", "document_type": "Setup", "editable_grid": 1, + "engine": "InnoDB", "field_order": [ "charge_type", "row_id", @@ -10,12 +12,14 @@ "col_break_1", "description", "included_in_print_rate", + "included_in_paid_amount", "accounting_dimensions_section", "cost_center", "dimension_col_break", "section_break_8", "rate", "section_break_9", + "currency", "tax_amount", "total", "tax_amount_after_discount_amount", @@ -23,8 +27,7 @@ "base_tax_amount", "base_total", "base_tax_amount_after_discount_amount", - "item_wise_tax_detail", - "parenttype" + "item_wise_tax_detail" ], "fields": [ { @@ -173,17 +176,6 @@ "oldfieldtype": "Small Text", "read_only": 1 }, - { - "fieldname": "parenttype", - "fieldtype": "Data", - "hidden": 1, - "in_filter": 1, - "label": "Parenttype", - "oldfieldname": "parenttype", - "oldfieldtype": "Data", - "print_hide": 1, - "search_index": 1 - }, { "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", @@ -192,15 +184,33 @@ { "fieldname": "dimension_col_break", "fieldtype": "Column Break" + }, + { + "fetch_from": "account_head.account_currency", + "fieldname": "currency", + "fieldtype": "Link", + "label": "Account Currency", + "options": "Currency", + "read_only": 1 + }, + { + "default": "0", + "description": "If checked, the tax amount will be considered as already included in the Paid Amount in Payment Entry", + "fieldname": "included_in_paid_amount", + "fieldtype": "Check", + "label": "Included In Paid Amount" } ], "idx": 1, + "index_web_pages_for_search": 1, "istable": 1, - "modified": "2019-05-25 22:59:38.740883", + "links": [], + "modified": "2021-05-31 05:40:32.856780", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Taxes and Charges", "owner": "Administrator", "permissions": [], + "sort_field": "modified", "sort_order": "ASC" } \ No newline at end of file diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 2e133bed2e..3097f72201 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -464,7 +464,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ }, calculate_totals: function() { - // Changing sequence can cause rounding_adjustmentng issue and on-screen discrepency + // Changing sequence can because of rounding adjustment issue and on-screen discrepancy var me = this; var tax_count = this.frm.doc["taxes"] ? this.frm.doc["taxes"].length : 0; this.frm.doc.grand_total = flt(tax_count From 8a7e283926d51626d9114eaa4f6647b920ad8c9f Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Fri, 4 Jun 2021 22:53:26 +0530 Subject: [PATCH 25/53] feat: Item Taxes based on net rate --- erpnext/controllers/taxes_and_totals.py | 4 +- .../public/js/controllers/taxes_and_totals.js | 90 ++++++++++++++++--- erpnext/public/js/controllers/transaction.js | 66 +------------- erpnext/stock/doctype/item/item.py | 6 ++ erpnext/stock/doctype/item_tax/item_tax.json | 20 ++++- erpnext/stock/get_item_details.py | 34 +++++-- 6 files changed, 137 insertions(+), 83 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 9fae49482d..8040435634 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -54,6 +54,7 @@ class calculate_taxes_and_totals(object): if item.item_code and item.get('item_tax_template'): item_doc = frappe.get_cached_doc("Item", item.item_code) args = { + 'net_rate': item.net_rate or item.rate, 'tax_category': self.doc.get('tax_category'), 'posting_date': self.doc.get('posting_date'), 'bill_date': self.doc.get('bill_date'), @@ -78,7 +79,8 @@ class calculate_taxes_and_totals(object): taxes = _get_item_tax_template(args, item_taxes + item_group_taxes, for_validate=True) if item.item_tax_template not in taxes: - frappe.throw(_("Row {0}: Invalid Item Tax Template for item {1}").format( + item.item_tax_template = taxes[0] + frappe.msgprint(_("Row {0}: Item Tax template updated as per validity and rate applied").format( item.idx, frappe.bold(item.item_code) )) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 2e133bed2e..ff4898eeff 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -12,7 +12,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ if (in_list(["Sales Order", "Quotation"], item.parenttype) && item.blanket_order_rate) { effective_item_rate = item.blanket_order_rate; } - if(item.margin_type == "Percentage"){ + if(item.margin_type == "Percentage") { item.rate_with_margin = flt(effective_item_rate) + flt(effective_item_rate) * ( flt(item.margin_rate_or_amount) / 100); } else { @@ -73,15 +73,18 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ }, _calculate_taxes_and_totals: function() { - this.validate_conversion_rate(); - this.calculate_item_values(); - this.initialize_taxes(); - this.determine_exclusive_rate(); - this.calculate_net_total(); - this.calculate_taxes(); - this.manipulate_grand_total_for_inclusive_tax(); - this.calculate_totals(); - this._cleanup(); + frappe.run_serially([ + () => this.validate_conversion_rate(), + () => this.calculate_item_values(), + () => this.update_item_tax_map(), + () => this.initialize_taxes(), + () => this.determine_exclusive_rate(), + () => this.calculate_net_total(), + () => this.calculate_taxes(), + () => this.manipulate_grand_total_for_inclusive_tax(), + () => this.calculate_totals(), + () => this._cleanup() + ]); }, validate_conversion_rate: function() { @@ -263,6 +266,68 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ frappe.model.round_floats_in(this.frm.doc, ["total", "base_total", "net_total", "base_net_total"]); }, + update_item_tax_map: function() { + let me = this; + let item_codes = []; + let item_rates = {}; + $.each(this.frm.doc.items || [], function(i, item) { + if(item.item_code) { + // Use combination of name and item code in case same item is added multiple times + item_codes.push([item.item_code, item.name]); + item_rates[item.name] = item.net_rate; + } + }); + + if(item_codes.length) { + return this.frm.call({ + method: "erpnext.stock.get_item_details.get_item_tax_info", + args: { + company: me.frm.doc.company, + tax_category: cstr(me.frm.doc.tax_category), + item_codes: item_codes, + item_rates: item_rates + }, + callback: function(r) { + if(!r.exc) { + $.each(me.frm.doc.items || [], function(i, item) { + if(item.name && r.message.hasOwnProperty(item.name)) { + item.item_tax_template = r.message[item.name].item_tax_template; + item.item_tax_rate = r.message[item.name].item_tax_rate; + me.add_taxes_from_item_tax_template(item.item_tax_rate); + } + else { + item.item_tax_template = ""; + item.item_tax_rate = "{}"; + } + }); + } + + this.frm.refresh_fields(); + } + }); + } + }, + + add_taxes_from_item_tax_template: function(item_tax_map) { + let me = this; + + if(item_tax_map && cint(frappe.defaults.get_default("add_taxes_from_item_tax_template"))) { + if(typeof (item_tax_map) == "string") { + item_tax_map = JSON.parse(item_tax_map); + } + + $.each(item_tax_map, function(tax, rate) { + let found = (me.frm.doc.taxes || []).find(d => d.account_head === tax); + if(!found) { + let child = frappe.model.add_child(me.frm.doc, "taxes"); + child.charge_type = "On Net Total"; + child.account_head = tax; + child.rate = 0; + } + }); + } + }, + calculate_taxes: function() { var me = this; this.frm.doc.rounding_adjustment = 0; @@ -406,6 +471,11 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ let tax_detail = tax.item_wise_tax_detail; let key = item.item_code || item.item_name; + if(typeof (tax_detail) == "string") { + tax.item_wise_tax_detail = JSON.parse(tax.item_wise_tax_detail); + tax_detail = tax.item_wise_tax_detail; + } + let item_wise_tax_amount = current_tax_amount * this.frm.doc.conversion_rate; if (tax_detail && tax_detail[key]) item_wise_tax_amount += tax_detail[key][1]; diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index ad1976d2d2..ee6696b7d1 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -6,6 +6,7 @@ frappe.provide('erpnext.accounts.dimensions'); erpnext.TransactionController = erpnext.taxes_and_totals.extend({ setup: function() { this._super(); + let me = this; frappe.flags.hide_serial_batch_dialog = true; frappe.ui.form.on(this.frm.doctype + " Item", "rate", function(frm, cdt, cdn) { var item = frappe.get_doc(cdt, cdn); @@ -43,8 +44,6 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ cur_frm.cscript.calculate_stock_uom_rate(frm, cdt, cdn); }); - - frappe.ui.form.on(this.frm.cscript.tax_table, "rate", function(frm, cdt, cdn) { cur_frm.cscript.calculate_taxes_and_totals(); }); @@ -121,7 +120,6 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ } }); - var me = this; if(this.frm.fields_dict["items"].grid.get_field('batch_no')) { this.frm.set_query("batch_no", "items", function(doc, cdt, cdn) { return me.set_query_for_batch(doc, cdt, cdn); @@ -556,6 +554,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ name: me.frm.doc.name, project: item.project || me.frm.doc.project, qty: item.qty || 1, + net_rate: item.rate, stock_qty: item.stock_qty, conversion_factor: item.conversion_factor, weight_per_unit: item.weight_per_unit, @@ -712,26 +711,6 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ }); }, - add_taxes_from_item_tax_template: function(item_tax_map) { - let me = this; - - if(item_tax_map && cint(frappe.defaults.get_default("add_taxes_from_item_tax_template"))) { - if(typeof (item_tax_map) == "string") { - item_tax_map = JSON.parse(item_tax_map); - } - - $.each(item_tax_map, function(tax, rate) { - let found = (me.frm.doc.taxes || []).find(d => d.account_head === tax); - if(!found) { - let child = frappe.model.add_child(me.frm.doc, "taxes"); - child.charge_type = "On Net Total"; - child.account_head = tax; - child.rate = 0; - } - }); - } - }, - serial_no: function(doc, cdt, cdn) { var me = this; var item = frappe.get_doc(cdt, cdn); @@ -835,9 +814,9 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ frappe.run_serially([ () => me.frm.script_manager.trigger("currency"), - () => me.update_item_tax_map(), () => me.apply_default_taxes(), - () => me.apply_pricing_rule() + () => me.apply_pricing_rule(), + () => me.calculate_taxes_and_totals() ]); } } @@ -1816,7 +1795,6 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ callback: function(r) { if(!r.exc) { item.item_tax_rate = r.message; - me.add_taxes_from_item_tax_template(item.item_tax_rate); me.calculate_taxes_and_totals(); } } @@ -1827,43 +1805,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ } }, - update_item_tax_map: function() { - var me = this; - var item_codes = []; - $.each(this.frm.doc.items || [], function(i, item) { - if(item.item_code) { - item_codes.push(item.item_code); - } - }); - if(item_codes.length) { - return this.frm.call({ - method: "erpnext.stock.get_item_details.get_item_tax_info", - args: { - company: me.frm.doc.company, - tax_category: cstr(me.frm.doc.tax_category), - item_codes: item_codes - }, - callback: function(r) { - if(!r.exc) { - $.each(me.frm.doc.items || [], function(i, item) { - if(item.item_code && r.message.hasOwnProperty(item.item_code)) { - if (!item.item_tax_template) { - item.item_tax_template = r.message[item.item_code].item_tax_template; - item.item_tax_rate = r.message[item.item_code].item_tax_rate; - } - me.add_taxes_from_item_tax_template(item.item_tax_rate); - } else { - item.item_tax_template = ""; - item.item_tax_rate = "{}"; - } - }); - me.calculate_taxes_and_totals(); - } - } - }); - } - }, is_recurring: function() { // set default values for recurring documents diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index dbac79465e..60f468e82e 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -128,6 +128,7 @@ class Item(WebsiteGenerator): self.validate_auto_reorder_enabled_in_stock_settings() self.cant_change() self.update_show_in_website() + self.validate_item_tax_net_rate_range() if not self.get("__islocal"): self.old_item_group = frappe.db.get_value(self.doctype, self.name, "item_group") @@ -490,6 +491,11 @@ class Item(WebsiteGenerator): if self.disabled: self.show_in_website = False + def validate_item_tax_net_rate_range(self): + for tax in self.get('taxes'): + if tax.maximum_net_rate < tax.minimum_net_rate: + frappe.throw(_("Row #{0}: Maximum Net Rate cannot be greater than Minimum Net Rate")) + def update_template_tables(self): template = frappe.get_doc("Item", self.variant_of) diff --git a/erpnext/stock/doctype/item_tax/item_tax.json b/erpnext/stock/doctype/item_tax/item_tax.json index ae36efc7e3..fb100967f3 100644 --- a/erpnext/stock/doctype/item_tax/item_tax.json +++ b/erpnext/stock/doctype/item_tax/item_tax.json @@ -1,4 +1,5 @@ { + "actions": [], "creation": "2013-02-22 01:28:01", "doctype": "DocType", "editable_grid": 1, @@ -6,7 +7,9 @@ "field_order": [ "item_tax_template", "tax_category", - "valid_from" + "valid_from", + "minimum_net_rate", + "maximum_net_rate" ], "fields": [ { @@ -33,11 +36,24 @@ "fieldtype": "Date", "in_list_view": 1, "label": "Valid From" + }, + { + "fieldname": "maximum_net_rate", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Maximum Net Rate" + }, + { + "fieldname": "minimum_net_rate", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Minimum Net Rate" } ], "idx": 1, "istable": 1, - "modified": "2020-06-25 01:40:28.859752", + "links": [], + "modified": "2021-06-03 13:20:06.982303", "modified_by": "Administrator", "module": "Stock", "name": "Item Tax", diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index d1dcdc21c8..6f510539a4 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -436,18 +436,22 @@ def get_barcode_data(items_list): return itemwise_barcode @frappe.whitelist() -def get_item_tax_info(company, tax_category, item_codes): +def get_item_tax_info(company, tax_category, item_codes, item_rates=None): out = {} if isinstance(item_codes, string_types): item_codes = json.loads(item_codes) + if isinstance(item_rates, string_types): + item_rates = json.loads(item_rates) + for item_code in item_codes: - if not item_code or item_code in out: + if not item_code or item_code[1] in out: continue - out[item_code] = {} - item = frappe.get_cached_doc("Item", item_code) - get_item_tax_template({"company": company, "tax_category": tax_category}, item, out[item_code]) - out[item_code]["item_tax_rate"] = get_item_tax_map(company, out[item_code].get("item_tax_template"), as_json=True) + out[item_code[1]] = {} + item = frappe.get_cached_doc("Item", item_code[0]) + args = {"company": company, "tax_category": tax_category, "net_rate": item_rates[item_code[1]]} + get_item_tax_template(args, item, out[item_code[1]]) + out[item_code[1]]["item_tax_rate"] = get_item_tax_map(company, out[item_code[1]].get("item_tax_template"), as_json=True) return out @@ -478,12 +482,13 @@ def _get_item_tax_template(args, taxes, out=None, for_validate=False): for tax in taxes: tax_company = frappe.get_value("Item Tax Template", tax.item_tax_template, 'company') - if tax.valid_from and tax_company == args['company']: + if (tax.valid_from or tax.maximum_net_rate) and tax_company == args['company']: # In purchase Invoice first preference will be given to supplier invoice date # if supplier date is not present then posting date validation_date = args.get('transaction_date') or args.get('bill_date') or args.get('posting_date') - if getdate(tax.valid_from) <= getdate(validation_date): + if getdate(tax.valid_from) <= getdate(validation_date) \ + and is_within_valid_range(args, tax): taxes_with_validity.append(tax) else: if tax_company == args['company']: @@ -502,12 +507,25 @@ def _get_item_tax_template(args, taxes, out=None, for_validate=False): if not taxes_with_validity and (not taxes_with_no_validity): return None + # do not change if already a valid template + if args.get('item_tax_template') in taxes: + return arg.get('item_tax_template') + for tax in taxes: if cstr(tax.tax_category) == cstr(args.get("tax_category")): out["item_tax_template"] = tax.item_tax_template return tax.item_tax_template return None +def is_within_valid_range(args, tax): + if not flt(tax.maximum_net_rate): + # No range specified, just ignore + return True + elif flt(tax.minimum_net_rate) <= flt(args.get('net_rate')) <= flt(tax.maximum_net_rate): + return True + + return False + @frappe.whitelist() def get_item_tax_map(company, item_tax_template, as_json=True): item_tax_map = {} From e8a78bd43d027ea36ff2902ecf48835b76109038 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sat, 5 Jun 2021 13:16:39 +0530 Subject: [PATCH 26/53] fix: Add test cases --- .../sales_invoice/test_sales_invoice.py | 69 +++++++++++++------ erpnext/stock/doctype/item/item.py | 2 +- 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index df6d483904..1b1bb3b18f 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1963,6 +1963,54 @@ class TestSalesInvoice(unittest.TestCase): self.assertEqual(value_details['TotInvVal'], si.base_grand_total) self.assertTrue(einvoice['EwbDtls']) + def test_item_tax_validity(self): + item = frappe.get_doc("Item", "_Test Item 2") + + if item.taxes: + item.taxes = [] + item.save() + + item.append("taxes", { + "item_tax_template": "_Test Item Tax Template 1 - _TC", + "valid_from": add_days(nowdate(), 1) + }) + + item.save() + + sales_invoice = create_sales_invoice(item = "_Test Item 2", do_not_save=1) + sales_invoice.items[0].item_tax_template = "_Test Item Tax Template 1 - _TC" + self.assertRaises(frappe.ValidationError, sales_invoice.save) + + item.taxes = [] + item.save() + + def test_item_tax_net_range(self): + item = create_item("T Shirt") + + item.set('taxes', []) + item.append("taxes", { + "item_tax_template": "_Test Account Excise Duty @ 10 - _TC", + "minimum_net_rate": 0, + "maximum_net_rate": 500 + }) + + item.append("taxes", { + "item_tax_template": "_Test Account Excise Duty @ 12 - _TC", + "minimum_net_rate": 501, + "maximum_net_rate": 1000 + }) + + item.save() + + sales_invoice = create_sales_invoice(item = "T Shirt", rate=700, do_not_submit=True) + self.assertEqual(sales_invoice.items[0].item_tax_template, "_Test Account Excise Duty @ 12 - _TC") + + # Apply discount + sales_invoice.apply_discount_on = 'Net Total' + sales_invoice.discount_amount = 300 + sales_invoice.save() + self.assertEqual(sales_invoice.items[0].item_tax_template, "_Test Account Excise Duty @ 10 - _TC") + def make_test_address_for_ewaybill(): if not frappe.db.exists('Address', '_Test Address for Eway bill-Billing'): address = frappe.get_doc({ @@ -2085,27 +2133,6 @@ def check_gl_entries(doc, voucher_no, expected_gle, posting_date): doc.assertEqual(expected_gle[i][2], gle.credit) doc.assertEqual(getdate(expected_gle[i][3]), gle.posting_date) - def test_item_tax_validity(self): - item = frappe.get_doc("Item", "_Test Item 2") - - if item.taxes: - item.taxes = [] - item.save() - - item.append("taxes", { - "item_tax_template": "_Test Item Tax Template 1 - _TC", - "valid_from": add_days(nowdate(), 1) - }) - - item.save() - - sales_invoice = create_sales_invoice(item = "_Test Item 2", do_not_save=1) - sales_invoice.items[0].item_tax_template = "_Test Item Tax Template 1 - _TC" - self.assertRaises(frappe.ValidationError, sales_invoice.save) - - item.taxes = [] - item.save() - def create_sales_invoice(**args): si = frappe.new_doc("Sales Invoice") args = frappe._dict(args) diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 60f468e82e..0420ea7c54 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -493,7 +493,7 @@ class Item(WebsiteGenerator): def validate_item_tax_net_rate_range(self): for tax in self.get('taxes'): - if tax.maximum_net_rate < tax.minimum_net_rate: + if flt(tax.maximum_net_rate) < flt(tax.minimum_net_rate): frappe.throw(_("Row #{0}: Maximum Net Rate cannot be greater than Minimum Net Rate")) def update_template_tables(self): From 3646c301edc1380efcd0eedcd590e8124dfe90d8 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sat, 5 Jun 2021 13:21:03 +0530 Subject: [PATCH 27/53] fix: Linting issues --- .../public/js/controllers/taxes_and_totals.js | 25 +++++++++---------- erpnext/stock/get_item_details.py | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index ff4898eeff..0b9d771119 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -12,7 +12,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ if (in_list(["Sales Order", "Quotation"], item.parenttype) && item.blanket_order_rate) { effective_item_rate = item.blanket_order_rate; } - if(item.margin_type == "Percentage") { + if (item.margin_type == "Percentage") { item.rate_with_margin = flt(effective_item_rate) + flt(effective_item_rate) * ( flt(item.margin_rate_or_amount) / 100); } else { @@ -22,7 +22,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ item_rate = flt(item.rate_with_margin , precision("rate", item)); - if(item.discount_percentage){ + if (item.discount_percentage) { item.discount_amount = flt(item.rate_with_margin) * flt(item.discount_percentage) / 100; } @@ -271,14 +271,14 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ let item_codes = []; let item_rates = {}; $.each(this.frm.doc.items || [], function(i, item) { - if(item.item_code) { + if (item.item_code) { // Use combination of name and item code in case same item is added multiple times item_codes.push([item.item_code, item.name]); item_rates[item.name] = item.net_rate; } }); - if(item_codes.length) { + if (item_codes.length) { return this.frm.call({ method: "erpnext.stock.get_item_details.get_item_tax_info", args: { @@ -288,21 +288,18 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ item_rates: item_rates }, callback: function(r) { - if(!r.exc) { + if (!r.exc) { $.each(me.frm.doc.items || [], function(i, item) { - if(item.name && r.message.hasOwnProperty(item.name)) { + if (item.name && r.message.hasOwnProperty(item.name)) { item.item_tax_template = r.message[item.name].item_tax_template; item.item_tax_rate = r.message[item.name].item_tax_rate; me.add_taxes_from_item_tax_template(item.item_tax_rate); - } - else { + } else { item.item_tax_template = ""; item.item_tax_rate = "{}"; } }); } - - this.frm.refresh_fields(); } }); } @@ -311,14 +308,14 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ add_taxes_from_item_tax_template: function(item_tax_map) { let me = this; - if(item_tax_map && cint(frappe.defaults.get_default("add_taxes_from_item_tax_template"))) { - if(typeof (item_tax_map) == "string") { + if (item_tax_map && cint(frappe.defaults.get_default("add_taxes_from_item_tax_template"))) { + if (typeof (item_tax_map) == "string") { item_tax_map = JSON.parse(item_tax_map); } $.each(item_tax_map, function(tax, rate) { let found = (me.frm.doc.taxes || []).find(d => d.account_head === tax); - if(!found) { + if (!found) { let child = frappe.model.add_child(me.frm.doc, "taxes"); child.charge_type = "On Net Total"; child.account_head = tax; @@ -632,6 +629,8 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ tax.item_wise_tax_detail = JSON.stringify(tax.item_wise_tax_detail); }); } + + this.frm.refresh_fields(); }, set_discount_amount: function() { diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 6f510539a4..746cbbf601 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -509,7 +509,7 @@ def _get_item_tax_template(args, taxes, out=None, for_validate=False): # do not change if already a valid template if args.get('item_tax_template') in taxes: - return arg.get('item_tax_template') + return args.get('item_tax_template') for tax in taxes: if cstr(tax.tax_category) == cstr(args.get("tax_category")): From 18be767f75b9c858fa66294d037f1a9b9d2c6ace Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 6 Jun 2021 13:25:34 +0530 Subject: [PATCH 28/53] fix: Remove invalid test --- .../sales_invoice/test_sales_invoice.py | 21 ------------------- erpnext/controllers/taxes_and_totals.py | 11 +++++----- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 1b1bb3b18f..0d61f67e52 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1963,27 +1963,6 @@ class TestSalesInvoice(unittest.TestCase): self.assertEqual(value_details['TotInvVal'], si.base_grand_total) self.assertTrue(einvoice['EwbDtls']) - def test_item_tax_validity(self): - item = frappe.get_doc("Item", "_Test Item 2") - - if item.taxes: - item.taxes = [] - item.save() - - item.append("taxes", { - "item_tax_template": "_Test Item Tax Template 1 - _TC", - "valid_from": add_days(nowdate(), 1) - }) - - item.save() - - sales_invoice = create_sales_invoice(item = "_Test Item 2", do_not_save=1) - sales_invoice.items[0].item_tax_template = "_Test Item Tax Template 1 - _TC" - self.assertRaises(frappe.ValidationError, sales_invoice.save) - - item.taxes = [] - item.save() - def test_item_tax_net_range(self): item = create_item("T Shirt") diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 8040435634..fb22a1d608 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -78,11 +78,12 @@ class calculate_taxes_and_totals(object): taxes = _get_item_tax_template(args, item_taxes + item_group_taxes, for_validate=True) - if item.item_tax_template not in taxes: - item.item_tax_template = taxes[0] - frappe.msgprint(_("Row {0}: Item Tax template updated as per validity and rate applied").format( - item.idx, frappe.bold(item.item_code) - )) + if taxes: + if item.item_tax_template not in taxes: + item.item_tax_template = taxes[0] + frappe.msgprint(_("Row {0}: Item Tax template updated as per validity and rate applied").format( + item.idx, frappe.bold(item.item_code) + )) def validate_conversion_rate(self): # validate conversion rate From e4fcc5562f3e4a26177eacc9d455596da1135aa8 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 8 Jun 2021 16:35:47 +0530 Subject: [PATCH 29/53] refactor: Advance taxes and charges calculation --- .../advance_taxes_and_charges.json | 11 +- .../doctype/payment_entry/payment_entry.js | 162 +++++++++++++---- .../doctype/payment_entry/payment_entry.py | 163 +++++++++++++----- 3 files changed, 255 insertions(+), 81 deletions(-) diff --git a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json index c127601259..3e4e679c91 100644 --- a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json +++ b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json @@ -19,6 +19,7 @@ "section_break_8", "rate", "section_break_9", + "currency", "tax_amount", "total", "allocated_amount", @@ -172,12 +173,20 @@ "fieldtype": "Currency", "label": "Allocated Amount (Company Currency)", "options": "Company:company:default_currency" + }, + { + "fetch_from": "account_head.account_currency", + "fieldname": "currency", + "fieldtype": "Link", + "label": "Account Currency", + "options": "Currency", + "read_only": 1 } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-05-31 02:03:57.444647", + "modified": "2021-06-08 07:04:44.287002", "modified_by": "Administrator", "module": "Accounts", "name": "Advance Taxes and Charges", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index b1cf9e02e6..6a3b717b12 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -1071,7 +1071,7 @@ frappe.ui.form.on('Payment Entry', { } me.frm.add_child("taxes", tax); } - frm.trigger('calculate_taxes'); + frm.events.apply_taxes(frm); frm.events.set_unallocated_amount(frm); } } @@ -1079,52 +1079,112 @@ frappe.ui.form.on('Payment Entry', { }); }, + apply_taxes: function(frm) { + frm.events.initialize_taxes(frm); + frm.events.determine_exclusive_rate(frm); + frm.events.calculate_taxes(frm); + }, + + initialize_taxes: function(frm) { + $.each(frm.doc["taxes"] || [], function(i, tax) { + tax.item_wise_tax_detail = {}; + let tax_fields = ["total", "tax_fraction_for_current_item", + "grand_total_fraction_for_current_item"]; + + if (cstr(tax.charge_type) != "Actual") { + tax_fields.push("tax_amount"); + } + + $.each(tax_fields, function(i, fieldname) { tax[fieldname] = 0.0; }); + + frm.doc.paid_amount_after_tax = frm.doc.paid_amount; + }); + }, + + determine_exclusive_rate: function(frm) { + let has_inclusive_tax = false; + $.each(frm.doc["taxes"] || [], function(i, row) { + if(cint(row.included_in_paid_amount)) has_inclusive_tax = true; + }); + if(has_inclusive_tax==false) return; + + let cumulated_tax_fraction = 0.0; + $.each(frm.doc["taxes"] || [], function(i, tax) { + let current_tax_fraction = frm.events.get_current_tax_fraction(frm, tax); + tax.tax_fraction_for_current_item = current_tax_fraction[0]; + + if(i==0) { + tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item; + } else { + tax.grand_total_fraction_for_current_item = + me.frm.doc["taxes"][i-1].grand_total_fraction_for_current_item + + tax.tax_fraction_for_current_item; + } + + cumulated_tax_fraction += tax.tax_fraction_for_current_item; + frm.doc.paid_amount_after_tax = flt(frm.doc.paid_amount/(1+cumulated_tax_fraction)) + }); + }, + + get_current_tax_fraction: function(frm, tax) { + let current_tax_fraction = 0.0; + + if(cint(tax.included_in_paid_amount)) { + let tax_rate = tax.rate; + + if (tax.charge_type == "Actual") { + current_tax_fraction = tax.tax_amount/frm.doc.paid_amount_after_tax; + } else if(tax.charge_type == "On Paid Amount") { + current_tax_fraction = (tax_rate / 100.0); + } else if(tax.charge_type == "On Previous Row Amount") { + current_tax_fraction = (tax_rate / 100.0) * + frm.doc["taxes"][cint(tax.row_id) - 1].tax_fraction_for_current_item; + } else if(tax.charge_type == "On Previous Row Total") { + current_tax_fraction = (tax_rate / 100.0) * + frm.doc["taxes"][cint(tax.row_id) - 1].grand_total_fraction_for_current_item; + } + } + + if(tax.add_deduct_tax && tax.add_deduct_tax == "Deduct") { + current_tax_fraction *= -1; + inclusive_tax_amount_per_qty *= -1; + } + return current_tax_fraction; + }, + + calculate_taxes: function(frm) { frm.doc.total_taxes_and_charges = 0.0; frm.doc.base_total_taxes_and_charges = 0.0; - $.each(me.frm.doc["taxes"] || [], function(i, tax) { - let tax_rate = tax.rate; - let current_tax_amount = 0.0; + let actual_tax_dict = {}; - // To set row_id by default as previous row. - if(["On Previous Row Amount", "On Previous Row Total"].includes(tax.charge_type)) { - if (tax.idx === 1) { - frappe.throw(__("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")); - } - if (!tax.row_id) { - tax.row_id = tax.idx - 1; - } + // maintain actual tax rate based on idx + $.each(frm.doc["taxes"] || [], function(i, tax) { + if (tax.charge_type == "Actual") { + actual_tax_dict[tax.idx] = flt(tax.tax_amount, precision("tax_amount", tax)); } + }); - if(tax.charge_type == "Actual") { - current_tax_amount = flt(tax.tax_amount, precision("tax_amount", tax)); - } else if(tax.charge_type == "On Paid Amount") { - current_tax_amount = (tax_rate / 100.0) * frm.doc.paid_amount; - } else if(tax.charge_type == "On Previous Row Amount") { - current_tax_amount = (tax_rate / 100.0) * - frm.doc["taxes"][cint(tax.row_id) - 1].tax_amount; + $.each(me.frm.doc["taxes"] || [], function(i, tax) { + let current_tax_amount = frm.events.get_current_tax_amount(frm, tax); - } else if(tax.charge_type == "On Previous Row Total") { - current_tax_amount = (tax_rate / 100.0) * - frm.doc["taxes"][cint(tax.row_id) - 1].total; + // Adjust divisional loss to the last item + if (tax.charge_type == "Actual") { + actual_tax_dict[tax.idx] -= current_tax_amount; + if (i == frm.doc["taxes"].length - 1) { + current_tax_amount += actual_tax_dict[tax.idx]; + } } tax.tax_amount = current_tax_amount; tax.base_tax_amount = tax.tax_amount * frm.doc.source_exchange_rate; - current_tax_amount *= (tax.add_deduct_tax == "Deduct") ? -1.0 : 1.0; - let applicable_tax_amount = 0 - - if (!tax.included_in_paid_amount) { - applicable_tax_amount = current_tax_amount - } - if(i==0) { - tax.total = flt(frm.doc.paid_amount + applicable_tax_amount, precision("total", tax)); + tax.total = flt(frm.doc.paid_amount_after_tax + current_tax_amount, precision("total", tax)); } else { - tax.total = flt(frm.doc["taxes"][i-1].total + applicable_tax_amount, precision("total", tax)); + tax.total = flt(frm.doc["taxes"][i-1].total + current_tax_amount, precision("total", tax)); } tax.base_total = tax.total * frm.doc.source_exchange_rate; @@ -1136,6 +1196,36 @@ frappe.ui.form.on('Payment Entry', { frm.refresh_field('base_total_taxes_and_charges'); }); }, + + get_current_tax_amount: function(frm, tax) { + let tax_rate = tax.rate; + let current_tax_amount = 0.0; + + // To set row_id by default as previous row. + if(["On Previous Row Amount", "On Previous Row Total"].includes(tax.charge_type)) { + if (tax.idx === 1) { + frappe.throw( + __("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")); + } + if (!tax.row_id) { + tax.row_id = tax.idx - 1; + } + } + if(tax.charge_type == "Actual") { + current_tax_amount = flt(tax.tax_amount, precision("tax_amount", tax)) + } else if(tax.charge_type == "On Paid Amount") { + current_tax_amount = flt((tax_rate / 100.0) * frm.doc.paid_amount_after_tax); + } else if(tax.charge_type == "On Previous Row Amount") { + current_tax_amount = flt((tax_rate / 100.0) * + frm.doc["taxes"][cint(tax.row_id) - 1].tax_amount); + + } else if(tax.charge_type == "On Previous Row Total") { + current_tax_amount = flt((tax_rate / 100.0) * + frm.doc["taxes"][cint(tax.row_id) - 1].total); + } + + return current_tax_amount; + }, }); @@ -1184,27 +1274,27 @@ frappe.ui.form.on('Payment Entry Reference', { frappe.ui.form.on('Advance Taxes and Charges', { rate: function(frm) { - frm.events.calculate_taxes(frm); + frm.events.apply_taxes(frm); frm.events.set_unallocated_amount(frm); }, tax_amount : function(frm) { - frm.events.calculate_taxes(frm); + frm.events.apply_taxes(frm); frm.events.set_unallocated_amount(frm); }, row_id: function(frm) { - frm.events.calculate_taxes(frm); + frm.events.apply_taxes(frm); frm.events.set_unallocated_amount(frm); }, taxes_remove: function(frm) { - frm.events.calculate_taxes(frm); + frm.events.apply_taxes(frm); frm.events.set_unallocated_amount(frm); }, included_in_paid_amount: function(frm) { - frm.events.calculate_taxes(frm); + frm.events.apply_taxes(frm); frm.events.set_unallocated_amount(frm); } }) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index d960156670..83d52fa5f6 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -54,7 +54,7 @@ class PaymentEntry(AccountsController): self.validate_mandatory() self.validate_reference_documents() self.set_tax_withholding() - self.calculate_taxes() + self.apply_taxes() self.set_amounts() self.clear_unallocated_reference_document_rows() self.validate_payment_against_negative_invoice() @@ -65,7 +65,6 @@ class PaymentEntry(AccountsController): self.validate_allocated_amount() self.validate_paid_invoices() self.ensure_supplier_is_not_blocked() - self.set_advance_tax_account() self.set_status() def on_submit(self): @@ -311,14 +310,6 @@ class PaymentEntry(AccountsController): + "

" + _("If this is undesirable please cancel the corresponding Payment Entry."), title=_("Warning"), indicator="orange") - def set_advance_tax_account(self): - if self.get('taxes') and not self.advance_tax_account: - unrealized_profit_loss_account = frappe.db.get_value('Company', self.company, 'unrealized_profit_loss_account') - if not unrealized_profit_loss_account: - frappe.throw(_("Please select advance tax account or add Unrealized Profit / Loss Account in company master")) - - self.advance_tax_account = unrealized_profit_loss_account - def validate_journal_entry(self): for d in self.get("references"): if d.allocated_amount and d.reference_doctype == "Journal Entry": @@ -461,6 +452,11 @@ class PaymentEntry(AccountsController): for d in to_remove: self.remove(d) + def apply_taxes(self): + self.initialize_taxes() + self.determine_exclusive_rate() + self.calculate_taxes() + def set_amounts(self): self.set_received_amount() self.set_amounts_in_company_currency() @@ -715,12 +711,12 @@ class PaymentEntry(AccountsController): if account_currency != self.company_currency: frappe.throw(_("Currency for {0} must be {1}").format(d.account_head, self.company_currency)) - if self.payment_type == 'Pay': + if (self.payment_type == 'Pay' and self.advance_tax_account) or self.payment_type == 'Receive': dr_or_cr = "debit" if d.add_deduct_tax == "Add" else "credit" - rev_dr_cr = "credit" if d.add_deduct_tax == "Add" else "debit" - elif self.payment_type == 'Receive': + elif (self.payment_type == 'Receive' and self.advance_tax_account) or self.payment_type == 'Pay': dr_or_cr = "credit" if d.add_deduct_tax == "Add" else "debit" - rev_dr_cr = "debit" if d.add_deduct_tax == "Add" else "credit" + + payment_or_advance_account = self.get_party_account_for_taxes() gl_entries.append( self.get_gl_dict({ @@ -733,15 +729,16 @@ class PaymentEntry(AccountsController): "cost_center": d.cost_center }, account_currency, item=d)) + #Intentionally use -1 to get net values in party account gl_entries.append( self.get_gl_dict({ - "account": self.advance_tax_account, + "account": payment_or_advance_account, "against": self.party if self.payment_type=="Receive" else self.paid_from, - rev_dr_cr: d.base_tax_amount, - rev_dr_cr + "_in_account_currency": d.base_tax_amount + dr_or_cr: -1 * d.base_tax_amount, + dr_or_cr + "_in_account_currency": -1*d.base_tax_amount if account_currency==self.company_currency else d.tax_amount, - "cost_center": d.cost_center or self.cost_center + "cost_center": self.cost_center, }, account_currency, item=d)) def add_deductions_gl_entries(self, gl_entries): @@ -762,6 +759,14 @@ class PaymentEntry(AccountsController): }, item=d) ) + def get_party_account_for_taxes(self): + if self.advance_tax_account: + return self.advance_tax_account + elif self.payment_type == 'Pay': + return self.paid_from + elif self.payment_type == 'Receive': + return self.paid_to + def update_advance_paid(self): if self.payment_type in ("Receive", "Pay") and self.party: for d in self.get("references"): @@ -808,32 +813,52 @@ class PaymentEntry(AccountsController): self.append('deductions', row) self.set_unallocated_amount() + def initialize_taxes(self): + for tax in self.get("taxes"): + tax_fields = ["total", "tax_fraction_for_current_item", "grand_total_fraction_for_current_item"] + + if tax.charge_type != "Actual": + tax_fields.append("tax_amount") + + for fieldname in tax_fields: + tax.set(fieldname, 0.0) + + self.paid_amount_after_tax = self.paid_amount + + def determine_exclusive_rate(self): + if not any((cint(tax.included_in_paid_amount) for tax in self.get("taxes"))): + return + + cumulated_tax_fraction = 0 + total_inclusive_tax_amount_per_qty = 0 + for i, tax in enumerate(self.get("taxes")): + + tax.tax_fraction_for_current_item = self.get_current_tax_fraction(tax) + if i==0: + tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item + else: + tax.grand_total_fraction_for_current_item = \ + self.get("taxes")[i-1].grand_total_fraction_for_current_item \ + + tax.tax_fraction_for_current_item + + cumulated_tax_fraction += tax.tax_fraction_for_current_item + + self.paid_amount_after_tax = flt(self.paid_amount/(1+cumulated_tax_fraction)) + def calculate_taxes(self): self.total_taxes_and_charges = 0.0 self.base_total_taxes_and_charges = 0.0 + actual_tax_dict = dict([[tax.idx, flt(tax.tax_amount, tax.precision("tax_amount"))] + for tax in self.get("taxes") if tax.charge_type == "Actual"]) + for i, tax in enumerate(self.get('taxes')): - tax_rate = tax.rate - - # To set row_id by default as previous row. - if tax.charge_type in ["On Previous Row Amount", "On Previous Row Total"]: - if tax.idx == 1: - frappe.throw(_("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")) - - if not tax.row_id: - tax.row_id = tax.idx - 1 + current_tax_amount = self.get_current_tax_amount(tax) if tax.charge_type == "Actual": - current_tax_amount = flt(tax.tax_amount, self.precision("tax_amount", tax)) - elif tax.charge_type == "On Paid Amount": - current_tax_amount = (tax_rate / 100.0) * self.paid_amount - elif tax.charge_type == "On Previous Row Amount": - current_tax_amount = (tax_rate / 100.0) * \ - self.get('taxes')[cint(tax.row_id) - 1].tax_amount - - elif tax.charge_type == "On Previous Row Total": - current_tax_amount = (tax_rate / 100.0) * \ - self.get('taxes')[cint(tax.row_id) - 1].total + actual_tax_dict[tax.idx] -= current_tax_amount + if i == len(self.get("taxes")) - 1: + current_tax_amount += actual_tax_dict[tax.idx] tax.tax_amount = current_tax_amount tax.base_tax_amount = tax.tax_amount * self.source_exchange_rate @@ -843,21 +868,68 @@ class PaymentEntry(AccountsController): else: current_tax_amount *= 1.0 - if not tax.included_in_paid_amount: - applicable_tax = current_tax_amount - else: - applicable_tax = 0 - if i == 0: - tax.total = flt(self.paid_amount + applicable_tax, self.precision("total", tax)) + tax.total = flt(self.paid_amount_after_tax + current_tax_amount, self.precision("total", tax)) else: - tax.total = flt(self.get('taxes')[i-1].total + applicable_tax, self.precision("total", tax)) + tax.total = flt(self.get('taxes')[i-1].total + current_tax_amount, self.precision("total", tax)) tax.base_total = tax.total * self.source_exchange_rate self.total_taxes_and_charges += current_tax_amount self.base_total_taxes_and_charges += current_tax_amount * self.source_exchange_rate + if self.get('taxes'): + self.paid_amount_after_tax = self.get('taxes')[-1].base_total + + def get_current_tax_amount(self, tax): + tax_rate = tax.rate + + # To set row_id by default as previous row. + if tax.charge_type in ["On Previous Row Amount", "On Previous Row Total"]: + if tax.idx == 1: + frappe.throw(_("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row")) + + if not tax.row_id: + tax.row_id = tax.idx - 1 + + if tax.charge_type == "Actual": + current_tax_amount = flt(tax.tax_amount, self.precision("tax_amount", tax)) + elif tax.charge_type == "On Paid Amount": + current_tax_amount = (tax_rate / 100.0) * self.paid_amount_after_tax + elif tax.charge_type == "On Previous Row Amount": + current_tax_amount = (tax_rate / 100.0) * \ + self.get('taxes')[cint(tax.row_id) - 1].tax_amount + + elif tax.charge_type == "On Previous Row Total": + current_tax_amount = (tax_rate / 100.0) * \ + self.get('taxes')[cint(tax.row_id) - 1].total + + return current_tax_amount + + def get_current_tax_fraction(self, tax): + current_tax_fraction = 0 + + if cint(tax.included_in_paid_amount): + tax_rate = tax.rate + + if tax.charge_type == 'Actual': + current_tax_fraction = tax.tax_amount/self.paid_amount_after_tax + elif tax.charge_type == "On Paid Amount": + current_tax_fraction = tax_rate / 100.0 + + elif tax.charge_type == "On Previous Row Amount": + current_tax_fraction = (tax_rate / 100.0) * \ + self.get("taxes")[cint(tax.row_id) - 1].tax_fraction_for_current_item + + elif tax.charge_type == "On Previous Row Total": + current_tax_fraction = (tax_rate / 100.0) * \ + self.get("taxes")[cint(tax.row_id) - 1].grand_total_fraction_for_current_item + + if getattr(tax, "add_deduct_tax", None) and tax.add_deduct_tax == "Deduct": + current_tax_fraction *= -1.0 + + return current_tax_fraction + @frappe.whitelist() def get_outstanding_reference_documents(args): @@ -1426,6 +1498,9 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= pe.apply_tax_withholding_amount = 1 pe.tax_withholding_category = doc.tax_withholding_category + if not pe.advance_tax_account: + pe.advance_tax_account = frappe.db.get_value('Company', pe.company, 'unrealized_profit_loss_account') + return pe def get_bank_cash_account(doc, bank_account): From 99b583f688966cc89d069f8c5b7c4cf88108abb5 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 9 Jun 2021 00:06:35 +0530 Subject: [PATCH 30/53] fix: on click of duplicate button system copy the difference account from first row --- erpnext/stock/doctype/stock_entry/stock_entry.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 93a6fc0e0a..1a25994b24 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -986,7 +986,10 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ items_add: function(doc, cdt, cdn) { var row = frappe.get_doc(cdt, cdn); - this.frm.script_manager.copy_from_first_row("items", row, ["expense_account", "cost_center"]); + + if (!(row.expense_account && row.cost_center)) { + this.frm.script_manager.copy_from_first_row("items", row, ["expense_account", "cost_center"]); + } if(!row.s_warehouse) row.s_warehouse = this.frm.doc.from_warehouse; if(!row.t_warehouse) row.t_warehouse = this.frm.doc.to_warehouse; From 8090965162fc314ff8f41d71e5890f8c7f060802 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 9 Jun 2021 13:45:42 +0530 Subject: [PATCH 31/53] fix: Debug test --- .../accounts/doctype/purchase_invoice/test_purchase_invoice.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 8afb9a29f4..5187ca1b5e 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1017,6 +1017,9 @@ class TestPurchaseInvoice(unittest.TestCase): where voucher_type='Purchase Invoice' and voucher_no=%s order by account asc""", (purchase_invoice.name), as_dict=1) + for i, gle in enumerate(gl_entries): + print(gle.account, gle.debit, gle.credit) + for i, gle in enumerate(gl_entries): self.assertEqual(expected_gle[i][0], gle.account) self.assertEqual(expected_gle[i][1], gle.debit) From 4c1dad820780b88ca7c5710e570003974c11bd54 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 9 Jun 2021 14:18:23 +0530 Subject: [PATCH 32/53] fix: Debug tests --- .../accounts/doctype/purchase_invoice/test_purchase_invoice.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 5187ca1b5e..3299ecc5bc 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -991,6 +991,9 @@ class TestPurchaseInvoice(unittest.TestCase): where voucher_type='Payment Entry' and voucher_no=%s order by account asc""", (payment_entry.name), as_dict=1) + for i, gle in enumerate(gl_entries): + print(gle.account, gle.debit, gle.credit) + for i, gle in enumerate(gl_entries): self.assertEqual(expected_gle[i][0], gle.account) self.assertEqual(expected_gle[i][1], gle.debit) From 9e648183dbc52ee526b3a3dd15b1f57110ebccb5 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 9 Jun 2021 18:26:16 +0530 Subject: [PATCH 33/53] fix: Test case --- erpnext/accounts/doctype/payment_entry/payment_entry.py | 2 -- .../doctype/purchase_invoice/test_purchase_invoice.py | 8 +------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 5796fc0800..d04d6a0d15 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -835,9 +835,7 @@ class PaymentEntry(AccountsController): return cumulated_tax_fraction = 0 - total_inclusive_tax_amount_per_qty = 0 for i, tax in enumerate(self.get("taxes")): - tax.tax_fraction_for_current_item = self.get_current_tax_fraction(tax) if i==0: tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 3299ecc5bc..8e72dc6321 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -991,9 +991,6 @@ class TestPurchaseInvoice(unittest.TestCase): where voucher_type='Payment Entry' and voucher_no=%s order by account asc""", (payment_entry.name), as_dict=1) - for i, gle in enumerate(gl_entries): - print(gle.account, gle.debit, gle.credit) - for i, gle in enumerate(gl_entries): self.assertEqual(expected_gle[i][0], gle.account) self.assertEqual(expected_gle[i][1], gle.debit) @@ -1011,8 +1008,8 @@ class TestPurchaseInvoice(unittest.TestCase): ['_Test Account Cost for Goods Sold - _TC', 30000, 0], ['_Test Account Excise Duty - _TC', 0, 3000], ['Creditors - _TC', 0, 27000], - ['TDS Payable - _TC', 0, 3000], ['TDS Payable - _TC', 3000, 0] + ['TDS Payable - _TC', 0, 3000], ] gl_entries = frappe.db.sql("""select account, debit, credit @@ -1020,9 +1017,6 @@ class TestPurchaseInvoice(unittest.TestCase): where voucher_type='Purchase Invoice' and voucher_no=%s order by account asc""", (purchase_invoice.name), as_dict=1) - for i, gle in enumerate(gl_entries): - print(gle.account, gle.debit, gle.credit) - for i, gle in enumerate(gl_entries): self.assertEqual(expected_gle[i][0], gle.account) self.assertEqual(expected_gle[i][1], gle.debit) From 911818a9e2101c63f7bdacc06a07f1c511ba1578 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 9 Jun 2021 22:55:10 +0530 Subject: [PATCH 34/53] fix: Add multiple fixes --- .../advance_taxes_and_charges.json | 4 ++-- erpnext/accounts/doctype/payment_entry/payment_entry.js | 2 +- erpnext/accounts/doctype/payment_entry/payment_entry.json | 7 +++++-- erpnext/accounts/doctype/payment_entry/payment_entry.py | 5 ++++- .../accounts/doctype/purchase_invoice/purchase_invoice.py | 3 --- .../doctype/purchase_invoice/test_purchase_invoice.py | 1 + .../purchase_taxes_and_charges.json | 4 ++-- .../sales_taxes_and_charges/sales_taxes_and_charges.json | 4 ++-- erpnext/controllers/accounts_controller.py | 5 ++++- 9 files changed, 21 insertions(+), 14 deletions(-) diff --git a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json index 3e4e679c91..4d63499431 100644 --- a/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json +++ b/erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json @@ -160,7 +160,7 @@ "default": "0", "fieldname": "included_in_paid_amount", "fieldtype": "Check", - "label": "Included In Paid Amount" + "label": "Considered In Paid Amount" }, { "fieldname": "allocated_amount", @@ -186,7 +186,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-06-08 07:04:44.287002", + "modified": "2021-06-09 11:46:58.373170", "modified_by": "Administrator", "module": "Accounts", "name": "Advance Taxes and Charges", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 6a3b717b12..939f3546ff 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -1133,7 +1133,7 @@ frappe.ui.form.on('Payment Entry', { let tax_rate = tax.rate; if (tax.charge_type == "Actual") { - current_tax_fraction = tax.tax_amount/frm.doc.paid_amount_after_tax; + current_tax_fraction = tax.tax_amount/(frm.doc.paid_amount_after_tax + frm.doc.tax_amount); } else if(tax.charge_type == "On Paid Amount") { current_tax_fraction = (tax_rate / 100.0); } else if(tax.charge_type == "On Previous Row Amount") { diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 0b4178a547..54623dd6cd 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -681,13 +681,16 @@ "hide_border": 1 }, { + "depends_on": "eval:doc.apply_tax_withholding_amount", + "description": "Provisional tax account for advance tax. Taxes are parked in this account until payments are allocated to invoices", "fieldname": "advance_tax_account", "fieldtype": "Link", "label": "Advance Tax Account", - "mandatory_depends_on": "doc.base_total_taxes_and_charges", + "mandatory_depends_on": "eval:doc.apply_tax_withholding_amount", "options": "Account" }, { + "depends_on": "eval:doc.received_amount", "fieldname": "received_amount_after_tax", "fieldtype": "Currency", "label": "Received Amount After Tax", @@ -704,7 +707,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2021-05-31 01:54:18.378910", + "modified": "2021-06-09 11:55:04.215050", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index d04d6a0d15..edca210142 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -400,6 +400,9 @@ class PaymentEntry(AccountsController): if not self.apply_tax_withholding_amount: return + if not self.advance_tax_account: + frappe.throw(_("Advance TDS account is mandatory for advance TDS deduction")) + reference_doclist = [] net_total = self.paid_amount included_in_paid_amount = 0 @@ -916,7 +919,7 @@ class PaymentEntry(AccountsController): tax_rate = tax.rate if tax.charge_type == 'Actual': - current_tax_fraction = tax.tax_amount/self.paid_amount_after_tax + current_tax_fraction = tax.tax_amount/ (self.paid_amount_after_tax + tax.tax_amount) elif tax.charge_type == "On Paid Amount": current_tax_fraction = tax_rate / 100.0 diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 934c731cf1..0ee0bc7e11 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -68,9 +68,6 @@ class PurchaseInvoice(BuyingController): super(PurchaseInvoice, self).validate() - # apply tax withholding only if checked and applicable - self.set_tax_withholding() - if not self.is_return: self.po_required() self.pr_required() diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 8e72dc6321..fb4b8d4c1f 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -975,6 +975,7 @@ class TestPurchaseInvoice(unittest.TestCase): # Create Payment Entry Against the order payment_entry = get_payment_entry(dt='Purchase Order', dn=po.name) + payment_entry.paid_from = 'Cash - _TC' payment_entry.save() payment_entry.submit() diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json index f6703315fa..9b07645ccc 100644 --- a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json +++ b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json @@ -221,13 +221,13 @@ "description": "If checked, the tax amount will be considered as already included in the Paid Amount in Payment Entry", "fieldname": "included_in_paid_amount", "fieldtype": "Check", - "label": "Included In Paid Amount" + "label": "Considered In Paid Amount" } ], "idx": 1, "istable": 1, "links": [], - "modified": "2021-05-31 03:41:38.298937", + "modified": "2021-06-09 11:48:25.335733", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Taxes and Charges", diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json b/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json index 36fd634b50..170d34e651 100644 --- a/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json +++ b/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json @@ -198,14 +198,14 @@ "description": "If checked, the tax amount will be considered as already included in the Paid Amount in Payment Entry", "fieldname": "included_in_paid_amount", "fieldtype": "Check", - "label": "Included In Paid Amount" + "label": "Considered In Paid Amount" } ], "idx": 1, "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-05-31 05:40:32.856780", + "modified": "2021-06-09 11:48:04.691596", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Taxes and Charges", diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index d8d0312ff6..53ded33b6f 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -116,6 +116,8 @@ class AccountsController(TransactionBase): if self.doctype == 'Purchase Invoice': self.calculate_paid_amount() + # apply tax withholding only if checked and applicable + self.set_tax_withholding() if self.doctype in ['Purchase Invoice', 'Sales Invoice']: pos_check_field = "is_pos" if self.doctype=="Sales Invoice" else "is_paid" @@ -742,7 +744,8 @@ class AccountsController(TransactionBase): def allocate_advance_taxes(self, gl_entries): tax_map = self.get_tax_map() for pe in self.get("advances"): - if pe.reference_type == "Payment Entry": + if pe.reference_type == "Payment Entry" and \ + frappe.db.get_value('Payment Entry', pe.reference_name, 'advance_tax_account'): pe = frappe.get_doc("Payment Entry", pe.reference_name) for tax in pe.get("taxes"): account_currency = get_account_currency(tax.account_head) From 0b5fe1b5eb0fb24a4a37a6513e76f26b9a1f3bee Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 10 Jun 2021 10:34:49 +0530 Subject: [PATCH 35/53] fix: Failing test case --- .../doctype/purchase_invoice/test_purchase_invoice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index fb4b8d4c1f..c656c8aeec 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1009,8 +1009,8 @@ class TestPurchaseInvoice(unittest.TestCase): ['_Test Account Cost for Goods Sold - _TC', 30000, 0], ['_Test Account Excise Duty - _TC', 0, 3000], ['Creditors - _TC', 0, 27000], - ['TDS Payable - _TC', 3000, 0] - ['TDS Payable - _TC', 0, 3000], + ['TDS Payable - _TC', 3000, 0], + ['TDS Payable - _TC', 0, 3000] ] gl_entries = frappe.db.sql("""select account, debit, credit From 076bd5eaab52c9ad7805ff511787f8de045743b3 Mon Sep 17 00:00:00 2001 From: GangaManoj Date: Thu, 10 Jun 2021 12:08:44 +0530 Subject: [PATCH 36/53] fix: Only display GST card in Accounting Workspace if it's in India --- .../workspace/accounting/accounting.json | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/workspace/accounting/accounting.json b/erpnext/accounts/workspace/accounting/accounting.json index df68318052..10a4001502 100644 --- a/erpnext/accounts/workspace/accounting/accounting.json +++ b/erpnext/accounts/workspace/accounting/accounting.json @@ -445,15 +445,15 @@ "type": "Link" }, { - "dependencies": "GL Entry", - "hidden": 0, - "is_query_report": 1, - "label": "UAE VAT 201", - "link_to": "UAE VAT 201", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, + "dependencies": "GL Entry", + "hidden": 0, + "is_query_report": 1, + "label": "UAE VAT 201", + "link_to": "UAE VAT 201", + "link_type": "Report", + "onboard": 0, + "type": "Link" + }, { "hidden": 0, "is_query_report": 0, @@ -684,6 +684,7 @@ "is_query_report": 0, "label": "Goods and Services Tax (GST India)", "onboard": 0, + "only_for": "India", "type": "Card Break" }, { @@ -694,6 +695,7 @@ "link_to": "GST Settings", "link_type": "DocType", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -704,6 +706,7 @@ "link_to": "GST HSN Code", "link_type": "DocType", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -714,6 +717,7 @@ "link_to": "GSTR-1", "link_type": "Report", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -724,6 +728,7 @@ "link_to": "GSTR-2", "link_type": "Report", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -734,6 +739,7 @@ "link_to": "GSTR 3B Report", "link_type": "DocType", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -744,6 +750,7 @@ "link_to": "GST Sales Register", "link_type": "Report", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -754,6 +761,7 @@ "link_to": "GST Purchase Register", "link_type": "Report", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -764,6 +772,7 @@ "link_to": "GST Itemised Sales Register", "link_type": "Report", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -774,6 +783,7 @@ "link_to": "GST Itemised Purchase Register", "link_type": "Report", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -784,6 +794,7 @@ "link_to": "C-Form", "link_type": "DocType", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -794,6 +805,7 @@ "link_to": "Lower Deduction Certificate", "link_type": "DocType", "onboard": 0, + "only_for": "India", "type": "Link" }, { @@ -1052,7 +1064,7 @@ "type": "Link" } ], - "modified": "2021-05-12 11:48:01.905144", + "modified": "2021-06-10 03:17:31.427945", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting", @@ -1107,4 +1119,4 @@ "type": "Dashboard" } ] -} +} \ No newline at end of file From d063f9a5d185e9f481991b11c8fa8c0dcf9a39a5 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 10 Jun 2021 12:26:21 +0530 Subject: [PATCH 37/53] fix: GL Entry ordering --- .../doctype/purchase_invoice/test_purchase_invoice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index c656c8aeec..723d151ad8 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1000,6 +1000,7 @@ class TestPurchaseInvoice(unittest.TestCase): # Create Purchase Invoice against Purchase Order purchase_invoice = get_mapped_purchase_invoice(po.name) purchase_invoice.allocate_advances_automatically = 1 + purchase_invoice.items[0].expense_account = '_Test Account Cost for Goods Sold - _TC' purchase_invoice.save() purchase_invoice.submit() @@ -1009,8 +1010,7 @@ class TestPurchaseInvoice(unittest.TestCase): ['_Test Account Cost for Goods Sold - _TC', 30000, 0], ['_Test Account Excise Duty - _TC', 0, 3000], ['Creditors - _TC', 0, 27000], - ['TDS Payable - _TC', 3000, 0], - ['TDS Payable - _TC', 0, 3000] + ['TDS Payable - _TC', 3000, 3000] ] gl_entries = frappe.db.sql("""select account, debit, credit From aedf25ba46d20d8a7d40b6c77f880cfdc426cf90 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 4 Jun 2021 11:44:40 +0530 Subject: [PATCH 38/53] chore: Drop old patches v7 backup was restored and upgraded to latest v10.x.x branch. The patches run uptil the upgrade are removed in this change. This means only existing v10 sites are allowed direct upgrade to v13 and newer --- erpnext/patches/repair_tools/__init__.py | 0 .../set_stock_balance_as_per_serial_no.py | 13 - erpnext/patches/v10_0/__init__.py | 0 .../patches/v10_0/add_agriculture_domain.py | 13 - .../add_guardian_role_for_parent_portal.py | 23 -- .../patches/v10_0/add_non_profit_domain.py | 20 -- .../allow_operators_in_supplier_scorecard.py | 23 -- .../v10_0/copy_projects_renamed_fields.py | 13 - ..._regional_print_format_based_on_country.py | 22 -- .../fix_reserved_qty_for_sub_contract.py | 31 --- .../recalculate_gross_margin_for_project.py | 14 - .../v10_0/rename_schools_to_education.py | 32 --- ...r_purchase_receipts_with_rejected_items.py | 32 --- ...t_requested_qty_for_non_stock_uom_items.py | 21 -- ...t_auto_created_serial_no_in_stock_entry.py | 56 ---- erpnext/patches/v10_0/set_b2c_limit.py | 12 - ..._default_payment_terms_based_on_company.py | 37 --- erpnext/patches/v10_0/set_discount_amount.py | 35 --- ...set_numeric_ranges_in_template_if_blank.py | 35 --- .../v10_0/set_primary_contact_for_customer.py | 21 -- ...n_transactions_based_on_serial_no_input.py | 21 -- .../patches/v10_0/set_student_party_type.py | 8 - .../setup_vat_for_uae_and_saudi_arabia.py | 13 - ...s_of_all_department_members_in_calendar.py | 6 - erpnext/patches/v10_0/taxes_issue_with_pos.py | 26 -- .../update_address_template_for_india.py | 12 - .../patches/v10_0/update_assessment_plan.py | 17 -- .../patches/v10_0/update_assessment_result.py | 20 -- .../update_asset_calculate_depreciation.py | 12 - .../v10_0/update_hub_connector_domain.py | 10 - .../v10_0/update_lft_rgt_for_employee.py | 9 - .../patches/v10_0/update_project_in_sle.py | 15 -- .../update_reserved_qty_for_purchase_order.py | 53 ---- ...date_sales_order_link_to_purchase_order.py | 18 -- ...update_status_for_multiple_source_in_po.py | 40 --- .../update_status_in_purchase_receipt.py | 8 - .../update_territory_and_customer_group.py | 29 --- .../v10_0/update_user_image_in_employee.py | 19 -- .../v10_0/update_warehouse_address_details.py | 37 --- erpnext/patches/v10_1/__init__.py | 0 erpnext/patches/v11_0/__init__.py | 1 - .../v11_0/remove_subscriber_doctype.py | 16 -- erpnext/patches/v11_1/__init__.py | 0 erpnext/patches/v12_0/__init__.py | 0 erpnext/patches/v13_0/__init__.py | 1 - erpnext/patches/v4_0/__init__.py | 0 .../patches/v4_0/apply_user_permissions.py | 50 ---- erpnext/patches/v4_0/countrywise_coa.py | 29 --- ...custom_fields_for_india_specific_fields.py | 63 ----- .../v4_0/create_price_list_if_missing.py | 35 --- .../v4_0/customer_discount_to_pricing_rule.py | 33 --- erpnext/patches/v4_0/fields_to_be_renamed.py | 109 -------- erpnext/patches/v4_0/fix_address_template.py | 12 - .../patches/v4_0/fix_case_of_hr_module_def.py | 13 - erpnext/patches/v4_0/fix_contact_address.py | 13 - erpnext/patches/v4_0/fix_employee_user_id.py | 23 -- .../global_defaults_to_system_settings.py | 39 --- erpnext/patches/v4_0/import_country_codes.py | 15 -- .../v4_0/map_charge_to_taxes_and_charges.py | 16 -- .../move_warehouse_user_to_restrictions.py | 13 - erpnext/patches/v4_0/new_address_template.py | 14 - .../patches/v4_0/reload_sales_print_format.py | 8 - .../remove_employee_role_if_no_employee.py | 18 -- .../patches/v4_0/remove_module_home_pages.py | 10 - .../patches/v4_0/rename_sitemap_to_route.py | 17 -- .../v4_0/reset_permissions_for_masters.py | 20 -- .../patches/v4_0/save_default_letterhead.py | 13 - .../set_pricing_rule_for_buying_or_selling.py | 13 - erpnext/patches/v4_0/split_email_settings.py | 67 ----- .../patches/v4_0/update_account_root_type.py | 34 --- ...custom_print_formats_for_renamed_fields.py | 36 --- ...to_sales_person_in_maintenance_schedule.py | 12 - ...harges_in_custom_purchase_print_formats.py | 12 - .../v4_0/update_tax_amount_after_discount.py | 20 -- .../patches/v4_0/update_user_properties.py | 51 ---- .../v4_0/update_users_report_view_settings.py | 12 - erpnext/patches/v4_0/validate_v3_patch.py | 11 - erpnext/patches/v4_1/__init__.py | 0 .../v4_1/fix_delivery_and_billing_status.py | 12 - erpnext/patches/v4_1/fix_jv_remarks.py | 21 -- .../v4_1/fix_sales_order_delivered_status.py | 15 -- .../patches/v4_1/set_outgoing_email_footer.py | 12 - erpnext/patches/v4_2/__init__.py | 0 .../patches/v4_2/add_currency_turkish_lira.py | 10 - erpnext/patches/v4_2/default_website_style.py | 11 - ...elete_gl_entries_for_cancelled_invoices.py | 14 - .../patches/v4_2/delete_old_print_formats.py | 23 -- erpnext/patches/v4_2/discount_amount.py | 12 - .../patches/v4_2/fix_account_master_type.py | 12 - .../fix_gl_entries_for_stock_transactions.py | 54 ---- erpnext/patches/v4_2/fix_recurring_orders.py | 41 --- erpnext/patches/v4_2/party_model.py | 117 --------- erpnext/patches/v4_2/recalculate_bom_cost.py | 16 -- .../repost_sle_for_si_with_no_warehouse.py | 34 --- .../v4_2/repost_stock_reconciliation.py | 31 --- erpnext/patches/v4_2/reset_bom_costs.py | 17 -- .../v4_2/seprate_manufacture_and_repack.py | 9 - erpnext/patches/v4_2/set_company_country.py | 15 -- erpnext/patches/v4_2/set_item_has_batch.py | 65 ----- erpnext/patches/v4_2/toggle_rounded_total.py | 9 - .../v4_2/update_landed_cost_voucher.py | 10 - .../patches/v4_2/update_project_milestones.py | 9 - .../update_sales_order_invoice_field_name.py | 7 - .../v4_2/update_stock_uom_for_dn_in_sle.py | 11 - erpnext/patches/v4_4/__init__.py | 0 erpnext/patches/v4_4/make_email_accounts.py | 96 ------- erpnext/patches/v5_0/__init__.py | 0 .../v5_0/convert_stock_reconciliation.py | 31 --- .../patches/v5_0/execute_on_doctype_update.py | 9 - .../fix_taxes_and_totals_in_party_currency.py | 66 ----- .../v5_0/index_on_account_and_gl_entry.py | 30 --- erpnext/patches/v5_0/is_group.py | 9 - erpnext/patches/v5_0/item_patches.py | 6 - .../v5_0/link_warehouse_with_account.py | 10 - erpnext/patches/v5_0/new_crm_module.py | 24 -- erpnext/patches/v5_0/newsletter.py | 38 --- .../v5_0/opportunity_not_submittable.py | 10 - erpnext/patches/v5_0/party_model_patch_fix.py | 18 -- erpnext/patches/v5_0/portal_fixes.py | 7 - erpnext/patches/v5_0/project_costing.py | 8 - .../v5_0/recalculate_total_amount_in_jv.py | 26 -- ...nned_operating_cost_in_production_order.py | 13 - .../patches/v5_0/remove_birthday_events.py | 7 - erpnext/patches/v5_0/rename_customer_issue.py | 6 - erpnext/patches/v5_0/rename_pos_setting.py | 6 - .../patches/v5_0/rename_table_fieldnames.py | 243 ------------------ .../v5_0/rename_taxes_and_charges_master.py | 14 - erpnext/patches/v5_0/rename_total_fields.py | 55 ---- ...lds_in_custom_scripts_and_print_formats.py | 65 ----- .../repost_gle_for_jv_with_multiple_party.py | 26 -- erpnext/patches/v5_0/repost_requested_qty.py | 21 -- erpnext/patches/v5_0/reset_values_in_tools.py | 12 - erpnext/patches/v5_0/set_appraisal_remarks.py | 9 - .../v5_0/set_default_company_in_bom.py | 10 - erpnext/patches/v5_0/set_footer_address.py | 9 - .../patches/v5_0/stock_entry_update_value.py | 8 - .../taxes_and_totals_in_party_currency.py | 80 ------ erpnext/patches/v5_0/update_account_types.py | 20 -- erpnext/patches/v5_0/update_advance_paid.py | 13 - .../update_companywise_payment_account.py | 21 -- .../v5_0/update_dn_against_doc_fields.py | 14 - erpnext/patches/v5_0/update_from_bom.py | 9 - .../update_frozen_accounts_permission_role.py | 13 - .../v5_0/update_item_and_description_again.py | 50 ---- .../v5_0/update_item_desc_in_invoice.py | 52 ---- .../v5_0/update_item_description_and_image.py | 54 ---- .../patches/v5_0/update_item_name_in_bom.py | 18 -- .../v5_0/update_journal_entry_title.py | 12 - ...pdate_material_transfer_for_manufacture.py | 6 - ..._material_transferred_for_manufacturing.py | 10 - ...ial_transferred_for_manufacturing_again.py | 19 -- .../v5_0/update_operation_description.py | 11 - erpnext/patches/v5_0/update_opportunity.py | 14 - erpnext/patches/v5_0/update_projects.py | 34 --- erpnext/patches/v5_0/update_sms_sender.py | 9 - ...amount_after_discount_in_purchase_cycle.py | 17 -- .../patches/v5_0/update_temporary_account.py | 9 - erpnext/patches/v5_0/update_time_log_title.py | 12 - erpnext/patches/v5_1/__init__.py | 0 erpnext/patches/v5_1/default_bom.py | 7 - erpnext/patches/v5_1/fix_against_account.py | 37 --- erpnext/patches/v5_1/rename_roles.py | 10 - erpnext/patches/v5_1/sales_bom_rename.py | 12 - erpnext/patches/v5_2/__init__.py | 1 - .../v5_2/change_item_selects_to_checks.py | 19 -- erpnext/patches/v5_4/__init__.py | 0 erpnext/patches/v5_4/cleanup_journal_entry.py | 21 -- .../patches/v5_4/fix_invoice_outstanding.py | 13 - .../patches/v5_4/fix_missing_item_images.py | 126 --------- ...x_reserved_qty_and_sle_for_packed_items.py | 22 -- ...anagers_regarding_wrong_tax_calculation.py | 41 --- .../patches/v5_4/set_root_and_report_type.py | 12 - .../v5_4/stock_entry_additional_costs.py | 53 ---- .../update_purchase_cost_against_project.py | 13 - erpnext/patches/v5_7/__init__.py | 1 - .../patches/v5_7/item_template_attributes.py | 124 --------- erpnext/patches/v5_8/__init__.py | 1 - .../v5_8/add_credit_note_print_heading.py | 14 - erpnext/patches/v5_8/tax_rule.py | 31 --- ...pdate_order_reference_in_return_entries.py | 92 ------- erpnext/patches/v6_0/__init__.py | 0 erpnext/patches/v6_0/default_activity_rate.py | 14 - .../patches/v6_0/fix_outstanding_amount.py | 16 -- erpnext/patches/v6_0/fix_planned_qty.py | 14 - erpnext/patches/v6_0/multi_currency.py | 65 ----- erpnext/patches/v6_0/set_default_title.py | 36 --- erpnext/patches/v6_10/__init__.py | 1 - .../v6_10/email_digest_default_quote.py | 6 - .../fix_billed_amount_in_drop_ship_po.py | 18 -- .../fix_delivery_status_of_drop_ship_item.py | 10 - erpnext/patches/v6_10/fix_jv_total_amount.py | 14 - .../v6_10/fix_ordered_received_billed.py | 17 -- erpnext/patches/v6_12/__init__.py | 0 .../repost_entries_with_target_warehouse.py | 175 ------------- erpnext/patches/v6_12/set_overdue_tasks.py | 8 - erpnext/patches/v6_16/__init__.py | 1 - .../v6_16/create_manufacturer_records.py | 19 -- .../update_billing_status_in_dn_and_pr.py | 42 --- erpnext/patches/v6_19/__init__.py | 1 - .../v6_19/comment_feed_communication.py | 7 - erpnext/patches/v6_2/__init__.py | 1 - .../fix_missing_default_taxes_and_lead.py | 25 -- .../v6_2/remove_newsletter_duplicates.py | 13 - erpnext/patches/v6_20/__init__.py | 0 .../set_party_account_currency_in_orders.py | 24 -- erpnext/patches/v6_20x/__init__.py | 1 - .../v6_20x/remove_customer_supplier_roles.py | 23 -- .../remove_fiscal_year_from_holiday_list.py | 19 -- .../v6_20x/rename_project_name_to_project.py | 17 -- ...t_valuation_rate_for_negative_inventory.py | 11 - erpnext/patches/v6_20x/set_compact_print.py | 8 - .../update_product_bundle_description.py | 11 - erpnext/patches/v6_21/__init__.py | 1 - erpnext/patches/v6_21/fix_reorder_level.py | 24 -- .../v6_21/rename_material_request_fields.py | 14 - erpnext/patches/v6_23/__init__.py | 0 .../v6_23/update_stopped_status_to_closed.py | 9 - erpnext/patches/v6_24/__init__.py | 0 ...tomer_address_to_shipping_address_on_po.py | 19 -- erpnext/patches/v6_24/set_recurring_id.py | 13 - erpnext/patches/v6_27/__init__.py | 1 - .../v6_27/fix_recurring_order_status.py | 54 ---- erpnext/patches/v6_3/__init__.py | 0 .../v6_3/convert_applicable_territory.py | 24 -- erpnext/patches/v6_4/__init__.py | 1 - erpnext/patches/v6_4/email_digest_update.py | 10 - erpnext/patches/v6_4/fix_duplicate_bins.py | 20 -- .../v6_4/fix_expense_included_in_valuation.py | 74 ------ ...x_journal_entries_due_to_reconciliation.py | 53 ---- ...ified_in_sales_order_and_purchase_order.py | 10 - .../fix_sales_order_maintenance_status.py | 8 - .../fix_status_in_sales_and_purchase_order.py | 8 - erpnext/patches/v6_4/make_image_thumbnail.py | 15 -- ...al_entries_where_reference_name_missing.py | 23 -- .../v6_4/round_status_updater_percentages.py | 14 - erpnext/patches/v6_4/set_user_in_contact.py | 7 - erpnext/patches/v6_5/__init__.py | 1 - .../v6_5/show_in_website_for_template_item.py | 15 -- erpnext/patches/v6_6/__init__.py | 1 - erpnext/patches/v6_6/fix_website_image.py | 32 --- ...emove_fiscal_year_from_leave_allocation.py | 17 -- erpnext/patches/v6_8/__init__.py | 0 erpnext/patches/v6_8/make_webform_standard.py | 14 - .../v6_8/move_drop_ship_to_po_items.py | 43 ---- erpnext/patches/v7_0/__init__.py | 0 .../v7_0/calculate_total_costing_amount.py | 18 -- .../v7_0/convert_timelog_to_timesheet.py | 69 ----- .../v7_0/convert_timelogbatch_to_timesheet.py | 32 --- erpnext/patches/v7_0/create_budget_record.py | 57 ---- .../v7_0/create_warehouse_nestedset.py | 128 --------- erpnext/patches/v7_0/fix_duplicate_icons.py | 27 -- ...ouse_ledger_gl_entries_for_transactions.py | 51 ---- erpnext/patches/v7_0/make_guardian.py | 37 --- .../v7_0/make_is_group_fieldtype_as_check.py | 18 -- ...count_type_stock_and_warehouse_to_stock.py | 10 - .../v7_0/migrate_mode_of_payments_v6_to_v7.py | 38 --- .../v7_0/migrate_schools_to_erpnext.py | 30 --- ...lesinvoiceitem_to_salesinvoicetimesheet.py | 17 -- .../v7_0/po_status_issue_for_pr_return.py | 40 --- erpnext/patches/v7_0/re_route.py | 5 - .../remove_administrator_role_in_doctypes.py | 9 - .../v7_0/remove_doctypes_and_reports.py | 27 -- erpnext/patches/v7_0/remove_features_setup.py | 29 --- .../remove_old_earning_deduction_doctypes.py | 16 -- .../v7_0/rename_advance_table_fields.py | 18 -- .../v7_0/rename_examination_to_assessment.py | 24 -- .../rename_fee_amount_to_fee_component.py | 16 -- erpnext/patches/v7_0/rename_prevdoc_fields.py | 76 ------ .../patches/v7_0/rename_salary_components.py | 149 ----------- .../patches/v7_0/rename_time_sheet_doctype.py | 14 - .../repost_bin_qty_and_item_projected_qty.py | 15 -- .../repost_gle_for_pi_with_update_stock.py | 20 -- .../v7_0/repost_gle_for_pos_sales_return.py | 25 -- ...et_base_amount_in_invoice_payment_table.py | 24 -- .../v7_0/set_is_group_for_warehouse.py | 7 - .../v7_0/set_material_request_type_in_item.py | 16 -- .../v7_0/set_naming_series_for_timesheet.py | 15 -- .../v7_0/set_party_name_in_payment_entry.py | 20 -- erpnext/patches/v7_0/set_portal_settings.py | 28 -- ..._table_for_expense_claim_type_if_exists.py | 20 -- .../v7_0/system_settings_setup_complete.py | 16 -- erpnext/patches/v7_0/update_autoname_field.py | 14 - .../v7_0/update_change_amount_account.py | 19 -- ...rsion_factor_in_supplier_quotation_item.py | 19 -- erpnext/patches/v7_0/update_home_page.py | 27 -- .../update_maintenance_module_in_doctype.py | 11 - .../v7_0/update_mins_to_first_response.py | 24 -- .../update_missing_employee_in_timesheet.py | 20 -- .../v7_0/update_mode_of_payment_type.py | 29 --- erpnext/patches/v7_0/update_party_status.py | 21 -- ...vdoc_values_for_supplier_quotation_item.py | 9 - .../v7_0/update_project_in_gl_entry.py | 21 -- .../update_refdoc_in_landed_cost_voucher.py | 15 -- .../v7_0/update_status_for_timesheet.py | 11 - .../patches/v7_0/update_status_of_po_so.py | 68 ----- ...pdate_status_of_zero_amount_sales_order.py | 7 - .../v7_0/update_timesheet_communications.py | 27 -- erpnext/patches/v7_1/__init__.py | 1 - .../add_account_user_role_for_timesheet.py | 31 --- .../v7_1/add_field_for_task_dependent.py | 10 - .../v7_1/fix_link_for_customer_from_lead.py | 7 - ..._invoice_from_parent_to_child_timesheet.py | 20 -- .../patches/v7_1/rename_field_timesheet.py | 11 - .../v7_1/rename_quality_inspection_field.py | 38 --- ...tock_for_deleted_bins_for_merging_items.py | 44 ---- erpnext/patches/v7_1/save_stock_settings.py | 15 -- .../v7_1/set_budget_against_as_cost_center.py | 11 - .../v7_1/set_currency_exchange_date.py | 10 - .../v7_1/set_prefered_contact_email.py | 17 -- .../patches/v7_1/set_sales_person_status.py | 8 - erpnext/patches/v7_1/set_student_guardian.py | 23 -- .../v7_1/set_total_amount_currency_in_je.py | 24 -- .../patches/v7_1/update_bom_base_currency.py | 20 -- erpnext/patches/v7_1/update_component_type.py | 15 -- erpnext/patches/v7_1/update_invoice_status.py | 34 --- erpnext/patches/v7_1/update_lead_source.py | 29 --- .../update_missing_salary_component_type.py | 50 ---- erpnext/patches/v7_1/update_portal_roles.py | 21 -- .../v7_1/update_total_billing_hours.py | 14 - erpnext/patches/v7_2/__init__.py | 1 - ...ar_leave_encashment_as_salary_component.py | 36 --- erpnext/patches/v7_2/contact_address_links.py | 32 --- .../delete_fleet_management_module_def.py | 10 - ...ty_supplied_items_for_non_subcontracted.py | 14 - .../patches/v7_2/make_all_assessment_group.py | 14 - erpnext/patches/v7_2/mark_students_active.py | 9 - .../v7_2/rename_att_date_attendance.py | 15 -- .../v7_2/rename_evaluation_criteria.py | 39 --- .../patches/v7_2/set_null_value_to_fields.py | 11 - .../patches/v7_2/setup_auto_close_settings.py | 18 -- erpnext/patches/v7_2/stock_uom_in_selling.py | 15 -- .../v7_2/update_abbr_in_salary_slips.py | 14 - .../patches/v7_2/update_assessment_modules.py | 51 ---- .../v7_2/update_attendance_docstatus.py | 10 - erpnext/patches/v7_2/update_doctype_status.py | 11 - .../update_guardian_name_in_student_master.py | 14 - erpnext/patches/v7_2/update_party_type.py | 16 -- erpnext/patches/v7_2/update_salary_slips.py | 22 -- .../v7_2/update_website_for_variant.py | 13 - erpnext/patches/v8_0/__init__.py | 1 - .../patches/v8_0/addresses_linked_to_lead.py | 5 - .../v8_0/change_in_words_varchar_length.py | 16 -- ...dress_doc_from_address_field_in_company.py | 33 --- erpnext/patches/v8_0/create_domain_docs.py | 53 ---- erpnext/patches/v8_0/delete_bin_indexes.py | 16 -- .../delete_schools_depricated_doctypes.py | 14 - .../patches/v8_0/disable_instructor_role.py | 18 -- ...ooking_asset_depreciation_automatically.py | 9 - ..._for_invoices_with_negative_outstanding.py | 23 -- ...ayments_table_blank_for_non_pos_invoice.py | 15 -- .../merge_student_batch_and_student_group.py | 73 ------ ...from_account_to_warehouse_for_inventory.py | 15 -- .../v8_0/move_perpetual_inventory_setting.py | 13 - ...ample_item_to_allow_zero_valuation_rate.py | 13 - ...ems_in_status_field_of_material_request.py | 25 -- ...rename_total_margin_to_rate_with_margin.py | 24 -- ...ost_reserved_qty_for_multiple_sales_uom.py | 19 -- .../revert_manufacturers_table_from_item.py | 22 -- erpnext/patches/v8_0/save_system_settings.py | 20 -- ..._serial_nos_for_disabled_sales_invoices.py | 14 - .../patches/v8_0/set_project_copied_from.py | 11 - ...nvoice_serial_number_from_delivery_note.py | 42 --- .../patches/v8_0/update_customer_pos_id.py | 9 - .../patches/v8_0/update_production_orders.py | 49 ---- .../v8_0/update_sales_cost_in_project.py | 11 - ...tus_as_paid_for_completed_expense_claim.py | 19 -- .../update_stock_qty_value_in_bom_item.py | 14 - ...ate_stock_qty_value_in_purchase_invoice.py | 9 - ...ate_student_groups_from_student_batches.py | 38 --- .../update_supplier_address_in_stock_entry.py | 22 -- erpnext/patches/v8_1/__init__.py | 0 erpnext/patches/v8_1/add_hsn_sac_codes.py | 11 - .../add_indexes_in_transaction_doctypes.py | 10 - ...allow_invoice_copy_to_edit_after_submit.py | 13 - .../patches/v8_1/delete_deprecated_reports.py | 33 --- erpnext/patches/v8_1/gst_fixes.py | 62 ----- ...e_sales_invoice_from_returned_serial_no.py | 18 -- .../v8_1/removed_report_support_hours.py | 14 - .../v8_1/set_delivery_date_in_so_item.py | 22 -- .../v8_1/update_expense_claim_status.py | 23 -- erpnext/patches/v8_1/update_gst_state.py | 15 -- erpnext/patches/v8_10/__init__.py | 0 .../change_default_customer_credit_days.py | 89 ------- erpnext/patches/v8_3/__init__.py | 0 .../set_restrict_to_domain_for_module_def.py | 9 - .../v8_3/update_company_total_sales.py | 15 -- erpnext/patches/v8_4/__init__.py | 1 - .../patches/v8_4/make_scorecard_records.py | 11 - erpnext/patches/v8_5/__init__.py | 0 .../fix_tax_breakup_for_non_invoice_docs.py | 48 ---- .../remove_project_type_property_setter.py | 18 -- .../remove_quotations_route_in_sidebar.py | 16 -- .../v8_5/set_default_mode_of_payment.py | 17 -- .../update_customer_group_in_POS_profile.py | 9 - .../update_existing_data_in_project_type.py | 19 -- erpnext/patches/v8_6/__init__.py | 0 ...point_sms_doctype_module_to_frappe_core.py | 9 - .../patches/v8_6/rename_bom_update_tool.py | 9 - ...mission_for_quotation_for_sales_manager.py | 11 - .../v8_6/update_timesheet_company_from_PO.py | 15 -- erpnext/patches/v8_7/__init__.py | 0 .../v8_7/fix_purchase_receipt_status.py | 13 - .../make_subscription_from_recurring_data.py | 58 ----- erpnext/patches/v8_8/__init__.py | 0 .../add_new_fields_in_accounts_settings.py | 9 - .../patches/v8_8/set_bom_rate_as_per_uom.py | 13 - erpnext/patches/v8_9/__init__.py | 1 - .../v8_9/add_setup_progress_actions.py | 47 ---- ...gst_doctypes_for_outside_india_accounts.py | 14 - ...e_employee_from_salary_structure_parent.py | 6 - .../v8_9/rename_company_sales_target_field.py | 8 - .../v8_9/set_default_customer_group.py | 8 - .../set_default_fields_in_variant_settings.py | 13 - erpnext/patches/v8_9/set_member_party_type.py | 9 - .../v8_9/set_print_zero_amount_taxes.py | 9 - ...update_billing_gstin_for_indian_account.py | 15 -- erpnext/patches/v9_0/__init__.py | 1 - erpnext/patches/v9_0/add_healthcare_domain.py | 13 - .../add_user_to_child_table_in_pos_profile.py | 38 --- .../patches/v9_0/copy_old_fees_field_data.py | 15 -- ..._existing_warehouse_from_stock_settings.py | 8 - .../v9_0/remove_subscription_module.py | 9 - .../v9_0/revert_manufacturing_user_role.py | 22 -- erpnext/patches/v9_0/set_pos_profile_name.py | 24 -- ...for_material_request_and_purchase_order.py | 24 -- ...ipping_type_for_existing_shipping_rules.py | 18 -- .../patches/v9_0/set_uoms_in_variant_field.py | 14 - .../v9_0/set_variant_item_description.py | 46 ---- .../student_admission_childtable_migrate.py | 31 --- .../v9_0/update_employee_loan_details.py | 24 -- ...te_multi_uom_fields_in_material_request.py | 12 - erpnext/patches/v9_1/__init__.py | 0 .../v9_1/create_issue_opportunity_type.py | 34 --- erpnext/patches/v9_2/__init__.py | 0 .../delete_healthcare_domain_default_items.py | 17 -- .../patches/v9_2/delete_process_payroll.py | 5 - .../v9_2/remove_company_from_patient.py | 7 - .../v9_2/rename_net_weight_in_item_master.py | 8 - .../v9_2/rename_translated_domains_in_en.py | 39 --- .../repost_reserved_qty_for_production.py | 9 - .../v9_2/set_item_name_in_production_order.py | 12 - 441 files changed, 9599 deletions(-) delete mode 100644 erpnext/patches/repair_tools/__init__.py delete mode 100644 erpnext/patches/repair_tools/set_stock_balance_as_per_serial_no.py delete mode 100644 erpnext/patches/v10_0/__init__.py delete mode 100644 erpnext/patches/v10_0/add_agriculture_domain.py delete mode 100644 erpnext/patches/v10_0/add_guardian_role_for_parent_portal.py delete mode 100644 erpnext/patches/v10_0/add_non_profit_domain.py delete mode 100644 erpnext/patches/v10_0/allow_operators_in_supplier_scorecard.py delete mode 100644 erpnext/patches/v10_0/copy_projects_renamed_fields.py delete mode 100644 erpnext/patches/v10_0/enabled_regional_print_format_based_on_country.py delete mode 100644 erpnext/patches/v10_0/fix_reserved_qty_for_sub_contract.py delete mode 100644 erpnext/patches/v10_0/recalculate_gross_margin_for_project.py delete mode 100644 erpnext/patches/v10_0/rename_schools_to_education.py delete mode 100644 erpnext/patches/v10_0/repost_gle_for_purchase_receipts_with_rejected_items.py delete mode 100644 erpnext/patches/v10_0/repost_requested_qty_for_non_stock_uom_items.py delete mode 100644 erpnext/patches/v10_0/set_auto_created_serial_no_in_stock_entry.py delete mode 100644 erpnext/patches/v10_0/set_b2c_limit.py delete mode 100644 erpnext/patches/v10_0/set_default_payment_terms_based_on_company.py delete mode 100644 erpnext/patches/v10_0/set_discount_amount.py delete mode 100644 erpnext/patches/v10_0/set_numeric_ranges_in_template_if_blank.py delete mode 100644 erpnext/patches/v10_0/set_primary_contact_for_customer.py delete mode 100644 erpnext/patches/v10_0/set_qty_in_transactions_based_on_serial_no_input.py delete mode 100644 erpnext/patches/v10_0/set_student_party_type.py delete mode 100644 erpnext/patches/v10_0/setup_vat_for_uae_and_saudi_arabia.py delete mode 100644 erpnext/patches/v10_0/show_leaves_of_all_department_members_in_calendar.py delete mode 100644 erpnext/patches/v10_0/taxes_issue_with_pos.py delete mode 100644 erpnext/patches/v10_0/update_address_template_for_india.py delete mode 100644 erpnext/patches/v10_0/update_assessment_plan.py delete mode 100644 erpnext/patches/v10_0/update_assessment_result.py delete mode 100644 erpnext/patches/v10_0/update_asset_calculate_depreciation.py delete mode 100644 erpnext/patches/v10_0/update_hub_connector_domain.py delete mode 100644 erpnext/patches/v10_0/update_lft_rgt_for_employee.py delete mode 100644 erpnext/patches/v10_0/update_project_in_sle.py delete mode 100644 erpnext/patches/v10_0/update_reserved_qty_for_purchase_order.py delete mode 100644 erpnext/patches/v10_0/update_sales_order_link_to_purchase_order.py delete mode 100644 erpnext/patches/v10_0/update_status_for_multiple_source_in_po.py delete mode 100644 erpnext/patches/v10_0/update_status_in_purchase_receipt.py delete mode 100644 erpnext/patches/v10_0/update_territory_and_customer_group.py delete mode 100644 erpnext/patches/v10_0/update_user_image_in_employee.py delete mode 100644 erpnext/patches/v10_0/update_warehouse_address_details.py delete mode 100644 erpnext/patches/v10_1/__init__.py delete mode 100644 erpnext/patches/v11_0/__init__.py delete mode 100644 erpnext/patches/v11_0/remove_subscriber_doctype.py delete mode 100644 erpnext/patches/v11_1/__init__.py delete mode 100644 erpnext/patches/v12_0/__init__.py delete mode 100644 erpnext/patches/v13_0/__init__.py delete mode 100644 erpnext/patches/v4_0/__init__.py delete mode 100644 erpnext/patches/v4_0/apply_user_permissions.py delete mode 100644 erpnext/patches/v4_0/countrywise_coa.py delete mode 100644 erpnext/patches/v4_0/create_custom_fields_for_india_specific_fields.py delete mode 100644 erpnext/patches/v4_0/create_price_list_if_missing.py delete mode 100644 erpnext/patches/v4_0/customer_discount_to_pricing_rule.py delete mode 100644 erpnext/patches/v4_0/fields_to_be_renamed.py delete mode 100644 erpnext/patches/v4_0/fix_address_template.py delete mode 100644 erpnext/patches/v4_0/fix_case_of_hr_module_def.py delete mode 100644 erpnext/patches/v4_0/fix_contact_address.py delete mode 100644 erpnext/patches/v4_0/fix_employee_user_id.py delete mode 100644 erpnext/patches/v4_0/global_defaults_to_system_settings.py delete mode 100644 erpnext/patches/v4_0/import_country_codes.py delete mode 100644 erpnext/patches/v4_0/map_charge_to_taxes_and_charges.py delete mode 100644 erpnext/patches/v4_0/move_warehouse_user_to_restrictions.py delete mode 100644 erpnext/patches/v4_0/new_address_template.py delete mode 100644 erpnext/patches/v4_0/reload_sales_print_format.py delete mode 100644 erpnext/patches/v4_0/remove_employee_role_if_no_employee.py delete mode 100644 erpnext/patches/v4_0/remove_module_home_pages.py delete mode 100644 erpnext/patches/v4_0/rename_sitemap_to_route.py delete mode 100644 erpnext/patches/v4_0/reset_permissions_for_masters.py delete mode 100644 erpnext/patches/v4_0/save_default_letterhead.py delete mode 100644 erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py delete mode 100644 erpnext/patches/v4_0/split_email_settings.py delete mode 100644 erpnext/patches/v4_0/update_account_root_type.py delete mode 100644 erpnext/patches/v4_0/update_custom_print_formats_for_renamed_fields.py delete mode 100644 erpnext/patches/v4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py delete mode 100644 erpnext/patches/v4_0/update_other_charges_in_custom_purchase_print_formats.py delete mode 100644 erpnext/patches/v4_0/update_tax_amount_after_discount.py delete mode 100644 erpnext/patches/v4_0/update_user_properties.py delete mode 100644 erpnext/patches/v4_0/update_users_report_view_settings.py delete mode 100644 erpnext/patches/v4_0/validate_v3_patch.py delete mode 100644 erpnext/patches/v4_1/__init__.py delete mode 100644 erpnext/patches/v4_1/fix_delivery_and_billing_status.py delete mode 100644 erpnext/patches/v4_1/fix_jv_remarks.py delete mode 100644 erpnext/patches/v4_1/fix_sales_order_delivered_status.py delete mode 100644 erpnext/patches/v4_1/set_outgoing_email_footer.py delete mode 100644 erpnext/patches/v4_2/__init__.py delete mode 100644 erpnext/patches/v4_2/add_currency_turkish_lira.py delete mode 100644 erpnext/patches/v4_2/default_website_style.py delete mode 100644 erpnext/patches/v4_2/delete_gl_entries_for_cancelled_invoices.py delete mode 100644 erpnext/patches/v4_2/delete_old_print_formats.py delete mode 100644 erpnext/patches/v4_2/discount_amount.py delete mode 100644 erpnext/patches/v4_2/fix_account_master_type.py delete mode 100644 erpnext/patches/v4_2/fix_gl_entries_for_stock_transactions.py delete mode 100644 erpnext/patches/v4_2/fix_recurring_orders.py delete mode 100644 erpnext/patches/v4_2/party_model.py delete mode 100644 erpnext/patches/v4_2/recalculate_bom_cost.py delete mode 100644 erpnext/patches/v4_2/repost_sle_for_si_with_no_warehouse.py delete mode 100644 erpnext/patches/v4_2/repost_stock_reconciliation.py delete mode 100644 erpnext/patches/v4_2/reset_bom_costs.py delete mode 100644 erpnext/patches/v4_2/seprate_manufacture_and_repack.py delete mode 100644 erpnext/patches/v4_2/set_company_country.py delete mode 100644 erpnext/patches/v4_2/set_item_has_batch.py delete mode 100644 erpnext/patches/v4_2/toggle_rounded_total.py delete mode 100644 erpnext/patches/v4_2/update_landed_cost_voucher.py delete mode 100644 erpnext/patches/v4_2/update_project_milestones.py delete mode 100644 erpnext/patches/v4_2/update_sales_order_invoice_field_name.py delete mode 100644 erpnext/patches/v4_2/update_stock_uom_for_dn_in_sle.py delete mode 100644 erpnext/patches/v4_4/__init__.py delete mode 100644 erpnext/patches/v4_4/make_email_accounts.py delete mode 100644 erpnext/patches/v5_0/__init__.py delete mode 100644 erpnext/patches/v5_0/convert_stock_reconciliation.py delete mode 100644 erpnext/patches/v5_0/execute_on_doctype_update.py delete mode 100644 erpnext/patches/v5_0/fix_taxes_and_totals_in_party_currency.py delete mode 100644 erpnext/patches/v5_0/index_on_account_and_gl_entry.py delete mode 100644 erpnext/patches/v5_0/is_group.py delete mode 100644 erpnext/patches/v5_0/item_patches.py delete mode 100644 erpnext/patches/v5_0/link_warehouse_with_account.py delete mode 100644 erpnext/patches/v5_0/new_crm_module.py delete mode 100644 erpnext/patches/v5_0/newsletter.py delete mode 100644 erpnext/patches/v5_0/opportunity_not_submittable.py delete mode 100644 erpnext/patches/v5_0/party_model_patch_fix.py delete mode 100644 erpnext/patches/v5_0/portal_fixes.py delete mode 100644 erpnext/patches/v5_0/project_costing.py delete mode 100644 erpnext/patches/v5_0/recalculate_total_amount_in_jv.py delete mode 100644 erpnext/patches/v5_0/reclculate_planned_operating_cost_in_production_order.py delete mode 100644 erpnext/patches/v5_0/remove_birthday_events.py delete mode 100644 erpnext/patches/v5_0/rename_customer_issue.py delete mode 100644 erpnext/patches/v5_0/rename_pos_setting.py delete mode 100644 erpnext/patches/v5_0/rename_table_fieldnames.py delete mode 100644 erpnext/patches/v5_0/rename_taxes_and_charges_master.py delete mode 100644 erpnext/patches/v5_0/rename_total_fields.py delete mode 100644 erpnext/patches/v5_0/replace_renamed_fields_in_custom_scripts_and_print_formats.py delete mode 100644 erpnext/patches/v5_0/repost_gle_for_jv_with_multiple_party.py delete mode 100644 erpnext/patches/v5_0/repost_requested_qty.py delete mode 100644 erpnext/patches/v5_0/reset_values_in_tools.py delete mode 100644 erpnext/patches/v5_0/set_appraisal_remarks.py delete mode 100644 erpnext/patches/v5_0/set_default_company_in_bom.py delete mode 100644 erpnext/patches/v5_0/set_footer_address.py delete mode 100644 erpnext/patches/v5_0/stock_entry_update_value.py delete mode 100644 erpnext/patches/v5_0/taxes_and_totals_in_party_currency.py delete mode 100644 erpnext/patches/v5_0/update_account_types.py delete mode 100644 erpnext/patches/v5_0/update_advance_paid.py delete mode 100644 erpnext/patches/v5_0/update_companywise_payment_account.py delete mode 100644 erpnext/patches/v5_0/update_dn_against_doc_fields.py delete mode 100644 erpnext/patches/v5_0/update_from_bom.py delete mode 100644 erpnext/patches/v5_0/update_frozen_accounts_permission_role.py delete mode 100644 erpnext/patches/v5_0/update_item_and_description_again.py delete mode 100644 erpnext/patches/v5_0/update_item_desc_in_invoice.py delete mode 100644 erpnext/patches/v5_0/update_item_description_and_image.py delete mode 100644 erpnext/patches/v5_0/update_item_name_in_bom.py delete mode 100644 erpnext/patches/v5_0/update_journal_entry_title.py delete mode 100644 erpnext/patches/v5_0/update_material_transfer_for_manufacture.py delete mode 100644 erpnext/patches/v5_0/update_material_transferred_for_manufacturing.py delete mode 100644 erpnext/patches/v5_0/update_material_transferred_for_manufacturing_again.py delete mode 100644 erpnext/patches/v5_0/update_operation_description.py delete mode 100644 erpnext/patches/v5_0/update_opportunity.py delete mode 100644 erpnext/patches/v5_0/update_projects.py delete mode 100644 erpnext/patches/v5_0/update_sms_sender.py delete mode 100644 erpnext/patches/v5_0/update_tax_amount_after_discount_in_purchase_cycle.py delete mode 100644 erpnext/patches/v5_0/update_temporary_account.py delete mode 100644 erpnext/patches/v5_0/update_time_log_title.py delete mode 100644 erpnext/patches/v5_1/__init__.py delete mode 100644 erpnext/patches/v5_1/default_bom.py delete mode 100644 erpnext/patches/v5_1/fix_against_account.py delete mode 100644 erpnext/patches/v5_1/rename_roles.py delete mode 100644 erpnext/patches/v5_1/sales_bom_rename.py delete mode 100644 erpnext/patches/v5_2/__init__.py delete mode 100644 erpnext/patches/v5_2/change_item_selects_to_checks.py delete mode 100644 erpnext/patches/v5_4/__init__.py delete mode 100644 erpnext/patches/v5_4/cleanup_journal_entry.py delete mode 100644 erpnext/patches/v5_4/fix_invoice_outstanding.py delete mode 100644 erpnext/patches/v5_4/fix_missing_item_images.py delete mode 100644 erpnext/patches/v5_4/fix_reserved_qty_and_sle_for_packed_items.py delete mode 100644 erpnext/patches/v5_4/notify_system_managers_regarding_wrong_tax_calculation.py delete mode 100644 erpnext/patches/v5_4/set_root_and_report_type.py delete mode 100644 erpnext/patches/v5_4/stock_entry_additional_costs.py delete mode 100644 erpnext/patches/v5_4/update_purchase_cost_against_project.py delete mode 100644 erpnext/patches/v5_7/__init__.py delete mode 100644 erpnext/patches/v5_7/item_template_attributes.py delete mode 100644 erpnext/patches/v5_8/__init__.py delete mode 100644 erpnext/patches/v5_8/add_credit_note_print_heading.py delete mode 100644 erpnext/patches/v5_8/tax_rule.py delete mode 100644 erpnext/patches/v5_8/update_order_reference_in_return_entries.py delete mode 100644 erpnext/patches/v6_0/__init__.py delete mode 100644 erpnext/patches/v6_0/default_activity_rate.py delete mode 100644 erpnext/patches/v6_0/fix_outstanding_amount.py delete mode 100644 erpnext/patches/v6_0/fix_planned_qty.py delete mode 100644 erpnext/patches/v6_0/multi_currency.py delete mode 100644 erpnext/patches/v6_0/set_default_title.py delete mode 100644 erpnext/patches/v6_10/__init__.py delete mode 100644 erpnext/patches/v6_10/email_digest_default_quote.py delete mode 100644 erpnext/patches/v6_10/fix_billed_amount_in_drop_ship_po.py delete mode 100644 erpnext/patches/v6_10/fix_delivery_status_of_drop_ship_item.py delete mode 100644 erpnext/patches/v6_10/fix_jv_total_amount.py delete mode 100644 erpnext/patches/v6_10/fix_ordered_received_billed.py delete mode 100644 erpnext/patches/v6_12/__init__.py delete mode 100644 erpnext/patches/v6_12/repost_entries_with_target_warehouse.py delete mode 100644 erpnext/patches/v6_12/set_overdue_tasks.py delete mode 100644 erpnext/patches/v6_16/__init__.py delete mode 100644 erpnext/patches/v6_16/create_manufacturer_records.py delete mode 100644 erpnext/patches/v6_16/update_billing_status_in_dn_and_pr.py delete mode 100644 erpnext/patches/v6_19/__init__.py delete mode 100644 erpnext/patches/v6_19/comment_feed_communication.py delete mode 100644 erpnext/patches/v6_2/__init__.py delete mode 100644 erpnext/patches/v6_2/fix_missing_default_taxes_and_lead.py delete mode 100644 erpnext/patches/v6_2/remove_newsletter_duplicates.py delete mode 100644 erpnext/patches/v6_20/__init__.py delete mode 100644 erpnext/patches/v6_20/set_party_account_currency_in_orders.py delete mode 100644 erpnext/patches/v6_20x/__init__.py delete mode 100644 erpnext/patches/v6_20x/remove_customer_supplier_roles.py delete mode 100644 erpnext/patches/v6_20x/remove_fiscal_year_from_holiday_list.py delete mode 100644 erpnext/patches/v6_20x/rename_project_name_to_project.py delete mode 100644 erpnext/patches/v6_20x/repost_valuation_rate_for_negative_inventory.py delete mode 100644 erpnext/patches/v6_20x/set_compact_print.py delete mode 100644 erpnext/patches/v6_20x/update_product_bundle_description.py delete mode 100644 erpnext/patches/v6_21/__init__.py delete mode 100644 erpnext/patches/v6_21/fix_reorder_level.py delete mode 100644 erpnext/patches/v6_21/rename_material_request_fields.py delete mode 100644 erpnext/patches/v6_23/__init__.py delete mode 100644 erpnext/patches/v6_23/update_stopped_status_to_closed.py delete mode 100644 erpnext/patches/v6_24/__init__.py delete mode 100644 erpnext/patches/v6_24/map_customer_address_to_shipping_address_on_po.py delete mode 100644 erpnext/patches/v6_24/set_recurring_id.py delete mode 100644 erpnext/patches/v6_27/__init__.py delete mode 100644 erpnext/patches/v6_27/fix_recurring_order_status.py delete mode 100644 erpnext/patches/v6_3/__init__.py delete mode 100644 erpnext/patches/v6_3/convert_applicable_territory.py delete mode 100644 erpnext/patches/v6_4/__init__.py delete mode 100644 erpnext/patches/v6_4/email_digest_update.py delete mode 100644 erpnext/patches/v6_4/fix_duplicate_bins.py delete mode 100644 erpnext/patches/v6_4/fix_expense_included_in_valuation.py delete mode 100644 erpnext/patches/v6_4/fix_journal_entries_due_to_reconciliation.py delete mode 100644 erpnext/patches/v6_4/fix_modified_in_sales_order_and_purchase_order.py delete mode 100644 erpnext/patches/v6_4/fix_sales_order_maintenance_status.py delete mode 100644 erpnext/patches/v6_4/fix_status_in_sales_and_purchase_order.py delete mode 100644 erpnext/patches/v6_4/make_image_thumbnail.py delete mode 100644 erpnext/patches/v6_4/repost_gle_for_journal_entries_where_reference_name_missing.py delete mode 100644 erpnext/patches/v6_4/round_status_updater_percentages.py delete mode 100644 erpnext/patches/v6_4/set_user_in_contact.py delete mode 100644 erpnext/patches/v6_5/__init__.py delete mode 100644 erpnext/patches/v6_5/show_in_website_for_template_item.py delete mode 100644 erpnext/patches/v6_6/__init__.py delete mode 100644 erpnext/patches/v6_6/fix_website_image.py delete mode 100644 erpnext/patches/v6_6/remove_fiscal_year_from_leave_allocation.py delete mode 100644 erpnext/patches/v6_8/__init__.py delete mode 100644 erpnext/patches/v6_8/make_webform_standard.py delete mode 100644 erpnext/patches/v6_8/move_drop_ship_to_po_items.py delete mode 100644 erpnext/patches/v7_0/__init__.py delete mode 100644 erpnext/patches/v7_0/calculate_total_costing_amount.py delete mode 100644 erpnext/patches/v7_0/convert_timelog_to_timesheet.py delete mode 100644 erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py delete mode 100644 erpnext/patches/v7_0/create_budget_record.py delete mode 100644 erpnext/patches/v7_0/create_warehouse_nestedset.py delete mode 100644 erpnext/patches/v7_0/fix_duplicate_icons.py delete mode 100644 erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py delete mode 100644 erpnext/patches/v7_0/make_guardian.py delete mode 100644 erpnext/patches/v7_0/make_is_group_fieldtype_as_check.py delete mode 100644 erpnext/patches/v7_0/merge_account_type_stock_and_warehouse_to_stock.py delete mode 100644 erpnext/patches/v7_0/migrate_mode_of_payments_v6_to_v7.py delete mode 100644 erpnext/patches/v7_0/migrate_schools_to_erpnext.py delete mode 100644 erpnext/patches/v7_0/move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet.py delete mode 100644 erpnext/patches/v7_0/po_status_issue_for_pr_return.py delete mode 100644 erpnext/patches/v7_0/re_route.py delete mode 100644 erpnext/patches/v7_0/remove_administrator_role_in_doctypes.py delete mode 100644 erpnext/patches/v7_0/remove_doctypes_and_reports.py delete mode 100644 erpnext/patches/v7_0/remove_features_setup.py delete mode 100644 erpnext/patches/v7_0/remove_old_earning_deduction_doctypes.py delete mode 100644 erpnext/patches/v7_0/rename_advance_table_fields.py delete mode 100644 erpnext/patches/v7_0/rename_examination_to_assessment.py delete mode 100644 erpnext/patches/v7_0/rename_fee_amount_to_fee_component.py delete mode 100644 erpnext/patches/v7_0/rename_prevdoc_fields.py delete mode 100644 erpnext/patches/v7_0/rename_salary_components.py delete mode 100644 erpnext/patches/v7_0/rename_time_sheet_doctype.py delete mode 100644 erpnext/patches/v7_0/repost_bin_qty_and_item_projected_qty.py delete mode 100644 erpnext/patches/v7_0/repost_gle_for_pi_with_update_stock.py delete mode 100644 erpnext/patches/v7_0/repost_gle_for_pos_sales_return.py delete mode 100644 erpnext/patches/v7_0/set_base_amount_in_invoice_payment_table.py delete mode 100644 erpnext/patches/v7_0/set_is_group_for_warehouse.py delete mode 100644 erpnext/patches/v7_0/set_material_request_type_in_item.py delete mode 100644 erpnext/patches/v7_0/set_naming_series_for_timesheet.py delete mode 100644 erpnext/patches/v7_0/set_party_name_in_payment_entry.py delete mode 100644 erpnext/patches/v7_0/set_portal_settings.py delete mode 100644 erpnext/patches/v7_0/setup_account_table_for_expense_claim_type_if_exists.py delete mode 100644 erpnext/patches/v7_0/system_settings_setup_complete.py delete mode 100644 erpnext/patches/v7_0/update_autoname_field.py delete mode 100644 erpnext/patches/v7_0/update_change_amount_account.py delete mode 100644 erpnext/patches/v7_0/update_conversion_factor_in_supplier_quotation_item.py delete mode 100644 erpnext/patches/v7_0/update_home_page.py delete mode 100644 erpnext/patches/v7_0/update_maintenance_module_in_doctype.py delete mode 100644 erpnext/patches/v7_0/update_mins_to_first_response.py delete mode 100644 erpnext/patches/v7_0/update_missing_employee_in_timesheet.py delete mode 100644 erpnext/patches/v7_0/update_mode_of_payment_type.py delete mode 100644 erpnext/patches/v7_0/update_party_status.py delete mode 100644 erpnext/patches/v7_0/update_prevdoc_values_for_supplier_quotation_item.py delete mode 100644 erpnext/patches/v7_0/update_project_in_gl_entry.py delete mode 100644 erpnext/patches/v7_0/update_refdoc_in_landed_cost_voucher.py delete mode 100644 erpnext/patches/v7_0/update_status_for_timesheet.py delete mode 100644 erpnext/patches/v7_0/update_status_of_po_so.py delete mode 100644 erpnext/patches/v7_0/update_status_of_zero_amount_sales_order.py delete mode 100644 erpnext/patches/v7_0/update_timesheet_communications.py delete mode 100644 erpnext/patches/v7_1/__init__.py delete mode 100644 erpnext/patches/v7_1/add_account_user_role_for_timesheet.py delete mode 100644 erpnext/patches/v7_1/add_field_for_task_dependent.py delete mode 100644 erpnext/patches/v7_1/fix_link_for_customer_from_lead.py delete mode 100644 erpnext/patches/v7_1/move_sales_invoice_from_parent_to_child_timesheet.py delete mode 100644 erpnext/patches/v7_1/rename_field_timesheet.py delete mode 100644 erpnext/patches/v7_1/rename_quality_inspection_field.py delete mode 100644 erpnext/patches/v7_1/repost_stock_for_deleted_bins_for_merging_items.py delete mode 100644 erpnext/patches/v7_1/save_stock_settings.py delete mode 100644 erpnext/patches/v7_1/set_budget_against_as_cost_center.py delete mode 100644 erpnext/patches/v7_1/set_currency_exchange_date.py delete mode 100644 erpnext/patches/v7_1/set_prefered_contact_email.py delete mode 100644 erpnext/patches/v7_1/set_sales_person_status.py delete mode 100644 erpnext/patches/v7_1/set_student_guardian.py delete mode 100644 erpnext/patches/v7_1/set_total_amount_currency_in_je.py delete mode 100644 erpnext/patches/v7_1/update_bom_base_currency.py delete mode 100644 erpnext/patches/v7_1/update_component_type.py delete mode 100644 erpnext/patches/v7_1/update_invoice_status.py delete mode 100644 erpnext/patches/v7_1/update_lead_source.py delete mode 100644 erpnext/patches/v7_1/update_missing_salary_component_type.py delete mode 100644 erpnext/patches/v7_1/update_portal_roles.py delete mode 100644 erpnext/patches/v7_1/update_total_billing_hours.py delete mode 100644 erpnext/patches/v7_2/__init__.py delete mode 100644 erpnext/patches/v7_2/arrear_leave_encashment_as_salary_component.py delete mode 100644 erpnext/patches/v7_2/contact_address_links.py delete mode 100644 erpnext/patches/v7_2/delete_fleet_management_module_def.py delete mode 100644 erpnext/patches/v7_2/empty_supplied_items_for_non_subcontracted.py delete mode 100644 erpnext/patches/v7_2/make_all_assessment_group.py delete mode 100644 erpnext/patches/v7_2/mark_students_active.py delete mode 100644 erpnext/patches/v7_2/rename_att_date_attendance.py delete mode 100644 erpnext/patches/v7_2/rename_evaluation_criteria.py delete mode 100644 erpnext/patches/v7_2/set_null_value_to_fields.py delete mode 100644 erpnext/patches/v7_2/setup_auto_close_settings.py delete mode 100644 erpnext/patches/v7_2/stock_uom_in_selling.py delete mode 100644 erpnext/patches/v7_2/update_abbr_in_salary_slips.py delete mode 100644 erpnext/patches/v7_2/update_assessment_modules.py delete mode 100644 erpnext/patches/v7_2/update_attendance_docstatus.py delete mode 100644 erpnext/patches/v7_2/update_doctype_status.py delete mode 100644 erpnext/patches/v7_2/update_guardian_name_in_student_master.py delete mode 100644 erpnext/patches/v7_2/update_party_type.py delete mode 100644 erpnext/patches/v7_2/update_salary_slips.py delete mode 100644 erpnext/patches/v7_2/update_website_for_variant.py delete mode 100644 erpnext/patches/v8_0/__init__.py delete mode 100644 erpnext/patches/v8_0/addresses_linked_to_lead.py delete mode 100644 erpnext/patches/v8_0/change_in_words_varchar_length.py delete mode 100644 erpnext/patches/v8_0/create_address_doc_from_address_field_in_company.py delete mode 100644 erpnext/patches/v8_0/create_domain_docs.py delete mode 100644 erpnext/patches/v8_0/delete_bin_indexes.py delete mode 100644 erpnext/patches/v8_0/delete_schools_depricated_doctypes.py delete mode 100644 erpnext/patches/v8_0/disable_instructor_role.py delete mode 100644 erpnext/patches/v8_0/enable_booking_asset_depreciation_automatically.py delete mode 100644 erpnext/patches/v8_0/fix_status_for_invoices_with_negative_outstanding.py delete mode 100644 erpnext/patches/v8_0/make_payments_table_blank_for_non_pos_invoice.py delete mode 100644 erpnext/patches/v8_0/merge_student_batch_and_student_group.py delete mode 100644 erpnext/patches/v8_0/move_account_head_from_account_to_warehouse_for_inventory.py delete mode 100644 erpnext/patches/v8_0/move_perpetual_inventory_setting.py delete mode 100644 erpnext/patches/v8_0/rename_is_sample_item_to_allow_zero_valuation_rate.py delete mode 100644 erpnext/patches/v8_0/rename_items_in_status_field_of_material_request.py delete mode 100644 erpnext/patches/v8_0/rename_total_margin_to_rate_with_margin.py delete mode 100644 erpnext/patches/v8_0/repost_reserved_qty_for_multiple_sales_uom.py delete mode 100644 erpnext/patches/v8_0/revert_manufacturers_table_from_item.py delete mode 100644 erpnext/patches/v8_0/save_system_settings.py delete mode 100644 erpnext/patches/v8_0/set_null_to_serial_nos_for_disabled_sales_invoices.py delete mode 100644 erpnext/patches/v8_0/set_project_copied_from.py delete mode 100644 erpnext/patches/v8_0/set_sales_invoice_serial_number_from_delivery_note.py delete mode 100644 erpnext/patches/v8_0/update_customer_pos_id.py delete mode 100644 erpnext/patches/v8_0/update_production_orders.py delete mode 100644 erpnext/patches/v8_0/update_sales_cost_in_project.py delete mode 100644 erpnext/patches/v8_0/update_status_as_paid_for_completed_expense_claim.py delete mode 100644 erpnext/patches/v8_0/update_stock_qty_value_in_bom_item.py delete mode 100644 erpnext/patches/v8_0/update_stock_qty_value_in_purchase_invoice.py delete mode 100644 erpnext/patches/v8_0/update_student_groups_from_student_batches.py delete mode 100644 erpnext/patches/v8_0/update_supplier_address_in_stock_entry.py delete mode 100644 erpnext/patches/v8_1/__init__.py delete mode 100644 erpnext/patches/v8_1/add_hsn_sac_codes.py delete mode 100644 erpnext/patches/v8_1/add_indexes_in_transaction_doctypes.py delete mode 100644 erpnext/patches/v8_1/allow_invoice_copy_to_edit_after_submit.py delete mode 100644 erpnext/patches/v8_1/delete_deprecated_reports.py delete mode 100644 erpnext/patches/v8_1/gst_fixes.py delete mode 100644 erpnext/patches/v8_1/remove_sales_invoice_from_returned_serial_no.py delete mode 100644 erpnext/patches/v8_1/removed_report_support_hours.py delete mode 100644 erpnext/patches/v8_1/set_delivery_date_in_so_item.py delete mode 100644 erpnext/patches/v8_1/update_expense_claim_status.py delete mode 100644 erpnext/patches/v8_1/update_gst_state.py delete mode 100644 erpnext/patches/v8_10/__init__.py delete mode 100644 erpnext/patches/v8_10/change_default_customer_credit_days.py delete mode 100644 erpnext/patches/v8_3/__init__.py delete mode 100644 erpnext/patches/v8_3/set_restrict_to_domain_for_module_def.py delete mode 100644 erpnext/patches/v8_3/update_company_total_sales.py delete mode 100644 erpnext/patches/v8_4/__init__.py delete mode 100644 erpnext/patches/v8_4/make_scorecard_records.py delete mode 100644 erpnext/patches/v8_5/__init__.py delete mode 100644 erpnext/patches/v8_5/fix_tax_breakup_for_non_invoice_docs.py delete mode 100644 erpnext/patches/v8_5/remove_project_type_property_setter.py delete mode 100644 erpnext/patches/v8_5/remove_quotations_route_in_sidebar.py delete mode 100644 erpnext/patches/v8_5/set_default_mode_of_payment.py delete mode 100644 erpnext/patches/v8_5/update_customer_group_in_POS_profile.py delete mode 100644 erpnext/patches/v8_5/update_existing_data_in_project_type.py delete mode 100644 erpnext/patches/v8_6/__init__.py delete mode 100644 erpnext/patches/v8_6/point_sms_doctype_module_to_frappe_core.py delete mode 100644 erpnext/patches/v8_6/rename_bom_update_tool.py delete mode 100644 erpnext/patches/v8_6/set_write_permission_for_quotation_for_sales_manager.py delete mode 100644 erpnext/patches/v8_6/update_timesheet_company_from_PO.py delete mode 100644 erpnext/patches/v8_7/__init__.py delete mode 100644 erpnext/patches/v8_7/fix_purchase_receipt_status.py delete mode 100644 erpnext/patches/v8_7/make_subscription_from_recurring_data.py delete mode 100644 erpnext/patches/v8_8/__init__.py delete mode 100644 erpnext/patches/v8_8/add_new_fields_in_accounts_settings.py delete mode 100644 erpnext/patches/v8_8/set_bom_rate_as_per_uom.py delete mode 100644 erpnext/patches/v8_9/__init__.py delete mode 100644 erpnext/patches/v8_9/add_setup_progress_actions.py delete mode 100644 erpnext/patches/v8_9/delete_gst_doctypes_for_outside_india_accounts.py delete mode 100644 erpnext/patches/v8_9/remove_employee_from_salary_structure_parent.py delete mode 100644 erpnext/patches/v8_9/rename_company_sales_target_field.py delete mode 100644 erpnext/patches/v8_9/set_default_customer_group.py delete mode 100644 erpnext/patches/v8_9/set_default_fields_in_variant_settings.py delete mode 100644 erpnext/patches/v8_9/set_member_party_type.py delete mode 100644 erpnext/patches/v8_9/set_print_zero_amount_taxes.py delete mode 100644 erpnext/patches/v8_9/update_billing_gstin_for_indian_account.py delete mode 100644 erpnext/patches/v9_0/__init__.py delete mode 100644 erpnext/patches/v9_0/add_healthcare_domain.py delete mode 100644 erpnext/patches/v9_0/add_user_to_child_table_in_pos_profile.py delete mode 100644 erpnext/patches/v9_0/copy_old_fees_field_data.py delete mode 100644 erpnext/patches/v9_0/remove_non_existing_warehouse_from_stock_settings.py delete mode 100644 erpnext/patches/v9_0/remove_subscription_module.py delete mode 100644 erpnext/patches/v9_0/revert_manufacturing_user_role.py delete mode 100644 erpnext/patches/v9_0/set_pos_profile_name.py delete mode 100644 erpnext/patches/v9_0/set_schedule_date_for_material_request_and_purchase_order.py delete mode 100644 erpnext/patches/v9_0/set_shipping_type_for_existing_shipping_rules.py delete mode 100644 erpnext/patches/v9_0/set_uoms_in_variant_field.py delete mode 100644 erpnext/patches/v9_0/set_variant_item_description.py delete mode 100644 erpnext/patches/v9_0/student_admission_childtable_migrate.py delete mode 100644 erpnext/patches/v9_0/update_employee_loan_details.py delete mode 100644 erpnext/patches/v9_0/update_multi_uom_fields_in_material_request.py delete mode 100644 erpnext/patches/v9_1/__init__.py delete mode 100644 erpnext/patches/v9_1/create_issue_opportunity_type.py delete mode 100644 erpnext/patches/v9_2/__init__.py delete mode 100644 erpnext/patches/v9_2/delete_healthcare_domain_default_items.py delete mode 100644 erpnext/patches/v9_2/delete_process_payroll.py delete mode 100644 erpnext/patches/v9_2/remove_company_from_patient.py delete mode 100644 erpnext/patches/v9_2/rename_net_weight_in_item_master.py delete mode 100644 erpnext/patches/v9_2/rename_translated_domains_in_en.py delete mode 100644 erpnext/patches/v9_2/repost_reserved_qty_for_production.py delete mode 100644 erpnext/patches/v9_2/set_item_name_in_production_order.py diff --git a/erpnext/patches/repair_tools/__init__.py b/erpnext/patches/repair_tools/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/repair_tools/set_stock_balance_as_per_serial_no.py b/erpnext/patches/repair_tools/set_stock_balance_as_per_serial_no.py deleted file mode 100644 index 5a421d146f..0000000000 --- a/erpnext/patches/repair_tools/set_stock_balance_as_per_serial_no.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 - -def execute(): - from erpnext.stock.stock_balance import set_stock_balance_as_per_serial_no - frappe.db.auto_commit_on_many_writes = 1 - - set_stock_balance_as_per_serial_no() - - frappe.db.auto_commit_on_many_writes = 0 diff --git a/erpnext/patches/v10_0/__init__.py b/erpnext/patches/v10_0/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v10_0/add_agriculture_domain.py b/erpnext/patches/v10_0/add_agriculture_domain.py deleted file mode 100644 index c18e69f3e6..0000000000 --- a/erpnext/patches/v10_0/add_agriculture_domain.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - domain = 'Agriculture' - if not frappe.db.exists('Domain', domain): - frappe.get_doc({ - 'doctype': 'Domain', - 'domain': domain - }).insert(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/patches/v10_0/add_guardian_role_for_parent_portal.py b/erpnext/patches/v10_0/add_guardian_role_for_parent_portal.py deleted file mode 100644 index 0b891f21f4..0000000000 --- a/erpnext/patches/v10_0/add_guardian_role_for_parent_portal.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - # create guardian role - if not frappe.get_value('Role', dict(role_name='Guardian')): - frappe.get_doc({ - 'doctype': 'Role', - 'role_name': 'Guardian', - 'desk_access': 0, - 'restrict_to_domain': 'Education' - }).insert(ignore_permissions=True) - - # set guardian roles in already created users - if frappe.db.exists("Doctype", "Guardian"): - for user in frappe.db.sql_list("""select u.name from `tabUser` u , `tabGuardian` g where g.email_address = u.name"""): - user = frappe.get_doc('User', user) - user.flags.ignore_validate = True - user.flags.ignore_mandatory = True - user.save() diff --git a/erpnext/patches/v10_0/add_non_profit_domain.py b/erpnext/patches/v10_0/add_non_profit_domain.py deleted file mode 100644 index b03d669515..0000000000 --- a/erpnext/patches/v10_0/add_non_profit_domain.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - domain = 'Non Profit' - if not frappe.db.exists('Domain', domain): - frappe.get_doc({ - 'doctype': 'Domain', - 'domain': domain - }).insert(ignore_permissions=True) - - frappe.get_doc({ - 'doctype': 'Role', - 'role_name': 'Non Profit Portal User', - 'desk_access': 0, - 'restrict_to_domain': domain - }).insert(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/patches/v10_0/allow_operators_in_supplier_scorecard.py b/erpnext/patches/v10_0/allow_operators_in_supplier_scorecard.py deleted file mode 100644 index 827f9bc94f..0000000000 --- a/erpnext/patches/v10_0/allow_operators_in_supplier_scorecard.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2019, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('buying', 'doctype', 'supplier_scorecard_criteria') - frappe.reload_doc('buying', 'doctype', 'supplier_scorecard_scoring_criteria') - frappe.reload_doc('buying', 'doctype', 'supplier_scorecard') - - for criteria in frappe.get_all('Supplier Scorecard Criteria', fields=['name', 'formula'], limit_page_length=None): - frappe.db.set_value('Supplier Scorecard Criteria', criteria.name, - 'formula', criteria.formula.replace('<','<').replace('>','>')) - - for criteria in frappe.get_all('Supplier Scorecard Scoring Criteria', fields=['name', 'formula'], limit_page_length=None): - if criteria.formula: # not mandatory - frappe.db.set_value('Supplier Scorecard Scoring Criteria', criteria.name, - 'formula', criteria.formula.replace('<','<').replace('>','>')) - - for sc in frappe.get_all('Supplier Scorecard', fields=['name', 'weighting_function'], limit_page_length=None): - frappe.db.set_value('Supplier Scorecard', sc.name, 'weighting_function', - sc.weighting_function.replace('<','<').replace('>','>')) \ No newline at end of file diff --git a/erpnext/patches/v10_0/copy_projects_renamed_fields.py b/erpnext/patches/v10_0/copy_projects_renamed_fields.py deleted file mode 100644 index 80db3bdd1e..0000000000 --- a/erpnext/patches/v10_0/copy_projects_renamed_fields.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - """ copy data from old fields to new """ - frappe.reload_doc("projects", "doctype", "project") - - if frappe.db.has_column('Project', 'total_sales_cost'): - rename_field('Project', "total_sales_cost", "total_sales_amount") - - if frappe.db.has_column('Project', 'total_billing_amount'): - rename_field('Project', "total_billing_amount", "total_billable_amount") \ No newline at end of file diff --git a/erpnext/patches/v10_0/enabled_regional_print_format_based_on_country.py b/erpnext/patches/v10_0/enabled_regional_print_format_based_on_country.py deleted file mode 100644 index 38b04cebc2..0000000000 --- a/erpnext/patches/v10_0/enabled_regional_print_format_based_on_country.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - print_format_mapper = { - 'India': ['GST POS Invoice', 'GST Tax Invoice'], - 'Saudi Arabia': ['Simplified Tax Invoice', 'Detailed Tax Invoice', 'Tax Invoice'], - 'United Arab Emirates': ['Simplified Tax Invoice', 'Detailed Tax Invoice', 'Tax Invoice'] - } - - frappe.db.sql(""" update `tabPrint Format` set disabled = 1 where name - in ('GST POS Invoice', 'GST Tax Invoice', 'Simplified Tax Invoice', 'Detailed Tax Invoice')""") - - for d in frappe.get_all('Company', fields = ["country"], - filters={'country': ('in', ['India', 'Saudi Arabia', 'United Arab Emirates'])}): - if print_format_mapper.get(d.country): - print_formats = print_format_mapper.get(d.country) - frappe.db.sql(""" update `tabPrint Format` set disabled = 0 - where name in (%s)""" % ", ".join(["%s"]*len(print_formats)), tuple(print_formats)) \ No newline at end of file diff --git a/erpnext/patches/v10_0/fix_reserved_qty_for_sub_contract.py b/erpnext/patches/v10_0/fix_reserved_qty_for_sub_contract.py deleted file mode 100644 index c0a9e5eb5b..0000000000 --- a/erpnext/patches/v10_0/fix_reserved_qty_for_sub_contract.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from erpnext.stock.utils import get_bin - -def execute(): - frappe.reload_doc("stock", "doctype", "bin") - frappe.reload_doc("buying", "doctype", "purchase_order_item_supplied") - for d in frappe.db.sql(""" - select distinct rm_item_code, reserve_warehouse - from `tabPurchase Order Item Supplied` - where docstatus=1 and reserve_warehouse is not null and reserve_warehouse != ''"""): - - try: - bin_doc = get_bin(d[0], d[1]) - bin_doc.update_reserved_qty_for_sub_contracting() - except: - pass - - for d in frappe.db.sql("""select distinct item_code, source_warehouse - from `tabWork Order Item` - where docstatus=1 and transferred_qty > required_qty - and source_warehouse is not null and source_warehouse != ''""", as_list=1): - - try: - bin_doc = get_bin(d[0], d[1]) - bin_doc.update_reserved_qty_for_production() - except: - pass diff --git a/erpnext/patches/v10_0/recalculate_gross_margin_for_project.py b/erpnext/patches/v10_0/recalculate_gross_margin_for_project.py deleted file mode 100644 index 6d461f3bc9..0000000000 --- a/erpnext/patches/v10_0/recalculate_gross_margin_for_project.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('projects', 'doctype', 'project') - for d in frappe.db.sql(""" select name from `tabProject` where - ifnull(total_consumed_material_cost, 0 ) > 0 and ifnull(total_billed_amount, 0) > 0""", as_dict=1): - doc = frappe.get_doc("Project", d.name) - doc.calculate_gross_margin() - doc.db_set('gross_margin', doc.gross_margin) - doc.db_set('per_gross_margin', doc.per_gross_margin) \ No newline at end of file diff --git a/erpnext/patches/v10_0/rename_schools_to_education.py b/erpnext/patches/v10_0/rename_schools_to_education.py deleted file mode 100644 index 85c25a8943..0000000000 --- a/erpnext/patches/v10_0/rename_schools_to_education.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - # rename the School module as Education - - # rename the school module - if frappe.db.exists('Module Def', 'Schools') and not frappe.db.exists('Module Def', 'Education'): - frappe.rename_doc("Module Def", "Schools", "Education") - - # delete the school module - if frappe.db.exists('Module Def', 'Schools') and frappe.db.exists('Module Def', 'Education'): - frappe.db.sql("""delete from `tabModule Def` where module_name = 'Schools'""") - - - # rename "School Settings" to the "Education Settings - if frappe.db.exists('DocType', 'School Settings'): - frappe.rename_doc("DocType", "School Settings", "Education Settings", force=True) - frappe.reload_doc("education", "doctype", "education_settings") - - # delete the discussion web form if exists - if frappe.db.exists('Web Form', 'Discussion'): - frappe.db.sql("""delete from `tabWeb Form` where name = 'discussion'""") - - # rename the select option field from "School Bus" to "Institute's Bus" - frappe.reload_doc("education", "doctype", "Program Enrollment") - if "mode_of_transportation" in frappe.db.get_table_columns("Program Enrollment"): - frappe.db.sql("""update `tabProgram Enrollment` set mode_of_transportation = "Institute's Bus" - where mode_of_transportation = "School Bus" """) diff --git a/erpnext/patches/v10_0/repost_gle_for_purchase_receipts_with_rejected_items.py b/erpnext/patches/v10_0/repost_gle_for_purchase_receipts_with_rejected_items.py deleted file mode 100644 index e6546e386b..0000000000 --- a/erpnext/patches/v10_0/repost_gle_for_purchase_receipts_with_rejected_items.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe, erpnext - -def execute(): - for company in frappe.get_all("Company"): - if not erpnext.is_perpetual_inventory_enabled(company.name): - continue - - acc_frozen_upto = frappe.db.get_value("Accounts Settings", None, "acc_frozen_upto") or "1900-01-01" - pr_with_rejected_warehouse = frappe.db.sql(""" - select pr.name - from `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pr_item - where pr.name = pr_item.parent - and pr.posting_date > %s - and pr.docstatus=1 - and pr.company = %s - and pr_item.rejected_qty > 0 - """, (acc_frozen_upto, company.name), as_dict=1) - - for d in pr_with_rejected_warehouse: - doc = frappe.get_doc("Purchase Receipt", d.name) - - doc.docstatus = 2 - doc.make_gl_entries_on_cancel() - - - # update gl entries for submit state of PR - doc.docstatus = 1 - doc.make_gl_entries() diff --git a/erpnext/patches/v10_0/repost_requested_qty_for_non_stock_uom_items.py b/erpnext/patches/v10_0/repost_requested_qty_for_non_stock_uom_items.py deleted file mode 100644 index 4fe4e97cf5..0000000000 --- a/erpnext/patches/v10_0/repost_requested_qty_for_non_stock_uom_items.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2019, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - from erpnext.stock.stock_balance import update_bin_qty, get_indented_qty - - count=0 - for item_code, warehouse in frappe.db.sql("""select distinct item_code, warehouse - from `tabMaterial Request Item` where docstatus = 1 and stock_uom<>uom"""): - try: - count += 1 - update_bin_qty(item_code, warehouse, { - "indented_qty": get_indented_qty(item_code, warehouse), - }) - if count % 200 == 0: - frappe.db.commit() - except: - frappe.db.rollback() diff --git a/erpnext/patches/v10_0/set_auto_created_serial_no_in_stock_entry.py b/erpnext/patches/v10_0/set_auto_created_serial_no_in_stock_entry.py deleted file mode 100644 index c6470f21d7..0000000000 --- a/erpnext/patches/v10_0/set_auto_created_serial_no_in_stock_entry.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - serialised_items = [d.name for d in frappe.get_all("Item", filters={"has_serial_no": 1})] - - if not serialised_items: - return - - for dt in ["Stock Entry Detail", "Purchase Receipt Item", "Purchase Invoice Item"]: - cond = "" - if dt=="Purchase Invoice Item": - cond = """ and parent in (select name from `tabPurchase Invoice` - where `tabPurchase Invoice`.name = `tabPurchase Invoice Item`.parent and update_stock=1)""" - - item_rows = frappe.db.sql(""" - select name - from `tab{0}` - where conversion_factor != 1 - and docstatus = 1 - and ifnull(serial_no, '') = '' - and item_code in ({1}) - {2} - """.format(dt, ', '.join(['%s']*len(serialised_items)), cond), tuple(serialised_items)) - - if item_rows: - sle_serial_nos = dict(frappe.db.sql(""" - select voucher_detail_no, serial_no - from `tabStock Ledger Entry` - where ifnull(serial_no, '') != '' - and voucher_detail_no in (%s) - """.format(', '.join(['%s']*len(item_rows))), - tuple([d[0] for d in item_rows]))) - - batch_size = 100 - for i in range(0, len(item_rows), batch_size): - batch_item_rows = item_rows[i:i + batch_size] - when_then = [] - for item_row in batch_item_rows: - - when_then.append('WHEN `name` = "{row_name}" THEN "{value}"'.format( - row_name=item_row[0], - value=sle_serial_nos.get(item_row[0]))) - - frappe.db.sql(""" - update - `tab{doctype}` - set - serial_no = CASE {when_then_cond} ELSE `serial_no` END - """.format( - doctype = dt, - when_then_cond=" ".join(when_then) - )) \ No newline at end of file diff --git a/erpnext/patches/v10_0/set_b2c_limit.py b/erpnext/patches/v10_0/set_b2c_limit.py deleted file mode 100644 index 5d964e681a..0000000000 --- a/erpnext/patches/v10_0/set_b2c_limit.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("regional", "doctype", "gst_settings") - frappe.reload_doc("accounts", "doctype", "gst_account") - gst_settings = frappe.get_doc("GST Settings") - gst_settings.b2c_limit = 250000 - gst_settings.save() diff --git a/erpnext/patches/v10_0/set_default_payment_terms_based_on_company.py b/erpnext/patches/v10_0/set_default_payment_terms_based_on_company.py deleted file mode 100644 index a90e096390..0000000000 --- a/erpnext/patches/v10_0/set_default_payment_terms_based_on_company.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext.patches.v8_10.change_default_customer_credit_days import make_payment_term, make_template - -def execute(): - for dt in ("Company", "Customer Group"): - frappe.reload_doc("setup", "doctype", frappe.scrub(dt)) - - credit_records = frappe.db.sql(""" - SELECT DISTINCT `credit_days`, `credit_days_based_on`, `name` - from `tab{0}` - where - ((credit_days_based_on='Fixed Days' or credit_days_based_on is null) and credit_days is not null) - or credit_days_based_on='Last Day of the Next Month' - """.format(dt), as_dict=1) - - for d in credit_records: - template = create_payment_terms_template(d) - - frappe.db.sql(""" - update `tab{0}` - set `payment_terms` = %s - where name = %s - """.format(dt), (template.name, d.name)) - -def create_payment_terms_template(data): - if data.credit_days_based_on == "Fixed Days": - pyt_template_name = 'Default Payment Term - N{0}'.format(data.credit_days) - else: - pyt_template_name = 'Default Payment Term - EO2M' - - if not frappe.db.exists("Payment Terms Template", pyt_template_name): - payment_term = make_payment_term(data.credit_days, data.credit_days_based_on) - template = make_template(payment_term) - else: - template = frappe.get_doc("Payment Terms Template", pyt_template_name) - return template \ No newline at end of file diff --git a/erpnext/patches/v10_0/set_discount_amount.py b/erpnext/patches/v10_0/set_discount_amount.py deleted file mode 100644 index d5e2c5a84b..0000000000 --- a/erpnext/patches/v10_0/set_discount_amount.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import unicode_literals - -import frappe - -def execute(): - frappe.reload_doc("accounts", "doctype", "sales_invoice_item") - frappe.reload_doc('accounts', 'doctype', 'purchase_invoice_item') - frappe.reload_doc('buying', 'doctype', 'purchase_order_item') - frappe.reload_doc('buying', 'doctype', 'supplier_quotation_item') - frappe.reload_doc('selling', 'doctype', 'sales_order_item') - frappe.reload_doc('selling', 'doctype', 'quotation_item') - frappe.reload_doc('stock', 'doctype', 'delivery_note_item') - frappe.reload_doc('stock', 'doctype', 'purchase_receipt_item') - - selling_doctypes = ["Sales Order Item", "Sales Invoice Item", "Delivery Note Item", "Quotation Item"] - buying_doctypes = ["Purchase Order Item", "Purchase Invoice Item", "Purchase Receipt Item", "Supplier Quotation Item"] - - for doctype in selling_doctypes: - frappe.db.sql(''' - UPDATE - `tab%s` - SET - discount_amount = if(rate_with_margin > 0, rate_with_margin, price_list_rate) * discount_percentage / 100 - WHERE - discount_percentage > 0 - ''' % (doctype)) - for doctype in buying_doctypes: - frappe.db.sql(''' - UPDATE - `tab%s` - SET - discount_amount = price_list_rate * discount_percentage / 100 - WHERE - discount_percentage > 0 - ''' % (doctype)) \ No newline at end of file diff --git a/erpnext/patches/v10_0/set_numeric_ranges_in_template_if_blank.py b/erpnext/patches/v10_0/set_numeric_ranges_in_template_if_blank.py deleted file mode 100644 index 6825f19d74..0000000000 --- a/erpnext/patches/v10_0/set_numeric_ranges_in_template_if_blank.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - item_numeric_attributes = frappe.db.sql(""" - select name, numeric_values, from_range, to_range, increment - from `tabItem Attribute` - where numeric_values = 1 - """, as_dict=1) - - for d in item_numeric_attributes: - frappe.db.sql(""" - update `tabItem Variant Attribute` - set - from_range = CASE - WHEN from_range = 0 THEN %(from_range)s - ELSE from_range - END, - to_range = CASE - WHEN to_range = 0 THEN %(to_range)s - ELSE to_range - END, - increment = CASE - WHEN increment = 0 THEN %(increment)s - ELSE increment - END, - numeric_values = %(numeric_values)s - where - attribute = %(name)s - and exists(select name from tabItem - where name=`tabItem Variant Attribute`.parent and has_variants=1) - """, d) \ No newline at end of file diff --git a/erpnext/patches/v10_0/set_primary_contact_for_customer.py b/erpnext/patches/v10_0/set_primary_contact_for_customer.py deleted file mode 100644 index ae0b31c21f..0000000000 --- a/erpnext/patches/v10_0/set_primary_contact_for_customer.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('Customer') - - frappe.db.sql(""" - update - `tabCustomer`, ( - select `tabContact`.name, `tabContact`.mobile_no, `tabContact`.email_id, - `tabDynamic Link`.link_name from `tabContact`, `tabDynamic Link` - where `tabContact`.name = `tabDynamic Link`.parent and - `tabDynamic Link`.link_doctype = 'Customer' and `tabContact`.is_primary_contact = 1 - ) as contact - set - `tabCustomer`.customer_primary_contact = contact.name, - `tabCustomer`.mobile_no = contact.mobile_no, `tabCustomer`.email_id = contact.email_id - where `tabCustomer`.name = contact.link_name""") \ No newline at end of file diff --git a/erpnext/patches/v10_0/set_qty_in_transactions_based_on_serial_no_input.py b/erpnext/patches/v10_0/set_qty_in_transactions_based_on_serial_no_input.py deleted file mode 100644 index 083b7f4b20..0000000000 --- a/erpnext/patches/v10_0/set_qty_in_transactions_based_on_serial_no_input.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("stock", "doctype", "stock_settings") - - ss = frappe.get_doc("Stock Settings") - ss.set_qty_in_transactions_based_on_serial_no_input = 1 - - if ss.default_warehouse \ - and not frappe.db.exists("Warehouse", ss.default_warehouse): - ss.default_warehouse = None - - if ss.stock_uom and not frappe.db.exists("UOM", ss.stock_uom): - ss.stock_uom = None - - ss.flags.ignore_mandatory = True - ss.save() \ No newline at end of file diff --git a/erpnext/patches/v10_0/set_student_party_type.py b/erpnext/patches/v10_0/set_student_party_type.py deleted file mode 100644 index 08376ae894..0000000000 --- a/erpnext/patches/v10_0/set_student_party_type.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if not frappe.db.exists("Party Type", "Student"): - party = frappe.new_doc("Party Type") - party.party_type = "Student" - party.save() diff --git a/erpnext/patches/v10_0/setup_vat_for_uae_and_saudi_arabia.py b/erpnext/patches/v10_0/setup_vat_for_uae_and_saudi_arabia.py deleted file mode 100644 index a8d90499d8..0000000000 --- a/erpnext/patches/v10_0/setup_vat_for_uae_and_saudi_arabia.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from erpnext.setup.doctype.company.company import install_country_fixtures - -def execute(): - frappe.reload_doc("accounts", "doctype", "account") - frappe.reload_doc("accounts", "doctype", "payment_schedule") - for d in frappe.get_all('Company', - filters={'country': ('in', ['Saudi Arabia', 'United Arab Emirates'])}): - install_country_fixtures(d.name) \ No newline at end of file diff --git a/erpnext/patches/v10_0/show_leaves_of_all_department_members_in_calendar.py b/erpnext/patches/v10_0/show_leaves_of_all_department_members_in_calendar.py deleted file mode 100644 index 7e2ff7a8a7..0000000000 --- a/erpnext/patches/v10_0/show_leaves_of_all_department_members_in_calendar.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("hr", "doctype", "hr_settings") - frappe.db.set_value("HR Settings", None, "show_leaves_of_all_department_members_in_calendar", 1) \ No newline at end of file diff --git a/erpnext/patches/v10_0/taxes_issue_with_pos.py b/erpnext/patches/v10_0/taxes_issue_with_pos.py deleted file mode 100644 index 2a3275ac2c..0000000000 --- a/erpnext/patches/v10_0/taxes_issue_with_pos.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - for d in frappe.get_all('Sales Invoice', fields=["name"], - filters = {'is_pos':1, 'docstatus': 1, 'creation': ('>', '2018-04-23')}): - doc = frappe.get_doc('Sales Invoice', d.name) - if (not doc.taxes and doc.taxes_and_charges and doc.pos_profile and doc.outstanding_amount != 0 and - frappe.db.get_value('POS Profile', doc.pos_profile, 'taxes_and_charges', cache=True) == doc.taxes_and_charges): - - doc.append_taxes_from_master() - doc.calculate_taxes_and_totals() - for d in doc.taxes: - d.db_update() - - doc.db_update() - - delete_gle_for_voucher(doc.name) - doc.make_gl_entries() - -def delete_gle_for_voucher(voucher_no): - frappe.db.sql("""delete from `tabGL Entry` where voucher_no = %(voucher_no)s""", - {'voucher_no': voucher_no}) \ No newline at end of file diff --git a/erpnext/patches/v10_0/update_address_template_for_india.py b/erpnext/patches/v10_0/update_address_template_for_india.py deleted file mode 100644 index 1ddca93760..0000000000 --- a/erpnext/patches/v10_0/update_address_template_for_india.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from erpnext.regional.address_template.setup import set_up_address_templates - -def execute(): - if frappe.db.get_value('Company', {'country': 'India'}, 'name'): - address_template = frappe.db.get_value('Address Template', 'India', 'template') - if not address_template or "gstin" not in address_template: - set_up_address_templates(default_country='India') diff --git a/erpnext/patches/v10_0/update_assessment_plan.py b/erpnext/patches/v10_0/update_assessment_plan.py deleted file mode 100644 index 174623c1a4..0000000000 --- a/erpnext/patches/v10_0/update_assessment_plan.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('education', 'doctype', 'assessment_plan') - - frappe.db.sql(""" - UPDATE `tabAssessment Plan` as ap - INNER JOIN `tabStudent Group` as sg ON sg.name = ap.student_group - SET ap.academic_term = sg.academic_term, - ap.academic_year = sg.academic_year, - ap.program = sg.program - WHERE ap.docstatus = 1 - """) \ No newline at end of file diff --git a/erpnext/patches/v10_0/update_assessment_result.py b/erpnext/patches/v10_0/update_assessment_result.py deleted file mode 100644 index 96218db972..0000000000 --- a/erpnext/patches/v10_0/update_assessment_result.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('education', 'doctype', 'assessment_result') - - frappe.db.sql(""" - UPDATE `tabAssessment Result` AS ar - INNER JOIN `tabAssessment Plan` AS ap ON ap.name = ar.assessment_plan - SET ar.academic_term = ap.academic_term, - ar.academic_year = ap.academic_year, - ar.program = ap.program, - ar.course = ap.course, - ar.assessment_group = ap.assessment_group, - ar.student_group = ap.student_group - WHERE ap.docstatus = 1 - """) \ No newline at end of file diff --git a/erpnext/patches/v10_0/update_asset_calculate_depreciation.py b/erpnext/patches/v10_0/update_asset_calculate_depreciation.py deleted file mode 100644 index b947a40b4a..0000000000 --- a/erpnext/patches/v10_0/update_asset_calculate_depreciation.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('assets', 'doctype', 'asset') - frappe.reload_doc('assets', 'doctype', 'depreciation_schedule') - - frappe.db.sql(""" - update tabAsset a - set calculate_depreciation = 1 - where exists(select ds.name from `tabDepreciation Schedule` ds where ds.parent=a.name) - """) \ No newline at end of file diff --git a/erpnext/patches/v10_0/update_hub_connector_domain.py b/erpnext/patches/v10_0/update_hub_connector_domain.py deleted file mode 100644 index baf580a369..0000000000 --- a/erpnext/patches/v10_0/update_hub_connector_domain.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.table_exists("Data Migration Connector"): - frappe.db.sql(""" - UPDATE `tabData Migration Connector` - SET hostname = 'https://hubmarket.org' - WHERE connector_name = 'Hub Connector' - """) \ No newline at end of file diff --git a/erpnext/patches/v10_0/update_lft_rgt_for_employee.py b/erpnext/patches/v10_0/update_lft_rgt_for_employee.py deleted file mode 100644 index 46ca786e0d..0000000000 --- a/erpnext/patches/v10_0/update_lft_rgt_for_employee.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils.nestedset import rebuild_tree - -def execute(): - """ assign lft and rgt appropriately """ - frappe.reload_doc("hr", "doctype", "employee") - - rebuild_tree("Employee", "reports_to") \ No newline at end of file diff --git a/erpnext/patches/v10_0/update_project_in_sle.py b/erpnext/patches/v10_0/update_project_in_sle.py deleted file mode 100644 index 08c64f18d8..0000000000 --- a/erpnext/patches/v10_0/update_project_in_sle.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - for doctype in ['Sales Invoice', 'Delivery Note', 'Stock Entry']: - frappe.db.sql(""" update - `tabStock Ledger Entry` sle, `tab{0}` parent_doc - set - sle.project = parent_doc.project - where - sle.voucher_no = parent_doc.name and sle.voucher_type = %s and sle.project is null - and parent_doc.project is not null and parent_doc.project != ''""".format(doctype), doctype) diff --git a/erpnext/patches/v10_0/update_reserved_qty_for_purchase_order.py b/erpnext/patches/v10_0/update_reserved_qty_for_purchase_order.py deleted file mode 100644 index 7b2c36698a..0000000000 --- a/erpnext/patches/v10_0/update_reserved_qty_for_purchase_order.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext.stock.utils import get_bin - -def execute(): - po_item = list(frappe.db.sql((""" - select distinct po.name as poname, poitem.rm_item_code as rm_item_code, po.company - from `tabPurchase Order` po, `tabPurchase Order Item Supplied` poitem - where po.name = poitem.parent - and po.is_subcontracted = "Yes" - and po.docstatus = 1"""), as_dict=1)) - if not po_item: - return - - frappe.reload_doc("stock", "doctype", "bin") - frappe.reload_doc("buying", "doctype", "purchase_order_item_supplied") - company_warehouse = frappe._dict(frappe.db.sql("""select company, min(name) from `tabWarehouse` - where is_group = 0 group by company""")) - - items = list(set([d.rm_item_code for d in po_item])) - item_wh = frappe._dict(frappe.db.sql("""select item_code, default_warehouse - from `tabItem` where name in ({0})""".format(", ".join(["%s"] * len(items))), items)) - - # Update reserved warehouse - for item in po_item: - reserve_warehouse = get_warehouse(item.rm_item_code, item.company, company_warehouse, item_wh) - frappe.db.sql("""update `tabPurchase Order Item Supplied` - set reserve_warehouse = %s - where parent = %s and rm_item_code = %s - """, (reserve_warehouse, item["poname"], item["rm_item_code"])) - - # Update bin - item_wh_bin = frappe.db.sql((""" - select distinct poitemsup.rm_item_code as rm_item_code, - poitemsup.reserve_warehouse as reserve_warehouse - from `tabPurchase Order` po, `tabPurchase Order Item Supplied` poitemsup - where po.name = poitemsup.parent - and po.is_subcontracted = "Yes" - and po.docstatus = 1"""), as_dict=1) - for d in item_wh_bin: - try: - stock_bin = get_bin(d["rm_item_code"], d["reserve_warehouse"]) - stock_bin.update_reserved_qty_for_sub_contracting() - except: - pass - -def get_warehouse(item_code, company, company_warehouse, item_wh): - reserve_warehouse = item_wh.get(item_code) - if frappe.db.get_value("Warehouse", reserve_warehouse, "company") != company: - reserve_warehouse = None - if not reserve_warehouse: - reserve_warehouse = company_warehouse.get(company) - return reserve_warehouse diff --git a/erpnext/patches/v10_0/update_sales_order_link_to_purchase_order.py b/erpnext/patches/v10_0/update_sales_order_link_to_purchase_order.py deleted file mode 100644 index b4f58384bf..0000000000 --- a/erpnext/patches/v10_0/update_sales_order_link_to_purchase_order.py +++ /dev/null @@ -1,18 +0,0 @@ -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("buying", "doctype", "supplier_quotation_item") - - for doctype in ['Purchase Order','Supplier Quotation']: - frappe.db.sql(""" - Update - `tab{doctype} Item`, `tabMaterial Request Item` - set - `tab{doctype} Item`.sales_order = `tabMaterial Request Item`.sales_order - where - `tab{doctype} Item`.material_request= `tabMaterial Request Item`.parent - and `tab{doctype} Item`.material_request_item = `tabMaterial Request Item`.name - and `tabMaterial Request Item`.sales_order is not null""".format(doctype=doctype)) \ No newline at end of file diff --git a/erpnext/patches/v10_0/update_status_for_multiple_source_in_po.py b/erpnext/patches/v10_0/update_status_for_multiple_source_in_po.py deleted file mode 100644 index fd3be08b89..0000000000 --- a/erpnext/patches/v10_0/update_status_for_multiple_source_in_po.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - - - # update the sales order item in the material request - frappe.reload_doc('stock', 'doctype', 'material_request_item') - frappe.db.sql('''update `tabMaterial Request Item` mri, `tabSales Order Item` soi - set mri.sales_order_item = soi.name - where ifnull(mri.sales_order, "")!="" and soi.parent=mri.sales_order - and soi.item_code=mri.item_code and mri.docstatus=1 - ''') - - # update the sales order item in the purchase order - frappe.db.sql('''update `tabPurchase Order Item` poi, `tabSales Order Item` soi - set poi.sales_order_item = soi.name - where ifnull(poi.sales_order, "")!="" and soi.parent=poi.sales_order - and soi.item_code=poi.item_code and poi.docstatus = 1 - ''') - - # Update the status in material request and sales order - po_list = frappe.db.sql(''' - select parent from `tabPurchase Order Item` where ifnull(material_request, "")!="" and - ifnull(sales_order, "")!="" and docstatus=1 - ''',as_dict=1) - - for po in list(set([d.get("parent") for d in po_list if d.get("parent")])): - try: - po_doc = frappe.get_doc("Purchase Order", po) - - # update the so in the status updater - po_doc.update_status_updater() - po_doc.update_qty(update_modified=False) - - except Exception: - pass diff --git a/erpnext/patches/v10_0/update_status_in_purchase_receipt.py b/erpnext/patches/v10_0/update_status_in_purchase_receipt.py deleted file mode 100644 index a0bdd9e2cc..0000000000 --- a/erpnext/patches/v10_0/update_status_in_purchase_receipt.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("stock", "doctype", "purchase_receipt") - frappe.db.sql(''' - UPDATE `tabPurchase Receipt` SET status = "Completed" WHERE per_billed = 100 AND docstatus = 1 - ''') \ No newline at end of file diff --git a/erpnext/patches/v10_0/update_territory_and_customer_group.py b/erpnext/patches/v10_0/update_territory_and_customer_group.py deleted file mode 100644 index 7f3dae991d..0000000000 --- a/erpnext/patches/v10_0/update_territory_and_customer_group.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.rename_doc import get_fetch_fields - -def execute(): - ignore_doctypes = ["Lead", "Opportunity", "POS Profile", "Tax Rule", "Pricing Rule"] - customers = frappe.get_all('Customer', fields=["name", "customer_group"]) - customer_group_fetch = get_fetch_fields('Customer', 'Customer Group', ignore_doctypes) - - batch_size = 1000 - for i in range(0, len(customers), batch_size): - batch_customers = customers[i:i + batch_size] - for d in customer_group_fetch: - when_then = [] - for customer in batch_customers: - value = frappe.db.escape(frappe.as_unicode(customer.get("customer_group"))) - - when_then.append(''' - WHEN `%s` = %s and %s != %s - THEN %s - '''%(d["master_fieldname"], frappe.db.escape(frappe.as_unicode(customer.name)), - d["linked_to_fieldname"], value, value)) - - frappe.db.sql(""" - update - `tab%s` - set - %s = CASE %s ELSE `%s` END - """%(d['doctype'], d.linked_to_fieldname, " ".join(when_then), d.linked_to_fieldname)) diff --git a/erpnext/patches/v10_0/update_user_image_in_employee.py b/erpnext/patches/v10_0/update_user_image_in_employee.py deleted file mode 100644 index 72d5d2a857..0000000000 --- a/erpnext/patches/v10_0/update_user_image_in_employee.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('hr', 'doctype', 'employee') - - frappe.db.sql(""" - UPDATE - `tabEmployee`, `tabUser` - SET - `tabEmployee`.image = `tabUser`.user_image - WHERE - `tabEmployee`.user_id = `tabUser`.name and - `tabEmployee`.user_id is not null and - `tabEmployee`.user_id != '' and `tabEmployee`.image is null - """) diff --git a/erpnext/patches/v10_0/update_warehouse_address_details.py b/erpnext/patches/v10_0/update_warehouse_address_details.py deleted file mode 100644 index b982b9a662..0000000000 --- a/erpnext/patches/v10_0/update_warehouse_address_details.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - warehouse = frappe.db.sql("""select name, email_id, phone_no, mobile_no, address_line_1, - address_line_2, city, state, pin from `tabWarehouse` where ifnull(address_line_1, '') != '' - or ifnull(mobile_no, '') != '' - or ifnull(email_id, '') != '' """, as_dict=1) - - for d in warehouse: - try: - address = frappe.new_doc('Address') - address.name = d.name - address.address_title = d.name - address.address_line1 = d.address_line_1 - address.city = d.city - address.state = d.state - address.pincode = d.pin - address.db_insert() - address.append('links',{'link_doctype':'Warehouse','link_name':d.name}) - address.links[0].db_insert() - if d.name and (d.email_id or d.mobile_no or d.phone_no): - contact = frappe.new_doc('Contact') - contact.name = d.name - contact.first_name = d.name - contact.mobile_no = d.mobile_no - contact.email_id = d.email_id - contact.phone = d.phone_no - contact.db_insert() - contact.append('links',{'link_doctype':'Warehouse','link_name':d.name}) - contact.links[0].db_insert() - except frappe.DuplicateEntryError: - pass - \ No newline at end of file diff --git a/erpnext/patches/v10_1/__init__.py b/erpnext/patches/v10_1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v11_0/__init__.py b/erpnext/patches/v11_0/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v11_0/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v11_0/remove_subscriber_doctype.py b/erpnext/patches/v11_0/remove_subscriber_doctype.py deleted file mode 100644 index 4839a20f91..0000000000 --- a/erpnext/patches/v11_0/remove_subscriber_doctype.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - """ copy subscribe field to customer """ - frappe.reload_doc("accounts","doctype","subscription") - - if frappe.db.exists("DocType", "Subscriber"): - if frappe.db.has_column('Subscription','subscriber'): - frappe.db.sql(""" - update `tabSubscription` s1 - set customer=(select customer from tabSubscriber where name=s1.subscriber) - """) - - frappe.delete_doc("DocType", "Subscriber") \ No newline at end of file diff --git a/erpnext/patches/v11_1/__init__.py b/erpnext/patches/v11_1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v12_0/__init__.py b/erpnext/patches/v12_0/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v13_0/__init__.py b/erpnext/patches/v13_0/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v13_0/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v4_0/__init__.py b/erpnext/patches/v4_0/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v4_0/apply_user_permissions.py b/erpnext/patches/v4_0/apply_user_permissions.py deleted file mode 100644 index 3c5d612c18..0000000000 --- a/erpnext/patches/v4_0/apply_user_permissions.py +++ /dev/null @@ -1,50 +0,0 @@ -# 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 erpnext.hr.doctype.employee.employee import EmployeeUserDisabledError - -def execute(): - update_hr_permissions() - update_permissions() - remove_duplicate_user_permissions() - frappe.clear_cache() - -def update_hr_permissions(): - # add set user permissions rights to HR Manager - frappe.db.sql("""update `tabDocPerm` set `set_user_permissions`=1 where parent in ('Employee', 'Leave Application') - and role='HR Manager' and permlevel=0 and `read`=1""") - docperm_meta = frappe.get_meta('DocPerm') - if docperm_meta.get_field('apply_user_permissions'): - # apply user permissions on Employee and Leave Application - frappe.db.sql("""update `tabDocPerm` set `apply_user_permissions`=1 where parent in ('Employee', 'Leave Application') - and role in ('Employee', 'Leave Approver') and permlevel=0 and `read`=1""") - - frappe.clear_cache() - - # save employees to run on_update events - for employee in frappe.db.sql_list("""select name from `tabEmployee` where docstatus < 2"""): - try: - emp = frappe.get_doc("Employee", employee) - emp.flags.ignore_mandatory = True - emp.save() - except EmployeeUserDisabledError: - pass - -def update_permissions(): - # clear match conditions other than owner - frappe.db.sql("""update tabDocPerm set `match`='' - where ifnull(`match`,'') not in ('', 'owner')""") - -def remove_duplicate_user_permissions(): - # remove duplicate user_permissions (if they exist) - for d in frappe.db.sql("""select parent, defkey, defvalue, - count(*) as cnt from tabDefaultValue - where parent not in ('__global', '__default') - group by parent, defkey, defvalue""", as_dict=1): - if d.cnt > 1: - # order by parenttype so that user permission does not get removed! - frappe.db.sql("""delete from tabDefaultValue where `parent`=%s and `defkey`=%s and - `defvalue`=%s order by parenttype limit %s""", (d.parent, d.defkey, d.defvalue, d.cnt-1)) - diff --git a/erpnext/patches/v4_0/countrywise_coa.py b/erpnext/patches/v4_0/countrywise_coa.py deleted file mode 100644 index f45e6028c8..0000000000 --- a/erpnext/patches/v4_0/countrywise_coa.py +++ /dev/null @@ -1,29 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("setup", 'doctype', "company") - frappe.reload_doc("accounts", 'doctype', "account") - - frappe.db.sql("""update tabAccount set account_type='Cash' - where account_type='Bank or Cash' and account_name in ('Cash', 'Cash In Hand')""") - - frappe.db.sql("""update tabAccount set account_type='Stock' - where account_name = 'Stock Assets'""") - - ac_types = {"Fixed Asset Account": "Fixed Asset", "Bank or Cash": "Bank"} - for old, new in ac_types.items(): - frappe.db.sql("""update tabAccount set account_type=%s - where account_type=%s""", (new, old)) - - try: - frappe.db.sql("""update `tabAccount` set report_type = - if(is_pl_account='Yes', 'Profit and Loss', 'Balance Sheet')""") - - frappe.db.sql("""update `tabAccount` set balance_must_be=debit_or_credit - where ifnull(allow_negative_balance, 0) = 0""") - except: - pass diff --git a/erpnext/patches/v4_0/create_custom_fields_for_india_specific_fields.py b/erpnext/patches/v4_0/create_custom_fields_for_india_specific_fields.py deleted file mode 100644 index fe50e444b5..0000000000 --- a/erpnext/patches/v4_0/create_custom_fields_for_india_specific_fields.py +++ /dev/null @@ -1,63 +0,0 @@ -# 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.custom.doctype.custom_field.custom_field import create_custom_field_if_values_exist - -def execute(): - frappe.reload_doc("stock", "doctype", "purchase_receipt") - frappe.reload_doc("hr", "doctype", "employee") - frappe.reload_doc("Payroll", "doctype", "salary_slip") - - india_specific_fields = { - "Purchase Receipt": [{ - "label": "Supplier Shipment No", - "fieldname": "challan_no", - "fieldtype": "Data", - "insert_after": "is_subcontracted" - }, { - "label": "Supplier Shipment Date", - "fieldname": "challan_date", - "fieldtype": "Date", - "insert_after": "is_subcontracted" - }], - "Employee": [{ - "label": "PAN Number", - "fieldname": "pan_number", - "fieldtype": "Data", - "insert_after": "company_email" - }, { - "label": "Gratuity LIC Id", - "fieldname": "gratuity_lic_id", - "fieldtype": "Data", - "insert_after": "company_email" - }, { - "label": "Esic Card No", - "fieldname": "esic_card_no", - "fieldtype": "Data", - "insert_after": "bank_ac_no" - }, { - "label": "PF Number", - "fieldname": "pf_number", - "fieldtype": "Data", - "insert_after": "bank_ac_no" - }], - "Salary Slip": [{ - "label": "Esic No", - "fieldname": "esic_no", - "fieldtype": "Data", - "insert_after": "letter_head", - "permlevel": 1 - }, { - "label": "PF Number", - "fieldname": "pf_no", - "fieldtype": "Data", - "insert_after": "letter_head", - "permlevel": 1 - }] - } - - for dt, docfields in india_specific_fields.items(): - for df in docfields: - create_custom_field_if_values_exist(dt, df) diff --git a/erpnext/patches/v4_0/create_price_list_if_missing.py b/erpnext/patches/v4_0/create_price_list_if_missing.py deleted file mode 100644 index 039e52111c..0000000000 --- a/erpnext/patches/v4_0/create_price_list_if_missing.py +++ /dev/null @@ -1,35 +0,0 @@ -# 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 _ -from frappe.utils.nestedset import get_root_of - -def execute(): - # setup not complete - if not frappe.db.sql("""select name from tabCompany limit 1"""): - return - - if "shopping_cart" in frappe.get_installed_apps(): - frappe.reload_doc("shopping_cart", "doctype", "shopping_cart_settings") - - if not frappe.db.sql("select name from `tabPrice List` where buying=1"): - create_price_list(_("Standard Buying"), buying=1) - - if not frappe.db.sql("select name from `tabPrice List` where selling=1"): - create_price_list(_("Standard Selling"), selling=1) - -def create_price_list(pl_name, buying=0, selling=0): - price_list = frappe.get_doc({ - "doctype": "Price List", - "price_list_name": pl_name, - "enabled": 1, - "buying": buying, - "selling": selling, - "currency": frappe.db.get_default("currency"), - "territories": [{ - "territory": get_root_of("Territory") - }] - }) - price_list.insert() diff --git a/erpnext/patches/v4_0/customer_discount_to_pricing_rule.py b/erpnext/patches/v4_0/customer_discount_to_pricing_rule.py deleted file mode 100644 index 1b260c48cc..0000000000 --- a/erpnext/patches/v4_0/customer_discount_to_pricing_rule.py +++ /dev/null @@ -1,33 +0,0 @@ -# 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.utils.nestedset import get_root_of - -def execute(): - frappe.reload_doc("accounts", "doctype", "pricing_rule") - - frappe.db.auto_commit_on_many_writes = True - - default_item_group = get_root_of("Item Group") - - for d in frappe.db.sql("""select * from `tabCustomer Discount` - where ifnull(parent, '') != ''""", as_dict=1): - if not d.discount: - continue - - frappe.get_doc({ - "doctype": "Pricing Rule", - "apply_on": "Item Group", - "item_group": d.item_group or default_item_group, - "applicable_for": "Customer", - "customer": d.parent, - "price_or_discount": "Discount Percentage", - "discount_percentage": d.discount, - "selling": 1 - }).insert() - - frappe.db.auto_commit_on_many_writes = False - - frappe.delete_doc("DocType", "Customer Discount") diff --git a/erpnext/patches/v4_0/fields_to_be_renamed.py b/erpnext/patches/v4_0/fields_to_be_renamed.py deleted file mode 100644 index cc17697132..0000000000 --- a/erpnext/patches/v4_0/fields_to_be_renamed.py +++ /dev/null @@ -1,109 +0,0 @@ -# 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.model.utils.rename_field import rename_field -from frappe.modules import scrub, get_doctype_module - -rename_map = { - "Quotation Item": [ - ["ref_rate", "price_list_rate"], - ["base_ref_rate", "base_price_list_rate"], - ["adj_rate", "discount_percentage"], - ["export_rate", "rate"], - ["basic_rate", "base_rate"], - ["amount", "base_amount"], - ["export_amount", "amount"] - ], - - "Sales Order Item": [ - ["ref_rate", "price_list_rate"], - ["base_ref_rate", "base_price_list_rate"], - ["adj_rate", "discount_percentage"], - ["export_rate", "rate"], - ["basic_rate", "base_rate"], - ["amount", "base_amount"], - ["export_amount", "amount"], - ["reserved_warehouse", "warehouse"] - ], - - "Delivery Note Item": [ - ["ref_rate", "price_list_rate"], - ["base_ref_rate", "base_price_list_rate"], - ["adj_rate", "discount_percentage"], - ["export_rate", "rate"], - ["basic_rate", "base_rate"], - ["amount", "base_amount"], - ["export_amount", "amount"] - ], - - "Sales Invoice Item": [ - ["ref_rate", "price_list_rate"], - ["base_ref_rate", "base_price_list_rate"], - ["adj_rate", "discount_percentage"], - ["export_rate", "rate"], - ["basic_rate", "base_rate"], - ["amount", "base_amount"], - ["export_amount", "amount"] - ], - - "Supplier Quotation Item": [ - ["import_ref_rate", "price_list_rate"], - ["purchase_ref_rate", "base_price_list_rate"], - ["discount_rate", "discount_percentage"], - ["import_rate", "rate"], - ["purchase_rate", "base_rate"], - ["amount", "base_amount"], - ["import_amount", "amount"] - ], - - "Purchase Order Item": [ - ["import_ref_rate", "price_list_rate"], - ["purchase_ref_rate", "base_price_list_rate"], - ["discount_rate", "discount_percentage"], - ["import_rate", "rate"], - ["purchase_rate", "base_rate"], - ["amount", "base_amount"], - ["import_amount", "amount"] - ], - - "Purchase Receipt Item": [ - ["import_ref_rate", "price_list_rate"], - ["purchase_ref_rate", "base_price_list_rate"], - ["discount_rate", "discount_percentage"], - ["import_rate", "rate"], - ["purchase_rate", "base_rate"], - ["amount", "base_amount"], - ["import_amount", "amount"] - ], - - "Purchase Invoice Item": [ - ["import_ref_rate", "price_list_rate"], - ["purchase_ref_rate", "base_price_list_rate"], - ["discount_rate", "discount_percentage"], - ["import_rate", "rate"], - ["rate", "base_rate"], - ["amount", "base_amount"], - ["import_amount", "amount"], - ["expense_head", "expense_account"] - ], - - "Item": [ - ["purchase_account", "expense_account"], - ["default_sales_cost_center", "selling_cost_center"], - ["cost_center", "buying_cost_center"], - ["default_income_account", "income_account"], - ], - "Item Price": [ - ["ref_rate", "price_list_rate"] - ] -} - -def execute(): - for dn in rename_map: - frappe.reload_doc(get_doctype_module(dn), "doctype", scrub(dn)) - - for dt, field_list in rename_map.items(): - for field in field_list: - rename_field(dt, field[0], field[1]) diff --git a/erpnext/patches/v4_0/fix_address_template.py b/erpnext/patches/v4_0/fix_address_template.py deleted file mode 100644 index 905e3db3e8..0000000000 --- a/erpnext/patches/v4_0/fix_address_template.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors - -from __future__ import unicode_literals -import frappe - -def execute(): - missing_line = """{{ address_line1 }}
""" - for name, template in frappe.db.sql("select name, template from `tabAddress Template`"): - if missing_line not in template: - d = frappe.get_doc("Address Template", name) - d.template = missing_line + d.template - d.save() diff --git a/erpnext/patches/v4_0/fix_case_of_hr_module_def.py b/erpnext/patches/v4_0/fix_case_of_hr_module_def.py deleted file mode 100644 index e77b427b77..0000000000 --- a/erpnext/patches/v4_0/fix_case_of_hr_module_def.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors - -from __future__ import unicode_literals -import frappe - -def execute(): - hr = frappe.db.get_value("Module Def", "HR") - if hr == "Hr": - frappe.rename_doc("Module Def", "Hr", "HR") - frappe.db.set_value("Module Def", "HR", "module_name", "HR") - - frappe.clear_cache() - frappe.setup_module_map() diff --git a/erpnext/patches/v4_0/fix_contact_address.py b/erpnext/patches/v4_0/fix_contact_address.py deleted file mode 100644 index 6a3e106b8c..0000000000 --- a/erpnext/patches/v4_0/fix_contact_address.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("website", "doctype", "contact_us_settings") - address = frappe.db.get_value("Contact Us Settings", None, "address") - if address: - address = frappe.get_doc("Address", address) - contact = frappe.get_doc("Contact Us Settings", "Contact Us Settings") - for f in ("address_title", "address_line1", "address_line2", "city", "state", "country", "pincode"): - contact.set(f, address.get(f)) - - contact.save() \ No newline at end of file diff --git a/erpnext/patches/v4_0/fix_employee_user_id.py b/erpnext/patches/v4_0/fix_employee_user_id.py deleted file mode 100644 index 6f449f97bb..0000000000 --- a/erpnext/patches/v4_0/fix_employee_user_id.py +++ /dev/null @@ -1,23 +0,0 @@ -# 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.utils import get_fullname - -def execute(): - for user_id in frappe.db.sql_list("""select distinct user_id from `tabEmployee` - where ifnull(user_id, '')!='' - group by user_id having count(name) > 1"""): - - fullname = get_fullname(user_id) - employee = frappe.db.get_value("Employee", {"employee_name": fullname, "user_id": user_id}) - - if employee: - frappe.db.sql("""update `tabEmployee` set user_id=null - where user_id=%s and name!=%s""", (user_id, employee)) - else: - count = frappe.db.sql("""select count(*) from `tabEmployee` where user_id=%s""", user_id)[0][0] - frappe.db.sql("""update `tabEmployee` set user_id=null - where user_id=%s limit %s""", (user_id, count - 1)) diff --git a/erpnext/patches/v4_0/global_defaults_to_system_settings.py b/erpnext/patches/v4_0/global_defaults_to_system_settings.py deleted file mode 100644 index 2905fe1e6a..0000000000 --- a/erpnext/patches/v4_0/global_defaults_to_system_settings.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - -from __future__ import unicode_literals - -import frappe -from collections import Counter -from frappe.core.doctype.user.user import STANDARD_USERS - -def execute(): - frappe.reload_doc("core", "doctype", "system_settings") - system_settings = frappe.get_doc("System Settings") - - # set values from global_defauls - global_defaults = frappe.db.get_value("Global Defaults", None, - ["time_zone", "date_format", "number_format", "float_precision", "session_expiry"], as_dict=True) - - if global_defaults: - for key, val in global_defaults.items(): - if not system_settings.get(key): - system_settings.set(key, val) - - # language - if not system_settings.get("language"): - # find most common language - lang = frappe.db.sql_list("""select language from `tabUser` - where ifnull(language, '')!='' and language not like "Loading%%" and name not in ({standard_users})""".format( - standard_users=", ".join(["%s"]*len(STANDARD_USERS))), tuple(STANDARD_USERS)) - lang = Counter(lang).most_common(1) - lang = (len(lang) > 0) and lang[0][0] or "english" - - system_settings.language = lang - - system_settings.flags.ignore_mandatory = True - system_settings.save() - - global_defaults = frappe.get_doc("Global Defaults") - global_defaults.flags.ignore_mandatory = True - global_defaults.save() diff --git a/erpnext/patches/v4_0/import_country_codes.py b/erpnext/patches/v4_0/import_country_codes.py deleted file mode 100644 index 43e23d5b63..0000000000 --- a/erpnext/patches/v4_0/import_country_codes.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe.geo.country_info import get_all -from frappe.utils.install import import_country_and_currency - -from six import iteritems - -def execute(): - frappe.reload_doc("setup", "doctype", "country") - import_country_and_currency() - for name, country in iteritems(get_all()): - frappe.set_value("Country", name, "code", country.get("code")) \ No newline at end of file diff --git a/erpnext/patches/v4_0/map_charge_to_taxes_and_charges.py b/erpnext/patches/v4_0/map_charge_to_taxes_and_charges.py deleted file mode 100644 index 97e217aa05..0000000000 --- a/erpnext/patches/v4_0/map_charge_to_taxes_and_charges.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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 - -def execute(): - # update sales cycle - for d in ['Sales Invoice', 'Sales Order', 'Quotation', 'Delivery Note']: - frappe.db.sql("""update `tab%s` set taxes_and_charges=charge""" % d) - - # update purchase cycle - for d in ['Purchase Invoice', 'Purchase Order', 'Supplier Quotation', 'Purchase Receipt']: - frappe.db.sql("""update `tab%s` set taxes_and_charges=purchase_other_charges""" % d) - - frappe.db.sql("""update `tabPurchase Taxes and Charges` set parentfield='other_charges'""") diff --git a/erpnext/patches/v4_0/move_warehouse_user_to_restrictions.py b/erpnext/patches/v4_0/move_warehouse_user_to_restrictions.py deleted file mode 100644 index 8b81936d8d..0000000000 --- a/erpnext/patches/v4_0/move_warehouse_user_to_restrictions.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 -import frappe.permissions - -def execute(): - for warehouse, user in frappe.db.sql("""select parent, user from `tabWarehouse User`"""): - frappe.permissions.add_user_permission("Warehouse", warehouse, user) - - frappe.delete_doc_if_exists("DocType", "Warehouse User") - frappe.reload_doc("stock", "doctype", "warehouse") diff --git a/erpnext/patches/v4_0/new_address_template.py b/erpnext/patches/v4_0/new_address_template.py deleted file mode 100644 index fa6602706e..0000000000 --- a/erpnext/patches/v4_0/new_address_template.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - frappe.reload_doc("utilities", "doctype", "address_template") - if not frappe.db.sql("select name from `tabAddress Template`"): - try: - d = frappe.new_doc("Address Template") - d.update({"country":frappe.db.get_default("country") or - frappe.db.get_value("Global Defaults", "Global Defaults", "country")}) - d.insert() - except: - print(frappe.get_traceback()) - diff --git a/erpnext/patches/v4_0/reload_sales_print_format.py b/erpnext/patches/v4_0/reload_sales_print_format.py deleted file mode 100644 index b8f090f9f3..0000000000 --- a/erpnext/patches/v4_0/reload_sales_print_format.py +++ /dev/null @@ -1,8 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc('accounts', 'Print Format', 'POS Invoice') diff --git a/erpnext/patches/v4_0/remove_employee_role_if_no_employee.py b/erpnext/patches/v4_0/remove_employee_role_if_no_employee.py deleted file mode 100644 index 8766ace54f..0000000000 --- a/erpnext/patches/v4_0/remove_employee_role_if_no_employee.py +++ /dev/null @@ -1,18 +0,0 @@ -# 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 -import frappe.permissions - -def execute(): - for user in frappe.db.sql_list("select distinct parent from `tabHas Role` where role='Employee'"): - # if employee record does not exists, remove employee role! - if not frappe.db.get_value("Employee", {"user_id": user}): - try: - user = frappe.get_doc("User", user) - for role in user.get("roles", {"role": "Employee"}): - user.get("roles").remove(role) - user.save() - except frappe.DoesNotExistError: - pass diff --git a/erpnext/patches/v4_0/remove_module_home_pages.py b/erpnext/patches/v4_0/remove_module_home_pages.py deleted file mode 100644 index a2720e0ebf..0000000000 --- a/erpnext/patches/v4_0/remove_module_home_pages.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 - -def execute(): - for page in ("accounts-home", "website-home", "support-home", "stock-home", "selling-home", "projects-home", - "manufacturing-home", "hr-home", "buying-home"): - frappe.delete_doc("Page", page) \ No newline at end of file diff --git a/erpnext/patches/v4_0/rename_sitemap_to_route.py b/erpnext/patches/v4_0/rename_sitemap_to_route.py deleted file mode 100644 index ffb1fda144..0000000000 --- a/erpnext/patches/v4_0/rename_sitemap_to_route.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import unicode_literals -import frappe -import frappe.model - -def execute(): - frappe.reload_doc("setup", "doctype", "item_group") - frappe.reload_doc("stock", "doctype", "item") - frappe.reload_doc("setup", "doctype", "sales_partner") - - try: - frappe.model.rename_field("Item Group", "parent_website_sitemap", "parent_website_route") - frappe.model.rename_field("Item", "parent_website_sitemap", "parent_website_route") - frappe.model.rename_field("Sales Partner", "parent_website_sitemap", - "parent_website_route") - except Exception as e: - if e.args[0]!=1054: - raise diff --git a/erpnext/patches/v4_0/reset_permissions_for_masters.py b/erpnext/patches/v4_0/reset_permissions_for_masters.py deleted file mode 100644 index bc1b438e2b..0000000000 --- a/erpnext/patches/v4_0/reset_permissions_for_masters.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -from frappe.permissions import reset_perms - -def execute(): - for doctype in ("About Us Settings", "Accounts Settings", "Activity Type", - "Blog Category", "Blog Settings", "Blogger", "Branch", "Brand", "Buying Settings", - "Communication", "Company", "Contact Us Settings", - "Country", "Currency", "Currency Exchange", "Deduction Type", "Department", - "Designation", "Earning Type", "Event", "Feed", "File", "Fiscal Year", - "HR Settings", "Industry Type", "Leave Type", "Letter Head", - "Mode of Payment", "Module Def", "Naming Series", "POS Setting", "Print Heading", - "Report", "Role", "Selling Settings", "Stock Settings", "Supplier Type", "UOM"): - try: - reset_perms(doctype) - except: - print("Error resetting perms for", doctype) - raise diff --git a/erpnext/patches/v4_0/save_default_letterhead.py b/erpnext/patches/v4_0/save_default_letterhead.py deleted file mode 100644 index 5d75f096b3..0000000000 --- a/erpnext/patches/v4_0/save_default_letterhead.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 - -def execute(): - """save default letterhead to set default_letter_head_content""" - try: - letter_head = frappe.get_doc("Letter Head", {"is_default": 1}) - letter_head.save() - except frappe.DoesNotExistError: - pass diff --git a/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py b/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py deleted file mode 100644 index 7e472e2195..0000000000 --- a/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("accounts", "doctype", "pricing_rule") - frappe.db.sql("""update `tabPricing Rule` set selling=1 where ifnull(applicable_for, '') in - ('', 'Customer', 'Customer Group', 'Territory', 'Sales Partner', 'Campaign')""") - - frappe.db.sql("""update `tabPricing Rule` set buying=1 where ifnull(applicable_for, '') in - ('', 'Supplier', 'Supplier Type')""") diff --git a/erpnext/patches/v4_0/split_email_settings.py b/erpnext/patches/v4_0/split_email_settings.py deleted file mode 100644 index 5d1dea60ee..0000000000 --- a/erpnext/patches/v4_0/split_email_settings.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - print("WARNING!!!! Email Settings not migrated. Please setup your email again.") - - # this will happen if you are migrating very old accounts - # comment out this line below and remember to create new Email Accounts - # for incoming and outgoing mails - raise Exception - - return - - - frappe.reload_doc("core", "doctype", "outgoing_email_settings") - frappe.reload_doc("support", "doctype", "support_email_settings") - - email_settings = get_email_settings() - map_outgoing_email_settings(email_settings) - map_support_email_settings(email_settings) - - -def map_outgoing_email_settings(email_settings): - outgoing_email_settings = frappe.get_doc("Outgoing Email Settings") - for fieldname in (("outgoing_mail_server", "mail_server"), - "use_ssl", "mail_port", "mail_login", "mail_password", - "always_use_login_id_as_sender", "auto_email_id"): - - if isinstance(fieldname, tuple): - from_fieldname, to_fieldname = fieldname - else: - from_fieldname = to_fieldname = fieldname - - outgoing_email_settings.set(to_fieldname, email_settings.get(from_fieldname)) - - outgoing_email_settings._fix_numeric_types() - outgoing_email_settings.save() - -def map_support_email_settings(email_settings): - support_email_settings = frappe.get_doc("Support Email Settings") - - for fieldname in ("sync_support_mails", "support_email", - ("support_host", "mail_server"), - ("support_use_ssl", "use_ssl"), - ("support_username", "mail_login"), - ("support_password", "mail_password"), - "support_signature", "send_autoreply", "support_autoreply"): - - if isinstance(fieldname, tuple): - from_fieldname, to_fieldname = fieldname - else: - from_fieldname = to_fieldname = fieldname - - support_email_settings.set(to_fieldname, email_settings.get(from_fieldname)) - - support_email_settings._fix_numeric_types() - support_email_settings.save() - -def get_email_settings(): - ret = {} - for field, value in frappe.db.sql("select field, value from tabSingles where doctype='Email Settings'"): - ret[field] = value - return ret - diff --git a/erpnext/patches/v4_0/update_account_root_type.py b/erpnext/patches/v4_0/update_account_root_type.py deleted file mode 100644 index 15ddf032a4..0000000000 --- a/erpnext/patches/v4_0/update_account_root_type.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - frappe.reload_doc("accounts", "doctype", "account") - - account_table_columns = frappe.db.get_table_columns("Account") - if "debit_or_credit" in account_table_columns and "is_pl_account" in account_table_columns: - frappe.db.sql("""UPDATE tabAccount - SET root_type = CASE - WHEN (debit_or_credit='Debit' and is_pl_account = 'No') THEN 'Asset' - WHEN (debit_or_credit='Credit' and is_pl_account = 'No') THEN 'Liability' - WHEN (debit_or_credit='Debit' and is_pl_account = 'Yes') THEN 'Expense' - WHEN (debit_or_credit='Credit' and is_pl_account = 'Yes') THEN 'Income' - END - WHERE ifnull(parent_account, '') = '' - """) - - else: - for key, root_type in (("asset", "Asset"), ("liabilities", "Liability"), ("expense", "Expense"), - ("income", "Income")): - frappe.db.sql("""update tabAccount set root_type=%s where name like %s - and ifnull(parent_account, '')=''""", (root_type, "%" + key + "%")) - - for root in frappe.db.sql("""SELECT name, lft, rgt, root_type FROM `tabAccount` - WHERE ifnull(parent_account, '')=''""", as_dict=True): - if root.root_type: - frappe.db.sql("""UPDATE tabAccount SET root_type=%s WHERE lft>%s and rgt<%s""", - (root.root_type, root.lft, root.rgt)) - else: - print(b"Root type not found for {0}".format(root.name.encode("utf-8"))) diff --git a/erpnext/patches/v4_0/update_custom_print_formats_for_renamed_fields.py b/erpnext/patches/v4_0/update_custom_print_formats_for_renamed_fields.py deleted file mode 100644 index d784a1b182..0000000000 --- a/erpnext/patches/v4_0/update_custom_print_formats_for_renamed_fields.py +++ /dev/null @@ -1,36 +0,0 @@ -# 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 -import re - -def execute(): - # NOTE: sequence is important - fields_list = ( - ("amount", "base_amount"), - ("ref_rate", "price_list_rate"), - ("base_ref_rate", "base_price_list_rate"), - ("adj_rate", "discount_percentage"), - ("export_rate", "rate"), - ("basic_rate", "base_rate"), - ("export_amount", "amount"), - ("reserved_warehouse", "warehouse"), - ("import_ref_rate", "price_list_rate"), - ("purchase_ref_rate", "base_price_list_rate"), - ("discount_rate", "discount_percentage"), - ("import_rate", "rate"), - ("purchase_rate", "base_rate"), - ("import_amount", "amount") - ) - - condition = " or ".join("""html like "%%{}%%" """.format(d[0].replace("_", "\\_")) for d in fields_list - if d[0] != "amount") - - for name, html in frappe.db.sql("""select name, html from `tabPrint Format` - where standard = 'No' and ({}) and html not like '%%frappe.%%'""".format(condition)): - html = html.replace("wn.", "frappe.") - for from_field, to_field in fields_list: - html = re.sub(r"\b{}\b".format(from_field), to_field, html) - - frappe.db.set_value("Print Format", name, "html", html) diff --git a/erpnext/patches/v4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py b/erpnext/patches/v4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py deleted file mode 100644 index fe66a5e3ef..0000000000 --- a/erpnext/patches/v4_0/update_incharge_name_to_sales_person_in_maintenance_schedule.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("support", "doctype", "schedules") - frappe.reload_doc("support", "doctype", "maintenance_schedule_item") - - frappe.db.sql("""update `tabMaintenance Schedule Detail` set sales_person=incharge_name""") - frappe.db.sql("""update `tabMaintenance Schedule Item` set sales_person=incharge_name""") \ No newline at end of file diff --git a/erpnext/patches/v4_0/update_other_charges_in_custom_purchase_print_formats.py b/erpnext/patches/v4_0/update_other_charges_in_custom_purchase_print_formats.py deleted file mode 100644 index 2e2e77a9fc..0000000000 --- a/erpnext/patches/v4_0/update_other_charges_in_custom_purchase_print_formats.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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 -import re - -def execute(): - for name, html in frappe.db.sql("""select name, html from `tabPrint Format` - where standard = 'No' and html like '%%purchase\\_tax\\_details%%'"""): - html = re.sub(r"\bpurchase_tax_details\b", "taxes", html) - frappe.db.set_value("Print Format", name, "html", html) diff --git a/erpnext/patches/v4_0/update_tax_amount_after_discount.py b/erpnext/patches/v4_0/update_tax_amount_after_discount.py deleted file mode 100644 index d10329ef37..0000000000 --- a/erpnext/patches/v4_0/update_tax_amount_after_discount.py +++ /dev/null @@ -1,20 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("accounts", "doctype", "sales_taxes_and_charges") - docs_with_discount_amount = frappe._dict() - for dt in ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"]: - records = frappe.db.sql_list("""select name from `tab%s` - where ifnull(discount_amount, 0) > 0 and docstatus=1""" % dt) - docs_with_discount_amount[dt] = records - - for dt, discounted_records in docs_with_discount_amount.items(): - frappe.db.sql("""update `tabSales Taxes and Charges` - set tax_amount_after_discount_amount = tax_amount - where parenttype = %s and parent not in (%s)""" % - ('%s', ', '.join(['%s']*(len(discounted_records)+1))), - tuple([dt, ''] + discounted_records)) diff --git a/erpnext/patches/v4_0/update_user_properties.py b/erpnext/patches/v4_0/update_user_properties.py deleted file mode 100644 index f2085ce4df..0000000000 --- a/erpnext/patches/v4_0/update_user_properties.py +++ /dev/null @@ -1,51 +0,0 @@ -# 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 -import frappe.permissions -import frappe.defaults - -def execute(): - frappe.reload_doc("core", "doctype", "docfield") - frappe.reload_doc("hr", "doctype", "employee") - - set_print_email_permissions() - migrate_user_properties_to_user_permissions() - - frappe.clear_cache() - -def migrate_user_properties_to_user_permissions(): - for d in frappe.db.sql("""select parent, defkey, defvalue from tabDefaultValue - where parent not in ('__global', '__default')""", as_dict=True): - df = frappe.db.sql("""select options from tabDocField - where fieldname=%s and fieldtype='Link'""", d.defkey, as_dict=True) - - if df: - frappe.db.sql("""update tabDefaultValue - set defkey=%s, parenttype='User Permission' - where defkey=%s and - parent not in ('__global', '__default')""", (df[0].options, d.defkey)) - -def set_print_email_permissions(): - # reset Page perms - from frappe.core.page.permission_manager.permission_manager import reset - reset("Page") - reset("Report") - - if "allow_print" not in frappe.db.get_table_columns("DocType"): - return - - # patch to move print, email into DocPerm - # NOTE: allow_print and allow_email are misnamed. They were used to hide print / hide email - for doctype, hide_print, hide_email in frappe.db.sql("""select name, ifnull(allow_print, 0), ifnull(allow_email, 0) - from `tabDocType` where ifnull(issingle, 0)=0 and ifnull(istable, 0)=0 and - (ifnull(allow_print, 0)=0 or ifnull(allow_email, 0)=0)"""): - - if not hide_print: - frappe.db.sql("""update `tabDocPerm` set `print`=1 - where permlevel=0 and `read`=1 and parent=%s""", doctype) - - if not hide_email: - frappe.db.sql("""update `tabDocPerm` set `email`=1 - where permlevel=0 and `read`=1 and parent=%s""", doctype) diff --git a/erpnext/patches/v4_0/update_users_report_view_settings.py b/erpnext/patches/v4_0/update_users_report_view_settings.py deleted file mode 100644 index 6f216f5b38..0000000000 --- a/erpnext/patches/v4_0/update_users_report_view_settings.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals - -from frappe.model.utils.rename_field import update_users_report_view_settings -from erpnext.patches.v4_0.fields_to_be_renamed import rename_map - -def execute(): - for dt, field_list in rename_map.items(): - for field in field_list: - update_users_report_view_settings(dt, field[0], field[1]) diff --git a/erpnext/patches/v4_0/validate_v3_patch.py b/erpnext/patches/v4_0/validate_v3_patch.py deleted file mode 100644 index 3df39edea6..0000000000 --- a/erpnext/patches/v4_0/validate_v3_patch.py +++ /dev/null @@ -1,11 +0,0 @@ -# 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 - -def execute(): - from frappe.modules.patch_handler import executed - last_v3_patch = 'patches.1401.fix_pos_outstanding' - if not executed(last_v3_patch): - raise Exception("site not ready to migrate to version 4") diff --git a/erpnext/patches/v4_1/__init__.py b/erpnext/patches/v4_1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v4_1/fix_delivery_and_billing_status.py b/erpnext/patches/v4_1/fix_delivery_and_billing_status.py deleted file mode 100644 index 8cc6a4b0be..0000000000 --- a/erpnext/patches/v4_1/fix_delivery_and_billing_status.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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 - -def execute(): - frappe.db.sql("""update `tabSales Order` set delivery_status = 'Not Delivered' - where delivery_status = 'Delivered' and ifnull(per_delivered, 0) = 0 and ifnull(docstatus, 0) in (0, 1)""") - - frappe.db.sql("""update `tabSales Order` set billing_status = 'Not Billed' - where billing_status = 'Billed' and ifnull(per_billed, 0) = 0 and ifnull(docstatus, 0) in (0, 1)""") diff --git a/erpnext/patches/v4_1/fix_jv_remarks.py b/erpnext/patches/v4_1/fix_jv_remarks.py deleted file mode 100644 index e07bf05f1a..0000000000 --- a/erpnext/patches/v4_1/fix_jv_remarks.py +++ /dev/null @@ -1,21 +0,0 @@ -# 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 - -def execute(): - reference_date = guess_reference_date() - for name in frappe.db.sql_list("""select name from `tabJournal Entry` - where date(creation)>=%s""", reference_date): - jv = frappe.get_doc("Journal Entry", name) - try: - jv.create_remarks() - except frappe.MandatoryError: - pass - else: - frappe.db.set_value("Journal Entry", jv.name, "remark", jv.remark) - -def guess_reference_date(): - return (frappe.db.get_value("Patch Log", {"patch": "erpnext.patches.v4_0.validate_v3_patch"}, "creation") - or "2014-05-06") diff --git a/erpnext/patches/v4_1/fix_sales_order_delivered_status.py b/erpnext/patches/v4_1/fix_sales_order_delivered_status.py deleted file mode 100644 index 66037b8958..0000000000 --- a/erpnext/patches/v4_1/fix_sales_order_delivered_status.py +++ /dev/null @@ -1,15 +0,0 @@ -# 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 - -def execute(): - for si in frappe.db.sql_list("""select name - from `tabSales Invoice` - where ifnull(update_stock,0) = 1 and docstatus = 1 and exists( - select name from `tabSales Invoice Item` where parent=`tabSales Invoice`.name and - ifnull(so_detail, "") != "")"""): - - invoice = frappe.get_doc("Sales Invoice", si) - invoice.update_qty() diff --git a/erpnext/patches/v4_1/set_outgoing_email_footer.py b/erpnext/patches/v4_1/set_outgoing_email_footer.py deleted file mode 100644 index 54d016bf5f..0000000000 --- a/erpnext/patches/v4_1/set_outgoing_email_footer.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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 erpnext.setup.install import default_mail_footer - -def execute(): - return - mail_footer = frappe.db.get_default('mail_footer') or '' - mail_footer += default_mail_footer - frappe.db.set_value("Outgoing Email Settings", "Outgoing Email Settings", "footer", mail_footer) diff --git a/erpnext/patches/v4_2/__init__.py b/erpnext/patches/v4_2/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v4_2/add_currency_turkish_lira.py b/erpnext/patches/v4_2/add_currency_turkish_lira.py deleted file mode 100644 index 1a46089f94..0000000000 --- a/erpnext/patches/v4_2/add_currency_turkish_lira.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 - -def execute(): - return - # country = get_country_info(country="Turkey") - # add_country_and_currency("Turkey", country) diff --git a/erpnext/patches/v4_2/default_website_style.py b/erpnext/patches/v4_2/default_website_style.py deleted file mode 100644 index e8f9502ea6..0000000000 --- a/erpnext/patches/v4_2/default_website_style.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - return - # frappe.reload_doc('website', 'doctype', 'style_settings') - # style_settings = frappe.get_doc("Style Settings", "Style Settings") - # if not style_settings.apply_style: - # style_settings.update(default_properties) - # style_settings.apply_style = 1 - # style_settings.save() diff --git a/erpnext/patches/v4_2/delete_gl_entries_for_cancelled_invoices.py b/erpnext/patches/v4_2/delete_gl_entries_for_cancelled_invoices.py deleted file mode 100644 index 169b1e2927..0000000000 --- a/erpnext/patches/v4_2/delete_gl_entries_for_cancelled_invoices.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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 - -def execute(): - cancelled_invoices = frappe.db.sql_list("""select name from `tabSales Invoice` - where docstatus = 2 and ifnull(update_stock, 0) = 1""") - - if cancelled_invoices: - frappe.db.sql("""delete from `tabGL Entry` - where voucher_type = 'Sales Invoice' and voucher_no in (%s)""" - % (', '.join(['%s']*len(cancelled_invoices))), tuple(cancelled_invoices)) \ No newline at end of file diff --git a/erpnext/patches/v4_2/delete_old_print_formats.py b/erpnext/patches/v4_2/delete_old_print_formats.py deleted file mode 100644 index cacdb85ce0..0000000000 --- a/erpnext/patches/v4_2/delete_old_print_formats.py +++ /dev/null @@ -1,23 +0,0 @@ -# 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 - -def execute(): - old_formats = ("Sales Invoice", "Sales Invoice Spartan", "Sales Invoice Modern", - "Sales Invoice Classic", - "Sales Order Spartan", "Sales Order Modern", "Sales Order Classic", - "Purchase Order Spartan", "Purchase Order Modern", "Purchase Order Classic", - "Quotation Spartan", "Quotation Modern", "Quotation Classic", - "Delivery Note Spartan", "Delivery Note Modern", "Delivery Note Classic") - - for fmt in old_formats: - # update property setter - for ps in frappe.db.sql_list("""select name from `tabProperty Setter` - where property='default_print_format' and value=%s""", fmt): - ps = frappe.get_doc("Property Setter", ps) - ps.value = "Standard" - ps.save(ignore_permissions = True) - - frappe.delete_doc_if_exists("Print Format", fmt) diff --git a/erpnext/patches/v4_2/discount_amount.py b/erpnext/patches/v4_2/discount_amount.py deleted file mode 100644 index 7ab61bdbea..0000000000 --- a/erpnext/patches/v4_2/discount_amount.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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.modules import scrub, get_doctype_module - -def execute(): - for dt in ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"]: - frappe.reload_doc(get_doctype_module(dt), "doctype", scrub(dt)) - frappe.db.sql("""update `tab{0}` set base_discount_amount=discount_amount, - discount_amount=discount_amount/conversion_rate""".format(dt)) diff --git a/erpnext/patches/v4_2/fix_account_master_type.py b/erpnext/patches/v4_2/fix_account_master_type.py deleted file mode 100644 index 99444ce83b..0000000000 --- a/erpnext/patches/v4_2/fix_account_master_type.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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 - -def execute(): - for d in frappe.db.sql("""select name from `tabAccount` - where ifnull(master_type, '') not in ('Customer', 'Supplier', 'Employee', '') and docstatus=0"""): - ac = frappe.get_doc("Account", d[0]) - ac.master_type = None - ac.save() diff --git a/erpnext/patches/v4_2/fix_gl_entries_for_stock_transactions.py b/erpnext/patches/v4_2/fix_gl_entries_for_stock_transactions.py deleted file mode 100644 index c6c94d4179..0000000000 --- a/erpnext/patches/v4_2/fix_gl_entries_for_stock_transactions.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe -from frappe.utils import flt - -def execute(): - from erpnext.stock.stock_balance import repost - repost(allow_zero_rate=True, only_actual=True) - - frappe.reload_doctype("Account") - - warehouse_account = frappe.db.sql("""select name, master_name from tabAccount - where ifnull(account_type, '') = 'Warehouse'""") - if warehouse_account: - warehouses = [d[1] for d in warehouse_account] - accounts = [d[0] for d in warehouse_account] - - stock_vouchers = frappe.db.sql("""select distinct sle.voucher_type, sle.voucher_no - from `tabStock Ledger Entry` sle - where sle.warehouse in (%s) - order by sle.posting_date""" % - ', '.join(['%s']*len(warehouses)), tuple(warehouses)) - - rejected = [] - for voucher_type, voucher_no in stock_vouchers: - stock_bal = frappe.db.sql("""select sum(stock_value_difference) from `tabStock Ledger Entry` - where voucher_type=%s and voucher_no =%s and warehouse in (%s)""" % - ('%s', '%s', ', '.join(['%s']*len(warehouses))), tuple([voucher_type, voucher_no] + warehouses)) - - account_bal = frappe.db.sql("""select ifnull(sum(ifnull(debit, 0) - ifnull(credit, 0)), 0) - from `tabGL Entry` - where voucher_type=%s and voucher_no =%s and account in (%s) - group by voucher_type, voucher_no""" % - ('%s', '%s', ', '.join(['%s']*len(accounts))), tuple([voucher_type, voucher_no] + accounts)) - - if stock_bal and account_bal and abs(flt(stock_bal[0][0]) - flt(account_bal[0][0])) > 0.1: - try: - print(voucher_type, voucher_no, stock_bal[0][0], account_bal[0][0]) - - frappe.db.sql("""delete from `tabGL Entry` - where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no)) - - voucher = frappe.get_doc(voucher_type, voucher_no) - voucher.make_gl_entries() - frappe.db.commit() - except Exception as e: - print(frappe.get_traceback()) - rejected.append([voucher_type, voucher_no]) - frappe.db.rollback() - - print("Failed to repost: ") - print(rejected) diff --git a/erpnext/patches/v4_2/fix_recurring_orders.py b/erpnext/patches/v4_2/fix_recurring_orders.py deleted file mode 100644 index ea1724a040..0000000000 --- a/erpnext/patches/v4_2/fix_recurring_orders.py +++ /dev/null @@ -1,41 +0,0 @@ -# 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 - -def execute(): - sales_orders = frappe.db.sql("""select name from `tabSales Order` - where docstatus = 1 and ifnull(is_recurring, 0) = 1 - and (per_delivered > 0 or per_billed > 0)""", as_dict=1) - - for so in sales_orders: - if not frappe.db.exists("Delivery Note Item", {"against_sales_order": so.name, "docstatus": 1}): - frappe.db.sql("""update `tabSales Order` set per_delivered = 0, - delivery_status = 'Not Delivered' where name = %s""", so.name) - frappe.db.sql("""update `tabSales Order Item` set delivered_qty = 0 - where parent = %s""", so.name) - - if not frappe.db.exists("Sales Invoice Item", {"sales_order": so.name, "docstatus": 1}): - frappe.db.sql("""update `tabSales Order` set per_billed = 0, - billing_status = 'Not Billed' where name = %s""", so.name) - frappe.db.sql("""update `tabSales Order Item` set billed_amt = 0 - where parent = %s""", so.name) - - purchase_orders = frappe.db.sql("""select name from `tabPurchase Order` - where docstatus = 1 and ifnull(is_recurring, 0) = 1 - and (per_received > 0 or per_billed > 0)""", as_dict=1) - - for po in purchase_orders: - if not frappe.db.exists("Purchase Receipt Item", {"prevdoc_doctype": "Purchase Order", - "prevdoc_docname": po.name, "docstatus": 1}): - frappe.db.sql("""update `tabPurchase Order` set per_received = 0 - where name = %s""", po.name) - frappe.db.sql("""update `tabPurchase Order Item` set received_qty = 0 - where parent = %s""", po.name) - - if not frappe.db.exists("Purchase Invoice Item", {"purchase_order": po.name, "docstatus": 1}): - frappe.db.sql("""update `tabPurchase Order` set per_billed = 0 - where name = %s""", po.name) - frappe.db.sql("""update `tabPurchase Order Item` set billed_amt = 0 - where parent = %s""", po.name) \ No newline at end of file diff --git a/erpnext/patches/v4_2/party_model.py b/erpnext/patches/v4_2/party_model.py deleted file mode 100644 index 46d7fffee1..0000000000 --- a/erpnext/patches/v4_2/party_model.py +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - frappe.reload_doc("accounts", "doctype", "account") - frappe.reload_doc("setup", "doctype", "company") - frappe.reload_doc("accounts", "doctype", "gl_entry") - frappe.reload_doc("accounts", "doctype", "journal_entry_account") - receivable_payable_accounts = create_receivable_payable_account() - if receivable_payable_accounts: - set_party_in_jv_and_gl_entry(receivable_payable_accounts) - delete_individual_party_account() - remove_customer_supplier_account_report() - -def create_receivable_payable_account(): - receivable_payable_accounts = frappe._dict() - - def _create_account(args): - if args["parent_account"] and frappe.db.exists("Account", args["parent_account"]): - account_id = frappe.db.get_value("Account", - {"account_name": args["account_name"], "company": args["company"]}) - if not account_id: - account = frappe.new_doc("Account") - account.is_group = 0 - account.update(args) - account.insert() - - account_id = account.name - - frappe.db.set_value("Company", args["company"], ("default_receivable_account" - if args["account_type"]=="Receivable" else "default_payable_account"), account_id) - - receivable_payable_accounts.setdefault(args["company"], {}).setdefault(args["account_type"], account_id) - - for company in frappe.db.sql_list("select name from tabCompany"): - _create_account({ - "account_name": "Debtors", - "account_type": "Receivable", - "company": company, - "parent_account": get_parent_account(company, "Customer") - }) - - _create_account({ - "account_name": "Creditors", - "account_type": "Payable", - "company": company, - "parent_account": get_parent_account(company, "Supplier") - }) - - return receivable_payable_accounts - -def get_parent_account(company, master_type): - parent_account = None - - if "receivables_group" in frappe.db.get_table_columns("Company"): - parent_account = frappe.get_cached_value('Company', company, - "receivables_group" if master_type=="Customer" else "payables_group") - if not parent_account: - parent_account = frappe.db.get_value("Account", {"company": company, - "account_name": "Accounts Receivable" if master_type=="Customer" else "Accounts Payable"}) - - if not parent_account: - parent_account = frappe.db.sql_list("""select parent_account from tabAccount - where company=%s and ifnull(master_type, '')=%s and ifnull(master_name, '')!='' limit 1""", - (company, master_type)) - parent_account = parent_account[0][0] if parent_account else None - - return parent_account - -def set_party_in_jv_and_gl_entry(receivable_payable_accounts): - accounts = frappe.db.sql("""select name, master_type, master_name, company from `tabAccount` - where ifnull(master_type, '') in ('Customer', 'Supplier') and ifnull(master_name, '') != ''""", as_dict=1) - - account_map = frappe._dict() - for d in accounts: - account_map.setdefault(d.name, d) - - if not account_map: - return - - for dt in ["Journal Entry Account", "GL Entry"]: - records = frappe.db.sql("""select name, account from `tab%s` - where account in (%s) and ifnull(party, '') = '' and docstatus < 2""" % - (dt, ", ".join(['%s']*len(account_map))), tuple(account_map.keys()), as_dict=1) - for i, d in enumerate(records): - account_details = account_map.get(d.account, {}) - account_type = "Receivable" if account_details.get("master_type")=="Customer" else "Payable" - new_account = receivable_payable_accounts[account_details.get("company")][account_type] - - frappe.db.sql("update `tab{0}` set account=%s, party_type=%s, party=%s where name=%s".format(dt), - (new_account, account_details.get("master_type"), account_details.get("master_name"), d.name)) - - if i%500 == 0: - frappe.db.commit() - -def delete_individual_party_account(): - frappe.db.sql("""delete from `tabAccount` - where ifnull(master_type, '') in ('Customer', 'Supplier') - and ifnull(master_name, '') != '' - and not exists(select gle.name from `tabGL Entry` gle - where gle.account = tabAccount.name)""") - - accounts_not_deleted = frappe.db.sql_list("""select tabAccount.name from `tabAccount` - where ifnull(master_type, '') in ('Customer', 'Supplier') - and ifnull(master_name, '') != '' - and exists(select gle.name from `tabGL Entry` gle where gle.account = tabAccount.name)""") - - if accounts_not_deleted: - print("Accounts not deleted: " + "\n".join(accounts_not_deleted)) - - -def remove_customer_supplier_account_report(): - for d in ["Customer Account Head", "Supplier Account Head"]: - frappe.delete_doc("Report", d) diff --git a/erpnext/patches/v4_2/recalculate_bom_cost.py b/erpnext/patches/v4_2/recalculate_bom_cost.py deleted file mode 100644 index eee89fce96..0000000000 --- a/erpnext/patches/v4_2/recalculate_bom_cost.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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 - -def execute(): - for d in frappe.db.sql("select name from `tabBOM` where docstatus < 2"): - try: - document = frappe.get_doc('BOM', d[0]) - if document.docstatus == 1: - document.flags.ignore_validate_update_after_submit = True - document.calculate_cost() - document.save() - except: - pass diff --git a/erpnext/patches/v4_2/repost_sle_for_si_with_no_warehouse.py b/erpnext/patches/v4_2/repost_sle_for_si_with_no_warehouse.py deleted file mode 100644 index 1356129dc0..0000000000 --- a/erpnext/patches/v4_2/repost_sle_for_si_with_no_warehouse.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe -from erpnext.stock.stock_ledger import NegativeStockError - -def execute(): - si_list = frappe.db.sql("""select distinct si.name - from `tabSales Invoice Item` si_item, `tabSales Invoice` si - where si.name = si_item.parent and si.modified > '2015-02-16' and si.docstatus=1 - and ifnull(si_item.warehouse, '') = '' and ifnull(si.update_stock, 0) = 1 - order by posting_date, posting_time""", as_dict=1) - - failed_list = [] - for si in si_list: - try: - si_doc = frappe.get_doc("Sales Invoice", si.name) - si_doc.docstatus = 2 - si_doc.on_cancel() - - si_doc.docstatus = 1 - si_doc.set_missing_item_details() - si_doc.on_submit() - frappe.db.commit() - except: - failed_list.append(si.name) - frappe.local.stockledger_exceptions = None - frappe.db.rollback() - - print("Failed to repost: ", failed_list) - - - \ No newline at end of file diff --git a/erpnext/patches/v4_2/repost_stock_reconciliation.py b/erpnext/patches/v4_2/repost_stock_reconciliation.py deleted file mode 100644 index ad20ebbae4..0000000000 --- a/erpnext/patches/v4_2/repost_stock_reconciliation.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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 -import json - -def execute(): - existing_allow_negative_stock = frappe.db.get_value("Stock Settings", None, "allow_negative_stock") - frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) - - head_row = ["Item Code", "Warehouse", "Quantity", "Valuation Rate"] - stock_reco_to_be_reposted = [] - for d in frappe.db.sql("""select name, reconciliation_json from `tabStock Reconciliation` - where docstatus=1 and creation > '2014-03-01'""", as_dict=1): - data = json.loads(d.reconciliation_json) - for row in data[data.index(head_row)+1:]: - if row[3] in ["", None]: - stock_reco_to_be_reposted.append(d.name) - break - - for dn in stock_reco_to_be_reposted: - reco = frappe.get_doc("Stock Reconciliation", dn) - reco.docstatus = 2 - reco.on_cancel() - - reco.docstatus = 1 - reco.validate() - reco.on_submit() - - frappe.db.set_value("Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock) diff --git a/erpnext/patches/v4_2/reset_bom_costs.py b/erpnext/patches/v4_2/reset_bom_costs.py deleted file mode 100644 index 42ca759467..0000000000 --- a/erpnext/patches/v4_2/reset_bom_costs.py +++ /dev/null @@ -1,17 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc('manufacturing', 'doctype', 'bom_operation') - for d in frappe.db.sql("""select name from `tabBOM` where docstatus < 2""", as_dict=1): - try: - bom = frappe.get_doc('BOM', d.name) - bom.flags.ignore_validate_update_after_submit = True - bom.calculate_cost() - bom.save() - frappe.db.commit() - except: - frappe.db.rollback() diff --git a/erpnext/patches/v4_2/seprate_manufacture_and_repack.py b/erpnext/patches/v4_2/seprate_manufacture_and_repack.py deleted file mode 100644 index 2c935436a2..0000000000 --- a/erpnext/patches/v4_2/seprate_manufacture_and_repack.py +++ /dev/null @@ -1,9 +0,0 @@ -# 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 - -def execute(): - frappe.db.sql("""update `tabStock Entry` set purpose='Manufacture' where purpose='Manufacture/Repack' and ifnull(work_order,"")!="" """) - frappe.db.sql("""update `tabStock Entry` set purpose='Repack' where purpose='Manufacture/Repack' and ifnull(work_order,"")="" """) \ No newline at end of file diff --git a/erpnext/patches/v4_2/set_company_country.py b/erpnext/patches/v4_2/set_company_country.py deleted file mode 100644 index 89f07f2873..0000000000 --- a/erpnext/patches/v4_2/set_company_country.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - country = frappe.db.get_single_value("Global Defaults", "country") - if not country: - print("Country not specified in Global Defaults") - return - - for company in frappe.db.sql_list("""select name from `tabCompany` - where ifnull(country, '')=''"""): - frappe.db.set_value("Company", company, "country", country) diff --git a/erpnext/patches/v4_2/set_item_has_batch.py b/erpnext/patches/v4_2/set_item_has_batch.py deleted file mode 100644 index 7e52d2def0..0000000000 --- a/erpnext/patches/v4_2/set_item_has_batch.py +++ /dev/null @@ -1,65 +0,0 @@ -# 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 - -def execute(): - frappe.db.sql("update tabItem set has_batch_no = 0 where ifnull(has_batch_no, '') = ''") - frappe.db.sql("update tabItem set has_serial_no = 0 where ifnull(has_serial_no, '') = ''") - - item_list = frappe.db.sql("""select name, has_batch_no, has_serial_no from tabItem - where is_stock_item = 1""", as_dict=1) - - sle_count = get_sle_count() - sle_with_batch = get_sle_with_batch() - sle_with_serial = get_sle_with_serial() - - batch_items = get_items_with_batch() - serialized_items = get_items_with_serial() - - for d in item_list: - if d.has_batch_no == 1: - if d.name not in batch_items and sle_count.get(d.name) and sle_count.get(d.name) != sle_with_batch.get(d.name): - frappe.db.set_value("Item", d.name, "has_batch_no", 0) - else: - if d.name in batch_items or (sle_count.get(d.name) and sle_count.get(d.name) == sle_with_batch.get(d.name)): - frappe.db.set_value("Item", d.name, "has_batch_no", 1) - - if d.has_serial_no == 1: - if d.name not in serialized_items and sle_count.get(d.name) and sle_count.get(d.name) != sle_with_serial.get(d.name): - frappe.db.set_value("Item", d.name, "has_serial_no", 0) - else: - if d.name in serialized_items or (sle_count.get(d.name) and sle_count.get(d.name) == sle_with_serial.get(d.name)): - frappe.db.set_value("Item", d.name, "has_serial_no", 1) - - -def get_sle_count(): - sle_count = {} - for d in frappe.db.sql("""select item_code, count(name) as cnt from `tabStock Ledger Entry` group by item_code""", as_dict=1): - sle_count.setdefault(d.item_code, d.cnt) - - return sle_count - -def get_sle_with_batch(): - sle_with_batch = {} - for d in frappe.db.sql("""select item_code, count(name) as cnt from `tabStock Ledger Entry` - where ifnull(batch_no, '') != '' group by item_code""", as_dict=1): - sle_with_batch.setdefault(d.item_code, d.cnt) - - return sle_with_batch - - -def get_sle_with_serial(): - sle_with_serial = {} - for d in frappe.db.sql("""select item_code, count(name) as cnt from `tabStock Ledger Entry` - where ifnull(serial_no, '') != '' group by item_code""", as_dict=1): - sle_with_serial.setdefault(d.item_code, d.cnt) - - return sle_with_serial - -def get_items_with_batch(): - return frappe.db.sql_list("select item from tabBatch") - -def get_items_with_serial(): - return frappe.db.sql_list("select item_code from `tabSerial No`") diff --git a/erpnext/patches/v4_2/toggle_rounded_total.py b/erpnext/patches/v4_2/toggle_rounded_total.py deleted file mode 100644 index e571208eb6..0000000000 --- a/erpnext/patches/v4_2/toggle_rounded_total.py +++ /dev/null @@ -1,9 +0,0 @@ -# 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 - -def execute(): - global_defaults = frappe.get_doc("Global Defaults", "Global Defaults") - global_defaults.toggle_rounded_total() diff --git a/erpnext/patches/v4_2/update_landed_cost_voucher.py b/erpnext/patches/v4_2/update_landed_cost_voucher.py deleted file mode 100644 index ec0029671e..0000000000 --- a/erpnext/patches/v4_2/update_landed_cost_voucher.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("stock", "doctype", "landed_cost_voucher") - frappe.db.sql("""update `tabLanded Cost Voucher` set distribute_charges_based_on = 'Amount' - where docstatus=1""") diff --git a/erpnext/patches/v4_2/update_project_milestones.py b/erpnext/patches/v4_2/update_project_milestones.py deleted file mode 100644 index e704116d05..0000000000 --- a/erpnext/patches/v4_2/update_project_milestones.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for project in frappe.db.sql_list("select name from tabProject"): - frappe.reload_doc("projects", "doctype", "project") - p = frappe.get_doc("Project", project) - p.update_milestones_completed() - p.db_set("percent_milestones_completed", p.percent_milestones_completed) diff --git a/erpnext/patches/v4_2/update_sales_order_invoice_field_name.py b/erpnext/patches/v4_2/update_sales_order_invoice_field_name.py deleted file mode 100644 index 28dd5c0d4e..0000000000 --- a/erpnext/patches/v4_2/update_sales_order_invoice_field_name.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'sales_invoice') - frappe.db.sql("""update `tabSales Invoice` set from_date = invoice_period_from_date, - to_date = invoice_period_to_date, is_recurring = convert_into_recurring_invoice""") diff --git a/erpnext/patches/v4_2/update_stock_uom_for_dn_in_sle.py b/erpnext/patches/v4_2/update_stock_uom_for_dn_in_sle.py deleted file mode 100644 index 89bf795534..0000000000 --- a/erpnext/patches/v4_2/update_stock_uom_for_dn_in_sle.py +++ /dev/null @@ -1,11 +0,0 @@ -# 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 - -def execute(): - frappe.db.sql("""update `tabStock Ledger Entry` sle, tabItem item - set sle.stock_uom = item.stock_uom - where sle.voucher_type="Delivery Note" and item.name = sle.item_code - and sle.stock_uom != item.stock_uom""") diff --git a/erpnext/patches/v4_4/__init__.py b/erpnext/patches/v4_4/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v4_4/make_email_accounts.py b/erpnext/patches/v4_4/make_email_accounts.py deleted file mode 100644 index 57df1ae491..0000000000 --- a/erpnext/patches/v4_4/make_email_accounts.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model import default_fields - -from six import iteritems - -def execute(): - frappe.reload_doc("email", "doctype", "email_account") - - # outgoing - outgoing = dict(frappe.db.sql("select field, value from tabSingles where doctype='Outgoing Email Settings'")) - if outgoing and outgoing['mail_server'] and outgoing['mail_login']: - account = frappe.new_doc("Email Account") - mapping = { - "login_id_is_different": 1, - "email_id": "auto_email_id", - "login_id": "mail_login", - "password": "mail_password", - "footer": "footer", - "smtp_server": "mail_server", - "smtp_port": "mail_port", - "use_tls": "use_ssl" - } - - for target_fieldname, source_fieldname in iteritems(mapping): - account.set(target_fieldname, outgoing.get(source_fieldname)) - - account.enable_outgoing = 1 - account.enable_incoming = 0 - - account.insert() - - # support - support = dict(frappe.db.sql("select field, value from tabSingles where doctype='Support Email Settings'")) - if support and support['mail_server'] and support['mail_login']: - account = frappe.new_doc("Email Account") - mapping = { - "enable_incoming": "sync_support_mails", - "email_id": "mail_login", - "password": "mail_password", - "email_server": "mail_server", - "use_ssl": "use_ssl", - "signature": "support_signature", - "enable_auto_reply": "send_autoreply", - "auto_reply_message": "support_autoreply" - } - - for target_fieldname, source_fieldname in iteritems(mapping): - account.set(target_fieldname, support.get(source_fieldname)) - - account.enable_outgoing = 0 - account.append_to = "Issue" - - insert_or_update(account) - - # sales, jobs - for doctype in ("Sales Email Settings", "Jobs Email Settings"): - source = dict(frappe.db.sql("select field, value from tabSingles where doctype=%s", doctype)) - if source and source.get('host') and source.get('username'): - account = frappe.new_doc("Email Account") - mapping = { - "enable_incoming": "extract_emails", - "email_id": "username", - "password": "password", - "email_server": "host", - "use_ssl": "use_ssl", - } - - for target_fieldname, source_fieldname in iteritems(mapping): - account.set(target_fieldname, source.get(source_fieldname)) - - account.enable_outgoing = 0 - account.append_to = "Lead" if doctype=="Sales Email Settings" else "Job Applicant" - - insert_or_update(account) - - for doctype in ("Outgoing Email Settings", "Support Email Settings", - "Sales Email Settings", "Jobs Email Settings"): - frappe.delete_doc("DocType", doctype) - -def insert_or_update(account): - try: - account.insert() - except frappe.NameError as e: - if e.args[0]=="Email Account": - existing_account = frappe.get_doc("Email Account", e.args[1]) - for key, value in account.as_dict().items(): - if not existing_account.get(key) and value \ - and key not in default_fields \ - and key != "__islocal": - existing_account.set(key, value) - - existing_account.save() - else: - raise - diff --git a/erpnext/patches/v5_0/__init__.py b/erpnext/patches/v5_0/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v5_0/convert_stock_reconciliation.py b/erpnext/patches/v5_0/convert_stock_reconciliation.py deleted file mode 100644 index 75d1da752f..0000000000 --- a/erpnext/patches/v5_0/convert_stock_reconciliation.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import unicode_literals -import frappe, json - -def execute(): - # stock reco now amendable - frappe.db.sql("""update tabDocPerm set `amend` = 1 where parent='Stock Reconciliation' and submit = 1""") - - frappe.reload_doc("stock", "doctype", "stock_reconciliation_item") - frappe.reload_doctype("Stock Reconciliation") - - if frappe.db.has_column("Stock Reconciliation", "reconciliation_json"): - for sr in frappe.db.get_all("Stock Reconciliation", ["name"], - {"reconciliation_json": ["!=", ""]}): - start = False - sr = frappe.get_doc("Stock Reconciliation", sr.name) - for row in json.loads(sr.reconciliation_json): - if start: - sr.append("items", { - "item_code": row[0], - "warehouse": row[1], - "qty": row[2] if len(row) > 2 else None, - "valuation_rate": row[3] if len(row) > 3 else None - }) - - elif row[0]=="Item Code": - start = True - - - for item in sr.items: - item.db_update() - diff --git a/erpnext/patches/v5_0/execute_on_doctype_update.py b/erpnext/patches/v5_0/execute_on_doctype_update.py deleted file mode 100644 index 70b1d8ded6..0000000000 --- a/erpnext/patches/v5_0/execute_on_doctype_update.py +++ /dev/null @@ -1,9 +0,0 @@ -# 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 - -def execute(): - for dt in ("Stock Ledger Entry", "Communication", "DefaultValue", "DocShare", "File", "ToDo"): - frappe.get_doc("DocType", dt).run_module_method("on_doctype_update") diff --git a/erpnext/patches/v5_0/fix_taxes_and_totals_in_party_currency.py b/erpnext/patches/v5_0/fix_taxes_and_totals_in_party_currency.py deleted file mode 100644 index 30dc0f8db4..0000000000 --- a/erpnext/patches/v5_0/fix_taxes_and_totals_in_party_currency.py +++ /dev/null @@ -1,66 +0,0 @@ -# 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.model.meta import get_field_precision - -def execute(): - if not frappe.db.sql("""select name from `tabPatch Log` - where patch = 'erpnext.patches.v5_0.taxes_and_totals_in_party_currency'"""): - return - selling_doctypes = ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"] - buying_doctypes = ["Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"] - - for dt in selling_doctypes: - update_values(dt, "Sales Taxes and Charges") - - for dt in buying_doctypes: - update_values(dt, "Purchase Taxes and Charges") - -def update_values(dt, tax_table): - rate_field_precision = get_field_precision(frappe.get_meta(dt + " Item").get_field("rate")) - tax_amount_precision = get_field_precision(frappe.get_meta(tax_table).get_field("tax_amount")) - - # update net_total, discount_on - frappe.db.sql(""" - UPDATE - `tab{0}` - SET - total_taxes_and_charges = round(base_total_taxes_and_charges / conversion_rate, {1}) - WHERE - docstatus < 2 - and ifnull(base_total_taxes_and_charges, 0) != 0 - and ifnull(total_taxes_and_charges, 0) = 0 - """.format(dt, tax_amount_precision)) - - # update net_amount - frappe.db.sql(""" - UPDATE - `tab{0}` par, `tab{1}` item - SET - item.net_amount = round(item.base_net_amount / par.conversion_rate, {2}), - item.net_rate = round(item.base_net_rate / par.conversion_rate, {2}) - WHERE - par.name = item.parent - and par.docstatus < 2 - and ((ifnull(item.base_net_amount, 0) != 0 and ifnull(item.net_amount, 0) = 0) - or (ifnull(item.base_net_rate, 0) != 0 and ifnull(item.net_rate, 0) = 0)) - """.format(dt, dt + " Item", rate_field_precision)) - - # update tax in party currency - frappe.db.sql(""" - UPDATE - `tab{0}` par, `tab{1}` tax - SET - tax.tax_amount = round(tax.base_tax_amount / par.conversion_rate, {2}), - tax.total = round(tax.base_total / conversion_rate, {2}), - tax.tax_amount_after_discount_amount = round(tax.base_tax_amount_after_discount_amount / conversion_rate, {2}) - WHERE - par.name = tax.parent - and par.docstatus < 2 - and ((ifnull(tax.base_tax_amount, 0) != 0 and ifnull(tax.tax_amount, 0) = 0) - or (ifnull(tax.base_total, 0) != 0 and ifnull(tax.total, 0) = 0) - or (ifnull(tax.base_tax_amount_after_discount_amount, 0) != 0 and - ifnull(tax.tax_amount_after_discount_amount, 0) = 0)) - """.format(dt, tax_table, tax_amount_precision)) \ No newline at end of file diff --git a/erpnext/patches/v5_0/index_on_account_and_gl_entry.py b/erpnext/patches/v5_0/index_on_account_and_gl_entry.py deleted file mode 100644 index 2920e9293d..0000000000 --- a/erpnext/patches/v5_0/index_on_account_and_gl_entry.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import unicode_literals - -import frappe - -def execute(): - index_map = { - "Account": ["parent_account", "lft", "rgt"], - "GL Entry": ["posting_date", "account", 'party', "voucher_no"], - "Sales Invoice": ["posting_date", "debit_to", "customer"], - "Purchase Invoice": ["posting_date", "credit_to", "supplier"] - } - - for dt, indexes in index_map.items(): - existing_indexes = [(d.Key_name, d.Column_name) for d in frappe.db.sql("""show index from `tab{0}` - where Column_name != 'name'""".format(dt), as_dict=1)] - - for old, column in existing_indexes: - if column in ("parent", "group_or_ledger", "is_group", "is_pl_account", "debit_or_credit", - "account_name", "company", "project", "voucher_date", "due_date", "bill_no", - "bill_date", "is_opening", "fiscal_year", "outstanding_amount"): - frappe.db.sql("alter table `tab{0}` drop index {1}".format(dt, old)) - - existing_indexes = [(d.Key_name, d.Column_name) for d in frappe.db.sql("""show index from `tab{0}` - where Column_name != 'name'""".format(dt), as_dict=1)] - - existing_indexed_columns = list(set([x[1] for x in existing_indexes])) - - for new in indexes: - if new not in existing_indexed_columns: - frappe.db.sql("alter table `tab{0}` add index ({1})".format(dt, new)) \ No newline at end of file diff --git a/erpnext/patches/v5_0/is_group.py b/erpnext/patches/v5_0/is_group.py deleted file mode 100644 index 4e3f760bed..0000000000 --- a/erpnext/patches/v5_0/is_group.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals - -import frappe - -def execute(): - frappe.reload_doctype("Account") - frappe.reload_doctype("Cost Center") - frappe.db.sql("update tabAccount set is_group = if(group_or_ledger='Group', 1, 0)") - frappe.db.sql("update `tabCost Center` set is_group = if(group_or_ledger='Group', 1, 0)") diff --git a/erpnext/patches/v5_0/item_patches.py b/erpnext/patches/v5_0/item_patches.py deleted file mode 100644 index e223e09f5b..0000000000 --- a/erpnext/patches/v5_0/item_patches.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql("update `tabItem` set end_of_life='2099-12-31' where ifnull(end_of_life, '0000-00-00')='0000-00-00'") - frappe.db.sql("update `tabItem` set website_image = image where ifnull(website_image, '') = 'attach_files:'") diff --git a/erpnext/patches/v5_0/link_warehouse_with_account.py b/erpnext/patches/v5_0/link_warehouse_with_account.py deleted file mode 100644 index 338fd7ad7f..0000000000 --- a/erpnext/patches/v5_0/link_warehouse_with_account.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 - -def execute(): - if "master_name" in frappe.db.get_table_columns("Account"): - frappe.db.sql("""update tabAccount set warehouse=master_name - where ifnull(account_type, '') = 'Warehouse' and ifnull(master_name, '') != ''""") \ No newline at end of file diff --git a/erpnext/patches/v5_0/new_crm_module.py b/erpnext/patches/v5_0/new_crm_module.py deleted file mode 100644 index f5dda1f273..0000000000 --- a/erpnext/patches/v5_0/new_crm_module.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import json -import frappe - -def execute(): - frappe.reload_doc('crm', 'doctype', 'lead') - frappe.reload_doc('crm', 'doctype', 'opportunity') - - add_crm_to_user_desktop_items() - -def add_crm_to_user_desktop_items(): - key = "_user_desktop_items" - for user in frappe.get_all("User", filters={"enabled": 1, "user_type": "System User"}): - user = user.name - user_desktop_items = frappe.db.get_defaults(key, parent=user) - if user_desktop_items: - user_desktop_items = json.loads(user_desktop_items) - if "CRM" not in user_desktop_items: - user_desktop_items.append("CRM") - frappe.db.set_default(key, json.dumps(user_desktop_items), parent=user) - diff --git a/erpnext/patches/v5_0/newsletter.py b/erpnext/patches/v5_0/newsletter.py deleted file mode 100644 index 63e3312413..0000000000 --- a/erpnext/patches/v5_0/newsletter.py +++ /dev/null @@ -1,38 +0,0 @@ -# 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 -import frappe.permissions - -def execute(): - frappe.reload_doc("core", "doctype", "block_module") - frappe.reload_doctype("User") - frappe.reload_doctype("Lead") - frappe.reload_doctype("Contact") - - frappe.reload_doc('email', 'doctype', 'email_group') - frappe.reload_doc('email', 'doctype', 'email_group_member') - frappe.reload_doc('email', 'doctype', 'newsletter') - - frappe.permissions.reset_perms("Newsletter") - - if not frappe.db.exists("Role", "Newsletter Manager"): - frappe.get_doc({"doctype": "Role", "role": "Newsletter Manager"}).insert() - - for userrole in frappe.get_all("Has Role", "parent", {"role": "Sales Manager", "parenttype": "User"}): - if frappe.db.exists("User", userrole.parent): - user = frappe.get_doc("User", userrole.parent) - user.append("roles", { - "doctype": "Has Role", - "role": "Newsletter Manager" - }) - user.flags.ignore_mandatory = True - user.save() - - # create default lists - general = frappe.new_doc("Email Group") - general.title = "General" - general.insert() - general.import_from("Lead") - general.import_from("Contact") diff --git a/erpnext/patches/v5_0/opportunity_not_submittable.py b/erpnext/patches/v5_0/opportunity_not_submittable.py deleted file mode 100644 index e29d66f284..0000000000 --- a/erpnext/patches/v5_0/opportunity_not_submittable.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype("Opportunity") - frappe.db.sql("update tabDocPerm set submit=0, cancel=0, amend=0 where parent='Opportunity'") - frappe.db.sql("update tabOpportunity set docstatus=0 where docstatus=1") diff --git a/erpnext/patches/v5_0/party_model_patch_fix.py b/erpnext/patches/v5_0/party_model_patch_fix.py deleted file mode 100644 index d9b6709792..0000000000 --- a/erpnext/patches/v5_0/party_model_patch_fix.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for company in frappe.get_all("Company", - ["name", "default_receivable_account", "default_payable_account"]): - - if company.default_receivable_account: - frappe.db.sql("""update `tabSales Invoice` invoice set `debit_to`=%(account)s - where company=%(company)s - and not exists (select name from `tabAccount` account where account.name=invoice.debit_to)""", - {"company": company.name, "account": company.default_receivable_account}) - - if company.default_payable_account: - frappe.db.sql("""update `tabPurchase Invoice` invoice set `credit_to`=%(account)s - where company=%(company)s - and not exists (select name from `tabAccount` account where account.name=invoice.credit_to)""", - {"company": company.name, "account": company.default_payable_account}) diff --git a/erpnext/patches/v5_0/portal_fixes.py b/erpnext/patches/v5_0/portal_fixes.py deleted file mode 100644 index 1fefd99167..0000000000 --- a/erpnext/patches/v5_0/portal_fixes.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe -import erpnext.setup.install - -def execute(): - frappe.reload_doc("website", "doctype", "web_form_field", force=True, reset_permissions=True) - #erpnext.setup.install.add_web_forms() diff --git a/erpnext/patches/v5_0/project_costing.py b/erpnext/patches/v5_0/project_costing.py deleted file mode 100644 index e2d65d0594..0000000000 --- a/erpnext/patches/v5_0/project_costing.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Project") - frappe.db.sql("update `tabProject` set expected_start_date = project_start_date, \ - expected_end_date = completion_date, actual_end_date = act_completion_date, \ - estimated_costing = project_value, gross_margin = gross_margin_value") \ No newline at end of file diff --git a/erpnext/patches/v5_0/recalculate_total_amount_in_jv.py b/erpnext/patches/v5_0/recalculate_total_amount_in_jv.py deleted file mode 100644 index d5af43c541..0000000000 --- a/erpnext/patches/v5_0/recalculate_total_amount_in_jv.py +++ /dev/null @@ -1,26 +0,0 @@ -# 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.utils import money_in_words - -def execute(): - company_currency = dict(frappe.db.sql("select name, default_currency from `tabCompany`")) - bank_or_cash_accounts = frappe.db.sql_list("""select name from `tabAccount` - where account_type in ('Bank', 'Cash') and docstatus < 2""") - - for je in frappe.db.sql_list("""select name from `tabJournal Entry` where docstatus < 2"""): - total_amount = 0 - total_amount_in_words = "" - - je_doc = frappe.get_doc('Journal Entry', je) - for d in je_doc.get("accounts"): - if (d.party_type and d.party) or d.account in bank_or_cash_accounts: - total_amount = d.debit or d.credit - if total_amount: - total_amount_in_words = money_in_words(total_amount, company_currency.get(je_doc.company)) - - if total_amount: - frappe.db.sql("""update `tabJournal Entry` set total_amount=%s, total_amount_in_words=%s - where name = %s""", (total_amount, total_amount_in_words, je)) diff --git a/erpnext/patches/v5_0/reclculate_planned_operating_cost_in_production_order.py b/erpnext/patches/v5_0/reclculate_planned_operating_cost_in_production_order.py deleted file mode 100644 index 6d392831b4..0000000000 --- a/erpnext/patches/v5_0/reclculate_planned_operating_cost_in_production_order.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 - -def execute(): - for wo in frappe.db.sql("""select name from `tabWork Order` where docstatus < 2""", as_dict=1): - work_order = frappe.get_doc("Work Order", wo.name) - if work_order.operations: - work_order.flags.ignore_validate_update_after_submit = True - work_order.calculate_time() - work_order.save() \ No newline at end of file diff --git a/erpnext/patches/v5_0/remove_birthday_events.py b/erpnext/patches/v5_0/remove_birthday_events.py deleted file mode 100644 index 3ead8669b8..0000000000 --- a/erpnext/patches/v5_0/remove_birthday_events.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for e in frappe.db.sql_list("""select name from tabEvent where - repeat_on='Every Year' and ref_type='Employee'"""): - frappe.delete_doc("Event", e, force=True) diff --git a/erpnext/patches/v5_0/rename_customer_issue.py b/erpnext/patches/v5_0/rename_customer_issue.py deleted file mode 100644 index 1bd69ceec1..0000000000 --- a/erpnext/patches/v5_0/rename_customer_issue.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.table_exists("Customer Issue"): - frappe.rename_doc("DocType", "Customer Issue", "Warranty Claim") diff --git a/erpnext/patches/v5_0/rename_pos_setting.py b/erpnext/patches/v5_0/rename_pos_setting.py deleted file mode 100644 index bf10333564..0000000000 --- a/erpnext/patches/v5_0/rename_pos_setting.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.table_exists("POS Setting"): - frappe.rename_doc("DocType", "POS Setting", "POS Profile") diff --git a/erpnext/patches/v5_0/rename_table_fieldnames.py b/erpnext/patches/v5_0/rename_table_fieldnames.py deleted file mode 100644 index aefb0a2037..0000000000 --- a/erpnext/patches/v5_0/rename_table_fieldnames.py +++ /dev/null @@ -1,243 +0,0 @@ -# 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.model.utils.rename_field import rename_field -from frappe.modules import scrub, get_doctype_module - -rename_map = { - "Opportunity": [ - ["enquiry_details", "items"] - ], - "Quotation": [ - ["quotation_details", "items"], - ["other_charges", "taxes"] - ], - "Sales Order": [ - ["sales_order_details", "items"], - ["other_charges", "taxes"], - ["packing_details", "packed_items"] - ], - "Delivery Note": [ - ["delivery_note_details", "items"], - ["other_charges", "taxes"], - ["packing_details", "packed_items"] - ], - "Sales Invoice": [ - ["entries", "items"], - ["other_charges", "taxes"], - ["packing_details", "packed_items"], - ["advance_adjustment_details", "advances"] - ], - "Material Request": [ - ["indent_details", "items"] - ], - "Supplier Quotation": [ - ["quotation_items", "items"], - ["other_charges", "taxes"] - ], - "Purchase Order": [ - ["po_details", "items"], - ["other_charges", "taxes"], - ["po_raw_material_details", "supplied_items"] - ], - "Purchase Receipt": [ - ["purchase_receipt_details", "items"], - ["other_charges", "taxes"], - ["pr_raw_material_details", "supplied_items"] - ], - "Purchase Invoice": [ - ["entries", "items"], - ["other_charges", "taxes"], - ["advance_allocation_details", "advances"] - ], - "Work Order": [ - ["production_order_operations", "operations"] - ], - "BOM": [ - ["bom_operations", "operations"], - ["bom_materials", "items"], - ["flat_bom_details", "exploded_items"] - ], - "Payment Reconciliation": [ - ["payment_reconciliation_payments", "payments"], - ["payment_reconciliation_invoices", "invoices"] - ], - "Sales Taxes and Charges Template": [ - ["other_charges", "taxes"], - ["valid_for_territories", "territories"] - ], - "Purchase Taxes and Charges Template": [ - ["other_charges", "taxes"] - ], - "Shipping Rule": [ - ["shipping_rule_conditions", "conditions"], - ["valid_for_territories", "territories"] - ], - "Price List": [ - ["valid_for_territories", "territories"] - ], - "Appraisal": [ - ["appraisal_details", "goals"] - ], - "Appraisal Template": [ - ["kra_sheet", "goals"] - ], - "Bank Reconciliation": [ - ["entries", "journal_entries"] - ], - "C-Form": [ - ["invoice_details", "invoices"] - ], - "Employee": [ - ["employee_leave_approvers", "leave_approvers"], - ["educational_qualification_details", "education"], - ["previous_experience_details", "external_work_history"], - ["experience_in_company_details", "internal_work_history"] - ], - "Expense Claim": [ - ["expense_voucher_details", "expenses"] - ], - "Fiscal Year": [ - ["fiscal_year_companies", "companies"] - ], - "Holiday List": [ - ["holiday_list_details", "holidays"] - ], - "Installation Note": [ - ["installed_item_details", "items"] - ], - "Item": [ - ["item_reorder", "reorder_levels"], - ["uom_conversion_details", "uoms"], - ["item_supplier_details", "supplier_items"], - ["item_customer_details", "customer_items"], - ["item_tax", "taxes"], - ["item_specification_details", "quality_parameters"], - ["item_website_specifications", "website_specifications"] - ], - "Item Group": [ - ["item_website_specifications", "website_specifications"] - ], - "Landed Cost Voucher": [ - ["landed_cost_purchase_receipts", "purchase_receipts"], - ["landed_cost_items", "items"], - ["landed_cost_taxes_and_charges", "taxes"] - ], - "Maintenance Schedule": [ - ["item_maintenance_detail", "items"], - ["maintenance_schedule_detail", "schedules"] - ], - "Maintenance Visit": [ - ["maintenance_visit_details", "purposes"] - ], - "Packing Slip": [ - ["item_details", "items"] - ], - "Customer": [ - ["party_accounts", "accounts"] - ], - "Customer Group": [ - ["party_accounts", "accounts"] - ], - "Supplier": [ - ["party_accounts", "accounts"] - ], - "Supplier Type": [ - ["party_accounts", "accounts"] - ], - "Payment Tool": [ - ["payment_tool_details", "vouchers"] - ], - "Production Planning Tool": [ - ["pp_so_details", "sales_orders"], - ["pp_details", "items"] - ], - "Quality Inspection": [ - ["qa_specification_details", "readings"] - ], - "Salary Slip": [ - ["earning_details", "earnings"], - ["deduction_details", "deductions"] - ], - "Salary Structure": [ - ["earning_details", "earnings"], - ["deduction_details", "deductions"] - ], - "Product Bundle": [ - ["sales_bom_items", "items"] - ], - "SMS Settings": [ - ["static_parameter_details", "parameters"] - ], - "Stock Entry": [ - ["mtn_details", "items"] - ], - "Sales Partner": [ - ["partner_target_details", "targets"] - ], - "Sales Person": [ - ["target_details", "targets"] - ], - "Territory": [ - ["target_details", "targets"] - ], - "Time Sheet": [ - ["time_sheet_details", "time_logs"] - ], - "Workstation": [ - ["workstation_operation_hours", "working_hours"] - ], - "Payment Reconciliation Payment": [ - ["journal_voucher", "journal_entry"], - ], - "Purchase Invoice Advance": [ - ["journal_voucher", "journal_entry"], - ], - "Sales Invoice Advance": [ - ["journal_voucher", "journal_entry"], - ], - "Journal Entry": [ - ["entries", "accounts"] - ], - "Monthly Distribution": [ - ["budget_distribution_details", "percentages"] - ] -} - -def execute(): - # rename doctypes - tables = frappe.db.sql_list("show tables") - for old_dt, new_dt in [["Journal Voucher Detail", "Journal Entry Account"], - ["Journal Voucher", "Journal Entry"], - ["Budget Distribution Detail", "Monthly Distribution Percentage"], - ["Budget Distribution", "Monthly Distribution"]]: - if "tab"+new_dt not in tables: - frappe.rename_doc("DocType", old_dt, new_dt, force=True) - - # reload new child doctypes - frappe.reload_doc("manufacturing", "doctype", "work_order_operation") - frappe.reload_doc("manufacturing", "doctype", "workstation_working_hour") - frappe.reload_doc("stock", "doctype", "item_variant") - frappe.reload_doc("Payroll", "doctype", "salary_detail") - frappe.reload_doc("accounts", "doctype", "party_account") - frappe.reload_doc("accounts", "doctype", "fiscal_year_company") - - #rename table fieldnames - for dn in rename_map: - if not frappe.db.exists("DocType", dn): - continue - frappe.reload_doc(get_doctype_module(dn), "doctype", scrub(dn)) - - for dt, field_list in rename_map.items(): - if not frappe.db.exists("DocType", dt): - continue - for field in field_list: - rename_field(dt, field[0], field[1]) - - # update voucher type - for old, new in [["Bank Voucher", "Bank Entry"], ["Cash Voucher", "Cash Entry"], - ["Credit Card Voucher", "Credit Card Entry"], ["Contra Voucher", "Contra Entry"], - ["Write Off Voucher", "Write Off Entry"], ["Excise Voucher", "Excise Entry"]]: - frappe.db.sql("update `tabJournal Entry` set voucher_type=%s where voucher_type=%s", (new, old)) diff --git a/erpnext/patches/v5_0/rename_taxes_and_charges_master.py b/erpnext/patches/v5_0/rename_taxes_and_charges_master.py deleted file mode 100644 index e26f48cda1..0000000000 --- a/erpnext/patches/v5_0/rename_taxes_and_charges_master.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - - -def execute(): - if frappe.db.table_exists("Sales Taxes and Charges Master"): - frappe.rename_doc("DocType", "Sales Taxes and Charges Master", - "Sales Taxes and Charges Template") - frappe.delete_doc("DocType", "Sales Taxes and Charges Master") - - if frappe.db.table_exists("Purchase Taxes and Charges Master"): - frappe.rename_doc("DocType", "Purchase Taxes and Charges Master", - "Purchase Taxes and Charges Template") - frappe.delete_doc("DocType", "Purchase Taxes and Charges Master") diff --git a/erpnext/patches/v5_0/rename_total_fields.py b/erpnext/patches/v5_0/rename_total_fields.py deleted file mode 100644 index 6657dd843e..0000000000 --- a/erpnext/patches/v5_0/rename_total_fields.py +++ /dev/null @@ -1,55 +0,0 @@ -# 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.model.utils.rename_field import rename_field -from frappe.modules import scrub, get_doctype_module - -selling_doctypes = ("Quotation", "Sales Order", "Delivery Note", "Sales Invoice") - -buying_doctypes = ("Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice") - -selling_renamed_fields = ( - ("net_total", "base_net_total"), - ("net_total_export", "net_total"), - ("other_charges_total", "base_total_taxes_and_charges"), - ("other_charges_total_export", "total_taxes_and_charges"), - ("grand_total", "base_grand_total"), - ("grand_total_export", "grand_total"), - ("rounded_total", "base_rounded_total"), - ("rounded_total_export", "rounded_total"), - ("in_words", "base_in_words"), - ("in_words_export", "in_words") -) - -buying_renamed_fields = ( - ("net_total", "base_net_total"), - ("net_total_import", "net_total"), - ("grand_total", "base_grand_total"), - ("grand_total_import", "grand_total"), - ("rounded_total", "base_rounded_total"), - ("in_words", "base_in_words"), - ("in_words_import", "in_words"), - ("other_charges_added", "base_taxes_and_charges_added"), - ("other_charges_added_import", "taxes_and_charges_added"), - ("other_charges_deducted", "base_taxes_and_charges_deducted"), - ("other_charges_deducted_import", "taxes_and_charges_deducted"), - ("total_tax", "base_total_taxes_and_charges") -) - -def execute(): - for doctypes, fields in [[selling_doctypes, selling_renamed_fields], [buying_doctypes, buying_renamed_fields]]: - for dt in doctypes: - frappe.reload_doc(get_doctype_module(dt), "doctype", scrub(dt)) - table_columns = frappe.db.get_table_columns(dt) - base_net_total = frappe.db.sql("select sum(ifnull({0}, 0)) from `tab{1}`".format(fields[0][1], dt))[0][0] - if not base_net_total: - for f in fields: - if f[0] in table_columns: - rename_field(dt, f[0], f[1]) - - # Added new field "total_taxes_and_charges" in buying cycle, updating value - if dt in ("Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"): - frappe.db.sql("""update `tab{0}` set total_taxes_and_charges = - round(base_total_taxes_and_charges/conversion_rate, 2)""".format(dt)) diff --git a/erpnext/patches/v5_0/replace_renamed_fields_in_custom_scripts_and_print_formats.py b/erpnext/patches/v5_0/replace_renamed_fields_in_custom_scripts_and_print_formats.py deleted file mode 100644 index c564f8b02a..0000000000 --- a/erpnext/patches/v5_0/replace_renamed_fields_in_custom_scripts_and_print_formats.py +++ /dev/null @@ -1,65 +0,0 @@ -# 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 -import re - -def execute(): - # NOTE: sequence is important - renamed_fields = get_all_renamed_fields() - - for dt, script_field, ref_dt_field in (("Client Script", "script", "dt"), ("Print Format", "html", "doc_type")): - - cond1 = " or ".join("""{0} like "%%{1}%%" """.format(script_field, d[0].replace("_", "\\_")) for d in renamed_fields) - cond2 = " and standard = 'No'" if dt == "Print Format" else "" - - for name, script, ref_dt in frappe.db.sql("select name, {0} as script, {1} as ref_dt from `tab{2}` where ({3}) {4}".format(script_field, ref_dt_field, dt, cond1, cond2)): - update_script(dt, name, ref_dt, script_field, script, renamed_fields) - -def get_all_renamed_fields(): - from erpnext.patches.v5_0.rename_table_fieldnames import rename_map - - renamed_fields = ( - ("base_amount", "base_net_amount"), - ("net_total", "base_net_total"), - ("net_total_export", "total"), - ("net_total_import", "total"), - ("other_charges_total", "base_total_taxes_and_charges"), - ("other_charges_total_export", "total_taxes_and_charges"), - ("other_charges_added", "base_taxes_and_charges_added"), - ("other_charges_added_import", "taxes_and_charges_added"), - ("other_charges_deducted", "base_taxes_and_charges_deducted"), - ("other_charges_deducted_import", "taxes_and_charges_deducted"), - ("total_tax", "base_total_taxes_and_charges"), - ("grand_total", "base_grand_total"), - ("grand_total_export", "grand_total"), - ("grand_total_import", "grand_total"), - ("rounded_total", "base_rounded_total"), - ("rounded_total_export", "rounded_total"), - ("rounded_total_import", "rounded_total"), - ("in_words", "base_in_words"), - ("in_words_export", "in_words"), - ("in_words_import", "in_words"), - ("tax_amount", "base_tax_amount"), - ("tax_amount_after_discount_amount", "base_tax_amount_after_discount_amount"), - ) - - for fields in rename_map.values(): - renamed_fields += tuple(fields) - - return renamed_fields - -def update_script(dt, name, ref_dt, script_field, script, renamed_fields): - for from_field, to_field in renamed_fields: - if from_field != "entries": - script = re.sub(r"\b{}\b".format(from_field), to_field, script) - - if ref_dt == "Journal Entry": - script = re.sub(r"\bentries\b", "accounts", script) - elif ref_dt == "Bank Reconciliation": - script = re.sub(r"\bentries\b", "journal_entries", script) - elif ref_dt in ("Sales Invoice", "Purchase Invoice"): - script = re.sub(r"\bentries\b", "items", script) - - frappe.db.set_value(dt, name, script_field, script) \ No newline at end of file diff --git a/erpnext/patches/v5_0/repost_gle_for_jv_with_multiple_party.py b/erpnext/patches/v5_0/repost_gle_for_jv_with_multiple_party.py deleted file mode 100644 index 76efdcc7c6..0000000000 --- a/erpnext/patches/v5_0/repost_gle_for_jv_with_multiple_party.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - je_list = frappe.db.sql_list(""" - select par.name from `tabJournal Entry` par - where par.docstatus=1 and par.creation > '2015-03-01' - and (select count(distinct child.party) from `tabJournal Entry Account` child - where par.name=child.parent and ifnull(child.party, '') != '') > 1 - """) - - for d in je_list: - # delete existing gle - frappe.db.sql("delete from `tabGL Entry` where voucher_type='Journal Entry' and voucher_no=%s", d) - - # repost gl entries - je = frappe.get_doc("Journal Entry", d) - je.make_gl_entries() - - if je_list: - print(je_list) - - \ No newline at end of file diff --git a/erpnext/patches/v5_0/repost_requested_qty.py b/erpnext/patches/v5_0/repost_requested_qty.py deleted file mode 100644 index 6af71f3fc4..0000000000 --- a/erpnext/patches/v5_0/repost_requested_qty.py +++ /dev/null @@ -1,21 +0,0 @@ -# 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 - -def execute(): - from erpnext.stock.stock_balance import update_bin_qty, get_indented_qty - - count=0 - for item_code, warehouse in frappe.db.sql("""select distinct item_code, warehouse - from `tabMaterial Request Item` where docstatus = 1"""): - try: - count += 1 - update_bin_qty(item_code, warehouse, { - "indented_qty": get_indented_qty(item_code, warehouse), - }) - if count % 200 == 0: - frappe.db.commit() - except: - frappe.db.rollback() diff --git a/erpnext/patches/v5_0/reset_values_in_tools.py b/erpnext/patches/v5_0/reset_values_in_tools.py deleted file mode 100644 index fd970ba1b0..0000000000 --- a/erpnext/patches/v5_0/reset_values_in_tools.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - for dt in ["Payment Tool", "Bank Reconciliation", "Payment Reconciliation", "Leave Control Panel", - "Salary Manager", "Upload Attenadance", "Production Planning Tool", "BOM Update Tool", "Customize Form", - "Employee Attendance Tool", "Rename Tool", "BOM Update Tool", "Process Payroll", "Naming Series"]: - frappe.db.sql("delete from `tabSingles` where doctype=%s", dt) - \ No newline at end of file diff --git a/erpnext/patches/v5_0/set_appraisal_remarks.py b/erpnext/patches/v5_0/set_appraisal_remarks.py deleted file mode 100644 index 8652c32cf0..0000000000 --- a/erpnext/patches/v5_0/set_appraisal_remarks.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Appraisal") - frappe.db.sql("update `tabAppraisal` set remarks = comments") \ No newline at end of file diff --git a/erpnext/patches/v5_0/set_default_company_in_bom.py b/erpnext/patches/v5_0/set_default_company_in_bom.py deleted file mode 100644 index a5cd761119..0000000000 --- a/erpnext/patches/v5_0/set_default_company_in_bom.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("manufacturing", "doctype", "bom") - company = frappe.db.get_value("Global Defaults", None, "default_company") - frappe.db.sql("""update `tabBOM` set company = %s""",company) diff --git a/erpnext/patches/v5_0/set_footer_address.py b/erpnext/patches/v5_0/set_footer_address.py deleted file mode 100644 index 8120d834e1..0000000000 --- a/erpnext/patches/v5_0/set_footer_address.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("System Settings") - ss = frappe.get_doc("System Settings", "System Settings") - ss.email_footer_address = frappe.db.get_default("company") - ss.flags.ignore_mandatory = True - ss.save() diff --git a/erpnext/patches/v5_0/stock_entry_update_value.py b/erpnext/patches/v5_0/stock_entry_update_value.py deleted file mode 100644 index ba1af310f5..0000000000 --- a/erpnext/patches/v5_0/stock_entry_update_value.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for d in frappe.db.get_all("Stock Entry"): - se = frappe.get_doc("Stock Entry", d.name) - se.set_total_incoming_outgoing_value() - se.db_update() diff --git a/erpnext/patches/v5_0/taxes_and_totals_in_party_currency.py b/erpnext/patches/v5_0/taxes_and_totals_in_party_currency.py deleted file mode 100644 index 76d10820b5..0000000000 --- a/erpnext/patches/v5_0/taxes_and_totals_in_party_currency.py +++ /dev/null @@ -1,80 +0,0 @@ -# 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.model.meta import get_field_precision -from frappe.custom.doctype.property_setter.property_setter import make_property_setter - -def execute(): - selling_doctypes = ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"] - buying_doctypes = ["Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"] - - for dt in selling_doctypes: - update_values(dt, "Sales Taxes and Charges") - - for dt in buying_doctypes: - update_values(dt, "Purchase Taxes and Charges") - -def update_values(dt, tax_table): - frappe.reload_doctype(dt) - frappe.reload_doctype(dt + " Item") - frappe.reload_doctype(tax_table) - - net_total_precision = get_field_precision(frappe.get_meta(dt).get_field("net_total")) - for field in ("total", "base_total", "base_net_total"): - make_property_setter(dt, field, "precision", net_total_precision, "Select") - - rate_field_precision = get_field_precision(frappe.get_meta(dt + " Item").get_field("rate")) - for field in ("net_rate", "base_net_rate", "net_amount", "base_net_amount", "base_rate", "base_amount"): - make_property_setter(dt + " Item", field, "precision", rate_field_precision, "Select") - - tax_amount_precision = get_field_precision(frappe.get_meta(tax_table).get_field("tax_amount")) - for field in ("base_tax_amount", "total", "base_total", "tax_amount_after_discount_amount", - "base_tax_amount_after_discount_amount"): - make_property_setter(tax_table, field, "precision", tax_amount_precision, "Select") - - # update net_total, discount_on - frappe.db.sql(""" - UPDATE - `tab{0}` - SET - total = round(net_total, {1}), - base_total = round(net_total*conversion_rate, {1}), - net_total = round(base_net_total / conversion_rate, {1}), - apply_discount_on = "Grand Total" - WHERE - docstatus < 2 - """.format(dt, net_total_precision)) - - # update net_amount - frappe.db.sql(""" - UPDATE - `tab{0}` par, `tab{1}` item - SET - item.base_net_amount = round(item.base_amount, {2}), - item.base_net_rate = round(item.base_rate, {2}), - item.net_amount = round(item.base_amount / par.conversion_rate, {2}), - item.net_rate = round(item.base_rate / par.conversion_rate, {2}), - item.base_amount = round(item.amount * par.conversion_rate, {2}), - item.base_rate = round(item.rate * par.conversion_rate, {2}) - WHERE - par.name = item.parent - and par.docstatus < 2 - """.format(dt, dt + " Item", rate_field_precision)) - - # update tax in party currency - frappe.db.sql(""" - UPDATE - `tab{0}` par, `tab{1}` tax - SET - tax.base_tax_amount = round(tax.tax_amount, {2}), - tax.tax_amount = round(tax.tax_amount / par.conversion_rate, {2}), - tax.base_total = round(tax.total, {2}), - tax.total = round(tax.total / conversion_rate, {2}), - tax.base_tax_amount_after_discount_amount = round(tax.tax_amount_after_discount_amount, {2}), - tax.tax_amount_after_discount_amount = round(tax.tax_amount_after_discount_amount / conversion_rate, {2}) - WHERE - par.name = tax.parent - and par.docstatus < 2 - """.format(dt, tax_table, tax_amount_precision)) diff --git a/erpnext/patches/v5_0/update_account_types.py b/erpnext/patches/v5_0/update_account_types.py deleted file mode 100644 index 424743efaa..0000000000 --- a/erpnext/patches/v5_0/update_account_types.py +++ /dev/null @@ -1,20 +0,0 @@ -# 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 - -def execute(): - for company in frappe.db.get_all("Company"): - company = frappe.get_doc("Company", company.name) - - match_types = ("Stock Received But Not Billed", "Stock Adjustment", "Expenses Included In Valuation", - "Cost of Goods Sold") - - for account_type in match_types: - account_name = "{0} - {1}".format(account_type, company.abbr) - current_account_type = frappe.db.get_value("Account", account_name, "account_type") - if current_account_type != account_type: - frappe.db.set_value("Account", account_name, "account_type", account_type) - - company.set_default_accounts() diff --git a/erpnext/patches/v5_0/update_advance_paid.py b/erpnext/patches/v5_0/update_advance_paid.py deleted file mode 100644 index 74e71e84c8..0000000000 --- a/erpnext/patches/v5_0/update_advance_paid.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 - -def execute(): - for dt in ("Sales Order", "Purchase Order"): - orders_with_advance = frappe.db.sql("""select name from `tab{0}` - where docstatus < 2 and ifnull(advance_paid, 0) != 0""".format(dt), as_dict=1) - - for order in orders_with_advance: - frappe.get_doc(dt, order.name).set_total_advance_paid() \ No newline at end of file diff --git a/erpnext/patches/v5_0/update_companywise_payment_account.py b/erpnext/patches/v5_0/update_companywise_payment_account.py deleted file mode 100644 index fb4b919c85..0000000000 --- a/erpnext/patches/v5_0/update_companywise_payment_account.py +++ /dev/null @@ -1,21 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'mode_of_payment') - frappe.reload_doc('accounts', 'doctype', 'mode_of_payment_account') - - mode_of_payment_list = frappe.db.sql("""select name, default_account - from `tabMode of Payment`""", as_dict=1) - - for d in mode_of_payment_list: - if d.get("default_account"): - parent_doc = frappe.get_doc("Mode of Payment", d.get("name")) - - parent_doc.set("accounts", - [{"company": frappe.db.get_value("Account", d.get("default_account"), "company"), - "default_account": d.get("default_account")}]) - parent_doc.save() diff --git a/erpnext/patches/v5_0/update_dn_against_doc_fields.py b/erpnext/patches/v5_0/update_dn_against_doc_fields.py deleted file mode 100644 index 56f4f484b1..0000000000 --- a/erpnext/patches/v5_0/update_dn_against_doc_fields.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc('stock', 'doctype', 'delivery_note_item') - - frappe.db.sql("""update `tabDelivery Note Item` set so_detail = prevdoc_detail_docname - where ifnull(against_sales_order, '') != ''""") - - frappe.db.sql("""update `tabDelivery Note Item` set si_detail = prevdoc_detail_docname - where ifnull(against_sales_invoice, '') != ''""") diff --git a/erpnext/patches/v5_0/update_from_bom.py b/erpnext/patches/v5_0/update_from_bom.py deleted file mode 100644 index 4b3e62d7a5..0000000000 --- a/erpnext/patches/v5_0/update_from_bom.py +++ /dev/null @@ -1,9 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype("Stock Entry") - frappe.db.sql("update `tabStock Entry` set from_bom = if(ifnull(bom_no, '')='', 0, 1)") diff --git a/erpnext/patches/v5_0/update_frozen_accounts_permission_role.py b/erpnext/patches/v5_0/update_frozen_accounts_permission_role.py deleted file mode 100644 index b52785ae60..0000000000 --- a/erpnext/patches/v5_0/update_frozen_accounts_permission_role.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 - -def execute(): - account_settings = frappe.get_doc("Accounts Settings") - - if not account_settings.frozen_accounts_modifier and account_settings.bde_auth_role: - frappe.db.set_value("Accounts Settings", None, - "frozen_accounts_modifier", account_settings.bde_auth_role) - diff --git a/erpnext/patches/v5_0/update_item_and_description_again.py b/erpnext/patches/v5_0/update_item_and_description_again.py deleted file mode 100644 index 35dedcc072..0000000000 --- a/erpnext/patches/v5_0/update_item_and_description_again.py +++ /dev/null @@ -1,50 +0,0 @@ -# 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.utils import cstr -import re - -def execute(): - item_details = frappe._dict() - for d in frappe.db.sql("select name, description from `tabItem`", as_dict=1): - description = cstr(d.description).strip() - new_desc = extract_description(description) - - item_details.setdefault(d.name, frappe._dict({ - "old_description": description, - "new_description": new_desc - })) - - - dt_list= ["Purchase Order Item","Supplier Quotation Item", "BOM", "BOM Explosion Item" , \ - "BOM Item", "Opportunity Item" , "Quotation Item" , "Sales Order Item" , "Delivery Note Item" , \ - "Material Request Item" , "Purchase Receipt Item" , "Stock Entry Detail"] - for dt in dt_list: - frappe.reload_doctype(dt) - records = frappe.db.sql("""select name, `{0}` as item_code, description from `tab{1}` - where description is not null and description like '%%]*\>".format(tag), "", desc) - - return desc diff --git a/erpnext/patches/v5_0/update_item_desc_in_invoice.py b/erpnext/patches/v5_0/update_item_desc_in_invoice.py deleted file mode 100644 index dba35d5693..0000000000 --- a/erpnext/patches/v5_0/update_item_desc_in_invoice.py +++ /dev/null @@ -1,52 +0,0 @@ -# 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.website.utils import find_first_image -from frappe.utils import cstr -import re - -def execute(): - item_details = frappe._dict() - for d in frappe.db.sql("select name, description, image from `tabItem`", as_dict=1): - description = cstr(d.description).strip() - item_details.setdefault(d.name, frappe._dict({ - "description": description, - "image": d.image - })) - - - dt_list= ["Sales Invoice Item","Purchase Invoice Item"] - for dt in dt_list: - frappe.reload_doctype(dt) - records = frappe.db.sql("""select name, item_code, description from `tab{0}` - where ifnull(item_code, '') != '' and description is not null """.format(dt), as_dict=1) - - count = 1 - for d in records: - if item_details.get(d.item_code) and cstr(d.description) == item_details.get(d.item_code).description: - desc = item_details.get(d.item_code).description - image = item_details.get(d.item_code).image - else: - desc, image = extract_image_and_description(cstr(d.description)) - - if not image: - item_detail = item_details.get(d.item_code) - if item_detail: - image = item_detail.image - - frappe.db.sql("""update `tab{0}` set description = %s, image = %s - where name = %s """.format(dt), (desc, image, d.name)) - - count += 1 - if count % 500 == 0: - frappe.db.commit() - - -def extract_image_and_description(data): - image_url = find_first_image(data) - desc = data - for tag in ("img", "table", "tr", "td"): - desc = re.sub("\]*\>".format(tag), "", desc) - return desc, image_url \ No newline at end of file diff --git a/erpnext/patches/v5_0/update_item_description_and_image.py b/erpnext/patches/v5_0/update_item_description_and_image.py deleted file mode 100644 index 75df39ee39..0000000000 --- a/erpnext/patches/v5_0/update_item_description_and_image.py +++ /dev/null @@ -1,54 +0,0 @@ -# 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.website.utils import find_first_image -from frappe.utils import cstr -import re - -def execute(): - item_details = frappe._dict() - for d in frappe.db.sql("select name, description_html, description from `tabItem`", as_dict=1): - description = cstr(d.description_html).strip() or cstr(d.description).strip() - image_url, new_desc = extract_image_and_description(description) - - item_details.setdefault(d.name, frappe._dict({ - "old_description": description, - "new_description": new_desc, - "image_url": image_url - })) - - - dt_list= ["Purchase Order Item","Supplier Quotation Item", "BOM", "BOM Explosion Item" , \ - "BOM Item", "Opportunity Item" , "Quotation Item" , "Sales Order Item" , "Delivery Note Item" , \ - "Material Request Item" , "Purchase Receipt Item" , "Stock Entry Detail"] - for dt in dt_list: - frappe.reload_doctype(dt) - records = frappe.db.sql("""select name, `{0}` as item_code, description from `tab{1}` - where description is not null and image is null and description like '%%]+\>", "", data) - - return image_url, desc diff --git a/erpnext/patches/v5_0/update_item_name_in_bom.py b/erpnext/patches/v5_0/update_item_name_in_bom.py deleted file mode 100644 index 5781542a2a..0000000000 --- a/erpnext/patches/v5_0/update_item_name_in_bom.py +++ /dev/null @@ -1,18 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("manufacturing", "doctype", "bom") - frappe.reload_doc("manufacturing", "doctype", "bom_item") - frappe.reload_doc("manufacturing", "doctype", "bom_explosion_item") - frappe.reload_doc("manufacturing", "doctype", "bom_operation") - - frappe.db.sql("""update `tabBOM` as bom set bom.item_name = \ - ( select item.item_name from `tabItem` as item where item.name = bom.item)""") - frappe.db.sql("""update `tabBOM Item` as bomItem set bomItem.item_name = ( select item.item_name \ - from `tabItem` as item where item.name = bomItem.item_code)""") - frappe.db.sql("""update `tabBOM Explosion Item` as explosionItem set explosionItem.item_name = \ - ( select item.item_name from `tabItem` as item where item.name = explosionItem.item_code)""") diff --git a/erpnext/patches/v5_0/update_journal_entry_title.py b/erpnext/patches/v5_0/update_journal_entry_title.py deleted file mode 100644 index eaa2be054f..0000000000 --- a/erpnext/patches/v5_0/update_journal_entry_title.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Journal Entry") - frappe.db.sql("""update `tabJournal Entry` set title = - if(ifnull(pay_to_recd_from, "")!="", pay_to_recd_from, - (select account from `tabJournal Entry Account` - where parent=`tabJournal Entry`.name and idx=1 limit 1))""") diff --git a/erpnext/patches/v5_0/update_material_transfer_for_manufacture.py b/erpnext/patches/v5_0/update_material_transfer_for_manufacture.py deleted file mode 100644 index f31c9fed4d..0000000000 --- a/erpnext/patches/v5_0/update_material_transfer_for_manufacture.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql("""update `tabStock Entry` set purpose='Material Transfer for Manufacture' - where ifnull(work_order, '')!='' and purpose='Material Transfer'""") diff --git a/erpnext/patches/v5_0/update_material_transferred_for_manufacturing.py b/erpnext/patches/v5_0/update_material_transferred_for_manufacturing.py deleted file mode 100644 index 2a09aa29af..0000000000 --- a/erpnext/patches/v5_0/update_material_transferred_for_manufacturing.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Work Order") - frappe.db.sql("""update `tabWork Order` set material_transferred_for_manufacturing= - (select sum(fg_completed_qty) from `tabStock Entry` - where docstatus=1 - and work_order=`tabWork Order`.name - and purpose = "Material Transfer for Manufacture")""") diff --git a/erpnext/patches/v5_0/update_material_transferred_for_manufacturing_again.py b/erpnext/patches/v5_0/update_material_transferred_for_manufacturing_again.py deleted file mode 100644 index 5847c83d38..0000000000 --- a/erpnext/patches/v5_0/update_material_transferred_for_manufacturing_again.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - wo_order_qty_transferred = frappe._dict() - for se in frappe.db.sql("""select work_order, sum(fg_completed_qty) as transferred_qty - from `tabStock Entry` - where docstatus=1 and ifnull(work_order, '') != '' - and purpose = 'Material Transfer for Manufacture' - group by work_order""", as_dict=1): - wo_order_qty_transferred.setdefault(se.work_order, se.transferred_qty) - - for d in frappe.get_all("Work Order", filters={"docstatus": 1}, fields=["name", "qty"]): - if d.name in wo_order_qty_transferred: - material_transferred_for_manufacturing = wo_order_qty_transferred.get(d.name) \ - if wo_order_qty_transferred.get(d.name) <= d.qty else d.qty - - frappe.db.sql("""update `tabWork Order` set material_transferred_for_manufacturing=%s - where name=%s""", (material_transferred_for_manufacturing, d.name)) \ No newline at end of file diff --git a/erpnext/patches/v5_0/update_operation_description.py b/erpnext/patches/v5_0/update_operation_description.py deleted file mode 100644 index 4ce32f35f1..0000000000 --- a/erpnext/patches/v5_0/update_operation_description.py +++ /dev/null @@ -1,11 +0,0 @@ -# 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 -import frappe.permissions - -def execute(): - if "opn_description" in frappe.db.get_table_columns("BOM Operation"): - frappe.db.sql("""update `tabBOM Operation` set description = opn_description - where ifnull(description, '') = ''""") \ No newline at end of file diff --git a/erpnext/patches/v5_0/update_opportunity.py b/erpnext/patches/v5_0/update_opportunity.py deleted file mode 100644 index 8eb45c48e7..0000000000 --- a/erpnext/patches/v5_0/update_opportunity.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('crm', 'doctype', 'opportunity') - frappe.reload_doc('crm', 'doctype', 'opportunity_item') - - # all existing opportunities were with items - frappe.db.sql("update `tabDocType` set module = 'CRM' where name='Opportunity Item'") - frappe.db.sql("update tabOpportunity set with_items=1, title=customer_name") - frappe.db.sql("update `tabEmail Account` set append_to='Opportunity' where append_to='Lead'") diff --git a/erpnext/patches/v5_0/update_projects.py b/erpnext/patches/v5_0/update_projects.py deleted file mode 100644 index 68e03c9bdb..0000000000 --- a/erpnext/patches/v5_0/update_projects.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -import frappe - -def execute(): - # convert milestones to tasks - frappe.reload_doctype("Project") - frappe.reload_doc("projects", "doctype", "project_task") - frappe.reload_doctype("Task") - frappe.reload_doc("projects", "doctype", "task_depends_on") - frappe.reload_doc("projects", "doctype", "time_log") - - for m in frappe.get_all("Project Milestone", "*"): - if (m.milestone and m.milestone_date - and frappe.db.exists("Project", m.parent)): - subject = (m.milestone[:139] + "…") if (len(m.milestone) > 140) else m.milestone - description = m.milestone - task = frappe.get_doc({ - "doctype": "Task", - "subject": subject, - "description": description if description!=subject else None, - "expected_start_date": m.milestone_date, - "status": "Open" if m.status=="Pending" else "Closed", - "project": m.parent, - }) - task.flags.ignore_mandatory = True - task.insert(ignore_permissions=True) - - # remove project milestone - frappe.delete_doc("DocType", "Project Milestone") - - # remove calendar events for milestone - for e in frappe.get_all("Event", ["name"], {"ref_type": "Project"}): - frappe.delete_doc("Event", e.name) diff --git a/erpnext/patches/v5_0/update_sms_sender.py b/erpnext/patches/v5_0/update_sms_sender.py deleted file mode 100644 index 7ffc703c43..0000000000 --- a/erpnext/patches/v5_0/update_sms_sender.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.set_value("SMS Settings", "SMS Settings", "sms_sender_name", - frappe.db.get_single_value("Global Defaults", "sms_sender_name")) diff --git a/erpnext/patches/v5_0/update_tax_amount_after_discount_in_purchase_cycle.py b/erpnext/patches/v5_0/update_tax_amount_after_discount_in_purchase_cycle.py deleted file mode 100644 index 53df9422b3..0000000000 --- a/erpnext/patches/v5_0/update_tax_amount_after_discount_in_purchase_cycle.py +++ /dev/null @@ -1,17 +0,0 @@ -# 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 - -def execute(): - frappe.db.sql(""" - update - `tabPurchase Taxes and Charges` - set - tax_amount_after_discount_amount = tax_amount, - base_tax_amount_after_discount_amount = base_tax_amount - where - ifnull(tax_amount_after_discount_amount, 0) = 0 - and ifnull(base_tax_amount_after_discount_amount, 0) = 0 - """) \ No newline at end of file diff --git a/erpnext/patches/v5_0/update_temporary_account.py b/erpnext/patches/v5_0/update_temporary_account.py deleted file mode 100644 index 078c8714ff..0000000000 --- a/erpnext/patches/v5_0/update_temporary_account.py +++ /dev/null @@ -1,9 +0,0 @@ -# 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 - -def execute(): - frappe.db.sql("""Update `tabAccount` set account_type = 'Temporary' - where account_name in ('Temporary Assets', 'Temporary Liabilities', 'Temporary Opening')""") \ No newline at end of file diff --git a/erpnext/patches/v5_0/update_time_log_title.py b/erpnext/patches/v5_0/update_time_log_title.py deleted file mode 100644 index 8263be0007..0000000000 --- a/erpnext/patches/v5_0/update_time_log_title.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Time Log") - for d in frappe.get_all("Time Log"): - time_log = frappe.get_doc("Time Log", d.name) - time_log.set_title() - frappe.db.set_value("Time Log", time_log.name, "title", time_log.title) diff --git a/erpnext/patches/v5_1/__init__.py b/erpnext/patches/v5_1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v5_1/default_bom.py b/erpnext/patches/v5_1/default_bom.py deleted file mode 100644 index 6484edd603..0000000000 --- a/erpnext/patches/v5_1/default_bom.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals - -import frappe - -def execute(): - frappe.db.sql("""Update `tabItem` as item set default_bom = NULL where - not exists(select name from `tabBOM` as bom where item.default_bom = bom.name and bom.docstatus =1 )""") \ No newline at end of file diff --git a/erpnext/patches/v5_1/fix_against_account.py b/erpnext/patches/v5_1/fix_against_account.py deleted file mode 100644 index a62c15b7d1..0000000000 --- a/erpnext/patches/v5_1/fix_against_account.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import unicode_literals - -import frappe - -from erpnext.accounts.doctype.gl_entry.gl_entry import update_against_account - -def execute(): - from_date = "2015-05-01" - - for doc in frappe.get_all("Journal Entry", - filters={"creation": (">", from_date), "docstatus": "1"}): - - # update in gl_entry - update_against_account("Journal Entry", doc.name) - - # update in jv - doc = frappe.get_doc("Journal Entry", doc.name) - doc.set_against_account() - doc.db_update() - - for doc in frappe.get_all("Sales Invoice", - filters={"creation": (">", from_date), "docstatus": "1"}, - fields=["name", "customer"]): - - frappe.db.sql("""update `tabGL Entry` set against=%s - where voucher_type='Sales Invoice' and voucher_no=%s - and credit > 0 and ifnull(party, '')=''""", - (doc.customer, doc.name)) - - for doc in frappe.get_all("Purchase Invoice", - filters={"creation": (">", from_date), "docstatus": "1"}, - fields=["name", "supplier"]): - - frappe.db.sql("""update `tabGL Entry` set against=%s - where voucher_type='Purchase Invoice' and voucher_no=%s - and debit > 0 and ifnull(party, '')=''""", - (doc.supplier, doc.name)) diff --git a/erpnext/patches/v5_1/rename_roles.py b/erpnext/patches/v5_1/rename_roles.py deleted file mode 100644 index e19c22a614..0000000000 --- a/erpnext/patches/v5_1/rename_roles.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if not frappe.db.exists("Role", "Stock User"): - frappe.rename_doc("Role", "Material User", "Stock User") - if not frappe.db.exists("Role", "Stock Manager"): - frappe.rename_doc("Role", "Material Manager", "Stock Manager") - if not frappe.db.exists("Role", "Item Manager"): - frappe.rename_doc("Role", "Material Master Manager", "Item Manager") diff --git a/erpnext/patches/v5_1/sales_bom_rename.py b/erpnext/patches/v5_1/sales_bom_rename.py deleted file mode 100644 index e06012f3e4..0000000000 --- a/erpnext/patches/v5_1/sales_bom_rename.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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 - -def execute(): - tables = frappe.db.sql_list("show tables") - for old_dt, new_dt in [["Sales BOM Item", "Product Bundle Item"], - ["Sales BOM", "Product Bundle"]]: - if "tab"+new_dt not in tables: - frappe.rename_doc("DocType", old_dt, new_dt, force=True) diff --git a/erpnext/patches/v5_2/__init__.py b/erpnext/patches/v5_2/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v5_2/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v5_2/change_item_selects_to_checks.py b/erpnext/patches/v5_2/change_item_selects_to_checks.py deleted file mode 100644 index 1ee8f6caa5..0000000000 --- a/erpnext/patches/v5_2/change_item_selects_to_checks.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import unicode_literals - -import frappe - -def execute(): - fields = ("is_stock_item", "is_asset_item", "has_batch_no", "has_serial_no", - "is_sales_item", "is_purchase_item", "inspection_required", "is_sub_contracted_item") - - # convert to 1 or 0 - update_str = ", ".join(["`{0}`=if(`{0}`='Yes',1,0)".format(f) for f in fields]) - frappe.db.sql("update tabItem set {0}".format(update_str)) - - frappe.db.commit() - - # alter fields to int - for f in fields: - frappe.db.sql("alter table tabItem change {0} {0} int(1) default '0'".format(f, f)) - - frappe.reload_doctype("Item") diff --git a/erpnext/patches/v5_4/__init__.py b/erpnext/patches/v5_4/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v5_4/cleanup_journal_entry.py b/erpnext/patches/v5_4/cleanup_journal_entry.py deleted file mode 100644 index 6860e6ad09..0000000000 --- a/erpnext/patches/v5_4/cleanup_journal_entry.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import unicode_literals -import frappe -from pymysql import InternalError - -def execute(): - frappe.reload_doctype("Journal Entry Account") - for doctype, fieldname in ( - ("Sales Order", "against_sales_order"), - ("Purchase Order", "against_purchase_order"), - ("Sales Invoice", "against_invoice"), - ("Purchase Invoice", "against_voucher"), - ("Journal Entry", "against_jv"), - ("Expense Claim", "against_expense_claim"), - ): - try: - frappe.db.sql("""update `tabJournal Entry Account` - set reference_type=%s, reference_name={0} where ifnull({0}, '') != '' - """.format(fieldname), doctype) - except InternalError: - # column not found - pass diff --git a/erpnext/patches/v5_4/fix_invoice_outstanding.py b/erpnext/patches/v5_4/fix_invoice_outstanding.py deleted file mode 100644 index 54a1da69ef..0000000000 --- a/erpnext/patches/v5_4/fix_invoice_outstanding.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt - -def execute(): - frappe.reload_doctype("Sales Invoice") - return_entries = frappe.get_list("Sales Invoice", filters={"is_return": 1, "docstatus": 1}, - fields=["debit_to", "customer", "return_against"]) - for d in return_entries: - update_outstanding_amt(d.debit_to, "Customer", d.customer, "Sales Invoice", d.return_against) diff --git a/erpnext/patches/v5_4/fix_missing_item_images.py b/erpnext/patches/v5_4/fix_missing_item_images.py deleted file mode 100644 index c6fe57896f..0000000000 --- a/erpnext/patches/v5_4/fix_missing_item_images.py +++ /dev/null @@ -1,126 +0,0 @@ -from __future__ import print_function, unicode_literals -import frappe -import os -from frappe.utils import get_files_path -from frappe.core.doctype.file.file import get_content_hash - -def execute(): - files_path = get_files_path() - - # get files that don't have attached_to_name but exist - unlinked_files = get_unlinked_files(files_path) - if not unlinked_files: - return - - fixed_files = fix_files_for_item(files_path, unlinked_files) - - # fix remaining files - for key, file_data in unlinked_files.items(): - if key not in fixed_files: - rename_and_set_content_hash(files_path, unlinked_files, key) - frappe.db.commit() - -def fix_files_for_item(files_path, unlinked_files): - fixed_files = [] - - # make a list of files/something and /files/something to check in child table's image column - file_urls = [key for key in unlinked_files.keys()] + ["/" + key for key in unlinked_files.keys()] - file_item_code = get_file_item_code(file_urls) - - for (file_url, item_code), children in file_item_code.items(): - new_file_url = "/files/{0}".format(unlinked_files[file_url]["file_name"]) - - for row in children: - # print file_url, new_file_url, item_code, row.doctype, row.name - - # replace image in these rows with the new file url - frappe.db.set_value(row.doctype, row.name, "image", new_file_url, update_modified=False) - - # set it as attachment of this item code - file_data = frappe.get_doc("File", unlinked_files[file_url]["file"]) - file_data.attached_to_doctype = "Item" - file_data.attached_to_name = item_code - file_data.flags.ignore_folder_validate = True - - try: - file_data.save() - except IOError: - print("File {0} does not exist".format(new_file_url)) - - # marking fix to prevent further errors - fixed_files.append(file_url) - - continue - - # set it as image in Item - if not frappe.db.get_value("Item", item_code, "image"): - frappe.db.set_value("Item", item_code, "image", new_file_url, update_modified=False) - - rename_and_set_content_hash(files_path, unlinked_files, file_url) - - fixed_files.append(file_url) - - # commit - frappe.db.commit() - - return fixed_files - -def rename_and_set_content_hash(files_path, unlinked_files, file_url): - # rename this file - old_filename = os.path.join(files_path, unlinked_files[file_url]["file"]) - new_filename = os.path.join(files_path, unlinked_files[file_url]["file_name"]) - - if not os.path.exists(new_filename): - os.rename(old_filename, new_filename) - - # set content hash if missing - file_data_name = unlinked_files[file_url]["file"] - if not frappe.db.get_value("File", file_data_name, "content_hash"): - with open(new_filename, "r") as f: - content_hash = get_content_hash(f.read()) - frappe.db.set_value("File", file_data_name, "content_hash", content_hash) - -def get_unlinked_files(files_path): - # find files that have the same name as a File doc - # and the file_name mentioned in that File doc doesn't exist - # and it isn't already attached to a doc - unlinked_files = {} - files = os.listdir(files_path) - for file in files: - if not frappe.db.exists("File", {"file_name": file}): - file_data = frappe.db.get_value("File", {"name": file}, - ["file_name", "attached_to_doctype", "attached_to_name"], as_dict=True) - - if (file_data - and file_data.file_name - and file_data.file_name not in files - and not file_data.attached_to_doctype - and not file_data.attached_to_name): - - file_data["file"] = file - unlinked_files["files/{0}".format(file)] = file_data - - return unlinked_files - -def get_file_item_code(file_urls): - # get a map of file_url, item_code and list of documents where file_url will need to be changed in image field - file_item_code = {} - - doctypes = frappe.db.sql_list("""select name from `tabDocType` dt - where istable=1 - and exists (select name from `tabDocField` df where df.parent=dt.name and df.fieldname='item_code') - and exists (select name from `tabDocField` df where df.parent=dt.name and df.fieldname='image')""") - - for doctype in doctypes: - result = frappe.db.sql("""select name, image, item_code, '{0}' as doctype from `tab{0}` - where image in ({1})""".format(doctype, ", ".join(["%s"]*len(file_urls))), - file_urls, as_dict=True) - - for r in result: - key = (r.image, r.item_code) - if key not in file_item_code: - file_item_code[key] = [] - - file_item_code[key].append(r) - - return file_item_code diff --git a/erpnext/patches/v5_4/fix_reserved_qty_and_sle_for_packed_items.py b/erpnext/patches/v5_4/fix_reserved_qty_and_sle_for_packed_items.py deleted file mode 100644 index 6eb3994c7c..0000000000 --- a/erpnext/patches/v5_4/fix_reserved_qty_and_sle_for_packed_items.py +++ /dev/null @@ -1,22 +0,0 @@ -# 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 erpnext.stock.stock_balance import repost_actual_qty - -def execute(): - cancelled_invoices = frappe.db.sql_list("""select name from `tabSales Invoice` - where docstatus = 2 and ifnull(update_stock, 0) = 1""") - - if cancelled_invoices: - repost_for = frappe.db.sql("""select distinct item_code, warehouse from `tabStock Ledger Entry` - where voucher_type = 'Sales Invoice' and voucher_no in (%s)""" - % (', '.join(['%s']*len(cancelled_invoices))), tuple(cancelled_invoices)) - - frappe.db.sql("""delete from `tabStock Ledger Entry` - where voucher_type = 'Sales Invoice' and voucher_no in (%s)""" - % (', '.join(['%s']*len(cancelled_invoices))), tuple(cancelled_invoices)) - - for item_code, warehouse in repost_for: - repost_actual_qty(item_code, warehouse) \ No newline at end of file diff --git a/erpnext/patches/v5_4/notify_system_managers_regarding_wrong_tax_calculation.py b/erpnext/patches/v5_4/notify_system_managers_regarding_wrong_tax_calculation.py deleted file mode 100644 index ba311225bb..0000000000 --- a/erpnext/patches/v5_4/notify_system_managers_regarding_wrong_tax_calculation.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe -from frappe.email import sendmail_to_system_managers -from frappe.utils import get_link_to_form - -def execute(): - wrong_records = [] - for dt in ("Quotation", "Sales Order", "Delivery Note", "Sales Invoice", - "Purchase Order", "Purchase Receipt", "Purchase Invoice"): - records = frappe.db.sql_list("""select name from `tab{0}` - where apply_discount_on = 'Net Total' and ifnull(discount_amount, 0) != 0 - and modified >= '2015-02-17' and docstatus=1""".format(dt)) - - if records: - records = [get_link_to_form(dt, d) for d in records] - wrong_records.append([dt, records]) - - if wrong_records: - content = """Dear System Manager, - -Due to an error related to Discount Amount on Net Total, tax calculation might be wrong in the following records. We did not fix the tax amount automatically because it can corrupt the entries, so we request you to check these records and amend if you found the calculation wrong. - -Please check following Entries: - -%s - - -Regards, - -Administrator""" % "\n".join([(d[0] + ": " + ", ".join(d[1])) for d in wrong_records]) - try: - sendmail_to_system_managers("[Important] [ERPNext] Tax calculation might be wrong, please check.", content) - except: - pass - - print("="*50) - print(content) - print("="*50) \ No newline at end of file diff --git a/erpnext/patches/v5_4/set_root_and_report_type.py b/erpnext/patches/v5_4/set_root_and_report_type.py deleted file mode 100644 index 9147644da2..0000000000 --- a/erpnext/patches/v5_4/set_root_and_report_type.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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 - -def execute(): - roots = frappe.db.sql("""select lft, rgt, report_type, root_type - from `tabAccount` where ifnull(parent_account, '')=''""", as_dict=1) - for d in roots: - frappe.db.sql("update `tabAccount` set report_type=%s, root_type=%s where lft > %s and rgt < %s", - (d.report_type, d.root_type, d.lft, d.rgt)) \ No newline at end of file diff --git a/erpnext/patches/v5_4/stock_entry_additional_costs.py b/erpnext/patches/v5_4/stock_entry_additional_costs.py deleted file mode 100644 index 3a98deb918..0000000000 --- a/erpnext/patches/v5_4/stock_entry_additional_costs.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2015, 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 flt - -def execute(): - frappe.reload_doctype("Stock Entry") - frappe.reload_doctype("Stock Entry Detail") - frappe.reload_doctype("Landed Cost Taxes and Charges") - - stock_entry_db_columns = frappe.db.get_table_columns("Stock Entry") - if "additional_operating_cost" in stock_entry_db_columns: - operating_cost_fieldname = "additional_operating_cost" - elif "total_fixed_cost" in stock_entry_db_columns: - operating_cost_fieldname = "total_fixed_cost" - else: - return - - - frappe.db.sql("""update `tabStock Entry Detail` sed, `tabStock Entry` se - set sed.valuation_rate=sed.incoming_rate, sed.basic_rate=sed.incoming_rate, sed.basic_amount=sed.amount - where sed.parent = se.name - and (se.purpose not in ('Manufacture', 'Repack') or ifnull({0}, 0)=0) - """.format(operating_cost_fieldname)) - - - stock_entries = frappe.db.sql_list("""select name from `tabStock Entry` - where purpose in ('Manufacture', 'Repack') and ifnull({0}, 0)!=0 - and docstatus < 2""".format(operating_cost_fieldname)) - - for d in stock_entries: - stock_entry = frappe.get_doc("Stock Entry", d) - stock_entry.append("additional_costs", { - "description": "Additional Operating Cost", - "amount": stock_entry.get(operating_cost_fieldname) - }) - - number_of_fg_items = len([t.t_warehouse for t in stock_entry.get("items") if t.t_warehouse]) - - for d in stock_entry.get("items"): - d.valuation_rate = d.incoming_rate - - if d.bom_no or (d.t_warehouse and number_of_fg_items == 1): - d.additional_cost = stock_entry.get(operating_cost_fieldname) - - d.basic_rate = flt(d.valuation_rate) - flt(d.additional_cost) - d.basic_amount = flt(flt(d.basic_rate) *flt(d.transfer_qty), d.precision("basic_amount")) - - stock_entry.flags.ignore_validate = True - stock_entry.flags.ignore_validate_update_after_submit = True - stock_entry.save() diff --git a/erpnext/patches/v5_4/update_purchase_cost_against_project.py b/erpnext/patches/v5_4/update_purchase_cost_against_project.py deleted file mode 100644 index 1b917c83c4..0000000000 --- a/erpnext/patches/v5_4/update_purchase_cost_against_project.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2015, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - for p in frappe.get_all("Project"): - purchase_cost = frappe.db.sql("""select sum(ifnull(base_net_amount, 0)) - from `tabPurchase Invoice Item` where project = %s and docstatus=1""", p.name) - purchase_cost = purchase_cost and purchase_cost[0][0] or 0 - - frappe.db.set_value("Project", p.name, "total_purchase_cost", purchase_cost) \ No newline at end of file diff --git a/erpnext/patches/v5_7/__init__.py b/erpnext/patches/v5_7/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v5_7/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v5_7/item_template_attributes.py b/erpnext/patches/v5_7/item_template_attributes.py deleted file mode 100644 index 6aa81f79b2..0000000000 --- a/erpnext/patches/v5_7/item_template_attributes.py +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe -from frappe.exceptions import SQLError - -def execute(): - """ - Structure History: - 1. Item and Item Variant - 2. Item, Variant Attribute, Manage Variants and Manage Variant Items - 3. Item, Item Variant Attribute, Item Attribute and Item Attribute Type (latest) - """ - rename_and_reload_doctypes() - - variant_templates = frappe.get_all("Item", filters={"has_variants": 1}, limit_page_length=1) - if not variant_templates: - # database does not have items that have variants - # so no point in running the patch - return - - variant_attributes = frappe.get_all("Item Variant Attribute", fields=["*"], limit_page_length=1) - - if variant_attributes: - # manage variant patch is already applied - migrate_manage_variants() - - else: - # old structure based on "Item Variant" table - try: - migrate_item_variants() - - except SQLError: - print("`tabItem Variant` not found") - -def rename_and_reload_doctypes(): - if "tabVariant Attribute" in frappe.db.get_tables(): - frappe.rename_doc("DocType", "Variant Attribute", "Item Variant Attribute") - - frappe.reload_doctype("Item") - frappe.reload_doc("Stock", "DocType", "Item Variant Attribute") - frappe.reload_doc("Stock", "DocType", "Item Attribute Value") - frappe.reload_doc("Stock", "DocType", "Item Attribute") - -def migrate_manage_variants(): - item_attribute = {} - for d in frappe.db.sql("""select DISTINCT va.attribute, i.variant_of - from `tabItem Variant Attribute` va, `tabItem` i - where va.parent = i.name and ifnull(i.variant_of, '')!=''""", as_dict=1): - item_attribute.setdefault(d.variant_of, []).append({"attribute": d.attribute}) - - for item, attributes in item_attribute.items(): - template = frappe.get_doc("Item", item) - template.set('attributes', attributes) - template.save() - -# patch old style -def migrate_item_variants(): - for item in frappe.get_all("Item", filters={"has_variants": 1}): - all_variants = frappe.get_all("Item", filters={"variant_of": item.name}, fields=["name", "description"]) - item_attributes = frappe.db.sql("""select distinct item_attribute, item_attribute_value - from `tabItem Variant` where parent=%s""", item.name) - - if not item_attributes and not all_variants: - item = frappe.get_doc("Item", item.name) - item.has_variants = 0 - item.save() - continue - - attribute_value_options = {} - for attribute, value in item_attributes: - attribute_value_options.setdefault(attribute, []).append(value) - - possible_combinations = get_possible_combinations(attribute_value_options) - - for variant in all_variants: - for combination in possible_combinations: - match = True - for attribute, value in combination.items(): - if "{0}: {1}".format(attribute, value) not in variant.description: - match = False - break - - if match: - # found the right variant - save_attributes_in_variant(variant, combination) - break - - save_attributes_in_template(item, attribute_value_options) - - frappe.delete_doc("DocType", "Item Variant") - -def save_attributes_in_template(item, attribute_value_options): - # store attribute in Item Variant Attribute table for template - template = frappe.get_doc("Item", item) - template.set("attributes", [{"attribute": attribute} for attribute in attribute_value_options.keys()]) - template.save() - -def get_possible_combinations(attribute_value_options): - possible_combinations = [] - - for attribute, values in attribute_value_options.items(): - if not possible_combinations: - for v in values: - possible_combinations.append({attribute: v}) - - else: - for v in values: - for combination in possible_combinations: - combination[attribute] = v - - return possible_combinations - -def save_attributes_in_variant(variant, combination): - # add data into attributes table - variant_item = frappe.get_doc("Item", variant.name) - variant_item.set("attributes", []) - for attribute, value in combination.items(): - variant_item.append("attributes", { - "attribute": attribute, - "attribute_value": value - }) - variant_item.save() diff --git a/erpnext/patches/v5_8/__init__.py b/erpnext/patches/v5_8/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v5_8/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v5_8/add_credit_note_print_heading.py b/erpnext/patches/v5_8/add_credit_note_print_heading.py deleted file mode 100644 index 476cbc8956..0000000000 --- a/erpnext/patches/v5_8/add_credit_note_print_heading.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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 import _ - -def execute(): - for print_heading in (_("Credit Note"), _("Debit Note")): - if not frappe.db.exists("Print Heading", print_heading): - frappe.get_doc({ - "doctype": "Print Heading", - "print_heading": print_heading - }).insert() diff --git a/erpnext/patches/v5_8/tax_rule.py b/erpnext/patches/v5_8/tax_rule.py deleted file mode 100644 index 8da28ba4c9..0000000000 --- a/erpnext/patches/v5_8/tax_rule.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc("accounts", "doctype", "tax_rule") - - customers = frappe.db.sql("""select name, default_taxes_and_charges from tabCustomer where - ifnull(default_taxes_and_charges, '') != '' """, as_dict=1) - - for d in customers: - if not frappe.db.sql("select name from `tabTax Rule` where customer=%s", d.name): - tr = frappe.new_doc("Tax Rule") - tr.tax_type = "Sales" - tr.customer = d.name - tr.sales_tax_template = d.default_taxes_and_charges - tr.save() - - - suppliers = frappe.db.sql("""select name, default_taxes_and_charges from tabSupplier where - ifnull(default_taxes_and_charges, '') != '' """, as_dict=1) - - for d in suppliers: - if not frappe.db.sql("select name from `tabTax Rule` where supplier=%s", d.name): - tr = frappe.new_doc("Tax Rule") - tr.tax_type = "Purchase" - tr.supplier = d.name - tr.purchase_tax_template = d.default_taxes_and_charges - tr.save() \ No newline at end of file diff --git a/erpnext/patches/v5_8/update_order_reference_in_return_entries.py b/erpnext/patches/v5_8/update_order_reference_in_return_entries.py deleted file mode 100644 index 503263834c..0000000000 --- a/erpnext/patches/v5_8/update_order_reference_in_return_entries.py +++ /dev/null @@ -1,92 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype("Delivery Note") - frappe.reload_doctype("Sales Invoice") - frappe.reload_doctype("Purchase Receipt") - frappe.reload_doctype("Sales Order Item") - frappe.reload_doctype("Purchase Order Item") - frappe.reload_doctype("Purchase Order Item Supplied") - - # sales return - return_entries = list(frappe.db.sql(""" - select dn.name as name, dn_item.name as row_id, dn.return_against, - dn_item.item_code, "Delivery Note" as doctype - from `tabDelivery Note Item` dn_item, `tabDelivery Note` dn - where dn_item.parent=dn.name and dn.is_return=1 and dn.docstatus < 2 - """, as_dict=1)) - - return_entries += list(frappe.db.sql(""" - select si.name as name, si_item.name as row_id, si.return_against, - si_item.item_code, "Sales Invoice" as doctype, update_stock - from `tabSales Invoice Item` si_item, `tabSales Invoice` si - where si_item.parent=si.name and si.is_return=1 and si.docstatus < 2 - """, as_dict=1)) - - for d in return_entries: - ref_field = "against_sales_order" if d.doctype == "Delivery Note" else "sales_order" - order_details = frappe.db.sql(""" - select {ref_field} as sales_order, so_detail, - (select transaction_date from `tabSales Order` where name=item.{ref_field}) as sales_order_date - from `tab{doctype} Item` item - where - parent=%s - and item_code=%s - and ifnull(so_detail, '') !='' - order by sales_order_date DESC limit 1 - """.format(ref_field=ref_field, doctype=d.doctype), (d.return_against, d.item_code), as_dict=1) - - if order_details: - frappe.db.sql(""" - update `tab{doctype} Item` - set {ref_field}=%s, so_detail=%s - where name=%s - """.format(doctype=d.doctype, ref_field=ref_field), - (order_details[0].sales_order, order_details[0].so_detail, d.row_id)) - - if (d.doctype=="Sales Invoice" and d.update_stock) or d.doctype=="Delivery Note": - doc = frappe.get_doc(d.doctype, d.name) - doc.update_reserved_qty() - - if d.doctype=="Sales Invoice": - doc.status_updater = [] - doc.update_status_updater_args() - - doc.update_prevdoc_status() - - #-------------------------- - # purchase return - return_entries = frappe.db.sql(""" - select pr.name as name, pr_item.name as row_id, pr.return_against, pr_item.item_code - from `tabPurchase Receipt Item` pr_item, `tabPurchase Receipt` pr - where pr_item.parent=pr.name and pr.is_return=1 and pr.docstatus < 2 - """, as_dict=1) - - for d in return_entries: - order_details = frappe.db.sql(""" - select prevdoc_docname as purchase_order, prevdoc_detail_docname as po_detail, - (select transaction_date from `tabPurchase Order` where name=item.prevdoc_detail_docname) as purchase_order_date - from `tabPurchase Receipt Item` item - where - parent=%s - and item_code=%s - and ifnull(prevdoc_detail_docname, '') !='' - and ifnull(prevdoc_doctype, '') = 'Purchase Order' and ifnull(prevdoc_detail_docname, '') != '' - order by purchase_order_date DESC limit 1 - """, (d.return_against, d.item_code), as_dict=1) - - if order_details: - frappe.db.sql(""" - update `tabPurchase Receipt Item` - set prevdoc_doctype='Purchase Order', prevdoc_docname=%s, prevdoc_detail_docname=%s - where name=%s - """, (order_details[0].purchase_order, order_details[0].po_detail, d.row_id)) - - pr = frappe.get_doc("Purchase Receipt", d.name) - pr.update_ordered_and_reserved_qty() - pr.update_prevdoc_status() - diff --git a/erpnext/patches/v6_0/__init__.py b/erpnext/patches/v6_0/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v6_0/default_activity_rate.py b/erpnext/patches/v6_0/default_activity_rate.py deleted file mode 100644 index cfbfb723bc..0000000000 --- a/erpnext/patches/v6_0/default_activity_rate.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("projects", "doctype", "activity_cost") - - for cost in frappe.db.get_list("Activity Cost", filters = {"employee": ""}, - fields = ("name", "activity_type", "costing_rate", "billing_rate")): - activity_type = frappe.get_doc("Activity Type", cost.activity_type) - activity_type.costing_rate = cost.costing_rate - activity_type.billing_rate = cost.billing_rate - activity_type.save() - - frappe.delete_doc("Activity Cost", cost.name) diff --git a/erpnext/patches/v6_0/fix_outstanding_amount.py b/erpnext/patches/v6_0/fix_outstanding_amount.py deleted file mode 100644 index 0de689074f..0000000000 --- a/erpnext/patches/v6_0/fix_outstanding_amount.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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 erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt - -def execute(): - for dt, party_field, account_field in (("Sales Invoice", "customer", "debit_to"), - ("Purchase Invoice", "supplier", "credit_to")): - - wrong_invoices = frappe.db.sql("""select name, {0} as account from `tab{1}` - where docstatus=1 and ifnull({2}, '')=''""".format(account_field, dt, party_field)) - - for invoice, account in wrong_invoices: - update_outstanding_amt(account, party_field.title(), None, dt, invoice) \ No newline at end of file diff --git a/erpnext/patches/v6_0/fix_planned_qty.py b/erpnext/patches/v6_0/fix_planned_qty.py deleted file mode 100644 index cf7b429249..0000000000 --- a/erpnext/patches/v6_0/fix_planned_qty.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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 erpnext.stock.stock_balance import get_planned_qty, update_bin_qty - -def execute(): - for item_code, warehouse in frappe.db.sql("""select distinct production_item, fg_warehouse - from `tabWork Order`"""): - if frappe.db.exists("Item", item_code) and frappe.db.exists("Warehouse", warehouse): - update_bin_qty(item_code, warehouse, { - "planned_qty": get_planned_qty(item_code, warehouse) - }) diff --git a/erpnext/patches/v6_0/multi_currency.py b/erpnext/patches/v6_0/multi_currency.py deleted file mode 100644 index b4c37fc253..0000000000 --- a/erpnext/patches/v6_0/multi_currency.py +++ /dev/null @@ -1,65 +0,0 @@ -# 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 - -def execute(): - # Reload doctype - for dt in ("Account", "GL Entry", "Journal Entry", - "Journal Entry Account", "Sales Invoice", "Purchase Invoice", "Customer", "Supplier"): - frappe.reload_doctype(dt) - - company_list = frappe.get_all("Company", fields=["name", "default_currency", "default_receivable_account"]) - for company in company_list: - - # update currency in account and gl entry as per company currency - frappe.db.sql("""update `tabAccount` set account_currency = %s - where ifnull(account_currency, '') = '' and company=%s""", (company.default_currency, company.name)) - - # update newly introduced field's value in sales / purchase invoice - frappe.db.sql(""" - update - `tabSales Invoice` - set - base_paid_amount=paid_amount, - base_write_off_amount=write_off_amount, - party_account_currency=%s - where company=%s - """, (company.default_currency, company.name)) - - frappe.db.sql(""" - update - `tabPurchase Invoice` - set - base_write_off_amount=write_off_amount, - party_account_currency=%s - where company=%s - """, (company.default_currency, company.name)) - - # update exchange rate, debit/credit in account currency in Journal Entry - frappe.db.sql(""" - update `tabJournal Entry Account` jea - set exchange_rate=1, - debit_in_account_currency=debit, - credit_in_account_currency=credit, - account_type=(select account_type from `tabAccount` where name=jea.account) - """) - - frappe.db.sql(""" - update `tabJournal Entry Account` jea, `tabJournal Entry` je - set account_currency=%s - where jea.parent = je.name and je.company=%s - """, (company.default_currency, company.name)) - - # update debit/credit in account currency in GL Entry - frappe.db.sql(""" - update - `tabGL Entry` - set - debit_in_account_currency=debit, - credit_in_account_currency=credit, - account_currency=%s - where - company=%s - """, (company.default_currency, company.name)) diff --git a/erpnext/patches/v6_0/set_default_title.py b/erpnext/patches/v6_0/set_default_title.py deleted file mode 100644 index cceff3f480..0000000000 --- a/erpnext/patches/v6_0/set_default_title.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Quotation") - frappe.db.sql("""update tabQuotation set title = customer_name""") - - frappe.reload_doctype("Sales Order") - frappe.db.sql("""update `tabSales Order` set title = customer_name""") - - frappe.reload_doctype("Delivery Note") - frappe.db.sql("""update `tabDelivery Note` set title = customer_name""") - - frappe.reload_doctype("Material Request") - frappe.db.sql("""update `tabMaterial Request` set title = material_request_type""") - - frappe.reload_doctype("Supplier Quotation") - frappe.db.sql("""update `tabSupplier Quotation` set title = supplier_name""") - - frappe.reload_doctype("Purchase Order") - frappe.db.sql("""update `tabPurchase Order` set title = supplier_name""") - - frappe.reload_doctype("Purchase Receipt") - frappe.db.sql("""update `tabPurchase Receipt` set title = supplier_name""") - - frappe.reload_doctype("Purchase Invoice") - frappe.db.sql("""update `tabPurchase Invoice` set title = supplier_name""") - - frappe.reload_doctype("Stock Entry") - frappe.db.sql("""update `tabStock Entry` set title = purpose""") - - frappe.reload_doctype("Sales Invoice") - frappe.db.sql("""update `tabSales Invoice` set title = customer_name""") - - frappe.reload_doctype("Expense Claim") - frappe.db.sql("""update `tabExpense Claim` set title = employee_name""") diff --git a/erpnext/patches/v6_10/__init__.py b/erpnext/patches/v6_10/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_10/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_10/email_digest_default_quote.py b/erpnext/patches/v6_10/email_digest_default_quote.py deleted file mode 100644 index 6139f1a88a..0000000000 --- a/erpnext/patches/v6_10/email_digest_default_quote.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Email Digest") - frappe.db.sql("update `tabEmail Digest` set add_quote = 1") diff --git a/erpnext/patches/v6_10/fix_billed_amount_in_drop_ship_po.py b/erpnext/patches/v6_10/fix_billed_amount_in_drop_ship_po.py deleted file mode 100644 index d7f72b5880..0000000000 --- a/erpnext/patches/v6_10/fix_billed_amount_in_drop_ship_po.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql("""update `tabPurchase Order Item` set billed_amt = 0 - where delivered_by_supplier=1 and docstatus=1""") - - drop_ship_pos = frappe.db.sql("""select distinct parent from `tabPurchase Order Item` - where delivered_by_supplier=1 and docstatus=1""") - - for po in drop_ship_pos: - invoices = frappe.db.sql("""select distinct parent from `tabPurchase Invoice Item` - where purchase_order=%s and docstatus=1""", po[0]) - if invoices: - for inv in invoices: - frappe.get_doc("Purchase Invoice", inv[0]).update_qty(update_modified=False) - else: - frappe.db.sql("""update `tabPurchase Order` set per_billed=0 where name=%s""", po[0]) \ No newline at end of file diff --git a/erpnext/patches/v6_10/fix_delivery_status_of_drop_ship_item.py b/erpnext/patches/v6_10/fix_delivery_status_of_drop_ship_item.py deleted file mode 100644 index 9a53b7f5d3..0000000000 --- a/erpnext/patches/v6_10/fix_delivery_status_of_drop_ship_item.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Sales Order Item") - for so_name in frappe.db.sql("""select distinct parent from `tabSales Order Item` - where delivered_by_supplier=1 and docstatus=1"""): - so = frappe.get_doc("Sales Order", so_name[0]) - so.update_delivery_status() - so.set_status(update=True, update_modified=False) \ No newline at end of file diff --git a/erpnext/patches/v6_10/fix_jv_total_amount.py b/erpnext/patches/v6_10/fix_jv_total_amount.py deleted file mode 100644 index 42cb9e9e15..0000000000 --- a/erpnext/patches/v6_10/fix_jv_total_amount.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - -# patch all for-print field (total amount) in Journal Entry in 2015 -def execute(): - for je in frappe.get_all("Journal Entry", filters={"creation": (">", "2015-01-01")}): - je = frappe.get_doc("Journal Entry", je.name) - original = je.total_amount - - je.set_print_format_fields() - - if je.total_amount != original: - je.db_set("total_amount", je.total_amount, update_modified=False) - je.db_set("total_amount_in_words", je.total_amount_in_words, update_modified=False) diff --git a/erpnext/patches/v6_10/fix_ordered_received_billed.py b/erpnext/patches/v6_10/fix_ordered_received_billed.py deleted file mode 100644 index c81a20ec54..0000000000 --- a/erpnext/patches/v6_10/fix_ordered_received_billed.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - not_null_patch_date = frappe.db.sql("""select date(creation) from `tabPatch Log` where patch='frappe.patches.v6_9.int_float_not_null'""") - if not not_null_patch_date: - return - - not_null_patch_date = not_null_patch_date[0][0] - - for doctype in ("Purchase Invoice", "Sales Invoice", "Purchase Order", "Delivery Note", "Installation Note", "Delivery Note", "Purchase Receipt"): - for name in frappe.db.sql_list("""select name from `tab{doctype}` - where docstatus > 0 and (date(creation) >= %(patch_date)s or date(modified) >= %(patch_date)s)""".format(doctype=doctype), - {"patch_date": not_null_patch_date}): - - doc = frappe.get_doc(doctype, name) - doc.update_qty(update_modified=False) diff --git a/erpnext/patches/v6_12/__init__.py b/erpnext/patches/v6_12/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v6_12/repost_entries_with_target_warehouse.py b/erpnext/patches/v6_12/repost_entries_with_target_warehouse.py deleted file mode 100644 index fb5eab4e05..0000000000 --- a/erpnext/patches/v6_12/repost_entries_with_target_warehouse.py +++ /dev/null @@ -1,175 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe - -""" -This patch is written to fix Stock Ledger Entries and GL Entries -against Delivery Notes and Sales Invoice where Target Warehouse has been set wrongly -due to User Permissions on Warehouse. - -This cannot be run automatically because we can't take a call that -Target Warehouse has been set purposefully or by mistake. -Thats why we left it to the users to take the call, and manually run the patch. - -This patch has 2 main functions, `check()` and `repost()`. -- Run `check` function, to list out all the Sales Orders, Delivery Notes - and Sales Invoice with Target Warehouse. -- Run `repost` function to remove the Target Warehouse value and repost SLE and GLE again. - -To execute this patch run following commands from frappe-bench directory: -``` - bench --site [your-site-name] execute erpnext.patches.v6_12.repost_entries_with_target_warehouse.check - bench --site [your-site-name] backup - bench --site [your-site-name] execute erpnext.patches.v6_12.repost_entries_with_target_warehouse.repost -``` - -Exception Handling: -While reposting, if you get any exception, it will printed on screen. -Mostly it can be due to negative stock issue. If that is the case, follow these steps - - Ensure that stock is available for those items in the mentioned warehouse on the date mentioned in the error - - Execute `repost` funciton again -""" - -def check(): - so_list = get_affected_sales_order() - dn_list = get_affected_delivery_notes() - si_list = get_affected_sales_invoice() - - if so_list or dn_list or si_list: - print("Entries with Target Warehouse:") - - if so_list: - print("Sales Order") - print(so_list) - - if dn_list: - print("Delivery Notes") - print([d.name for d in dn_list]) - - if si_list: - print("Sales Invoice") - print([d.name for d in si_list]) - - -def repost(): - dn_failed_list, si_failed_list = [], [] - repost_dn(dn_failed_list) - repost_si(si_failed_list) - repost_so() - frappe.db.commit() - - if dn_failed_list: - print("-"*40) - print("Delivery Note Failed to Repost") - print(dn_failed_list) - - if si_failed_list: - print("-"*40) - print("Sales Invoice Failed to Repost") - print(si_failed_list) - print() - - print(""" -If above Delivery Notes / Sales Invoice failed due to negative stock, follow these steps: - - Ensure that stock is available for those items in the mentioned warehouse on the date mentioned in the error - - Run this patch again -""") - -def repost_dn(dn_failed_list): - dn_list = get_affected_delivery_notes() - - if dn_list: - print("-"*40) - print("Reposting Delivery Notes") - - for dn in dn_list: - if dn.docstatus == 0: - continue - - print(dn.name) - - try: - dn_doc = frappe.get_doc("Delivery Note", dn.name) - dn_doc.docstatus = 2 - dn_doc.update_prevdoc_status() - dn_doc.update_stock_ledger() - dn_doc.cancel_packing_slips() - frappe.db.sql("""delete from `tabGL Entry` - where voucher_type='Delivery Note' and voucher_no=%s""", dn.name) - - frappe.db.sql("update `tabDelivery Note Item` set target_warehouse='' where parent=%s", dn.name) - dn_doc = frappe.get_doc("Delivery Note", dn.name) - dn_doc.docstatus = 1 - dn_doc.on_submit() - frappe.db.commit() - except Exception: - dn_failed_list.append(dn.name) - frappe.local.stockledger_exceptions = None - print(frappe.get_traceback()) - frappe.db.rollback() - - frappe.db.sql("update `tabDelivery Note Item` set target_warehouse='' where docstatus=0") - -def repost_si(si_failed_list): - si_list = get_affected_sales_invoice() - - if si_list: - print("-"*40) - print("Reposting Sales Invoice") - - for si in si_list: - if si.docstatus == 0: - continue - - print(si.name) - - try: - si_doc = frappe.get_doc("Sales Invoice", si.name) - si_doc.docstatus = 2 - si_doc.update_stock_ledger() - frappe.db.sql("""delete from `tabGL Entry` - where voucher_type='Sales Invoice' and voucher_no=%s""", si.name) - - frappe.db.sql("update `tabSales Invoice Item` set target_warehouse='' where parent=%s", si.name) - si_doc = frappe.get_doc("Sales Invoice", si.name) - si_doc.docstatus = 1 - si_doc.update_stock_ledger() - si_doc.make_gl_entries() - frappe.db.commit() - except Exception: - si_failed_list.append(si.name) - frappe.local.stockledger_exceptions = None - print(frappe.get_traceback()) - frappe.db.rollback() - - frappe.db.sql("update `tabSales Invoice Item` set target_warehouse='' where docstatus=0") - -def repost_so(): - so_list = get_affected_sales_order() - - frappe.db.sql("update `tabSales Order Item` set target_warehouse=''") - - if so_list: - print("-"*40) - print("Sales Order reposted") - - -def get_affected_delivery_notes(): - return frappe.db.sql("""select distinct dn.name, dn.docstatus - from `tabDelivery Note` dn, `tabDelivery Note Item` dn_item - where dn.name=dn_item.parent and dn.docstatus < 2 - and dn_item.target_warehouse is not null and dn_item.target_warehouse != '' - order by dn.posting_date asc""", as_dict=1) - -def get_affected_sales_invoice(): - return frappe.db.sql("""select distinct si.name, si.docstatus - from `tabSales Invoice` si, `tabSales Invoice Item` si_item - where si.name=si_item.parent and si.docstatus < 2 and si.update_stock=1 - and si_item.target_warehouse is not null and si_item.target_warehouse != '' - order by si.posting_date asc""", as_dict=1) - -def get_affected_sales_order(): - return frappe.db.sql_list("""select distinct parent from `tabSales Order Item` - where target_warehouse is not null and target_warehouse != '' and docstatus <2""") \ No newline at end of file diff --git a/erpnext/patches/v6_12/set_overdue_tasks.py b/erpnext/patches/v6_12/set_overdue_tasks.py deleted file mode 100644 index 7dbb8ba8b6..0000000000 --- a/erpnext/patches/v6_12/set_overdue_tasks.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Task") - - from erpnext.projects.doctype.task.task import set_tasks_as_overdue - set_tasks_as_overdue() diff --git a/erpnext/patches/v6_16/__init__.py b/erpnext/patches/v6_16/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_16/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_16/create_manufacturer_records.py b/erpnext/patches/v6_16/create_manufacturer_records.py deleted file mode 100644 index 5ae65f0660..0000000000 --- a/erpnext/patches/v6_16/create_manufacturer_records.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2016, Frappe 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 cstr - -def execute(): - frappe.reload_doc("stock", "doctype", "manufacturer") - frappe.reload_doctype("Item") - - for d in frappe.db.sql("""select distinct manufacturer from tabItem - where ifnull(manufacturer, '') != '' and disabled=0"""): - manufacturer_name = cstr(d[0]).strip() - if manufacturer_name and not frappe.db.exists("Manufacturer", manufacturer_name): - man = frappe.new_doc("Manufacturer") - man.short_name = manufacturer_name - man.full_name = manufacturer_name - man.save() diff --git a/erpnext/patches/v6_16/update_billing_status_in_dn_and_pr.py b/erpnext/patches/v6_16/update_billing_status_in_dn_and_pr.py deleted file mode 100644 index 481f13005b..0000000000 --- a/erpnext/patches/v6_16/update_billing_status_in_dn_and_pr.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - for dt in ("Delivery Note", "Purchase Receipt"): - frappe.reload_doctype(dt) - frappe.reload_doctype(dt + " Item") - - # Update billed_amt in DN and PR which are not against any order - for d in frappe.db.sql("""select name from `tabDelivery Note Item` item - where (so_detail is null or so_detail = '') and docstatus=1""", as_dict=1): - - billed_amt = frappe.db.sql("""select sum(amount) from `tabSales Invoice Item` - where dn_detail=%s and docstatus=1""", d.name) - billed_amt = billed_amt and billed_amt[0][0] or 0 - frappe.db.set_value("Delivery Note Item", d.name, "billed_amt", billed_amt, update_modified=False) - - frappe.db.commit() - - # Update billed_amt in DN and PR which are not against any order - for d in frappe.db.sql("""select name from `tabPurchase Receipt Item` item - where (purchase_order_item is null or purchase_order_item = '') and docstatus=1""", as_dict=1): - - billed_amt = frappe.db.sql("""select sum(amount) from `tabPurchase Invoice Item` - where pr_detail=%s and docstatus=1""", d.name) - billed_amt = billed_amt and billed_amt[0][0] or 0 - frappe.db.set_value("Purchase Receipt Item", d.name, "billed_amt", billed_amt, update_modified=False) - - frappe.db.commit() - - for dt in ("Delivery Note", "Purchase Receipt"): - # Update billed amt which are against order or invoice - # Update billing status for all - for d in frappe.db.sql("select name from `tab{0}` where docstatus=1".format(dt), as_dict=1): - doc = frappe.get_doc(dt, d.name) - doc.update_billing_status(update_modified=False) - doc.set_status(update=True, update_modified=False) - - frappe.db.commit() diff --git a/erpnext/patches/v6_19/__init__.py b/erpnext/patches/v6_19/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_19/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_19/comment_feed_communication.py b/erpnext/patches/v6_19/comment_feed_communication.py deleted file mode 100644 index bc41c2d8ff..0000000000 --- a/erpnext/patches/v6_19/comment_feed_communication.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.patches.v6_19.comment_feed_communication import update_timeline_doc_for - -def execute(): - for doctype in ("Customer", "Supplier", "Employee", "Project"): - update_timeline_doc_for(doctype) diff --git a/erpnext/patches/v6_2/__init__.py b/erpnext/patches/v6_2/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_2/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_2/fix_missing_default_taxes_and_lead.py b/erpnext/patches/v6_2/fix_missing_default_taxes_and_lead.py deleted file mode 100644 index b0cfc3d3bf..0000000000 --- a/erpnext/patches/v6_2/fix_missing_default_taxes_and_lead.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - # remove missing lead - for customer in frappe.db.sql_list("""select name from `tabCustomer` - where ifnull(lead_name, '')!='' and not exists (select name from `tabLead` where name=`tabCustomer`.lead_name)"""): - frappe.db.set_value("Customer", customer, "lead_name", None) - - # remove missing default taxes - for customer in frappe.db.sql_list("""select name from `tabCustomer` - where ifnull(default_taxes_and_charges, '')!='' and not exists ( - select name from `tabSales Taxes and Charges Template` where name=`tabCustomer`.default_taxes_and_charges - )"""): - c = frappe.get_doc("Customer", customer) - c.default_taxes_and_charges = None - c.save() - - for supplier in frappe.db.sql_list("""select name from `tabSupplier` - where ifnull(default_taxes_and_charges, '')!='' and not exists ( - select name from `tabPurchase Taxes and Charges Template` where name=`tabSupplier`.default_taxes_and_charges - )"""): - c = frappe.get_doc("Supplier", supplier) - c.default_taxes_and_charges = None - c.save() diff --git a/erpnext/patches/v6_2/remove_newsletter_duplicates.py b/erpnext/patches/v6_2/remove_newsletter_duplicates.py deleted file mode 100644 index f9d15475d1..0000000000 --- a/erpnext/patches/v6_2/remove_newsletter_duplicates.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - duplicates = frappe.db.sql("""select email_group, email, count(name) - from `tabEmail Group Member` - group by email_group, email - having count(name) > 1""") - - # delete all duplicates except 1 - for email_group, email, count in duplicates: - frappe.db.sql("""delete from `tabEmail Group Member` - where email_group=%s and email=%s limit %s""", (email_group, email, count-1)) diff --git a/erpnext/patches/v6_20/__init__.py b/erpnext/patches/v6_20/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v6_20/set_party_account_currency_in_orders.py b/erpnext/patches/v6_20/set_party_account_currency_in_orders.py deleted file mode 100644 index ae7ad9592d..0000000000 --- a/erpnext/patches/v6_20/set_party_account_currency_in_orders.py +++ /dev/null @@ -1,24 +0,0 @@ -# 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 - -def execute(): - for doctype in ("Sales Order", "Purchase Order"): - frappe.reload_doctype(doctype) - - for order in frappe.db.sql("""select name, {0} as party from `tab{1}` - where advance_paid > 0 and docstatus=1""" - .format(("customer" if doctype=="Sales Order" else "supplier"), doctype), as_dict=1): - - party_account_currency = frappe.db.get_value("Journal Entry Account", { - "reference_type": doctype, - "reference_name": order.name, - "party": order.party, - "docstatus": 1, - "is_advance": "Yes" - }, "account_currency") - - frappe.db.set_value(doctype, order.name, "party_account_currency", party_account_currency) - \ No newline at end of file diff --git a/erpnext/patches/v6_20x/__init__.py b/erpnext/patches/v6_20x/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_20x/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_20x/remove_customer_supplier_roles.py b/erpnext/patches/v6_20x/remove_customer_supplier_roles.py deleted file mode 100644 index a651576887..0000000000 --- a/erpnext/patches/v6_20x/remove_customer_supplier_roles.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("buying", "doctype", "request_for_quotation_supplier") - frappe.reload_doc("buying", "doctype", "request_for_quotation_item") - frappe.reload_doc("buying", "doctype", "request_for_quotation") - frappe.reload_doc("projects", "doctype", "timesheet") - - for role in ('Customer', 'Supplier'): - frappe.db.sql('''delete from `tabHas Role` - where role=%s and parent in ("Administrator", "Guest")''', role) - - if not frappe.db.sql('select name from `tabHas Role` where role=%s', role): - - # delete DocPerm - for doctype in frappe.db.sql('select parent from tabDocPerm where role=%s', role): - d = frappe.get_doc("DocType", doctype[0]) - d.permissions = [p for p in d.permissions if p.role != role] - d.save() - - # delete Role - frappe.delete_doc_if_exists('Role', role) diff --git a/erpnext/patches/v6_20x/remove_fiscal_year_from_holiday_list.py b/erpnext/patches/v6_20x/remove_fiscal_year_from_holiday_list.py deleted file mode 100644 index d440c6859e..0000000000 --- a/erpnext/patches/v6_20x/remove_fiscal_year_from_holiday_list.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Holiday List") - - default_holiday_list = frappe.db.get_value("Holiday List", {"is_default": 1}) - if default_holiday_list: - for company in frappe.get_all("Company", fields=["name", "default_holiday_list"]): - if not company.default_holiday_list: - frappe.db.set_value("Company", company.name, "default_holiday_list", default_holiday_list) - - - fiscal_years = frappe._dict((fy.name, fy) for fy in frappe.get_all("Fiscal Year", fields=["name", "year_start_date", "year_end_date"])) - - for holiday_list in frappe.get_all("Holiday List", fields=["name", "fiscal_year"]): - fy = fiscal_years[holiday_list.fiscal_year] - frappe.db.set_value("Holiday List", holiday_list.name, "from_date", fy.year_start_date) - frappe.db.set_value("Holiday List", holiday_list.name, "to_date", fy.year_end_date) diff --git a/erpnext/patches/v6_20x/rename_project_name_to_project.py b/erpnext/patches/v6_20x/rename_project_name_to_project.py deleted file mode 100644 index 49ec9d22bc..0000000000 --- a/erpnext/patches/v6_20x/rename_project_name_to_project.py +++ /dev/null @@ -1,17 +0,0 @@ -# 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.model.utils.rename_field import rename_field - -def execute(): - - doc_list = ["Work Order", "BOM", "Purchase Invoice Item", "Sales Invoice", - "Purchase Order Item", "Stock Entry", "Delivery Note", "Sales Order", - "Purchase Receipt Item", "Supplier Quotation Item"] - - for doctype in doc_list: - frappe.reload_doctype(doctype) - rename_field(doctype, "project_name", "project") - \ No newline at end of file diff --git a/erpnext/patches/v6_20x/repost_valuation_rate_for_negative_inventory.py b/erpnext/patches/v6_20x/repost_valuation_rate_for_negative_inventory.py deleted file mode 100644 index 8369fea317..0000000000 --- a/erpnext/patches/v6_20x/repost_valuation_rate_for_negative_inventory.py +++ /dev/null @@ -1,11 +0,0 @@ -# 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 -from erpnext.stock.stock_balance import repost - -def execute(): - if cint(frappe.db.get_value("Stock Settings", None, "allow_negative_stock")): - repost(only_actual=True) \ No newline at end of file diff --git a/erpnext/patches/v6_20x/set_compact_print.py b/erpnext/patches/v6_20x/set_compact_print.py deleted file mode 100644 index 495407f0e0..0000000000 --- a/erpnext/patches/v6_20x/set_compact_print.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -from erpnext.setup.install import create_compact_item_print_custom_field - -def execute(): - create_compact_item_print_custom_field() - frappe.db.set_value("Print Settings", None, "compact_item_print", 1) diff --git a/erpnext/patches/v6_20x/update_product_bundle_description.py b/erpnext/patches/v6_20x/update_product_bundle_description.py deleted file mode 100644 index 1fac44b001..0000000000 --- a/erpnext/patches/v6_20x/update_product_bundle_description.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils import sanitize_html - -def execute(): - for product_bundle in frappe.get_all('Product Bundle'): - doc = frappe.get_doc('Product Bundle', product_bundle.name) - for item in doc.items: - if item.description: - description = sanitize_html(item.description) - item.db_set('description', description, update_modified=False) diff --git a/erpnext/patches/v6_21/__init__.py b/erpnext/patches/v6_21/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_21/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_21/fix_reorder_level.py b/erpnext/patches/v6_21/fix_reorder_level.py deleted file mode 100644 index 82a35ebab1..0000000000 --- a/erpnext/patches/v6_21/fix_reorder_level.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import unicode_literals - -import frappe -from erpnext.stock.doctype.item.item import DuplicateReorderRows - -def execute(): - if frappe.db.has_column("Item", "re_order_level"): - for item in frappe.db.sql("""select name, default_warehouse, re_order_level, re_order_qty - from tabItem - where ifnull(re_order_level, 0) != 0 - and ifnull(re_order_qty, 0) != 0""", as_dict=1): - - item_doc = frappe.get_doc("Item", item.name) - item_doc.append("reorder_levels", { - "warehouse": item.default_warehouse, - "warehouse_reorder_level": item.re_order_level, - "warehouse_reorder_qty": item.re_order_qty, - "material_request_type": "Purchase" - }) - - try: - item_doc.save() - except DuplicateReorderRows: - pass diff --git a/erpnext/patches/v6_21/rename_material_request_fields.py b/erpnext/patches/v6_21/rename_material_request_fields.py deleted file mode 100644 index 07be27a5d6..0000000000 --- a/erpnext/patches/v6_21/rename_material_request_fields.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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.model.utils.rename_field import rename_field - -def execute(): - frappe.reload_doc('stock', 'doctype', 'material_request_item') - rename_field("Material Request Item", "sales_order_no", "sales_order") - - frappe.reload_doc('support', 'doctype', 'maintenance_schedule_item') - rename_field("Maintenance Schedule Item", "prevdoc_docname", "sales_order") - \ No newline at end of file diff --git a/erpnext/patches/v6_23/__init__.py b/erpnext/patches/v6_23/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v6_23/update_stopped_status_to_closed.py b/erpnext/patches/v6_23/update_stopped_status_to_closed.py deleted file mode 100644 index 79d1e0ac30..0000000000 --- a/erpnext/patches/v6_23/update_stopped_status_to_closed.py +++ /dev/null @@ -1,9 +0,0 @@ -# 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 - -def execute(): - for dt in ("Sales Order", "Purchase Order"): - frappe.db.sql("update `tab{0}` set status='Closed' where status='Stopped'".format(dt)) \ No newline at end of file diff --git a/erpnext/patches/v6_24/__init__.py b/erpnext/patches/v6_24/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v6_24/map_customer_address_to_shipping_address_on_po.py b/erpnext/patches/v6_24/map_customer_address_to_shipping_address_on_po.py deleted file mode 100644 index 1dd8083c7c..0000000000 --- a/erpnext/patches/v6_24/map_customer_address_to_shipping_address_on_po.py +++ /dev/null @@ -1,19 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype("Purchase Order") - - if not frappe.db.has_column("Purchase Order", "shipping_address"): - return - - if not frappe.db.has_column("Purchase Order", "customer_address"): - return - - frappe.db.sql("""update `tabPurchase Order` set shipping_address=customer_address, - shipping_address_display=customer_address_display""") - - frappe.db.commit() \ No newline at end of file diff --git a/erpnext/patches/v6_24/set_recurring_id.py b/erpnext/patches/v6_24/set_recurring_id.py deleted file mode 100644 index 527a2fd3d9..0000000000 --- a/erpnext/patches/v6_24/set_recurring_id.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for doctype in ('Sales Order', 'Purchase Order', 'Sales Invoice', - 'Purchase Invoice'): - frappe.reload_doctype(doctype) - frappe.db.sql('''update `tab{0}` set submit_on_creation=1, notify_by_email=1 - where is_recurring=1'''.format(doctype)) - frappe.db.sql('''update `tab{0}` set notify_by_email=1 - where is_recurring=1'''.format(doctype)) - frappe.db.sql('''update `tab{0}` set recurring_id = name - where is_recurring=1 and ifnull(recurring_id, '') = "" '''.format(doctype)) diff --git a/erpnext/patches/v6_27/__init__.py b/erpnext/patches/v6_27/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_27/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_27/fix_recurring_order_status.py b/erpnext/patches/v6_27/fix_recurring_order_status.py deleted file mode 100644 index 5843c9fbe5..0000000000 --- a/erpnext/patches/v6_27/fix_recurring_order_status.py +++ /dev/null @@ -1,54 +0,0 @@ -# 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 - -def execute(): - for doc in ( - { - "doctype": "Sales Order", - "stock_doctype": "Delivery Note", - "invoice_doctype": "Sales Invoice", - "stock_doctype_ref_field": "against_sales_order", - "invoice_ref_field": "sales_order", - "qty_field": "delivered_qty" - }, - { - "doctype": "Purchase Order", - "stock_doctype": "Purchase Receipt", - "invoice_doctype": "Purchase Invoice", - "stock_doctype_ref_field": "prevdoc_docname", - "invoice_ref_field": "purchase_order", - "qty_field": "received_qty" - }): - - order_list = frappe.db.sql("""select name from `tab{0}` - where docstatus=1 and is_recurring=1 - and ifnull(recurring_id, '') != name and creation >= '2016-01-25'""" - .format(doc["doctype"]), as_dict=1) - - for order in order_list: - frappe.db.sql("""update `tab{0} Item` - set {1}=0, billed_amt=0 where parent=%s""".format(doc["doctype"], - doc["qty_field"]), order.name) - - # Check against Delivery Note and Purchase Receipt - stock_doc_list = frappe.db.sql("""select distinct parent from `tab{0} Item` - where docstatus=1 and ifnull({1}, '')=%s""" - .format(doc["stock_doctype"], doc["stock_doctype_ref_field"]), order.name) - - if stock_doc_list: - for dn in stock_doc_list: - frappe.get_doc(doc["stock_doctype"], dn[0]).update_qty(update_modified=False) - - # Check against Invoice - invoice_list = frappe.db.sql("""select distinct parent from `tab{0} Item` - where docstatus=1 and ifnull({1}, '')=%s""" - .format(doc["invoice_doctype"], doc["invoice_ref_field"]), order.name) - - if invoice_list: - for dn in invoice_list: - frappe.get_doc(doc["invoice_doctype"], dn[0]).update_qty(update_modified=False) - - frappe.get_doc(doc["doctype"], order.name).set_status(update=True, update_modified=False) \ No newline at end of file diff --git a/erpnext/patches/v6_3/__init__.py b/erpnext/patches/v6_3/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v6_3/convert_applicable_territory.py b/erpnext/patches/v6_3/convert_applicable_territory.py deleted file mode 100644 index 231a483ea2..0000000000 --- a/erpnext/patches/v6_3/convert_applicable_territory.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("stock", "doctype", "price_list_country") - frappe.reload_doc("accounts", "doctype", "shipping_rule_country") - frappe.reload_doctype("Price List") - frappe.reload_doctype("Shipping Rule") - frappe.reload_doctype("shopping_cart", "doctype", "shopping_cart_settings") - - # for price list - countries = frappe.db.sql_list("select name from tabCountry") - - for doctype in ("Price List", "Shipping Rule"): - for at in frappe.db.sql("""select name, parent, territory from `tabApplicable Territory` where - parenttype = %s """, doctype, as_dict=True): - if at.territory in countries: - parent = frappe.get_doc(doctype, at.parent) - if not parent.countries: - parent.append("countries", {"country": at.territory}) - parent.save() - - - frappe.delete_doc("DocType", "Applicable Territory") diff --git a/erpnext/patches/v6_4/__init__.py b/erpnext/patches/v6_4/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_4/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_4/email_digest_update.py b/erpnext/patches/v6_4/email_digest_update.py deleted file mode 100644 index 8342b7fce6..0000000000 --- a/erpnext/patches/v6_4/email_digest_update.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Email Digest") - frappe.db.sql("""update `tabEmail Digest` set expense_year_to_date = - income_year_to_date""") - - if frappe.db.exists("Email Digest", "Scheduler Errors"): - frappe.delete_doc("Email Digest", "Scheduler Errors") diff --git a/erpnext/patches/v6_4/fix_duplicate_bins.py b/erpnext/patches/v6_4/fix_duplicate_bins.py deleted file mode 100644 index 77d05273e8..0000000000 --- a/erpnext/patches/v6_4/fix_duplicate_bins.py +++ /dev/null @@ -1,20 +0,0 @@ -# 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 erpnext.stock.stock_balance import repost_stock - -def execute(): - bins = frappe.db.sql("""select item_code, warehouse, count(*) from `tabBin` - group by item_code, warehouse having count(*) > 1""", as_dict=True) - - for d in bins: - try: - frappe.db.sql("delete from tabBin where item_code=%s and warehouse=%s", (d.item_code, d.warehouse)) - - repost_stock(d.item_code, d.warehouse, allow_zero_rate=True, only_actual=False, only_bin=True) - - frappe.db.commit() - except: - frappe.db.rollback() \ No newline at end of file diff --git a/erpnext/patches/v6_4/fix_expense_included_in_valuation.py b/erpnext/patches/v6_4/fix_expense_included_in_valuation.py deleted file mode 100644 index 7ed15ab010..0000000000 --- a/erpnext/patches/v6_4/fix_expense_included_in_valuation.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe -from frappe.utils import cstr - -def execute(): - for company in frappe.db.sql("select name, expenses_included_in_valuation from tabCompany", as_dict=1): - frozen_date = get_frozen_date(company.name, company.expenses_included_in_valuation) - - # Purchase Invoices after frozen date - # which are not against Receipt, but valuation related tax is there - pi_list = frappe.db.sql(""" - select distinct pi.name - from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item - where - pi.name = pi_item.parent - and pi.company = %s - and pi.posting_date > %s - and pi.docstatus = 1 - and pi.is_opening = 'No' - and (pi_item.item_tax_amount is not null and pi_item.item_tax_amount > 0) - and (pi_item.purchase_receipt is null or pi_item.purchase_receipt = '') - and (pi_item.item_code is not null and pi_item.item_code != '') - and exists(select name from `tabItem` where name=pi_item.item_code and is_stock_item=1) - """, (company.name, frozen_date), as_dict=1) - - for pi in pi_list: - # Check whether gle exists for Expenses Included in Valuation account against the PI - gle_for_expenses_included_in_valuation = frappe.db.sql("""select name from `tabGL Entry` - where voucher_type='Purchase Invoice' and voucher_no=%s and account=%s""", - (pi.name, company.expenses_included_in_valuation)) - - if gle_for_expenses_included_in_valuation: - print(pi.name) - - frappe.db.sql("""delete from `tabGL Entry` - where voucher_type='Purchase Invoice' and voucher_no=%s""", pi.name) - - purchase_invoice = frappe.get_doc("Purchase Invoice", pi.name) - - # some old entries have missing expense accounts - if purchase_invoice.against_expense_account: - expense_account = purchase_invoice.against_expense_account.split(",") - if len(expense_account) == 1: - expense_account = expense_account[0] - for item in purchase_invoice.items: - if not item.expense_account: - item.db_set("expense_account", expense_account, update_modified=False) - - purchase_invoice.make_gl_entries() - -def get_frozen_date(company, account): - # Accounting frozen upto - accounts_frozen_upto = frappe.db.get_single_value("Accounts Settings", "acc_frozen_upto") - - # Last adjustment entry to correct Expenses Included in Valuation account balance - last_adjustment_entry = frappe.db.sql("""select posting_date from `tabGL Entry` - where account=%s and company=%s and voucher_type = 'Journal Entry' - order by posting_date desc limit 1""", (account, company)) - - last_adjustment_date = cstr(last_adjustment_entry[0][0]) if last_adjustment_entry else None - - # Last period closing voucher - last_closing_entry = frappe.db.sql("""select posting_date from `tabGL Entry` - where company=%s and voucher_type = 'Period Closing Voucher' - order by posting_date desc limit 1""", company) - - last_closing_date = cstr(last_closing_entry[0][0]) if last_closing_entry else None - - frozen_date = max([accounts_frozen_upto, last_adjustment_date, last_closing_date]) - - return frozen_date or '1900-01-01' diff --git a/erpnext/patches/v6_4/fix_journal_entries_due_to_reconciliation.py b/erpnext/patches/v6_4/fix_journal_entries_due_to_reconciliation.py deleted file mode 100644 index b53412d7eb..0000000000 --- a/erpnext/patches/v6_4/fix_journal_entries_due_to_reconciliation.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Sales Invoice Advance") - frappe.reload_doctype("Purchase Invoice Advance") - - je_rows = frappe.db.sql(""" - select name, parent, reference_type, reference_name, debit, credit - from `tabJournal Entry Account` - where docstatus=1 and date(modified) >= '2015-09-17' - and ((ifnull(debit_in_account_currency, 0)*exchange_rate != ifnull(debit, 0)) - or (ifnull(credit_in_account_currency, 0)*exchange_rate != ifnull(credit, 0))) - order by parent - """, as_dict=True) - - journal_entries = [] - - for d in je_rows: - if d.parent not in journal_entries: - journal_entries.append(d.parent) - - is_advance_entry=None - if d.reference_type in ("Sales Invoice", "Purchase Invoice") and d.reference_name: - is_advance_entry = frappe.db.sql("""select name from `tab{0}` - where reference_name=%s and reference_row=%s - and ifnull(allocated_amount, 0) > 0 and docstatus=1""" - .format(d.reference_type + " Advance"), (d.parent, d.name)) - - if is_advance_entry or not (d.debit or d.credit): - frappe.db.sql(""" - update `tabJournal Entry Account` - set debit=debit_in_account_currency*exchange_rate, - credit=credit_in_account_currency*exchange_rate - where name=%s""", d.name) - else: - frappe.db.sql(""" - update `tabJournal Entry Account` - set debit_in_account_currency=debit/exchange_rate, - credit_in_account_currency=credit/exchange_rate - where name=%s""", d.name) - - for d in journal_entries: - print(d) - # delete existing gle - frappe.db.sql("delete from `tabGL Entry` where voucher_type='Journal Entry' and voucher_no=%s", d) - - # repost gl entries - je = frappe.get_doc("Journal Entry", d) - je.make_gl_entries() \ No newline at end of file diff --git a/erpnext/patches/v6_4/fix_modified_in_sales_order_and_purchase_order.py b/erpnext/patches/v6_4/fix_modified_in_sales_order_and_purchase_order.py deleted file mode 100644 index f27489e7b0..0000000000 --- a/erpnext/patches/v6_4/fix_modified_in_sales_order_and_purchase_order.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for doctype in ("Sales Order", "Purchase Order"): - data = frappe.db.sql("""select parent, modified_by, modified - from `tab{doctype} Item` where docstatus=1 group by parent""".format(doctype=doctype), as_dict=True) - for item in data: - frappe.db.sql("""update `tab{doctype}` set modified_by=%(modified_by)s, modified=%(modified)s - where name=%(parent)s""".format(doctype=doctype), item) diff --git a/erpnext/patches/v6_4/fix_sales_order_maintenance_status.py b/erpnext/patches/v6_4/fix_sales_order_maintenance_status.py deleted file mode 100644 index 50aa9e542e..0000000000 --- a/erpnext/patches/v6_4/fix_sales_order_maintenance_status.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for doc in frappe.get_all("Sales Order", filters={"docstatus": 1, - "order_type": "Maintenance"}): - doc = frappe.get_doc("Sales Order", doc.name) - doc.set_status(update=True) diff --git a/erpnext/patches/v6_4/fix_status_in_sales_and_purchase_order.py b/erpnext/patches/v6_4/fix_status_in_sales_and_purchase_order.py deleted file mode 100644 index 746a99004a..0000000000 --- a/erpnext/patches/v6_4/fix_status_in_sales_and_purchase_order.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for doctype in ("Sales Order", "Purchase Order"): - for doc in frappe.get_all(doctype, filters={"docstatus": 1}): - doc = frappe.get_doc(doctype, doc.name) - doc.set_status(update=True) diff --git a/erpnext/patches/v6_4/make_image_thumbnail.py b/erpnext/patches/v6_4/make_image_thumbnail.py deleted file mode 100644 index 2c86e8af86..0000000000 --- a/erpnext/patches/v6_4/make_image_thumbnail.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("File") - frappe.reload_doctype("Item") - for item in frappe.get_all("Item", fields=("name", "website_image", "thumbnail")): - if item.website_image and not item.thumbnail: - item_doc = frappe.get_doc("Item", item.name) - try: - item_doc.make_thumbnail() - if item_doc.thumbnail: - item_doc.db_set("thumbnail", item_doc.thumbnail, update_modified=False) - except Exception: - print("Unable to make thumbnail for {0}".format(item.website_image.encode("utf-8"))) diff --git a/erpnext/patches/v6_4/repost_gle_for_journal_entries_where_reference_name_missing.py b/erpnext/patches/v6_4/repost_gle_for_journal_entries_where_reference_name_missing.py deleted file mode 100644 index 1319b53558..0000000000 --- a/erpnext/patches/v6_4/repost_gle_for_journal_entries_where_reference_name_missing.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe - -def execute(): - je_list = frappe.db.sql_list("""select distinct parent from `tabJournal Entry Account` je - where docstatus=1 and ifnull(reference_name, '') !='' and creation > '2015-03-01' - and not exists(select name from `tabGL Entry` - where voucher_type='Journal Entry' and voucher_no=je.parent - and against_voucher_type=je.reference_type - and against_voucher=je.reference_name)""") - - for d in je_list: - print(d) - - # delete existing gle - frappe.db.sql("delete from `tabGL Entry` where voucher_type='Journal Entry' and voucher_no=%s", d) - - # repost gl entries - je = frappe.get_doc("Journal Entry", d) - je.make_gl_entries() \ No newline at end of file diff --git a/erpnext/patches/v6_4/round_status_updater_percentages.py b/erpnext/patches/v6_4/round_status_updater_percentages.py deleted file mode 100644 index 900e906b7b..0000000000 --- a/erpnext/patches/v6_4/round_status_updater_percentages.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for doctype, fieldname in ( - ("Sales Order", "per_billed"), - ("Sales Order", "per_delivered"), - ("Delivery Note", "per_installed"), - ("Purchase Order", "per_billed"), - ("Purchase Order", "per_received"), - ("Material Request", "per_ordered"), - ): - frappe.db.sql("""update `tab{doctype}` set `{fieldname}`=round(`{fieldname}`, 2)""".format( - doctype=doctype, fieldname=fieldname)) diff --git a/erpnext/patches/v6_4/set_user_in_contact.py b/erpnext/patches/v6_4/set_user_in_contact.py deleted file mode 100644 index 7e8a6eecd5..0000000000 --- a/erpnext/patches/v6_4/set_user_in_contact.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Contact") - frappe.db.sql("""update tabContact, tabUser set tabContact.user = tabUser.name - where tabContact.email_id = tabUser.email""") diff --git a/erpnext/patches/v6_5/__init__.py b/erpnext/patches/v6_5/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_5/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_5/show_in_website_for_template_item.py b/erpnext/patches/v6_5/show_in_website_for_template_item.py deleted file mode 100644 index af6e8304d6..0000000000 --- a/erpnext/patches/v6_5/show_in_website_for_template_item.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import unicode_literals -import frappe -import frappe.website.render - -def execute(): - for item_code in frappe.db.sql_list("""select distinct variant_of from `tabItem` - where variant_of is not null and variant_of !='' and show_in_website=1"""): - - item = frappe.get_doc("Item", item_code) - item.db_set("show_in_website", 1, update_modified=False) - - item.make_route() - item.db_set("route", item.route, update_modified=False) - - frappe.website.render.clear_cache() diff --git a/erpnext/patches/v6_6/__init__.py b/erpnext/patches/v6_6/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v6_6/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v6_6/fix_website_image.py b/erpnext/patches/v6_6/fix_website_image.py deleted file mode 100644 index cc3e2d852c..0000000000 --- a/erpnext/patches/v6_6/fix_website_image.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import print_function, unicode_literals -import frappe -from frappe.utils import encode - -def execute(): - """Fix the File records created via item.py even if the website_image file didn't exist""" - for item in frappe.db.sql_list("""select name from `tabItem` - where website_image is not null and website_image != '' - and website_image like '/files/%' - and exists ( - select name from `tabFile` - where attached_to_doctype='Item' - and attached_to_name=`tabItem`.name - and file_url=`tabItem`.website_image - and (file_name is null or file_name = '') - )"""): - - item = frappe.get_doc("Item", item) - file = frappe.get_doc("File", { - "attached_to_doctype": "Item", - "attached_to_name": item.name, - "file_url": item.website_image - }) - - try: - file.validate_file() - except IOError: - print(encode(item.website_image), "does not exist") - file.delete() - item.db_set("website_image", None, update_modified=False) - - diff --git a/erpnext/patches/v6_6/remove_fiscal_year_from_leave_allocation.py b/erpnext/patches/v6_6/remove_fiscal_year_from_leave_allocation.py deleted file mode 100644 index 11c582fc49..0000000000 --- a/erpnext/patches/v6_6/remove_fiscal_year_from_leave_allocation.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Leave Allocation") - if frappe.db.has_column("Leave Allocation", "fiscal_year"): - for leave_allocation in frappe.db.sql("select name, fiscal_year from `tabLeave Allocation`", as_dict=True): - dates = frappe.db.get_value("Fiscal Year", leave_allocation["fiscal_year"], - ["year_start_date", "year_end_date"]) - - if dates: - year_start_date, year_end_date = dates - - frappe.db.sql("""update `tabLeave Allocation` - set from_date=%s, to_date=%s where name=%s""", - (year_start_date, year_end_date, leave_allocation["name"])) - diff --git a/erpnext/patches/v6_8/__init__.py b/erpnext/patches/v6_8/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v6_8/make_webform_standard.py b/erpnext/patches/v6_8/make_webform_standard.py deleted file mode 100644 index 2cc16a286f..0000000000 --- a/erpnext/patches/v6_8/make_webform_standard.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - pass - - # done via fixtures - - # frappe.reload_doctype("Web Form") - # frappe.delete_doc("Web Form", "Issues") - # frappe.delete_doc("Web Form", "Addresses") - - # from erpnext.setup.install import add_web_forms - # add_web_forms() diff --git a/erpnext/patches/v6_8/move_drop_ship_to_po_items.py b/erpnext/patches/v6_8/move_drop_ship_to_po_items.py deleted file mode 100644 index 7184deeccc..0000000000 --- a/erpnext/patches/v6_8/move_drop_ship_to_po_items.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Purchase Order") - frappe.reload_doctype("Purchase Order Item") - - if not frappe.db.has_column("Purchase Order", "delivered_by_supplier"): - return - - for po in frappe.get_all("Purchase Order", filters={"delivered_by_supplier": 1}, fields=["name"]): - purchase_order = frappe.get_doc("Purchase Order", po) - - for item in purchase_order.items: - if item.prevdoc_doctype == "Sales Order": - delivered_by_supplier = frappe.get_value("Sales Order Item", item.prevdoc_detail_docname, - "delivered_by_supplier") - - if delivered_by_supplier: - frappe.db.sql("""update `tabPurchase Order Item` - set delivered_by_supplier=1, billed_amt=amount, received_qty=qty - where name=%s """, item.name) - - update_per_received(purchase_order) - update_per_billed(purchase_order) - -def update_per_received(po): - frappe.db.sql(""" update `tabPurchase Order` - set 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 = %(name)s), 2) - where name = %(name)s """, {"name": po.name}) - -def update_per_billed(po): - frappe.db.sql(""" update `tabPurchase Order` - set 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 = %(name)s), 2) - where name = %(name)s """, {"name": po.name}) - - diff --git a/erpnext/patches/v7_0/__init__.py b/erpnext/patches/v7_0/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v7_0/calculate_total_costing_amount.py b/erpnext/patches/v7_0/calculate_total_costing_amount.py deleted file mode 100644 index 8ed60a2955..0000000000 --- a/erpnext/patches/v7_0/calculate_total_costing_amount.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils import flt - -def execute(): - frappe.reload_doc('projects', 'doctype', 'timesheet') - - for data in frappe.get_all('Timesheet', fields=["name, total_costing_amount"], - filters = [["docstatus", "<", "2"]]): - if flt(data.total_costing_amount) == 0.0: - ts = frappe.get_doc('Timesheet', data.name) - ts.update_cost() - ts.calculate_total_amounts() - ts.flags.ignore_validate = True - ts.flags.ignore_mandatory = True - ts.flags.ignore_validate_update_after_submit = True - ts.flags.ignore_links = True - ts.save() diff --git a/erpnext/patches/v7_0/convert_timelog_to_timesheet.py b/erpnext/patches/v7_0/convert_timelog_to_timesheet.py deleted file mode 100644 index 8c60b5b71e..0000000000 --- a/erpnext/patches/v7_0/convert_timelog_to_timesheet.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('projects', 'doctype', 'task') - frappe.reload_doc('projects', 'doctype', 'timesheet') - if not frappe.db.table_exists("Time Log"): - return - - from erpnext.manufacturing.doctype.work_order.work_order \ - import make_timesheet, add_timesheet_detail - - for data in frappe.db.sql("select * from `tabTime Log`", as_dict=1): - if data.task: - company = frappe.db.get_value("Task", data.task, "company") - elif data.work_order: - company = frappe.db.get_value("Work Order", data.work_order, "company") - else: - company = frappe.db.get_single_value('Global Defaults', 'default_company') - - time_sheet = make_timesheet(data.work_order, company) - args = get_timelog_data(data) - add_timesheet_detail(time_sheet, args) - if data.docstatus == 2: - time_sheet.docstatus = 0 - else: - time_sheet.docstatus = data.docstatus - time_sheet.employee = data.employee - time_sheet.note = data.note - time_sheet.company = company - - time_sheet.set_status() - time_sheet.set_dates() - time_sheet.update_cost() - time_sheet.calculate_total_amounts() - time_sheet.flags.ignore_validate = True - time_sheet.flags.ignore_links = True - time_sheet.save(ignore_permissions=True) - - # To ignore validate_mandatory_fields function - if data.docstatus == 1: - time_sheet.db_set("docstatus", 1) - for d in time_sheet.get("time_logs"): - d.db_set("docstatus", 1) - time_sheet.update_work_order(time_sheet.name) - time_sheet.update_task_and_project() - if data.docstatus == 2: - time_sheet.db_set("docstatus", 2) - for d in time_sheet.get("time_logs"): - d.db_set("docstatus", 2) - -def get_timelog_data(data): - return { - 'is_billable': data.billable, - 'from_time': data.from_time, - 'hours': data.hours, - 'to_time': data.to_time, - 'project': data.project, - 'task': data.task, - 'activity_type': data.activity_type, - 'operation': data.operation, - 'operation_id': data.operation_id, - 'workstation': data.workstation, - 'completed_qty': data.completed_qty, - 'billing_rate': data.billing_rate, - 'billing_amount': data.billing_amount, - 'costing_rate': data.costing_rate, - 'costing_amount': data.costing_amount - } diff --git a/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py b/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py deleted file mode 100644 index e78f163e07..0000000000 --- a/erpnext/patches/v7_0/convert_timelogbatch_to_timesheet.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils import cint - -def execute(): - if not frappe.db.exists("DocType", "Time Log Batch"): - return - - from erpnext.manufacturing.doctype.work_order.work_order import add_timesheet_detail - - for tlb in frappe.get_all('Time Log Batch', fields=["*"], - filters = [["docstatus", "<", "2"]]): - time_sheet = frappe.new_doc('Timesheet') - time_sheet.employee= "" - time_sheet.company = frappe.db.get_single_value('Global Defaults', 'default_company') - time_sheet.sales_invoice = tlb.sales_invoice - - for data in frappe.get_all('Time Log Batch Detail', fields=["*"], - filters = {'parent': tlb.name}): - args = get_timesheet_data(data) - add_timesheet_detail(time_sheet, args) - - time_sheet.docstatus = tlb.docstatus - time_sheet.flags.ignore_links = True - time_sheet.save(ignore_permissions=True) - -def get_timesheet_data(data): - from erpnext.patches.v7_0.convert_timelog_to_timesheet import get_timelog_data - - time_log = frappe.get_all('Time Log', fields=["*"], filters = {'name': data.time_log}) - if time_log: - return get_timelog_data(time_log[0]) \ No newline at end of file diff --git a/erpnext/patches/v7_0/create_budget_record.py b/erpnext/patches/v7_0/create_budget_record.py deleted file mode 100644 index fd8bec9f32..0000000000 --- a/erpnext/patches/v7_0/create_budget_record.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import unicode_literals -import frappe - -from erpnext.accounts.doctype.budget.budget import DuplicateBudgetError - -def execute(): - frappe.reload_doc("accounts", "doctype", "budget") - frappe.reload_doc("accounts", "doctype", "budget_account") - - existing_budgets = frappe.db.sql(""" - select - cc.name, cc.company, cc.distribution_id, - budget.account, budget.budget_allocated, budget.fiscal_year - from - `tabCost Center` cc, `tabBudget Detail` budget - where - cc.name=budget.parent - """, as_dict=1) - - actions = {} - for d in frappe.db.sql("select name, yearly_bgt_flag, monthly_bgt_flag from tabCompany", as_dict=1): - actions.setdefault(d.name, d) - - budget_records = [] - for d in existing_budgets: - budget = frappe.db.get_value("Budget", - {"cost_center": d.name, "fiscal_year": d.fiscal_year, "company": d.company}) - - if not budget: - budget = frappe.new_doc("Budget") - budget.cost_center = d.name - budget.fiscal_year = d.fiscal_year - budget.monthly_distribution = d.distribution_id - budget.company = d.company - if actions[d.company]["yearly_bgt_flag"]: - budget.action_if_annual_budget_exceeded = actions[d.company]["yearly_bgt_flag"] - if actions[d.company]["monthly_bgt_flag"]: - budget.action_if_accumulated_monthly_budget_exceeded = actions[d.company]["monthly_bgt_flag"] - else: - budget = frappe.get_doc("Budget", budget) - - budget.append("accounts", { - "account": d.account, - "budget_amount": d.budget_allocated - }) - - try: - budget.insert() - budget_records.append(budget) - except DuplicateBudgetError: - pass - - for budget in budget_records: - budget.submit() - - if frappe.db.get_value("DocType", "Budget Detail"): - frappe.delete_doc("DocType", "Budget Detail") \ No newline at end of file diff --git a/erpnext/patches/v7_0/create_warehouse_nestedset.py b/erpnext/patches/v7_0/create_warehouse_nestedset.py deleted file mode 100644 index 1c9fc32142..0000000000 --- a/erpnext/patches/v7_0/create_warehouse_nestedset.py +++ /dev/null @@ -1,128 +0,0 @@ - -from __future__ import unicode_literals -import frappe, erpnext -from frappe import _ -from frappe.utils import cint -from frappe.utils.nestedset import rebuild_tree - -def execute(): - """ - Patch Reference: - 1. check whether warehouse is associated to company or not - 2. if warehouse is associated with company - a. create warehouse group for company - b. set warehouse group as parent to other warehouses and set is_group as 0 - 3. if warehouses is not associated with company - a. get distinct companies from stock ledger entries - b. if sle have only company, - i. set default company to all warehouse - ii. repeat 2.a and 2.b - c. if have multiple companies, - i. create group warehouse without company - ii. repeat 2.b - """ - - frappe.reload_doc("stock", "doctype", "warehouse") - - if check_is_warehouse_associated_with_company(): - for company in frappe.get_all("Company", fields=["name", "abbr"]): - make_warehouse_nestedset(company) - else: - sle_against_companies = frappe.db.sql_list("""select distinct company from `tabStock Ledger Entry`""") - - if len(sle_against_companies) == 1: - company = frappe.get_cached_value('Company', sle_against_companies[0], - fieldname=["name", "abbr"], as_dict=1) - set_company_to_warehouse(company.name) - make_warehouse_nestedset(company) - - elif len(sle_against_companies) > 1: - make_warehouse_nestedset() - -def check_is_warehouse_associated_with_company(): - warehouse_associcated_with_company = False - - for warehouse in frappe.get_all("Warehouse", fields=["name", "company"]): - if warehouse.company: - warehouse_associcated_with_company = True - - return warehouse_associcated_with_company - -def make_warehouse_nestedset(company=None): - validate_parent_account_for_warehouse(company) - stock_account_group = get_stock_account_group(company.name) - enable_perpetual_inventory = cint(erpnext.is_perpetual_inventory_enabled(company.name)) or 0 - if not stock_account_group and enable_perpetual_inventory: - return - - if company: - warehouse_group = "{0} - {1}".format(_("All Warehouses"), company.abbr) - ignore_mandatory = False - else: - warehouse_group = _("All Warehouses") - ignore_mandatory = True - - if not frappe.db.get_value("Warehouse", warehouse_group): - create_default_warehouse_group(company, stock_account_group, ignore_mandatory) - - set_parent_to_warehouse(warehouse_group, company) - if enable_perpetual_inventory: - set_parent_to_warehouse_account(company) - -def validate_parent_account_for_warehouse(company=None): - if not company: - return - - if cint(erpnext.is_perpetual_inventory_enabled(company.name)): - parent_account = frappe.db.sql("""select name from tabAccount - where account_type='Stock' and company=%s and is_group=1 - and (warehouse is null or warehouse = '')""", company.name) - - if not parent_account: - current_parent_accounts_for_warehouse = frappe.db.sql("""select parent_account from tabAccount - where account_type='Warehouse' and (warehouse is not null or warehouse != '') """) - - if current_parent_accounts_for_warehouse: - frappe.db.set_value("Account", current_parent_accounts_for_warehouse[0][0], "account_type", "Stock") - -def create_default_warehouse_group(company=None, stock_account_group=None, ignore_mandatory=False): - wh = frappe.get_doc({ - "doctype": "Warehouse", - "warehouse_name": _("All Warehouses"), - "is_group": 1, - "company": company.name if company else "", - "parent_warehouse": "" - }) - - if ignore_mandatory: - wh.flags.ignore_mandatory = ignore_mandatory - - wh.insert(ignore_permissions=True) - -def set_parent_to_warehouse(warehouse_group, company=None): - frappe.db.sql(""" update tabWarehouse set parent_warehouse = %s, is_group = 0 - where (is_group = 0 or is_group is null or is_group = '') and ifnull(company, '') = %s - """,(warehouse_group, company.name if company else "")) - - rebuild_tree("Warehouse", "parent_warehouse") - -def set_parent_to_warehouse_account(company): - frappe.db.sql(""" update tabAccount set parent_account = %s - where is_group = 0 and account_type = "Warehouse" - and (warehouse is not null or warehouse != '') and company = %s - """,("{0} - {1}".format(_("All Warehouses"), company.abbr), company.name)) - - rebuild_tree("Account", "parent_account") - -def set_company_to_warehouse(company): - frappe.db.sql("update tabWahouse set company=%s", company) - -def get_stock_account_group(company): - stock_account_group = frappe.db.get_all('Account', filters = {'company': company, 'is_group': 1, - 'account_type': 'Stock', 'root_type': 'Asset'}, limit=1) - - if not stock_account_group: - stock_account_group = frappe.db.get_all('Account', filters = {'company': company, 'is_group': 1, - 'parent_account': '', 'root_type': 'Asset'}, limit=1) - - return stock_account_group[0].name if stock_account_group else None \ No newline at end of file diff --git a/erpnext/patches/v7_0/fix_duplicate_icons.py b/erpnext/patches/v7_0/fix_duplicate_icons.py deleted file mode 100644 index 9f442029b5..0000000000 --- a/erpnext/patches/v7_0/fix_duplicate_icons.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import unicode_literals -import frappe - -from frappe.desk.doctype.desktop_icon.desktop_icon import (sync_desktop_icons, - get_desktop_icons, set_hidden) -from erpnext.patches.v7_0.migrate_schools_to_erpnext import reload_doctypes_for_schools_icons - -def execute(): - '''hide new style icons if old ones are set''' - frappe.reload_doc('desk', 'doctype', 'desktop_icon') - - reload_doctypes_for_schools_icons() - - sync_desktop_icons() - - for user in frappe.get_all('User', filters={'user_type': 'System User'}): - desktop_icons = get_desktop_icons(user.name) - icons_dict = {} - for d in desktop_icons: - if not d.hidden: - icons_dict[d.module_name] = d - - for key in (('Selling', 'Customer'), ('Stock', 'Item'), ('Buying', 'Supplier'), - ('HR', 'Employee'), ('CRM', 'Lead'), ('Support', 'Issue'), ('Projects', 'Project')): - if key[0] in icons_dict and key[1] in icons_dict: - set_hidden(key[1], user.name, 1) - diff --git a/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py b/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py deleted file mode 100644 index 2bc09714d8..0000000000 --- a/erpnext/patches/v7_0/fix_nonwarehouse_ledger_gl_entries_for_transactions.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import print_function, unicode_literals -import frappe, erpnext - -def execute(): - frappe.reload_doctype("Account") - - warehouses = frappe.db.sql("""select name, company from tabAccount - where account_type = 'Stock' and is_group = 0 - and (warehouse is null or warehouse = '')""", as_dict=1) - warehouses = [d.name for d in warehouses if erpnext.is_perpetual_inventory_enabled(d.company)] - - if len(warehouses) > 0: - warehouses = set_warehouse_for_stock_account(warehouses) - if not warehouses: - return - - stock_vouchers = frappe.db.sql("""select distinct sle.voucher_type, sle.voucher_no - from `tabStock Ledger Entry` sle - where sle.warehouse in (%s) and creation > '2016-05-01' - and not exists(select name from `tabGL Entry` - where account=sle.warehouse and voucher_type=sle.voucher_type and voucher_no=sle.voucher_no) - order by sle.posting_date""" % - ', '.join(['%s']*len(warehouses)), tuple(warehouses)) - - rejected = [] - for voucher_type, voucher_no in stock_vouchers: - try: - frappe.db.sql("""delete from `tabGL Entry` - where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no)) - - voucher = frappe.get_doc(voucher_type, voucher_no) - voucher.make_gl_entries() - frappe.db.commit() - except Exception as e: - print(frappe.get_traceback()) - rejected.append([voucher_type, voucher_no]) - frappe.db.rollback() - - print(rejected) - -def set_warehouse_for_stock_account(warehouse_account): - for account in warehouse_account: - if frappe.db.exists('Warehouse', account): - frappe.db.set_value("Account", account, "warehouse", account) - else: - warehouse_account.remove(account) - - return warehouse_account diff --git a/erpnext/patches/v7_0/make_guardian.py b/erpnext/patches/v7_0/make_guardian.py deleted file mode 100644 index 519969b38d..0000000000 --- a/erpnext/patches/v7_0/make_guardian.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.exists("DocType", "Student"): - student_table_cols = frappe.db.get_table_columns("Student") - if "father_name" in student_table_cols: - - # 'Schools' module changed to the 'Education' - # frappe.reload_doc("schools", "doctype", "student") - # frappe.reload_doc("schools", "doctype", "guardian") - # frappe.reload_doc("schools", "doctype", "guardian_interest") - - frappe.reload_doc("education", "doctype", "student") - frappe.reload_doc("education", "doctype", "guardian") - frappe.reload_doc("education", "doctype", "guardian_interest") - frappe.reload_doc("hr", "doctype", "interest") - - fields = ["name", "father_name", "mother_name"] - - if "father_email_id" in student_table_cols: - fields += ["father_email_id", "mother_email_id"] - - students = frappe.get_all("Student", fields) - for stud in students: - if stud.father_name: - make_guardian(stud.father_name, stud.name, stud.father_email_id) - if stud.mother_name: - make_guardian(stud.mother_name, stud.name, stud.mother_email_id) - -def make_guardian(name, student, email=None): - frappe.get_doc({ - 'doctype': 'Guardian', - 'guardian_name': name, - 'email': email, - 'student': student - }).insert() diff --git a/erpnext/patches/v7_0/make_is_group_fieldtype_as_check.py b/erpnext/patches/v7_0/make_is_group_fieldtype_as_check.py deleted file mode 100644 index ba82e869fa..0000000000 --- a/erpnext/patches/v7_0/make_is_group_fieldtype_as_check.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for doctype in ["Sales Person", "Customer Group", "Item Group", "Territory"]: - - # convert to 1 or 0 - frappe.db.sql("update `tab{doctype}` set is_group = if(is_group='Yes',1,0) " - .format(doctype=doctype)) - - frappe.db.commit() - - # alter fields to int - - frappe.db.sql("alter table `tab{doctype}` change is_group is_group int(1) default '0'" - .format(doctype=doctype)) - - frappe.reload_doctype(doctype) diff --git a/erpnext/patches/v7_0/merge_account_type_stock_and_warehouse_to_stock.py b/erpnext/patches/v7_0/merge_account_type_stock_and_warehouse_to_stock.py deleted file mode 100644 index 02808a742f..0000000000 --- a/erpnext/patches/v7_0/merge_account_type_stock_and_warehouse_to_stock.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("accounts", "doctype", "account") - - frappe.db.sql(""" update tabAccount set account_type = "Stock" - where account_type = "Warehouse" """) - - frappe.db.commit() \ No newline at end of file diff --git a/erpnext/patches/v7_0/migrate_mode_of_payments_v6_to_v7.py b/erpnext/patches/v7_0/migrate_mode_of_payments_v6_to_v7.py deleted file mode 100644 index e0e3f7075a..0000000000 --- a/erpnext/patches/v7_0/migrate_mode_of_payments_v6_to_v7.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'sales_invoice_timesheet') - frappe.reload_doc('accounts', 'doctype', 'sales_invoice_payment') - frappe.reload_doc('accounts', 'doctype', 'mode_of_payment') - - count = 0 - for data in frappe.db.sql("""select name, mode_of_payment, cash_bank_account, paid_amount, company - from `tabSales Invoice` si - where si.is_pos = 1 and si.docstatus < 2 - and si.cash_bank_account is not null and si.cash_bank_account != '' - and not exists(select name from `tabSales Invoice Payment` where parent=si.name)""", as_dict=1): - - if not data.mode_of_payment and not frappe.db.exists("Mode of Payment", "Cash"): - mop = frappe.new_doc("Mode of Payment") - mop.mode_of_payment = "Cash" - mop.type = "Cash" - mop.save() - - si_doc = frappe.get_doc('Sales Invoice', data.name) - row = si_doc.append('payments', { - 'mode_of_payment': data.mode_of_payment or 'Cash', - 'account': data.cash_bank_account, - 'type': frappe.db.get_value('Mode of Payment', data.mode_of_payment, 'type') or 'Cash', - 'amount': data.paid_amount - }) - row.db_update() - - si_doc.set_paid_amount() - si_doc.db_set("paid_amount", si_doc.paid_amount, update_modified = False) - si_doc.db_set("base_paid_amount", si_doc.base_paid_amount, update_modified = False) - - count +=1 - - if count % 200 == 0: - frappe.db.commit() \ No newline at end of file diff --git a/erpnext/patches/v7_0/migrate_schools_to_erpnext.py b/erpnext/patches/v7_0/migrate_schools_to_erpnext.py deleted file mode 100644 index b72bc137b6..0000000000 --- a/erpnext/patches/v7_0/migrate_schools_to_erpnext.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import unicode_literals -import frappe, os -from frappe.installer import remove_from_installed_apps - -def execute(): - reload_doctypes_for_schools_icons() - - frappe.reload_doc('website', 'doctype', 'portal_settings') - frappe.reload_doc('website', 'doctype', 'portal_menu_item') - frappe.reload_doc('buying', 'doctype', 'request_for_quotation') - - if 'schools' in frappe.get_installed_apps(): - if not frappe.db.exists('Module Def', 'Schools') and frappe.db.exists('Module Def', 'Academics'): - - # 'Schools' module changed to the 'Education' - # frappe.rename_doc("Module Def", "Academics", "Schools") - - frappe.rename_doc("Module Def", "Academics", "Education") - - remove_from_installed_apps("schools") - -def reload_doctypes_for_schools_icons(): - # 'Schools' module changed to the 'Education' - # base_path = frappe.get_app_path('erpnext', 'schools', 'doctype') - - base_path = frappe.get_app_path('erpnext', 'education', 'doctype') - for doctype in os.listdir(base_path): - if os.path.exists(os.path.join(base_path, doctype, doctype + '.json')) \ - and doctype not in ("fee_component", "assessment", "assessment_result"): - frappe.reload_doc('education', 'doctype', doctype) \ No newline at end of file diff --git a/erpnext/patches/v7_0/move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet.py b/erpnext/patches/v7_0/move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet.py deleted file mode 100644 index 998c4b674b..0000000000 --- a/erpnext/patches/v7_0/move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'sales_invoice') - frappe.reload_doc('accounts', 'doctype', 'sales_invoice_payment') - for time_sheet in frappe.db.sql(""" select sales_invoice, name, total_billable_amount from `tabTimesheet` - where sales_invoice is not null and docstatus < 2""", as_dict=True): - if not frappe.db.exists('Sales Invoice', time_sheet.sales_invoice): - continue - si_doc = frappe.get_doc('Sales Invoice', time_sheet.sales_invoice) - ts = si_doc.append('timesheets',{}) - ts.time_sheet = time_sheet.name - ts.billing_amount = time_sheet.total_billable_amount - ts.db_update() - si_doc.calculate_billing_amount_from_timesheet() - si_doc.db_set("total_billing_amount", si_doc.total_billing_amount, update_modified = False) \ No newline at end of file diff --git a/erpnext/patches/v7_0/po_status_issue_for_pr_return.py b/erpnext/patches/v7_0/po_status_issue_for_pr_return.py deleted file mode 100644 index 910814fd22..0000000000 --- a/erpnext/patches/v7_0/po_status_issue_for_pr_return.py +++ /dev/null @@ -1,40 +0,0 @@ -# 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 - -def execute(): - parent_list = [] - count = 0 - - frappe.reload_doc('stock', 'doctype', 'purchase_receipt') - frappe.reload_doc('stock', 'doctype', 'purchase_receipt_item') - - for data in frappe.db.sql(""" - select - `tabPurchase Receipt Item`.purchase_order, `tabPurchase Receipt Item`.name, - `tabPurchase Receipt Item`.item_code, `tabPurchase Receipt Item`.idx, - `tabPurchase Receipt Item`.parent - from - `tabPurchase Receipt Item`, `tabPurchase Receipt` - where - `tabPurchase Receipt Item`.parent = `tabPurchase Receipt`.name and - `tabPurchase Receipt Item`.purchase_order_item is null and - `tabPurchase Receipt Item`.purchase_order is not null and - `tabPurchase Receipt`.is_return = 1""", as_dict=1): - name = frappe.db.get_value('Purchase Order Item', - {'item_code': data.item_code, 'parent': data.purchase_order, 'idx': data.idx}, 'name') - - if name: - frappe.db.set_value('Purchase Receipt Item', data.name, 'purchase_order_item', name, update_modified=False) - parent_list.append(data.parent) - - count +=1 - if count % 200 == 0: - frappe.db.commit() - - if len(parent_list) > 0: - for parent in set(parent_list): - doc = frappe.get_doc('Purchase Receipt', parent) - doc.update_qty(update_modified=False) \ No newline at end of file diff --git a/erpnext/patches/v7_0/re_route.py b/erpnext/patches/v7_0/re_route.py deleted file mode 100644 index 3cec6f39b2..0000000000 --- a/erpnext/patches/v7_0/re_route.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import unicode_literals -from frappe.patches.v7_0.re_route import update_routes - -def execute(): - update_routes(['Item', 'Item Group', 'Sales Partner', 'Job Opening']) \ No newline at end of file diff --git a/erpnext/patches/v7_0/remove_administrator_role_in_doctypes.py b/erpnext/patches/v7_0/remove_administrator_role_in_doctypes.py deleted file mode 100644 index 8c87c4e3d3..0000000000 --- a/erpnext/patches/v7_0/remove_administrator_role_in_doctypes.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql("""delete from tabDocPerm where role="Administrator" and parent in - ("Payment Gateway", "Payment Gateway Account", "Payment Request", "Academic Term", "Academic Year", "Course", - "Course Schedule", "Examination", "Fee Category", "Fee Structure", "Fees", "Instructor", "Program", "Program Enrollment Tool", - "Room", "Scheduling Tool", "Student", "Student Applicant", "Student Attendance", "Student Group", "Student Group Creation Tool") - """) \ No newline at end of file diff --git a/erpnext/patches/v7_0/remove_doctypes_and_reports.py b/erpnext/patches/v7_0/remove_doctypes_and_reports.py deleted file mode 100644 index 2356e2f6ee..0000000000 --- a/erpnext/patches/v7_0/remove_doctypes_and_reports.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.table_exists("Time Log"): - frappe.db.sql("""delete from `tabDocType` - where name in('Time Log Batch', 'Time Log Batch Detail', 'Time Log')""") - - frappe.db.sql("""delete from `tabDocField` where parent in ('Time Log', 'Time Log Batch')""") - frappe.db.sql("""update `tabClient Script` set dt = 'Timesheet' where dt = 'Time Log'""") - - for data in frappe.db.sql(""" select label, fieldname from `tabCustom Field` where dt = 'Time Log'""", as_dict=1): - custom_field = frappe.get_doc({ - 'doctype': 'Custom Field', - 'label': data.label, - 'dt': 'Timesheet Detail', - 'fieldname': data.fieldname, - 'fieldtype': data.fieldtype or "Data" - }).insert(ignore_permissions=True) - - frappe.db.sql("""delete from `tabCustom Field` where dt = 'Time Log'""") - frappe.reload_doc('projects', 'doctype', 'timesheet') - frappe.reload_doc('projects', 'doctype', 'timesheet_detail') - - report = "Daily Time Log Summary" - if frappe.db.exists("Report", report): - frappe.delete_doc('Report', report) diff --git a/erpnext/patches/v7_0/remove_features_setup.py b/erpnext/patches/v7_0/remove_features_setup.py deleted file mode 100644 index 49393cc248..0000000000 --- a/erpnext/patches/v7_0/remove_features_setup.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import unicode_literals -import frappe - -from erpnext.setup.install import create_compact_item_print_custom_field -from frappe.utils import cint - -def execute(): - frappe.reload_doctype('Stock Settings') - stock_settings = frappe.get_doc('Stock Settings', 'Stock Settings') - stock_settings.show_barcode_field = cint(frappe.db.get_value("Features Setup", None, "fs_item_barcode")) - if not frappe.db.exists("UOM", stock_settings.stock_uom): - stock_settings.stock_uom = None - stock_settings.save() - - create_compact_item_print_custom_field() - - compact_item_print = frappe.db.get_value("Features Setup", None, "compact_item_print") - frappe.db.set_value("Print Settings", None, "compact_item_print", compact_item_print) - - # remove defaults - frappe.db.sql("""delete from tabDefaultValue where defkey in ('fs_item_serial_nos', - 'fs_item_batch_nos', 'fs_brands', 'fs_item_barcode', - 'fs_item_advanced', 'fs_packing_details', 'fs_item_group_in_details', - 'fs_exports', 'fs_imports', 'fs_discounts', 'fs_purchase_discounts', - 'fs_after_sales_installations', 'fs_projects', 'fs_sales_extras', - 'fs_recurring_invoice', 'fs_pos', 'fs_manufacturing', 'fs_quality', - 'fs_page_break', 'fs_more_info', 'fs_pos_view', 'compact_item_print')""") - - frappe.delete_doc('DocType', 'Features Setup') diff --git a/erpnext/patches/v7_0/remove_old_earning_deduction_doctypes.py b/erpnext/patches/v7_0/remove_old_earning_deduction_doctypes.py deleted file mode 100644 index 05a2c49461..0000000000 --- a/erpnext/patches/v7_0/remove_old_earning_deduction_doctypes.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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 - -def execute(): - if frappe.db.exists("DocType", "Salary Component"): - for dt in ("Salary Structure Earning", "Salary Structure Deduction", "Salary Slip Earning", - "Salary Slip Deduction", "Earning Type", "Deduction Type"): - frappe.delete_doc("DocType", dt) - - - for d in frappe.db.sql("""select name from `tabCustom Field` - where dt in ('Salary Detail', 'Salary Component')"""): - frappe.get_doc("Custom Field", d[0]).save() \ No newline at end of file diff --git a/erpnext/patches/v7_0/rename_advance_table_fields.py b/erpnext/patches/v7_0/rename_advance_table_fields.py deleted file mode 100644 index 34d81343e2..0000000000 --- a/erpnext/patches/v7_0/rename_advance_table_fields.py +++ /dev/null @@ -1,18 +0,0 @@ -# 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.model.utils.rename_field import rename_field - -def execute(): - for dt in ("Sales Invoice Advance", "Purchase Invoice Advance"): - frappe.reload_doctype(dt) - - frappe.db.sql("update `tab{0}` set reference_type = 'Journal Entry'".format(dt)) - - if frappe.get_meta(dt).has_field('journal_entry'): - rename_field(dt, "journal_entry", "reference_name") - - if frappe.get_meta(dt).has_field('jv_detail_no'): - rename_field(dt, "jv_detail_no", "reference_row") \ No newline at end of file diff --git a/erpnext/patches/v7_0/rename_examination_to_assessment.py b/erpnext/patches/v7_0/rename_examination_to_assessment.py deleted file mode 100644 index dc248de4fa..0000000000 --- a/erpnext/patches/v7_0/rename_examination_to_assessment.py +++ /dev/null @@ -1,24 +0,0 @@ -# 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.model.utils.rename_field import rename_field - -def execute(): - if frappe.db.exists("DocType", "Examination"): - frappe.rename_doc("DocType", "Examination", "Assessment") - frappe.rename_doc("DocType", "Examination Result", "Assessment Result") - - # 'Schools' module changed to the 'Education' - # frappe.reload_doc("schools", "doctype", "assessment") - # frappe.reload_doc("schools", "doctype", "assessment_result") - - frappe.reload_doc("education", "doctype", "assessment") - frappe.reload_doc("education", "doctype", "assessment_result") - - rename_field("Assessment", "exam_name", "assessment_name") - rename_field("Assessment", "exam_code", "assessment_code") - - frappe.db.sql("delete from `tabPortal Menu Item` where route = '/examination'") \ No newline at end of file diff --git a/erpnext/patches/v7_0/rename_fee_amount_to_fee_component.py b/erpnext/patches/v7_0/rename_fee_amount_to_fee_component.py deleted file mode 100644 index 5cb6a3b7c4..0000000000 --- a/erpnext/patches/v7_0/rename_fee_amount_to_fee_component.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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.model.utils.rename_field import rename_field - -def execute(): - if frappe.db.exists("DocType", "Fee Amount"): - frappe.rename_doc("DocType", "Fee Amount", "Fee Component") - for dt in ("Fees", "Fee Structure"): - frappe.reload_doctype(dt) - rename_field(dt, "amount", "components") - - \ No newline at end of file diff --git a/erpnext/patches/v7_0/rename_prevdoc_fields.py b/erpnext/patches/v7_0/rename_prevdoc_fields.py deleted file mode 100644 index ded4ad4aae..0000000000 --- a/erpnext/patches/v7_0/rename_prevdoc_fields.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import unicode_literals -import frappe -import json -from frappe.model.utils.rename_field import update_reports, rename_field, update_property_setters -from frappe.custom.doctype.property_setter.property_setter import make_property_setter - -def execute(): - frappe.reload_doctype('Purchase Order Item') - frappe.reload_doctype('Purchase Receipt Item') - update_po_fields() - update_prop_setters_reports_print_format_for_po() - set_sales_order_field() - rename_pr_fields() - -def update_po_fields(): - for data in frappe.db.sql(""" select prevdoc_docname, prevdoc_detail_docname, name, prevdoc_doctype - from `tabPurchase Order Item` where prevdoc_doctype is not null""", as_dict=True): - if data.prevdoc_doctype == 'Material Request': - frappe.db.set_value("Purchase Order Item", data.name, "material_request", data.prevdoc_docname, update_modified=False) - frappe.db.set_value("Purchase Order Item", data.name, "material_request_item", data.prevdoc_detail_docname, update_modified=False) - elif data.prevdoc_doctype == 'Sales Order': - frappe.db.set_value("Purchase Order Item", data.name, "sales_order", data.prevdoc_docname, update_modified=False) - frappe.db.set_value("Purchase Order Item", data.name, "sales_order_item", data.prevdoc_detail_docname, update_modified=False) - -def get_columns(): - return { - 'prevdoc_docname': 'material_request', - 'prevdoc_detail_docname': 'material_request_item' - } - -def update_prop_setters_reports_print_format_for_po(): - for key, val in get_columns().items(): - update_property_setters('Purchase Order Item', key, val) - update_reports('Purchase Order Item', key, val) - update_print_format_for_po(key, val, 'Purchase Order') - -def update_print_format_for_po(old_fieldname, new_fieldname, doc_type): - column_mapper = get_columns() - - for data in frappe.db.sql(""" select name, format_data from `tabPrint Format` where - format_data like %(old_fieldname)s and doc_type = %(doc_type)s""", - {'old_fieldname': '%%%s%%'%(old_fieldname), 'doc_type': doc_type}, as_dict=True): - - update_print_format_fields(old_fieldname, new_fieldname, data) - -def update_print_format_fields(old_fieldname, new_fieldname, args): - report_dict = json.loads(args.format_data) - update = False - - for col in report_dict: - if col.get('fieldname') and col.get('fieldname') == old_fieldname: - col['fieldname'] = new_fieldname - update = True - - if col.get('visible_columns'): - for key in col.get('visible_columns'): - if key.get('fieldname') == old_fieldname: - key['fieldname'] = new_fieldname - update = True - - if update: - val = json.dumps(report_dict) - frappe.db.sql("""update `tabPrint Format` set `format_data`=%s where name=%s""", (val, args.name)) - -def set_sales_order_field(): - for data in frappe.db.sql("""select doc_type, field_name, property, value, property_type - from `tabProperty Setter` where doc_type = 'Purchase Order Item' - and field_name in('material_request', 'material_request_item')""", as_dict=True): - if data.field_name == 'material_request': - make_property_setter(data.doc_type, 'sales_order', data.property, data.value, data.property_type) - else: - make_property_setter(data.doc_type, 'sales_order_item', data.property, data.value, data.property_type) - -def rename_pr_fields(): - rename_field("Purchase Receipt Item", "prevdoc_docname", "purchase_order") - rename_field("Purchase Receipt Item", "prevdoc_detail_docname", "purchase_order_item") diff --git a/erpnext/patches/v7_0/rename_salary_components.py b/erpnext/patches/v7_0/rename_salary_components.py deleted file mode 100644 index 1693f3bdf1..0000000000 --- a/erpnext/patches/v7_0/rename_salary_components.py +++ /dev/null @@ -1,149 +0,0 @@ -from __future__ import unicode_literals -import frappe -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("Payroll", "doctype", "salary_detail") - frappe.reload_doc("Payroll", "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` - 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 - where e_type is null and earning_type is not null""") - - 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 - 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_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(): - source_cols = "`" + "`, `".join(standard_cols_de + cols) + "`" - try: - frappe.db.sql("""INSERT INTO `tabSalary Component` ({0}) SELECT {1} FROM `tab{2}`""" - .format(target_cols, source_cols, doctype)) - except Exception as e: - if e.args[0]==1062: - pass - - update_customizations() - - for doctype in ["Salary Structure Deduction", "Salary Structure Earning", "Salary Slip Earning", - "Salary Slip Deduction", "Deduction Type", "Earning Type"] : - frappe.delete_doc("DocType", doctype) - - -def update_customizations(): - dt_cols = { - "Salary Structure Deduction": { - "d_type": "salary_component", - "deduction_type": "salary_component", - "d_modified_amt": "amount", - "depend_on_lwp": "depends_on_payment_days" - }, - "Salary Structure Earning": { - "e_type": "salary_component", - "earning_type": "salary_component", - "modified_value": "amount", - "depend_on_lwp": "depends_on_payment_days" - }, - "Salary Slip Earning": { - "e_type": "salary_component", - "earning_type": "salary_component", - "e_modified_amount": "amount", - "e_amount" : "default_amount", - "e_depends_on_lwp": "depends_on_payment_days" - }, - "Salary Slip Deduction": { - "d_type": "salary_component", - "deduction_type": "salary_component", - "d_modified_amount": "amount", - "d_amount" : "default_amount", - "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" - }, - "Deduction Type": { - "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) diff --git a/erpnext/patches/v7_0/rename_time_sheet_doctype.py b/erpnext/patches/v7_0/rename_time_sheet_doctype.py deleted file mode 100644 index f80a8301d7..0000000000 --- a/erpnext/patches/v7_0/rename_time_sheet_doctype.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.table_exists("Time Sheet") and not frappe.db.table_exists("Timesheet"): - frappe.rename_doc("DocType", "Time Sheet", "Timesheet") - frappe.rename_doc("DocType", "Time Sheet Detail", "Timesheet Detail") - - for doctype in ['Time Sheet', 'Time Sheet Detail']: - frappe.delete_doc('DocType', doctype) - - report = "Daily Time Sheet Summary" - if frappe.db.exists("Report", report): - frappe.delete_doc('Report', report) diff --git a/erpnext/patches/v7_0/repost_bin_qty_and_item_projected_qty.py b/erpnext/patches/v7_0/repost_bin_qty_and_item_projected_qty.py deleted file mode 100644 index a5cf22cf01..0000000000 --- a/erpnext/patches/v7_0/repost_bin_qty_and_item_projected_qty.py +++ /dev/null @@ -1,15 +0,0 @@ -# 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 - -def execute(): - repost_bin_qty() - -def repost_bin_qty(): - for bin in frappe.db.sql(""" select name from `tabBin` - where (actual_qty + ordered_qty + indented_qty + planned_qty - reserved_qty - reserved_qty_for_production - reserved_qty_for_sub_contract) != projected_qty """, as_dict=1): - bin_doc = frappe.get_doc('Bin', bin.name) - bin_doc.set_projected_qty() - bin_doc.db_set("projected_qty", bin_doc.projected_qty, update_modified = False) diff --git a/erpnext/patches/v7_0/repost_gle_for_pi_with_update_stock.py b/erpnext/patches/v7_0/repost_gle_for_pi_with_update_stock.py deleted file mode 100644 index b864e597b8..0000000000 --- a/erpnext/patches/v7_0/repost_gle_for_pi_with_update_stock.py +++ /dev/null @@ -1,20 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype("Purchase Invoice") - - for pi in frappe.db.sql("""select name from `tabPurchase Invoice` - where company in(select name from tabCompany where enable_perpetual_inventory = 1) and - update_stock=1 and docstatus=1 order by posting_date asc""", as_dict=1): - - frappe.db.sql("""delete from `tabGL Entry` - where voucher_type = 'Purchase Invoice' and voucher_no = %s""", pi.name) - - pi_doc = frappe.get_doc("Purchase Invoice", pi.name) - pi_doc.make_gl_entries() - frappe.db.commit() \ No newline at end of file diff --git a/erpnext/patches/v7_0/repost_gle_for_pos_sales_return.py b/erpnext/patches/v7_0/repost_gle_for_pos_sales_return.py deleted file mode 100644 index 77ecafd6f1..0000000000 --- a/erpnext/patches/v7_0/repost_gle_for_pos_sales_return.py +++ /dev/null @@ -1,25 +0,0 @@ -# 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(): - frappe.reload_doctype("Sales Invoice") - frappe.reload_doctype("Sales Invoice Item") - - for si in frappe.get_all("Sales Invoice", fields = ["name"], - filters={"docstatus": 1, "is_pos": 1, "is_return": 1}): - si_doc = frappe.get_doc("Sales Invoice", si.name) - if len(si_doc.payments) > 0: - si_doc.set_paid_amount() - si_doc.flags.ignore_validate_update_after_submit = True - si_doc.save() - if si_doc.grand_total <= si_doc.paid_amount and si_doc.paid_amount < 0: - delete_gle_for_voucher(si_doc.name) - si_doc.run_method("make_gl_entries") - -def delete_gle_for_voucher(voucher_no): - frappe.db.sql("""delete from `tabGL Entry` where voucher_no = %(voucher_no)s""", - {'voucher_no': voucher_no}) diff --git a/erpnext/patches/v7_0/set_base_amount_in_invoice_payment_table.py b/erpnext/patches/v7_0/set_base_amount_in_invoice_payment_table.py deleted file mode 100644 index 5dd61a06cc..0000000000 --- a/erpnext/patches/v7_0/set_base_amount_in_invoice_payment_table.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils import flt - -def execute(): - si_list = frappe.db.sql(""" - select distinct parent - from `tabSales Invoice Payment` - where docstatus!=2 and parenttype = 'Sales Invoice' - and amount != 0 and base_amount = 0 - """) - - count = 0 - for d in si_list: - si = frappe.get_doc("Sales Invoice", d[0]) - for p in si.get("payments"): - if p.amount and not p.base_amount: - base_amount = flt(p.amount*si.conversion_rate, si.precision("base_paid_amount")) - frappe.db.set_value("Sales Invoice Payment", p.name, "base_amount", base_amount, update_modified=False) - - count +=1 - - if count % 200 == 0: - frappe.db.commit() diff --git a/erpnext/patches/v7_0/set_is_group_for_warehouse.py b/erpnext/patches/v7_0/set_is_group_for_warehouse.py deleted file mode 100644 index 3e69616b80..0000000000 --- a/erpnext/patches/v7_0/set_is_group_for_warehouse.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("stock", "doctype", "warehouse") - frappe.db.sql("""update tabWarehouse - set is_group = if ((ifnull(is_group, "No") = "Yes" or ifnull(is_group, 0) = 1), 1, 0)""") \ No newline at end of file diff --git a/erpnext/patches/v7_0/set_material_request_type_in_item.py b/erpnext/patches/v7_0/set_material_request_type_in_item.py deleted file mode 100644 index 5fb14adbc8..0000000000 --- a/erpnext/patches/v7_0/set_material_request_type_in_item.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Item") - if "default_bom" in frappe.db.get_table_columns("Item"): - frappe.db.sql("""update `tabItem` - set default_material_request_type = ( - case - when (default_bom is not null and default_bom != '') - then 'Manufacture' - else 'Purchase' - end )""") - - else: - frappe.db.sql("update tabItem set default_material_request_type='Purchase'") \ No newline at end of file diff --git a/erpnext/patches/v7_0/set_naming_series_for_timesheet.py b/erpnext/patches/v7_0/set_naming_series_for_timesheet.py deleted file mode 100644 index d4d1a69d21..0000000000 --- a/erpnext/patches/v7_0/set_naming_series_for_timesheet.py +++ /dev/null @@ -1,15 +0,0 @@ -# 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.custom.doctype.property_setter.property_setter import make_property_setter - -def execute(): - frappe.reload_doc('projects', 'doctype', 'timesheet') - frappe.reload_doc('projects', 'doctype', 'timesheet_detail') - frappe.reload_doc('accounts', 'doctype', 'sales_invoice_timesheet') - - make_property_setter('Timesheet', "naming_series", "options", 'TS-', "Text") - make_property_setter('Timesheet', "naming_series", "default", 'TS-', "Text") \ No newline at end of file diff --git a/erpnext/patches/v7_0/set_party_name_in_payment_entry.py b/erpnext/patches/v7_0/set_party_name_in_payment_entry.py deleted file mode 100644 index bbdcf5cf3c..0000000000 --- a/erpnext/patches/v7_0/set_party_name_in_payment_entry.py +++ /dev/null @@ -1,20 +0,0 @@ -# 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 - -def execute(): - customers = frappe._dict(frappe.db.sql("select name, customer_name from tabCustomer")) - suppliers = frappe._dict(frappe.db.sql("select name, supplier_name from tabSupplier")) - - frappe.reload_doc('accounts', 'doctype', 'payment_entry') - - pe_list = frappe.db.sql("""select name, party_type, party from `tabPayment Entry` - where party is not null and party != ''""", as_dict=1) - for pe in pe_list: - party_name = customers.get(pe.party) if pe.party_type=="Customer" else suppliers.get(pe.party) - - frappe.db.set_value("Payment Entry", pe.name, "party_name", party_name, update_modified=False) - diff --git a/erpnext/patches/v7_0/set_portal_settings.py b/erpnext/patches/v7_0/set_portal_settings.py deleted file mode 100644 index 5259d4fbd4..0000000000 --- a/erpnext/patches/v7_0/set_portal_settings.py +++ /dev/null @@ -1,28 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype('Role') - for dt in ("assessment", "course", "fees"): - # 'Schools' module changed to the 'Education' - # frappe.reload_doc("schools", "doctype", dt) - frappe.reload_doc("education", "doctype", dt) - - for dt in ("domain", "has_domain", "domain_settings"): - frappe.reload_doc("core", "doctype", dt) - - frappe.reload_doc('website', 'doctype', 'portal_menu_item') - - frappe.get_doc('Portal Settings').sync_menu() - - if 'schools' in frappe.get_installed_apps(): - domain = frappe.get_doc('Domain', 'Education') - domain.setup_domain() - else: - domain = frappe.get_doc('Domain', 'Manufacturing') - domain.setup_data() - domain.setup_sidebar_items() diff --git a/erpnext/patches/v7_0/setup_account_table_for_expense_claim_type_if_exists.py b/erpnext/patches/v7_0/setup_account_table_for_expense_claim_type_if_exists.py deleted file mode 100644 index c5657079b3..0000000000 --- a/erpnext/patches/v7_0/setup_account_table_for_expense_claim_type_if_exists.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("hr", "doctype", "expense_claim_type") - frappe.reload_doc("hr", "doctype", "expense_claim_account") - - if not frappe.db.has_column('Expense Claim Type', 'default_account'): - return - - for expense_claim_type in frappe.get_all("Expense Claim Type", fields=["name", "default_account"]): - if expense_claim_type.default_account \ - and frappe.db.exists("Account", expense_claim_type.default_account): - doc = frappe.get_doc("Expense Claim Type", expense_claim_type.name) - doc.append("accounts", { - "company": frappe.db.get_value("Account", expense_claim_type.default_account, "company"), - "default_account": expense_claim_type.default_account, - }) - doc.flags.ignore_mandatory = True - doc.save(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/patches/v7_0/system_settings_setup_complete.py b/erpnext/patches/v7_0/system_settings_setup_complete.py deleted file mode 100644 index 0feeee981e..0000000000 --- a/erpnext/patches/v7_0/system_settings_setup_complete.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('System Settings') - companies = frappe.db.sql("""select name, country - from tabCompany order by creation asc""", as_dict=True) - if companies: - frappe.db.set_value('System Settings', 'System Settings', 'setup_complete', 1) - - for company in companies: - if company.country: - frappe.db.set_value('System Settings', 'System Settings', 'country', company.country) - break - - diff --git a/erpnext/patches/v7_0/update_autoname_field.py b/erpnext/patches/v7_0/update_autoname_field.py deleted file mode 100644 index bfa9b281df..0000000000 --- a/erpnext/patches/v7_0/update_autoname_field.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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 - -def execute(): - doctypes = frappe.db.sql(""" select name, autoname from `tabDocType` - where autoname like 'field:%' and allow_rename = 1""", as_dict=1) - - for doctype in doctypes: - fieldname = doctype.autoname.split(":")[1] - if fieldname: - frappe.db.sql(""" update `tab%s` set %s = name """%(doctype.name, fieldname)) \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_change_amount_account.py b/erpnext/patches/v7_0/update_change_amount_account.py deleted file mode 100644 index 1741095ea9..0000000000 --- a/erpnext/patches/v7_0/update_change_amount_account.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'sales_invoice') - - for company in frappe.db.sql("""select company from `tabSales Invoice` - where change_amount <> 0 and account_for_change_amount is null group by company""", as_list = 1): - cash_account = get_default_bank_cash_account(company[0], 'Cash').get('account') - if not cash_account: - bank_account = get_default_bank_cash_account(company[0], 'Bank').get('account') - cash_account = bank_account - - if cash_account: - frappe.db.sql("""update `tabSales Invoice` - set account_for_change_amount = %(cash_account)s where change_amount <> 0 - and company = %(company)s and account_for_change_amount is null""", - {'cash_account': cash_account, 'company': company[0]}) diff --git a/erpnext/patches/v7_0/update_conversion_factor_in_supplier_quotation_item.py b/erpnext/patches/v7_0/update_conversion_factor_in_supplier_quotation_item.py deleted file mode 100644 index 24da4b1aeb..0000000000 --- a/erpnext/patches/v7_0/update_conversion_factor_in_supplier_quotation_item.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('buying', 'doctype', 'supplier_quotation_item') - - frappe.db.sql("""update - `tabSupplier Quotation Item` as sqi_t, - (select sqi.item_code as item_code, sqi.uom as uom, ucd.conversion_factor as conversion_factor - from `tabSupplier Quotation Item` sqi left join `tabUOM Conversion Detail` ucd - on ucd.uom = sqi.uom and sqi.item_code = ucd.parent) as conversion_data, - `tabItem` as item - set - sqi_t.conversion_factor= ifnull(conversion_data.conversion_factor, 1), - sqi_t.stock_qty = (ifnull(conversion_data.conversion_factor, 1) * sqi_t.qty), - sqi_t.stock_uom = item.stock_uom - where - sqi_t.item_code = conversion_data.item_code and - sqi_t.uom = conversion_data.uom and sqi_t.item_code = item.name""") \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_home_page.py b/erpnext/patches/v7_0/update_home_page.py deleted file mode 100644 index 909825c572..0000000000 --- a/erpnext/patches/v7_0/update_home_page.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import unicode_literals -import frappe -import erpnext - -def execute(): - frappe.reload_doc('portal', 'doctype', 'homepage_featured_product') - frappe.reload_doc('portal', 'doctype', 'homepage') - frappe.reload_doc('portal', 'doctype', 'products_settings') - frappe.reload_doctype('Item') - frappe.reload_doctype('Item Group') - - website_settings = frappe.get_doc('Website Settings', 'Website Settings') - if frappe.db.exists('Web Page', website_settings.home_page): - header = frappe.db.get_value('Web Page', website_settings.home_page, 'header') - if header and header.startswith("
"): - homepage = frappe.get_doc('Homepage', 'Homepage') - homepage.company = erpnext.get_default_company() or frappe.get_all("Company")[0].name - if '

' in header: - homepage.tag_line = header.split('

')[1].split('

')[0] or 'Default Website' - else: - homepage.tag_line = 'Default Website' - homepage.setup_items() - homepage.save() - - website_settings.home_page = 'home' - website_settings.save() - diff --git a/erpnext/patches/v7_0/update_maintenance_module_in_doctype.py b/erpnext/patches/v7_0/update_maintenance_module_in_doctype.py deleted file mode 100644 index 4c0c6a9313..0000000000 --- a/erpnext/patches/v7_0/update_maintenance_module_in_doctype.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.set_value("DocType", "Maintenance Schedule", "module", "Maintenance") - frappe.db.set_value("DocType", "Maintenance Schedule Detail", "module", "Maintenance") - frappe.db.set_value("DocType", "Maintenance Schedule Item", "module", "Maintenance") - frappe.db.set_value("DocType", "Maintenance Visit", "module", "Maintenance") - frappe.db.set_value("DocType", "Maintenance Visit Purpose", "module", "Maintenance") \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_mins_to_first_response.py b/erpnext/patches/v7_0/update_mins_to_first_response.py deleted file mode 100644 index 16681357e6..0000000000 --- a/erpnext/patches/v7_0/update_mins_to_first_response.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import unicode_literals -import frappe - -from frappe.core.doctype.communication.communication import update_mins_to_first_communication - -def execute(): - frappe.reload_doctype('Issue') - frappe.reload_doctype('Opportunity') - - for doctype in ('Issue', 'Opportunity'): - frappe.db.sql('update tab{0} set mins_to_first_response=0'.format(doctype)) - for parent in frappe.get_all(doctype, order_by='creation desc', limit=500): - parent_doc = frappe.get_doc(doctype, parent.name) - for communication in frappe.get_all('Communication', - filters={'reference_doctype': doctype, 'reference_name': parent.name, - 'communication_medium': 'Email'}, - order_by = 'creation asc', limit=2): - - communication_doc = frappe.get_doc('Communication', communication.name) - - update_mins_to_first_communication(parent_doc, communication_doc) - - if parent_doc.mins_to_first_response: - continue \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_missing_employee_in_timesheet.py b/erpnext/patches/v7_0/update_missing_employee_in_timesheet.py deleted file mode 100644 index 54d492b265..0000000000 --- a/erpnext/patches/v7_0/update_missing_employee_in_timesheet.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.table_exists("Time Log") and "employee" in frappe.db.get_table_columns("Time Log"): - timesheet = frappe.db.sql("""select tl.employee as employee, ts.name as name, - tl.modified as modified, tl.modified_by as modified_by, tl.creation as creation, tl.owner as owner - from - `tabTimesheet` ts, `tabTimesheet Detail` tsd, `tabTime Log` tl - where - tsd.parent = ts.name and tl.from_time = tsd.from_time and tl.to_time = tsd.to_time - and tl.hours = tsd.hours and tl.billing_rate = tsd.billing_rate and tsd.idx=1 - and tl.docstatus < 2 and (ts.employee = '' or ts.employee is null)""", as_dict=1) - - for data in timesheet: - ts_doc = frappe.get_doc('Timesheet', data.name) - if len(ts_doc.time_logs) == 1: - frappe.db.sql(""" update `tabTimesheet` set creation = %(creation)s, - owner = %(owner)s, modified = %(modified)s, modified_by = %(modified_by)s, - employee = %(employee)s where name = %(name)s""", data) diff --git a/erpnext/patches/v7_0/update_mode_of_payment_type.py b/erpnext/patches/v7_0/update_mode_of_payment_type.py deleted file mode 100644 index 9292a1be1b..0000000000 --- a/erpnext/patches/v7_0/update_mode_of_payment_type.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils import flt - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'mode_of_payment') - - frappe.db.sql(""" update `tabMode of Payment` set type = 'Cash' where (type is null or type = '') and name = 'Cash'""") - - for data in frappe.db.sql("""select name from `tabSales Invoice` where is_pos=1 and docstatus<2 and - (ifnull(paid_amount, 0) - ifnull(change_amount, 0)) > ifnull(grand_total, 0) and modified > '2016-05-01'""", as_dict=1): - if data.name: - si_doc = frappe.get_doc("Sales Invoice", data.name) - remove_payment = [] - mode_of_payment = [d.mode_of_payment for d in si_doc.payments if flt(d.amount) > 0] - if mode_of_payment != set(mode_of_payment): - for payment_data in si_doc.payments: - if payment_data.idx != 1 and payment_data.amount == si_doc.grand_total: - remove_payment.append(payment_data) - frappe.db.sql(""" delete from `tabSales Invoice Payment` - where name = %(name)s""", {'name': payment_data.name}) - - if len(remove_payment) > 0: - for d in remove_payment: - si_doc.remove(d) - - si_doc.set_paid_amount() - si_doc.db_set("paid_amount", si_doc.paid_amount, update_modified = False) - si_doc.db_set("base_paid_amount", si_doc.base_paid_amount, update_modified = False) \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_party_status.py b/erpnext/patches/v7_0/update_party_status.py deleted file mode 100644 index 0c6b4ea598..0000000000 --- a/erpnext/patches/v7_0/update_party_status.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - return - # for party_type in ('Customer', 'Supplier'): - # frappe.reload_doctype(party_type) - # - # # set all as default status - # frappe.db.sql('update `tab{0}` set status=%s'.format(party_type), default_status[party_type]) - # - # for doctype in status_depends_on[party_type]: - # filters = get_filters_for(doctype) - # parties = frappe.get_all(doctype, fields="{0} as party".format(party_type.lower()), - # filters=filters, limit_page_length=1) - # - # parties = filter(None, [p.party for p in parties]) - # - # if parties: - # frappe.db.sql('update `tab{0}` set status="Open" where name in ({1})'.format(party_type, - # ', '.join(len(parties) * ['%s'])), parties) \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_prevdoc_values_for_supplier_quotation_item.py b/erpnext/patches/v7_0/update_prevdoc_values_for_supplier_quotation_item.py deleted file mode 100644 index e90de50c1e..0000000000 --- a/erpnext/patches/v7_0/update_prevdoc_values_for_supplier_quotation_item.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('Supplier Quotation Item') - for data in frappe.db.sql(""" select prevdoc_docname, prevdoc_detail_docname, name - from `tabSupplier Quotation Item` where prevdoc_docname is not null""", as_dict=True): - frappe.db.set_value("Supplier Quotation Item", data.name, "material_request", data.prevdoc_docname) - frappe.db.set_value("Supplier Quotation Item", data.name, "material_request_item", data.prevdoc_detail_docname) \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_project_in_gl_entry.py b/erpnext/patches/v7_0/update_project_in_gl_entry.py deleted file mode 100644 index d99e9a41e3..0000000000 --- a/erpnext/patches/v7_0/update_project_in_gl_entry.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("GL Entry") - - for doctype in ("Delivery Note", "Sales Invoice", "Stock Entry"): - frappe.db.sql(""" - update `tabGL Entry` gle, `tab{0}` dt - set gle.project = dt.project - where gle.voucher_type=%s and gle.voucher_no = dt.name - and ifnull(gle.cost_center, '') != '' and ifnull(dt.project, '') != '' - """.format(doctype), doctype) - - for doctype in ("Purchase Receipt", "Purchase Invoice"): - frappe.db.sql(""" - update `tabGL Entry` gle, `tab{0} Item` dt - set gle.project = dt.project - where gle.voucher_type=%s and gle.voucher_no = dt.parent and gle.cost_center=dt.cost_center - and ifnull(gle.cost_center, '') != '' and ifnull(dt.project, '') != '' - """.format(doctype), doctype) \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_refdoc_in_landed_cost_voucher.py b/erpnext/patches/v7_0/update_refdoc_in_landed_cost_voucher.py deleted file mode 100644 index 2d562bb40e..0000000000 --- a/erpnext/patches/v7_0/update_refdoc_in_landed_cost_voucher.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if "purchase_receipt" not in frappe.db.get_table_columns("Landed Cost Purchase Receipt"): - return - - frappe.reload_doctype("Landed Cost Purchase Receipt") - - frappe.db.sql(""" - update `tabLanded Cost Purchase Receipt` - set receipt_document_type = 'Purchase Receipt', receipt_document = purchase_receipt - where (receipt_document is null or receipt_document = '') - and (purchase_receipt is not null and purchase_receipt != '') - """) \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_status_for_timesheet.py b/erpnext/patches/v7_0/update_status_for_timesheet.py deleted file mode 100644 index 117c40c59f..0000000000 --- a/erpnext/patches/v7_0/update_status_for_timesheet.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql("""update - `tabTimesheet` as ts, - ( - select min(from_time)as from_time, max(to_time) as to_time, parent from `tabTimesheet Detail` group by parent - ) as tsd - set ts.status = 'Submitted', ts.start_date = tsd.from_time, ts.end_date = tsd.to_time - where tsd.parent = ts.name and ts.status = 'Draft' and ts.docstatus =1""") \ 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 deleted file mode 100644 index d630e8f0f2..0000000000 --- a/erpnext/patches/v7_0/update_status_of_po_so.py +++ /dev/null @@ -1,68 +0,0 @@ -# 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 = ifnull(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), 0) - where - net_total > 0 - """) - -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 = ifnull(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), 0) - where - net_total > 0 - """) - -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 diff --git a/erpnext/patches/v7_0/update_status_of_zero_amount_sales_order.py b/erpnext/patches/v7_0/update_status_of_zero_amount_sales_order.py deleted file mode 100644 index 9b2b24785a..0000000000 --- a/erpnext/patches/v7_0/update_status_of_zero_amount_sales_order.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for data in frappe.get_all('Sales Order', fields = ["name"], filters = [["docstatus", "=", "1"], ["grand_total", "=", "0"]]): - sales_order = frappe.get_doc('Sales Order', data.name) - sales_order.set_status(update=True, update_modified = False) \ No newline at end of file diff --git a/erpnext/patches/v7_0/update_timesheet_communications.py b/erpnext/patches/v7_0/update_timesheet_communications.py deleted file mode 100644 index 203471ea8f..0000000000 --- a/erpnext/patches/v7_0/update_timesheet_communications.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.table_exists("Time Log"): - timesheet = frappe.db.sql("""SELECT ts.name AS name, tl.name AS timelogname, - tl.modified AS modified, tl.modified_by AS modified_by, tl.creation AS creation, tl.owner AS owner - FROM - `tabTimesheet` ts, `tabTimesheet Detail` tsd, `tabTime Log` tl - WHERE - tsd.parent = ts.name AND tl.from_time = tsd.from_time AND tl.to_time = tsd.to_time - AND tl.hours = tsd.hours AND tl.billing_rate = tsd.billing_rate AND tsd.idx=1 - AND tl.docstatus < 2""", as_dict=1) - - for data in timesheet: - frappe.db.sql(""" update `tabTimesheet` set creation = %(creation)s, - owner = %(owner)s, modified = %(modified)s, modified_by = %(modified_by)s - where name = %(name)s""", data) - - frappe.db.sql(""" - update - tabCommunication - set - reference_doctype = "Timesheet", reference_name = %(timesheet)s - where - reference_doctype = "Time Log" and reference_name = %(timelog)s - """, {'timesheet': data.name, 'timelog': data.timelogname}, auto_commit=1) diff --git a/erpnext/patches/v7_1/__init__.py b/erpnext/patches/v7_1/__init__.py deleted file mode 100644 index 519ff49eac..0000000000 --- a/erpnext/patches/v7_1/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals \ No newline at end of file diff --git a/erpnext/patches/v7_1/add_account_user_role_for_timesheet.py b/erpnext/patches/v7_1/add_account_user_role_for_timesheet.py deleted file mode 100644 index 7372b0cc5f..0000000000 --- a/erpnext/patches/v7_1/add_account_user_role_for_timesheet.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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 - -def execute(): - if not frappe.db.get_value('DocPerm', {'parent': 'Timesheet', 'role': 'Accounts User', 'permlevel': 1}): - doc = frappe.get_doc('DocType', 'Timesheet') - doc.append('permissions', { - 'role': "Accounts User", - 'permlevel': 0, - 'read': 1, - 'write': 1, - 'create': 1, - 'delete': 1, - 'submit': 1, - 'cancel': 1, - 'amend': 1, - 'report': 1, - 'email': 1 - }) - - doc.append('permissions', { - 'role': "Accounts User", - 'permlevel': 1, - 'read': 1, - 'write': 1 - }) - - doc.save(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/patches/v7_1/add_field_for_task_dependent.py b/erpnext/patches/v7_1/add_field_for_task_dependent.py deleted file mode 100644 index 65b1c74e87..0000000000 --- a/erpnext/patches/v7_1/add_field_for_task_dependent.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('Task') - for t in frappe.get_all('Task', fields=['name']): - task = frappe.get_doc('Task', t.name) - task.update_depends_on() - if task.depends_on_tasks: - task.db_set('depends_on_tasks', task.depends_on_tasks, update_modified=False) diff --git a/erpnext/patches/v7_1/fix_link_for_customer_from_lead.py b/erpnext/patches/v7_1/fix_link_for_customer_from_lead.py deleted file mode 100644 index 33f809fe37..0000000000 --- a/erpnext/patches/v7_1/fix_link_for_customer_from_lead.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - for c in frappe.db.sql('select name from tabCustomer where ifnull(lead_name,"")!=""'): - customer = frappe.get_doc('Customer', c[0]) - customer.update_lead_status() \ No newline at end of file diff --git a/erpnext/patches/v7_1/move_sales_invoice_from_parent_to_child_timesheet.py b/erpnext/patches/v7_1/move_sales_invoice_from_parent_to_child_timesheet.py deleted file mode 100644 index d1ec7c697e..0000000000 --- a/erpnext/patches/v7_1/move_sales_invoice_from_parent_to_child_timesheet.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('projects', 'doctype', 'timesheet_detail') - frappe.reload_doc('accounts', 'doctype', 'sales_invoice_timesheet') - - frappe.db.sql(""" update - `tabTimesheet` as ts, - (select - sum(billing_amount) as billing_amount, sum(billing_hours) as billing_hours, time_sheet - from `tabSales Invoice Timesheet` where docstatus = 1 group by time_sheet - ) as sit - set - ts.total_billed_amount = sit.billing_amount, ts.total_billed_hours = sit.billing_hours, - ts.per_billed = ((sit.billing_amount * 100)/ts.total_billable_amount) - where ts.name = sit.time_sheet and ts.docstatus = 1""") - - frappe.db.sql(""" update `tabTimesheet Detail` tsd, `tabTimesheet` ts set tsd.sales_invoice = ts.sales_invoice - where tsd.parent = ts.name and ts.sales_invoice is not null""") \ No newline at end of file diff --git a/erpnext/patches/v7_1/rename_field_timesheet.py b/erpnext/patches/v7_1/rename_field_timesheet.py deleted file mode 100644 index 3690a2e79d..0000000000 --- a/erpnext/patches/v7_1/rename_field_timesheet.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - doctype = 'Timesheet' - fields_dict = {'total_billing_amount': 'total_billable_amount', 'total_billing_hours': 'total_billable_hours'} - - for old_fieldname, new_fieldname in fields_dict.items(): - if old_fieldname in frappe.db.get_table_columns(doctype): - rename_field(doctype, old_fieldname, new_fieldname) diff --git a/erpnext/patches/v7_1/rename_quality_inspection_field.py b/erpnext/patches/v7_1/rename_quality_inspection_field.py deleted file mode 100644 index 3b5a7d95eb..0000000000 --- a/erpnext/patches/v7_1/rename_quality_inspection_field.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import * - -def execute(): - for doctype in ("Purchase Receipt Item", "Delivery Note Item"): - frappe.reload_doctype(doctype) - - table_columns = frappe.db.get_table_columns(doctype) - if "qa_no" in table_columns: - rename_field(doctype, "qa_no", "quality_inspection") - - frappe.reload_doctype("Item") - rename_field("Item", "inspection_required", "inspection_required_before_purchase") - - frappe.reload_doc('stock', 'doctype', 'quality_inspection') - frappe.db.sql(""" - update - `tabQuality Inspection` - set - reference_type = 'Purchase Receipt', reference_name = purchase_receipt_no - where - ifnull(purchase_receipt_no, '') != '' and inspection_type = 'Incoming' - """) - - frappe.db.sql(""" - update - `tabQuality Inspection` - set - reference_type = 'Delivery Note', reference_name = delivery_note_no - where - ifnull(delivery_note_no, '') != '' and inspection_type = 'Outgoing' - """) - - for old_fieldname in ["purchase_receipt_no", "delivery_note_no"]: - update_reports("Quality Inspection", old_fieldname, "reference_name") - update_users_report_view_settings("Quality Inspection", old_fieldname, "reference_name") - update_property_setters("Quality Inspection", old_fieldname, "reference_name") diff --git a/erpnext/patches/v7_1/repost_stock_for_deleted_bins_for_merging_items.py b/erpnext/patches/v7_1/repost_stock_for_deleted_bins_for_merging_items.py deleted file mode 100644 index aca21085cc..0000000000 --- a/erpnext/patches/v7_1/repost_stock_for_deleted_bins_for_merging_items.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext.stock.stock_balance import repost_stock - -def execute(): - frappe.reload_doc('manufacturing', 'doctype', 'work_order_item') - frappe.reload_doc('manufacturing', 'doctype', 'work_order') - - modified_items = frappe.db.sql_list(""" - select name from `tabItem` - where is_stock_item=1 and modified >= '2016-10-31' - """) - - if not modified_items: - return - - item_warehouses_with_transactions = [] - transactions = ("Sales Order Item", "Material Request Item", "Purchase Order Item", - "Stock Ledger Entry", "Packed Item") - - for doctype in transactions: - item_warehouses_with_transactions += list(frappe.db.sql(""" - select distinct item_code, warehouse - from `tab{0}` where docstatus=1 and item_code in ({1})""" - .format(doctype, ', '.join(['%s']*len(modified_items))), tuple(modified_items))) - - item_warehouses_with_transactions += list(frappe.db.sql(""" - select distinct production_item, fg_warehouse - from `tabWork Order` where docstatus=1 and production_item in ({0})""" - .format(', '.join(['%s']*len(modified_items))), tuple(modified_items))) - - item_warehouses_with_transactions += list(frappe.db.sql(""" - select distinct pr_item.item_code, pr_item.source_warehouse - from `tabWork Order` pr, `tabWork Order Item` pr_item - where pr_item.parent and pr.name and pr.docstatus=1 and pr_item.item_code in ({0})""" - .format(', '.join(['%s']*len(modified_items))), tuple(modified_items))) - - item_warehouses_with_bin = list(frappe.db.sql("select distinct item_code, warehouse from `tabBin`")) - - item_warehouses_with_missing_bin = list( - set(item_warehouses_with_transactions) - set(item_warehouses_with_bin)) - - for item_code, warehouse in item_warehouses_with_missing_bin: - repost_stock(item_code, warehouse) diff --git a/erpnext/patches/v7_1/save_stock_settings.py b/erpnext/patches/v7_1/save_stock_settings.py deleted file mode 100644 index d3f0263c10..0000000000 --- a/erpnext/patches/v7_1/save_stock_settings.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - stock_settings = frappe.get_doc('Stock Settings') - - if stock_settings.default_warehouse \ - and not frappe.db.exists("Warehouse", stock_settings.default_warehouse): - stock_settings.default_warehouse = None - - if stock_settings.stock_uom and not frappe.db.exists("UOM", stock_settings.stock_uom): - stock_settings.stock_uom = None - - stock_settings.flags.ignore_mandatory = True - stock_settings.save() diff --git a/erpnext/patches/v7_1/set_budget_against_as_cost_center.py b/erpnext/patches/v7_1/set_budget_against_as_cost_center.py deleted file mode 100644 index dd9a432cf0..0000000000 --- a/erpnext/patches/v7_1/set_budget_against_as_cost_center.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("accounts", "doctype", "budget") - frappe.db.sql(""" - update - `tabBudget` - set - budget_against = 'Cost Center' - """) diff --git a/erpnext/patches/v7_1/set_currency_exchange_date.py b/erpnext/patches/v7_1/set_currency_exchange_date.py deleted file mode 100644 index 2a2d420f21..0000000000 --- a/erpnext/patches/v7_1/set_currency_exchange_date.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Currency Exchange") - frappe.db.sql(""" - update `tabCurrency Exchange` - set `date` = '2010-01-01' - where date is null or date = '0000-00-00' - """) \ No newline at end of file diff --git a/erpnext/patches/v7_1/set_prefered_contact_email.py b/erpnext/patches/v7_1/set_prefered_contact_email.py deleted file mode 100644 index 3b68e22269..0000000000 --- a/erpnext/patches/v7_1/set_prefered_contact_email.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('User') - for d in frappe.get_all("Employee"): - employee = frappe.get_doc("Employee", d.name) - if employee.company_email: - employee.prefered_contact_email = "Company Email" - employee.prefered_email = employee.company_email - elif employee.personal_email: - employee.prefered_contact_email = "Personal Email" - employee.prefered_email = employee.personal_email - elif employee.user_id: - employee.prefered_contact_email = "User ID" - employee.prefered_email = employee.user_id - employee.db_update() diff --git a/erpnext/patches/v7_1/set_sales_person_status.py b/erpnext/patches/v7_1/set_sales_person_status.py deleted file mode 100644 index 929beac27f..0000000000 --- a/erpnext/patches/v7_1/set_sales_person_status.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('setup','doctype','sales_person') - frappe.db.sql("""update `tabSales Person` set enabled=1 - where (employee is null or employee = '' - or employee IN (select employee from tabEmployee where status != "Left"))""") diff --git a/erpnext/patches/v7_1/set_student_guardian.py b/erpnext/patches/v7_1/set_student_guardian.py deleted file mode 100644 index 093c0bf6d9..0000000000 --- a/erpnext/patches/v7_1/set_student_guardian.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.exists("DocType", "Guardian"): - - # 'Schools' module changed to the 'Education' - # frappe.reload_doc("schools", "doctype", "student") - # frappe.reload_doc("schools", "doctype", "student_guardian") - # frappe.reload_doc("schools", "doctype", "student_sibling") - - frappe.reload_doc("education", "doctype", "student") - frappe.reload_doc("education", "doctype", "student_guardian") - frappe.reload_doc("education", "doctype", "student_sibling") - if "student" not in frappe.db.get_table_columns("Guardian"): - return - guardian = frappe.get_all("Guardian", fields=["name", "student"]) - for d in guardian: - if d.student: - student = frappe.get_doc("Student", d.student) - if student: - student.append("guardians", {"guardian": d.name}) - student.save() diff --git a/erpnext/patches/v7_1/set_total_amount_currency_in_je.py b/erpnext/patches/v7_1/set_total_amount_currency_in_je.py deleted file mode 100644 index 8426ddcd7d..0000000000 --- a/erpnext/patches/v7_1/set_total_amount_currency_in_je.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext import get_default_currency - -def execute(): - frappe.reload_doc("accounts", "doctype", "journal_entry") - - frappe.db.sql(""" update `tabJournal Entry` set total_amount_currency = %s - where ifnull(multi_currency, 0) = 0 - and (pay_to_recd_from is not null or pay_to_recd_from != "") """, get_default_currency()) - - for je in frappe.db.sql(""" select name from `tabJournal Entry` where multi_currency = 1 - and (pay_to_recd_from is not null or pay_to_recd_from != "")""", as_dict=1): - - doc = frappe.get_doc("Journal Entry", je.name) - for d in doc.get('accounts'): - if d.party_type and d.party: - total_amount_currency = d.account_currency - - elif frappe.db.get_value("Account", d.account, "account_type") in ["Bank", "Cash"]: - total_amount_currency = d.account_currency - - frappe.db.set_value("Journal Entry", je.name, "total_amount_currency", - total_amount_currency, update_modified=False) diff --git a/erpnext/patches/v7_1/update_bom_base_currency.py b/erpnext/patches/v7_1/update_bom_base_currency.py deleted file mode 100644 index 9a59209ea5..0000000000 --- a/erpnext/patches/v7_1/update_bom_base_currency.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext import get_default_currency - -def execute(): - frappe.reload_doc("manufacturing", "doctype", "bom") - frappe.reload_doc("manufacturing", "doctype", "bom_item") - frappe.reload_doc("manufacturing", "doctype", "bom_explosion_item") - frappe.reload_doc("manufacturing", "doctype", "bom_operation") - frappe.reload_doc("manufacturing", "doctype", "bom_scrap_item") - - frappe.db.sql(""" update `tabBOM Operation` set base_hour_rate = hour_rate, - base_operating_cost = operating_cost """) - - frappe.db.sql(""" update `tabBOM Item` set base_rate = rate, base_amount = amount """) - frappe.db.sql(""" update `tabBOM Scrap Item` set base_rate = rate, base_amount = amount """) - - frappe.db.sql(""" update `tabBOM` set `tabBOM`.base_operating_cost = `tabBOM`.operating_cost, - `tabBOM`.base_raw_material_cost = `tabBOM`.raw_material_cost, - `tabBOM`.currency = (select default_currency from `tabCompany` where name = `tabBOM`.company)""") diff --git a/erpnext/patches/v7_1/update_component_type.py b/erpnext/patches/v7_1/update_component_type.py deleted file mode 100644 index 24ca0570e0..0000000000 --- a/erpnext/patches/v7_1/update_component_type.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils import flt - -def execute(): - frappe.reload_doc('Payroll', 'doctype', 'salary_component') - sal_components = frappe.db.sql(""" - select DISTINCT salary_component, parentfield from `tabSalary Detail`""", as_dict=True) - - if sal_components: - for sal_component in sal_components: - if sal_component.parentfield == "earnings": - frappe.db.sql("""update `tabSalary Component` set type='Earning' where salary_component=%(sal_comp)s""",{"sal_comp": sal_component.salary_component}) - else: - frappe.db.sql("""update `tabSalary Component` set type='Deduction' where salary_component=%(sal_comp)s""",{"sal_comp": sal_component.salary_component}) \ No newline at end of file diff --git a/erpnext/patches/v7_1/update_invoice_status.py b/erpnext/patches/v7_1/update_invoice_status.py deleted file mode 100644 index 851af80f7a..0000000000 --- a/erpnext/patches/v7_1/update_invoice_status.py +++ /dev/null @@ -1,34 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'sales_invoice') - frappe.reload_doc('accounts', 'doctype', 'purchase_invoice') - - frappe.db.sql(""" - update - `tabPurchase Invoice` - set - status = (Case When outstanding_amount = 0 and docstatus = 1 and is_return = 0 then 'Paid' - when due_date < CURDATE() and outstanding_amount > 0 and docstatus =1 then 'Overdue' - when due_date >= CURDATE() and outstanding_amount > 0 and docstatus =1 then 'Unpaid' - when outstanding_amount < 0 and docstatus =1 then 'Debit Note Issued' - when is_return = 1 and docstatus =1 then 'Return' - when docstatus = 2 then 'Cancelled' - else 'Draft' - End)""") - - frappe.db.sql(""" - update - `tabSales Invoice` - set status = (Case When outstanding_amount = 0 and docstatus = 1 and is_return = 0 then 'Paid' - when due_date < CURDATE() and outstanding_amount > 0 and docstatus =1 then 'Overdue' - when due_date >= CURDATE() and outstanding_amount > 0 and docstatus =1 then 'Unpaid' - when outstanding_amount < 0 and docstatus =1 then 'Credit Note Issued' - when is_return = 1 and docstatus =1 then 'Return' - when docstatus = 2 then 'Cancelled' - else 'Draft' - End)""") \ No newline at end of file diff --git a/erpnext/patches/v7_1/update_lead_source.py b/erpnext/patches/v7_1/update_lead_source.py deleted file mode 100644 index a2a48a62e1..0000000000 --- a/erpnext/patches/v7_1/update_lead_source.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe import _ - -def execute(): - from erpnext.setup.setup_wizard.operations.install_fixtures import default_lead_sources - - frappe.reload_doc('crm', 'doctype', 'lead_source') - - frappe.local.lang = frappe.db.get_default("lang") or 'en' - - for s in default_lead_sources: - insert_lead_source(_(s)) - - # get lead sources in existing forms (customized) - # and create a document if not created - for d in ['Lead', 'Opportunity', 'Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']: - sources = frappe.db.sql_list('select distinct source from `tab{0}`'.format(d)) - for s in sources: - if s and s not in default_lead_sources: - insert_lead_source(s) - - # remove customization for source - for p in frappe.get_all('Property Setter', {'doc_type':d, 'field_name':'source', 'property':'options'}): - frappe.delete_doc('Property Setter', p.name) - -def insert_lead_source(s): - if not frappe.db.exists('Lead Source', s): - frappe.get_doc(dict(doctype='Lead Source', source_name=s)).insert() diff --git a/erpnext/patches/v7_1/update_missing_salary_component_type.py b/erpnext/patches/v7_1/update_missing_salary_component_type.py deleted file mode 100644 index 824f2b881f..0000000000 --- a/erpnext/patches/v7_1/update_missing_salary_component_type.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import unicode_literals - -import frappe -from frappe.utils import cstr - -''' -Some components do not have type set, try and guess whether they turn up in -earnings or deductions in existing salary slips -''' - -def execute(): - frappe.reload_doc("accounts", "doctype", "salary_component_account") - frappe.reload_doc("Payroll", "doctype", "salary_component") - frappe.reload_doc("Payroll", "doctype", "taxable_salary_slab") - - for s in frappe.db.sql('''select name, type, salary_component_abbr from `tabSalary Component` - where ifnull(type, "")="" or ifnull(salary_component_abbr, "") = ""''', as_dict=1): - - component = frappe.get_doc('Salary Component', s.name) - - # guess - if not s.type: - guess = frappe.db.sql('''select - parentfield from `tabSalary Detail` - where salary_component=%s limit 1''', s.name) - - if guess: - component.type = 'Earning' if guess[0][0]=='earnings' else 'Deduction' - - else: - component.type = 'Deduction' - - if not s.salary_component_abbr: - abbr = ''.join([c[0] for c in component.salary_component.split()]).upper() - - abbr_count = frappe.db.sql(""" - select - count(name) - from - `tabSalary Component` - where - salary_component_abbr = %s or salary_component_abbr like %s - """, (abbr, abbr + "-%%")) - - if abbr_count and abbr_count[0][0] > 0: - abbr = abbr + "-" + cstr(abbr_count[0][0]) - - component.salary_component_abbr = abbr - - component.save() diff --git a/erpnext/patches/v7_1/update_portal_roles.py b/erpnext/patches/v7_1/update_portal_roles.py deleted file mode 100644 index 482586b8ef..0000000000 --- a/erpnext/patches/v7_1/update_portal_roles.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('Role') - frappe.reload_doctype('User') - for role_name in ('Customer', 'Supplier', 'Student'): - if frappe.db.exists('Role', role_name): - frappe.db.set_value('Role', role_name, 'desk_access', 0) - else: - frappe.get_doc(dict(doctype='Role', role_name=role_name, desk_access=0)).insert() - - - # set customer, supplier roles - for c in frappe.get_all('Contact', fields=['user'], filters={'ifnull(user, "")': ('!=', '')}): - user = frappe.get_doc('User', c.user) - user.flags.ignore_validate = True - user.flags.ignore_mandatory = True - user.save() - - diff --git a/erpnext/patches/v7_1/update_total_billing_hours.py b/erpnext/patches/v7_1/update_total_billing_hours.py deleted file mode 100644 index b9c96028f5..0000000000 --- a/erpnext/patches/v7_1/update_total_billing_hours.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('projects', 'doctype', 'timesheet_detail') - frappe.reload_doc('accounts', 'doctype', 'sales_invoice_timesheet') - - frappe.db.sql("""update tabTimesheet set total_billable_hours=total_hours - where total_billable_amount>0 and docstatus = 1""") - - frappe.db.sql("""update `tabTimesheet Detail` set billing_hours=hours where docstatus < 2""") - - frappe.db.sql(""" update `tabSales Invoice Timesheet` set billing_hours = (select total_billable_hours from `tabTimesheet` - where name = time_sheet) where time_sheet is not null""") \ No newline at end of file diff --git a/erpnext/patches/v7_2/__init__.py b/erpnext/patches/v7_2/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v7_2/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v7_2/arrear_leave_encashment_as_salary_component.py b/erpnext/patches/v7_2/arrear_leave_encashment_as_salary_component.py deleted file mode 100644 index d2583b9422..0000000000 --- a/erpnext/patches/v7_2/arrear_leave_encashment_as_salary_component.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - # frappe.reload_doctype('Salary Slip', 'Salary Component') - frappe.reload_doc("Payroll", "doctype", "Salary Slip") - frappe.reload_doc("Payroll", "doctype", "Salary Component") - salary_components = [['Arrear', "ARR"], ['Leave Encashment', 'LENC']] - for salary_component, salary_abbr in salary_components: - if not frappe.db.exists('Salary Component', salary_component): - sal_comp = frappe.get_doc({ - "doctype": "Salary Component", - "salary_component": salary_component, - "type": "Earning", - "salary_component_abbr": salary_abbr - }).insert() - - salary_slips = frappe.db.sql("""select name, arrear_amount, leave_encashment_amount from `tabSalary Slip` - where docstatus !=2 and (arrear_amount > 0 or leave_encashment_amount > 0)""", as_dict=True) - - for salary_slip in salary_slips: - doc = frappe.get_doc('Salary Slip', salary_slip.name) - - if salary_slip.get("arrear_amount") > 0: - r = doc.append('earnings', { - 'salary_component': 'Arrear', - 'amount': salary_slip.arrear_amount - }) - r.db_update() - - if salary_slip.get("leave_encashment_amount") > 0: - r = doc.append('earnings', { - 'salary_component': 'Leave Encashment', - 'amount': salary_slip.leave_encashment_amount - }) - r.db_update() \ No newline at end of file diff --git a/erpnext/patches/v7_2/contact_address_links.py b/erpnext/patches/v7_2/contact_address_links.py deleted file mode 100644 index 200434c208..0000000000 --- a/erpnext/patches/v7_2/contact_address_links.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.core.doctype.dynamic_link.dynamic_link import deduplicate_dynamic_links -from frappe.utils import update_progress_bar - -def execute(): - frappe.reload_doc('core', 'doctype', 'dynamic_link') - frappe.reload_doc('contacts', 'doctype', 'contact') - frappe.reload_doc('contacts', 'doctype', 'address') - map_fields = ( - ('Customer', 'customer'), - ('Supplier', 'supplier'), - ('Lead', 'lead'), - ('Sales Partner', 'sales_partner') - ) - for doctype in ('Contact', 'Address'): - if frappe.db.has_column(doctype, 'customer'): - items = frappe.get_all(doctype) - for i, doc in enumerate(items): - doc = frappe.get_doc(doctype, doc.name) - dirty = False - for field in map_fields: - if doc.get(field[1]): - doc.append('links', dict(link_doctype=field[0], link_name=doc.get(field[1]))) - dirty = True - - if dirty: - deduplicate_dynamic_links(doc) - doc.update_children() - - update_progress_bar('Updating {0}'.format(doctype), i, len(items)) - print \ No newline at end of file diff --git a/erpnext/patches/v7_2/delete_fleet_management_module_def.py b/erpnext/patches/v7_2/delete_fleet_management_module_def.py deleted file mode 100644 index 542ac11e3f..0000000000 --- a/erpnext/patches/v7_2/delete_fleet_management_module_def.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 - -def execute(): - if frappe.db.exists('Module Def', 'Fleet Management'): - frappe.db.sql("""delete from `tabModule Def` - where module_name = 'Fleet Management'""") \ No newline at end of file diff --git a/erpnext/patches/v7_2/empty_supplied_items_for_non_subcontracted.py b/erpnext/patches/v7_2/empty_supplied_items_for_non_subcontracted.py deleted file mode 100644 index ec6f8afc3a..0000000000 --- a/erpnext/patches/v7_2/empty_supplied_items_for_non_subcontracted.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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 - -def execute(): - for doctype in ["Purchase Order", "Purchase Invoice", "Purchase Receipt"]: - child_table = 'Purchase Receipt Item Supplied' if doctype != 'Purchase Order' else 'Purchase Order Item Supplied' - for data in frappe.db.sql(""" select distinct `tab{doctype}`.name from `tab{doctype}` , `tab{child_table}` - where `tab{doctype}`.name = `tab{child_table}`.parent and `tab{doctype}`.docstatus != 2 - and `tab{doctype}`.is_subcontracted = 'No' """.format(doctype = doctype, child_table = child_table), as_dict=1): - frappe.db.sql(""" delete from `tab{child_table}` - where parent = %s and parenttype = %s""".format(child_table= child_table), (data.name, doctype)) \ No newline at end of file diff --git a/erpnext/patches/v7_2/make_all_assessment_group.py b/erpnext/patches/v7_2/make_all_assessment_group.py deleted file mode 100644 index f3ec628374..0000000000 --- a/erpnext/patches/v7_2/make_all_assessment_group.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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 - -def execute(): - if not frappe.db.exists({"doctype": "Assessment Group","assessment_group_name": "All Assessment Groups"}): - frappe.reload_doc("education", "doctype", "assessment_group") - doc = frappe.new_doc("Assessment Group") - doc.assessment_group_name = "All Assessment Groups" - doc.is_group = 1 - doc.flags.ignore_mandatory = True - doc.save() \ No newline at end of file diff --git a/erpnext/patches/v7_2/mark_students_active.py b/erpnext/patches/v7_2/mark_students_active.py deleted file mode 100644 index 7289e4a915..0000000000 --- a/erpnext/patches/v7_2/mark_students_active.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - # 'Schools' module changed to the 'Education' - # frappe.reload_doc('schools', 'doctype', 'student_group_student') - - frappe.reload_doc('education', 'doctype', 'student_group_student') - frappe.db.sql("update `tabStudent Group Student` set active=1") diff --git a/erpnext/patches/v7_2/rename_att_date_attendance.py b/erpnext/patches/v7_2/rename_att_date_attendance.py deleted file mode 100644 index 7f06d8f123..0000000000 --- a/erpnext/patches/v7_2/rename_att_date_attendance.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import update_reports, update_users_report_view_settings, update_property_setters - -def execute(): - if "att_date" not in frappe.db.get_table_columns("Attendance"): - return - frappe.reload_doc("hr", "doctype", "attendance") - frappe.db.sql("""update `tabAttendance` - set attendance_date = att_date - where attendance_date is null or attendance_date = '0000-00-00'""") - - update_reports("Attendance", "att_date", "attendance_date") - update_users_report_view_settings("Attendance", "att_date", "attendance_date") - update_property_setters("Attendance", "att_date", "attendance_date") diff --git a/erpnext/patches/v7_2/rename_evaluation_criteria.py b/erpnext/patches/v7_2/rename_evaluation_criteria.py deleted file mode 100644 index c6520b1b72..0000000000 --- a/erpnext/patches/v7_2/rename_evaluation_criteria.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - # 'Schools' module changed to the 'Education' - - - frappe.rename_doc("DocType", "Evaluation Criteria", "Assessment Criteria", force=True) - # frappe.reload_doc("schools", "doctype", "assessment_criteria") - frappe.reload_doc("education", "doctype", "assessment_criteria") - if 'evaluation_criteria' in frappe.db.get_table_columns('Assessment Criteria'): - rename_field("Assessment Criteria", "evaluation_criteria", "assessment_criteria") - - frappe.rename_doc("DocType", "Assessment Evaluation Criteria", "Assessment Plan Criteria", force=True) - # frappe.reload_doc("schools", "doctype", "assessment_plan_criteria") - frappe.reload_doc("education", "doctype", "assessment_plan_criteria") - if 'evaluation_criteria' in frappe.db.get_table_columns('Assessment Plan'): - rename_field("Assessment Plan Criteria", "evaluation_criteria", "assessment_criteria") - - # frappe.reload_doc("schools", "doctype", "assessment_plan") - frappe.reload_doc("education", "doctype", "assessment_plan") - rename_field("Assessment Plan", "evaluation_criterias", "assessment_criteria") - - # frappe.reload_doc("schools", "doctype", "assessment_result_detail") - frappe.reload_doc("education", "doctype", "assessment_result_detail") - if 'evaluation_criteria' in frappe.db.get_table_columns('Assessment Result Detail'): - rename_field("Assessment Result Detail", "evaluation_criteria", "assessment_criteria") - - frappe.rename_doc("DocType", "Course Evaluation Criteria", "Course Assessment Criteria", force=True) - # frappe.reload_doc("schools", "doctype", "course_assessment_criteria") - frappe.reload_doc("education", "doctype", "course_assessment_criteria") - if 'evaluation_criteria' in frappe.db.get_table_columns('Course Assessment Criteria'): - rename_field("Course Assessment Criteria", "evaluation_criteria", "assessment_criteria") - - # frappe.reload_doc("schools", "doctype", "course") - frappe.reload_doc("education", "doctype", "course") - if 'evaluation_criteria' in frappe.db.get_table_columns('Course'): - rename_field("Course", "evaluation_criterias", "assessment_criteria") diff --git a/erpnext/patches/v7_2/set_null_value_to_fields.py b/erpnext/patches/v7_2/set_null_value_to_fields.py deleted file mode 100644 index 6388be438d..0000000000 --- a/erpnext/patches/v7_2/set_null_value_to_fields.py +++ /dev/null @@ -1,11 +0,0 @@ -# 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 - -def execute(): - fields = {"Cost Center": "project", "Project": "cost_center"} - for budget_against, field in fields.items(): - frappe.db.sql(""" update `tabBudget` set {field} = null - where budget_against = %s """.format(field = field), budget_against) diff --git a/erpnext/patches/v7_2/setup_auto_close_settings.py b/erpnext/patches/v7_2/setup_auto_close_settings.py deleted file mode 100644 index 4eef2b9c8a..0000000000 --- a/erpnext/patches/v7_2/setup_auto_close_settings.py +++ /dev/null @@ -1,18 +0,0 @@ -# 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 - -def execute(): - # update the selling settings and set the close_opportunity_after_days - frappe.reload_doc("selling", "doctype", "selling_settings") - frappe.db.set_value("Selling Settings", "Selling Settings", "close_opportunity_after_days", 15) - - # Auto close Replied opportunity - frappe.db.sql("""update `tabOpportunity` set status='Closed' where status='Replied' - and date_sub(curdate(), interval 15 Day)>modified""") - - # create Support Settings doctype and update close_issue_after_days - frappe.reload_doc("support", "doctype", "support_settings") - frappe.db.set_value("Support Settings", "Support Settings", "close_issue_after_days", 7) \ No newline at end of file diff --git a/erpnext/patches/v7_2/stock_uom_in_selling.py b/erpnext/patches/v7_2/stock_uom_in_selling.py deleted file mode 100644 index d029555747..0000000000 --- a/erpnext/patches/v7_2/stock_uom_in_selling.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('Sales Order') - frappe.reload_doctype('Sales Invoice') - frappe.reload_doctype('Quotation') - frappe.reload_doctype('Delivery Note') - - doctype_list = ['Sales Order Item', 'Delivery Note Item', 'Quotation Item', 'Sales Invoice Item'] - - for doctype in doctype_list: - frappe.reload_doctype(doctype) - frappe.db.sql("""update `tab{doctype}` - set uom = stock_uom, conversion_factor = 1, stock_qty = qty""".format(doctype=doctype)) \ No newline at end of file diff --git a/erpnext/patches/v7_2/update_abbr_in_salary_slips.py b/erpnext/patches/v7_2/update_abbr_in_salary_slips.py deleted file mode 100644 index 57432fe986..0000000000 --- a/erpnext/patches/v7_2/update_abbr_in_salary_slips.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('Payroll', 'doctype', 'Salary Slip') - if not frappe.db.has_column('Salary Detail', 'abbr'): - return - - salary_details = frappe.db.sql("""select abbr, salary_component, name from `tabSalary Detail` - where abbr is null or abbr = ''""", as_dict=True) - - for salary_detail in salary_details: - salary_component_abbr = frappe.get_value("Salary Component", salary_detail.salary_component, "salary_component_abbr") - frappe.db.sql("""update `tabSalary Detail` set abbr = %s where name = %s""",(salary_component_abbr, salary_detail.name)) \ No newline at end of file diff --git a/erpnext/patches/v7_2/update_assessment_modules.py b/erpnext/patches/v7_2/update_assessment_modules.py deleted file mode 100644 index 2b5e774d46..0000000000 --- a/erpnext/patches/v7_2/update_assessment_modules.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - #Rename Grading Structure to Grading Scale - if not frappe.db.exists("DocType", "Grading Scale"): - frappe.rename_doc("DocType", "Grading Structure", "Grading Scale", force=True) - if not frappe.db.exists("DocType", "Grading Scale Interval"): - frappe.rename_doc("DocType", "Grade Interval", "Grading Scale Interval", force=True) - - # frappe.reload_doc("schools", "doctype", "grading_scale_interval") - frappe.reload_doc("education", "doctype", "grading_scale_interval") - if "to_score" in frappe.db.get_table_columns("Grading Scale Interval"): - rename_field("Grading Scale Interval", "to_score", "threshold") - - if not frappe.db.exists("DocType", "Assessment Plan"): - frappe.rename_doc("DocType", "Assessment", "Assessment Plan", force=True) - - # 'Schools' module changed to the 'Education' - # frappe.reload_doc("schools", "doctype", "assessment_plan") - - #Rename Assessment Results - frappe.reload_doc("education", "doctype", "assessment_plan") - if "grading_structure" in frappe.db.get_table_columns("Assessment Plan"): - rename_field("Assessment Plan", "grading_structure", "grading_scale") - - # frappe.reload_doc("schools", "doctype", "assessment_result") - # frappe.reload_doc("schools", "doctype", "assessment_result_detail") - # frappe.reload_doc("schools", "doctype", "assessment_criteria") - frappe.reload_doc("education", "doctype", "assessment_result") - frappe.reload_doc("education", "doctype", "assessment_result_detail") - frappe.reload_doc("education", "doctype", "assessment_criteria") - - - for assessment in frappe.get_all("Assessment Plan", - fields=["name", "grading_scale"], filters = [["docstatus", "!=", 2 ]]): - for stud_result in frappe.db.sql("select * from `tabAssessment Result` where parent= %s", - assessment.name, as_dict=True): - if stud_result.result: - assessment_result = frappe.new_doc("Assessment Result") - assessment_result.student = stud_result.student - assessment_result.student_name = stud_result.student_name - assessment_result.assessment_plan = assessment.name - assessment_result.grading_scale = assessment.grading_scale - assessment_result.total_score = stud_result.result - assessment_result.flags.ignore_validate = True - assessment_result.flags.ignore_mandatory = True - assessment_result.save() - - frappe.db.sql("""delete from `tabAssessment Result` where parent != '' or parent is not null""") \ No newline at end of file diff --git a/erpnext/patches/v7_2/update_attendance_docstatus.py b/erpnext/patches/v7_2/update_attendance_docstatus.py deleted file mode 100644 index a69052657d..0000000000 --- a/erpnext/patches/v7_2/update_attendance_docstatus.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("education", "doctype", "student_attendance") - frappe.db.sql(''' - update `tabStudent Attendance` set - docstatus=0 - where - docstatus=1''') \ No newline at end of file diff --git a/erpnext/patches/v7_2/update_doctype_status.py b/erpnext/patches/v7_2/update_doctype_status.py deleted file mode 100644 index c66f3f2e73..0000000000 --- a/erpnext/patches/v7_2/update_doctype_status.py +++ /dev/null @@ -1,11 +0,0 @@ -# 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 - -def execute(): - doctypes = ["Opportunity", "Quotation", "Sales Order", "Sales Invoice", "Purchase Invoice", "Purchase Order", "Delivery Note", "Purchase Receipt"] - for doctype in doctypes: - frappe.db.sql(""" update `tab{doctype}` set status = 'Draft' - where status = 'Cancelled' and docstatus = 0 """.format(doctype = doctype)) \ No newline at end of file diff --git a/erpnext/patches/v7_2/update_guardian_name_in_student_master.py b/erpnext/patches/v7_2/update_guardian_name_in_student_master.py deleted file mode 100644 index 9f589ef00e..0000000000 --- a/erpnext/patches/v7_2/update_guardian_name_in_student_master.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - # 'Schools' module changed to the 'Education' - # frappe.reload_doc("schools", "doctype", "student_guardian") - frappe.reload_doc("education", "doctype", "student_guardian") - - student_guardians = frappe.get_all("Student Guardian", fields=["guardian"]) - for student_guardian in student_guardians: - guardian_name = frappe.db.get_value("Guardian", student_guardian.guardian, "guardian_name") - frappe.db.sql("update `tabStudent Guardian` set guardian_name = %s where guardian= %s", - (guardian_name, student_guardian.guardian)) \ No newline at end of file diff --git a/erpnext/patches/v7_2/update_party_type.py b/erpnext/patches/v7_2/update_party_type.py deleted file mode 100644 index 147f5a3643..0000000000 --- a/erpnext/patches/v7_2/update_party_type.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doc('setup', 'doctype', 'party_type') - make_party_type() - -def make_party_type(): - for party_type in ["Customer", "Supplier", "Employee"]: - if not frappe.db.get_value("Party Type", party_type): - doc = frappe.new_doc("Party Type") - doc.party_type = party_type - doc.save(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/patches/v7_2/update_salary_slips.py b/erpnext/patches/v7_2/update_salary_slips.py deleted file mode 100644 index 9fcce62d8f..0000000000 --- a/erpnext/patches/v7_2/update_salary_slips.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext.payroll.doctype.payroll_entry.payroll_entry import get_month_details -from frappe.utils import cint - -def execute(): - frappe.reload_doc("Payroll", "doctype", "Salary Slip") - if not frappe.db.has_column('Salary Slip', 'fiscal_year'): - return - - salary_slips = frappe.db.sql("""select month, name, fiscal_year from `tabSalary Slip` - where (month is not null and month != '') and - start_date is null and end_date is null and docstatus != 2""", as_dict=True) - - for salary_slip in salary_slips: - if not cint(salary_slip.month): - continue - get_start_end_date = get_month_details(salary_slip.fiscal_year, cint(salary_slip.month)) - start_date = get_start_end_date['month_start_date'] - end_date = get_start_end_date['month_end_date'] - frappe.db.sql("""update `tabSalary Slip` set start_date = %s, end_date = %s where name = %s""", - (start_date, end_date, salary_slip.name)) \ No newline at end of file diff --git a/erpnext/patches/v7_2/update_website_for_variant.py b/erpnext/patches/v7_2/update_website_for_variant.py deleted file mode 100644 index e8eef6e7da..0000000000 --- a/erpnext/patches/v7_2/update_website_for_variant.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - # variant must have show_in_website = 0 - frappe.reload_doctype('Item') - frappe.db.sql(''' - update tabItem set - show_variant_in_website = 1, - show_in_website = 0 - where - show_in_website=1 - and ifnull(variant_of, "")!=""''') \ No newline at end of file diff --git a/erpnext/patches/v8_0/__init__.py b/erpnext/patches/v8_0/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v8_0/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v8_0/addresses_linked_to_lead.py b/erpnext/patches/v8_0/addresses_linked_to_lead.py deleted file mode 100644 index b5f2234228..0000000000 --- a/erpnext/patches/v8_0/addresses_linked_to_lead.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql("""UPDATE `tabDynamic Link` SET link_doctype = 'Lead' WHERE link_doctype = 'Load'""") diff --git a/erpnext/patches/v8_0/change_in_words_varchar_length.py b/erpnext/patches/v8_0/change_in_words_varchar_length.py deleted file mode 100644 index 68ff95b5ed..0000000000 --- a/erpnext/patches/v8_0/change_in_words_varchar_length.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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 - -def execute(): - doctypes = frappe.db.sql_list("""select parent from tabDocField where fieldname = 'in_words'""") - - for dt in doctypes: - for fieldname in ("in_words", "base_in_words"): - frappe.db.sql("alter table `tab{0}` change column `{1}` `{2}` varchar(255)" - .format(dt, fieldname, fieldname)) - - frappe.db.sql("""alter table `tabJournal Entry` - change column `total_amount_in_words` `total_amount_in_words` varchar(255)""") diff --git a/erpnext/patches/v8_0/create_address_doc_from_address_field_in_company.py b/erpnext/patches/v8_0/create_address_doc_from_address_field_in_company.py deleted file mode 100644 index cf1bc5af05..0000000000 --- a/erpnext/patches/v8_0/create_address_doc_from_address_field_in_company.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - # new field address_html is created in place of address field for the company's address in PR #8754 (without patch) - # so here is the patch for moving the address details in the address doc - company_list = [] - if 'address' in frappe.db.get_table_columns('Company'): - company_list = frappe.db.sql('''select name, address from `tabCompany` - where address is not null and address != ""''', as_dict=1) - - for company in company_list: - add_list = company.address.split(" ") - if ',' in company.address: - add_list = company.address.rpartition(',') - elif ' ' in company.address: - add_list = company.address.rpartition(' ') - else: - add_list = [company.address, None, company.address] - - doc = frappe.get_doc({ - "doctype":"Address", - "address_line1": add_list[0], - "city": add_list[2], - "links": [{ - "link_doctype": "Company", - "link_name": company.name - }] - }) - doc.save() diff --git a/erpnext/patches/v8_0/create_domain_docs.py b/erpnext/patches/v8_0/create_domain_docs.py deleted file mode 100644 index 3ef4f3c1bb..0000000000 --- a/erpnext/patches/v8_0/create_domain_docs.py +++ /dev/null @@ -1,53 +0,0 @@ -# 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 -import erpnext - -def execute(): - """Create domain documents""" - frappe.reload_doc("core", "doctype", "domain") - frappe.reload_doc("core", "doctype", "domain_settings") - frappe.reload_doc("core", "doctype", "has_domain") - frappe.reload_doc("core", "doctype", "role") - - for domain in ("Distribution", "Manufacturing", "Retail", "Services", "Education"): - if not frappe.db.exists({"doctype": "Domain", "domain": domain}): - create_domain(domain) - - # set domain in domain settings based on company domain - - domains = [] - condition = "" - company = erpnext.get_default_company() - if company: - condition = " and name={0}".format(frappe.db.escape(company)) - - domains = frappe.db.sql_list("select distinct domain from `tabCompany` where domain != 'Other' {0}".format(condition)) - - if not domains: - return - - domain_settings = frappe.get_doc("Domain Settings", "Domain Settings") - checked_domains = [row.domain for row in domain_settings.active_domains] - - for domain in domains: - # check and ignore if the domains is already checked in domain settings - if domain in checked_domains: - continue - - if not frappe.db.get_value("Domain", domain): - # user added custom domain in companies domain field - create_domain(domain) - - row = domain_settings.append("active_domains", dict(domain=domain)) - - domain_settings.save(ignore_permissions=True) - -def create_domain(domain): - # create new domain - - doc = frappe.new_doc("Domain") - doc.domain = domain - doc.db_update() \ No newline at end of file diff --git a/erpnext/patches/v8_0/delete_bin_indexes.py b/erpnext/patches/v8_0/delete_bin_indexes.py deleted file mode 100644 index 12cacdb952..0000000000 --- a/erpnext/patches/v8_0/delete_bin_indexes.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals -import frappe - -def execute(): - # delete bin indexes - unwanted_indexes = ["item_code", "warehouse"] - - for k in unwanted_indexes: - try: - frappe.db.sql("drop index {0} on `tabBin`".format(k)) - except: - pass \ No newline at end of file diff --git a/erpnext/patches/v8_0/delete_schools_depricated_doctypes.py b/erpnext/patches/v8_0/delete_schools_depricated_doctypes.py deleted file mode 100644 index 09a78ed3ca..0000000000 --- a/erpnext/patches/v8_0/delete_schools_depricated_doctypes.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2017, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - """ delete doctypes """ - - if frappe.db.exists("DocType", "Grading Structure"): - frappe.delete_doc("DocType", "Grading Structure", force=1) - - if frappe.db.exists("DocType", "Grade Interval"): - frappe.delete_doc("DocType", "Grade Interval", force=1) \ No newline at end of file diff --git a/erpnext/patches/v8_0/disable_instructor_role.py b/erpnext/patches/v8_0/disable_instructor_role.py deleted file mode 100644 index 4ba78d172c..0000000000 --- a/erpnext/patches/v8_0/disable_instructor_role.py +++ /dev/null @@ -1,18 +0,0 @@ -# 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 - -def execute(): - """ - disable the instructor role for companies with domain other than - Education. - """ - - domains = frappe.db.sql_list("select domain from tabCompany") - if "Education" not in domains: - if frappe.db.exists("Role", "Instructor"): - role = frappe.get_doc("Role", "Instructor") - role.disabled = 1 - role.save(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/patches/v8_0/enable_booking_asset_depreciation_automatically.py b/erpnext/patches/v8_0/enable_booking_asset_depreciation_automatically.py deleted file mode 100644 index 1088d702dd..0000000000 --- a/erpnext/patches/v8_0/enable_booking_asset_depreciation_automatically.py +++ /dev/null @@ -1,9 +0,0 @@ -# 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 - -def execute(): - frappe.db.set_value("Accounts Settings", None, - "book_asset_depreciation_entry_automatically", 1) \ No newline at end of file diff --git a/erpnext/patches/v8_0/fix_status_for_invoices_with_negative_outstanding.py b/erpnext/patches/v8_0/fix_status_for_invoices_with_negative_outstanding.py deleted file mode 100644 index 2e7f360c97..0000000000 --- a/erpnext/patches/v8_0/fix_status_for_invoices_with_negative_outstanding.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - for dt, status in [["Sales Invoice", "Credit Note Issued"], ["Purchase Invoice", "Debit Note Issued"]]: - invoices = frappe.db.sql(""" - select name - from `tab{0}` - where - status = %s - and outstanding_amount < 0 - and docstatus=1 - and is_return=0 - """.format(dt), status) - - for inv in invoices: - return_inv = frappe.db.sql("""select name from `tab{0}` - where is_return=1 and return_against=%s and docstatus=1""".format(dt), inv[0]) - if not return_inv: - frappe.db.sql("update `tab{0}` set status='Paid' where name = %s".format(dt), inv[0]) \ No newline at end of file diff --git a/erpnext/patches/v8_0/make_payments_table_blank_for_non_pos_invoice.py b/erpnext/patches/v8_0/make_payments_table_blank_for_non_pos_invoice.py deleted file mode 100644 index 9750fb7222..0000000000 --- a/erpnext/patches/v8_0/make_payments_table_blank_for_non_pos_invoice.py +++ /dev/null @@ -1,15 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype('Sales Invoice') - - frappe.db.sql(""" - delete from - `tabSales Invoice Payment` - where - parent in (select name from `tabSales Invoice` where is_pos = 0) - """) \ No newline at end of file diff --git a/erpnext/patches/v8_0/merge_student_batch_and_student_group.py b/erpnext/patches/v8_0/merge_student_batch_and_student_group.py deleted file mode 100644 index fb9021fd68..0000000000 --- a/erpnext/patches/v8_0/merge_student_batch_and_student_group.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import * -from frappe.model.mapper import get_mapped_doc - - -def execute(): - # for converting student batch into student group - for doctype in ["Student Group", "Student Group Student", 'Program Enrollment', - "Student Group Instructor", "Student Attendance", "Student", "Student Batch Name"]: - # 'Schools' module changed to the 'Education' - # frappe.reload_doc("schools", "doctype", frappe.scrub(doctype)) - - frappe.reload_doc("education", "doctype", frappe.scrub(doctype)) - - if frappe.db.table_exists("Student Batch"): - student_batches = frappe.db.sql('''select name as student_group_name, student_batch_name as batch, - program, academic_year, academic_term from `tabStudent Batch`''', as_dict=1) - - for student_batch in student_batches: - # create student batch name if does not exists !! - if student_batch.get("batch") and not frappe.db.exists("Student Batch Name", student_batch.get("batch")): - frappe.get_doc({ - "doctype": "Student Batch Name", - "batch_name": student_batch.get("batch") - }).insert(ignore_permissions=True) - - student_batch.update({"doctype":"Student Group", "group_based_on": "Batch"}) - doc = frappe.get_doc(student_batch) - - if frappe.db.sql("SHOW COLUMNS FROM `tabStudent Batch Student` LIKE 'active'"): - cond = ", active" - else: - cond = " " - student_list = frappe.db.sql('''select student, student_name {cond} from `tabStudent Batch Student` - where parent=%s'''.format(cond=cond), (doc.student_group_name), as_dict=1) - - if student_list: - for i, student in enumerate(student_list): - student.update({"group_roll_number": i+1}) - doc.extend("students", student_list) - - instructor_list = None - if frappe.db.table_exists("Student Batch Instructor"): - instructor_list = frappe.db.sql('''select instructor, instructor_name from `tabStudent Batch Instructor` - where parent=%s''', (doc.student_group_name), as_dict=1) - if instructor_list: - doc.extend("instructors", instructor_list) - doc.save() - - # delete the student batch and child-table - if frappe.db.table_exists("Student Batch"): - frappe.delete_doc("DocType", "Student Batch", force=1) - if frappe.db.table_exists("Student Batch Student"): - frappe.delete_doc("DocType", "Student Batch Student", force=1) - if frappe.db.table_exists("Student Batch Instructor"): - frappe.delete_doc("DocType", "Student Batch Instructor", force=1) - - # delete the student batch creation tool - if frappe.db.table_exists("Student Batch Creation Tool"): - frappe.delete_doc("DocType", "Student Batch Creation Tool", force=1) - - # delete the student batch creation tool - if frappe.db.table_exists("Attendance Tool Student"): - frappe.delete_doc("DocType", "Attendance Tool Student", force=1) - - # change the student batch to student group in the student attendance - table_columns = frappe.db.get_table_columns("Student Attendance") - if "student_batch" in table_columns: - rename_field("Student Attendance", "student_batch", "student_group") diff --git a/erpnext/patches/v8_0/move_account_head_from_account_to_warehouse_for_inventory.py b/erpnext/patches/v8_0/move_account_head_from_account_to_warehouse_for_inventory.py deleted file mode 100644 index b59d81831f..0000000000 --- a/erpnext/patches/v8_0/move_account_head_from_account_to_warehouse_for_inventory.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Warehouse") - frappe.db.sql(""" - update - `tabWarehouse` - set - account = (select name from `tabAccount` - where account_type = 'Stock' and - warehouse = `tabWarehouse`.name and is_group = 0 limit 1)""") \ No newline at end of file diff --git a/erpnext/patches/v8_0/move_perpetual_inventory_setting.py b/erpnext/patches/v8_0/move_perpetual_inventory_setting.py deleted file mode 100644 index 78322d4575..0000000000 --- a/erpnext/patches/v8_0/move_perpetual_inventory_setting.py +++ /dev/null @@ -1,13 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype('Company') - enabled = frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock") or 0 - for data in frappe.get_all('Company', fields = ["name"]): - doc = frappe.get_doc('Company', data.name) - doc.enable_perpetual_inventory = enabled - doc.db_update() \ No newline at end of file diff --git a/erpnext/patches/v8_0/rename_is_sample_item_to_allow_zero_valuation_rate.py b/erpnext/patches/v8_0/rename_is_sample_item_to_allow_zero_valuation_rate.py deleted file mode 100644 index e517df5fdb..0000000000 --- a/erpnext/patches/v8_0/rename_is_sample_item_to_allow_zero_valuation_rate.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - - doc_list = ["Purchase Invoice Item", "Stock Entry Detail", "Delivery Note Item", - "Purchase Receipt Item", "Sales Invoice Item"] - - for doctype in doc_list: - frappe.reload_doctype(doctype) - if "is_sample_item" in frappe.db.get_table_columns(doctype): - rename_field(doctype, "is_sample_item", "allow_zero_valuation_rate") \ No newline at end of file diff --git a/erpnext/patches/v8_0/rename_items_in_status_field_of_material_request.py b/erpnext/patches/v8_0/rename_items_in_status_field_of_material_request.py deleted file mode 100644 index 5ad862a436..0000000000 --- a/erpnext/patches/v8_0/rename_items_in_status_field_of_material_request.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql( - """ - UPDATE `tabMaterial Request` - SET status = CASE - WHEN docstatus = 2 THEN 'Cancelled' - WHEN docstatus = 0 THEN 'Draft' - ELSE CASE - WHEN status = 'Stopped' THEN 'Stopped' - WHEN status != 'Stopped' AND per_ordered = 0 THEN 'Pending' - WHEN per_ordered < 100 AND per_ordered > 0 AND status != 'Stopped' - THEN 'Partially Ordered' - WHEN per_ordered = 100 AND material_request_type = 'Purchase' - AND status != 'Stopped' THEN 'Ordered' - WHEN per_ordered = 100 AND material_request_type = 'Material Transfer' - AND status != 'Stopped' THEN 'Transferred' - WHEN per_ordered = 100 AND material_request_type = 'Material Issue' - AND status != 'Stopped' THEN 'Issued' - END - END - """ - ) \ No newline at end of file diff --git a/erpnext/patches/v8_0/rename_total_margin_to_rate_with_margin.py b/erpnext/patches/v8_0/rename_total_margin_to_rate_with_margin.py deleted file mode 100644 index 4065438796..0000000000 --- a/erpnext/patches/v8_0/rename_total_margin_to_rate_with_margin.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import unicode_literals -import frappe - -from frappe.model.utils.rename_field import rename_field - -def execute(): - """ - Rename Total Margin field to Rate With Margin in - "Sales Order Item", "Sales Invoice Item", "Delivery Note Item", - "Quotation Item" - """ - - for d in ("Sales Order Item", "Sales Invoice Item", - "Delivery Note Item", "Quotation Item"): - frappe.reload_doctype(d) - rename_field_if_exists(d, "total_margin", "rate_with_margin") - - -def rename_field_if_exists(doctype, old_fieldname, new_fieldname): - try: - rename_field(doctype, old_fieldname, new_fieldname) - except Exception as e: - if e.args[0] != 1054: - raise diff --git a/erpnext/patches/v8_0/repost_reserved_qty_for_multiple_sales_uom.py b/erpnext/patches/v8_0/repost_reserved_qty_for_multiple_sales_uom.py deleted file mode 100644 index 3030b8e2f3..0000000000 --- a/erpnext/patches/v8_0/repost_reserved_qty_for_multiple_sales_uom.py +++ /dev/null @@ -1,19 +0,0 @@ -# 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 erpnext.stock.stock_balance import update_bin_qty, get_reserved_qty - -def execute(): - for doctype in ("Sales Order Item", "Bin"): - frappe.reload_doctype(doctype) - - repost_for = frappe.db.sql("""select distinct item_code, warehouse - from `tabSales Order Item` where docstatus=1 and uom != stock_uom and - exists(select name from tabItem where name=`tabSales Order Item`.item_code and ifnull(is_stock_item, 0)=1)""") - - for item_code, warehouse in repost_for: - update_bin_qty(item_code, warehouse, { - "reserved_qty": get_reserved_qty(item_code, warehouse) - }) \ No newline at end of file diff --git a/erpnext/patches/v8_0/revert_manufacturers_table_from_item.py b/erpnext/patches/v8_0/revert_manufacturers_table_from_item.py deleted file mode 100644 index 60cbb33b80..0000000000 --- a/erpnext/patches/v8_0/revert_manufacturers_table_from_item.py +++ /dev/null @@ -1,22 +0,0 @@ -# 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 - -def execute(): - if frappe.db.exists("DocType", "Item Manufacturer"): - frappe.reload_doctype("Item") - item_manufacturers = frappe.db.sql(""" - select parent, manufacturer, manufacturer_part_no - from `tabItem Manufacturer` - """, as_dict=1) - - for im in item_manufacturers: - frappe.db.sql(""" - update tabItem - set manufacturer=%s, manufacturer_part_no=%s - where name=%s - """, (im.manufacturer, im.manufacturer_part_no, im.parent)) - - frappe.delete_doc("DocType", "Item Manufacturer") \ No newline at end of file diff --git a/erpnext/patches/v8_0/save_system_settings.py b/erpnext/patches/v8_0/save_system_settings.py deleted file mode 100644 index d479ece8a6..0000000000 --- a/erpnext/patches/v8_0/save_system_settings.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe.utils import cint - -def execute(): - """ - save system settings document - """ - - frappe.reload_doc("core", "doctype", "system_settings") - doc = frappe.get_doc("System Settings") - doc.flags.ignore_mandatory = True - - if cint(doc.currency_precision) == 0: - doc.currency_precision = '' - - doc.save(ignore_permissions=True) diff --git a/erpnext/patches/v8_0/set_null_to_serial_nos_for_disabled_sales_invoices.py b/erpnext/patches/v8_0/set_null_to_serial_nos_for_disabled_sales_invoices.py deleted file mode 100644 index 197d6ded61..0000000000 --- a/erpnext/patches/v8_0/set_null_to_serial_nos_for_disabled_sales_invoices.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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 erpnext.stock.stock_balance import update_bin_qty, get_reserved_qty - -def execute(): - frappe.db.sql(""" - update - `tabSales Invoice Item` - set serial_no = NULL - where - parent in (select name from `tabSales Invoice` where update_stock = 0 and docstatus = 1)""") \ No newline at end of file diff --git a/erpnext/patches/v8_0/set_project_copied_from.py b/erpnext/patches/v8_0/set_project_copied_from.py deleted file mode 100644 index d4287978cf..0000000000 --- a/erpnext/patches/v8_0/set_project_copied_from.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Project") - - frappe.db.sql(''' - UPDATE `tabProject` - SET copied_from=name - WHERE copied_from is NULL - ''') \ No newline at end of file diff --git a/erpnext/patches/v8_0/set_sales_invoice_serial_number_from_delivery_note.py b/erpnext/patches/v8_0/set_sales_invoice_serial_number_from_delivery_note.py deleted file mode 100644 index 8a4ef4086b..0000000000 --- a/erpnext/patches/v8_0/set_sales_invoice_serial_number_from_delivery_note.py +++ /dev/null @@ -1,42 +0,0 @@ -# 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 erpnext.stock.stock_balance import update_bin_qty, get_reserved_qty - -def execute(): - """ Set the Serial Numbers in Sales Invoice Item from Delivery Note Item """ - - frappe.reload_doc("stock", "doctype", "serial_no") - - frappe.db.sql(""" update `tabSales Invoice Item` sii inner join - `tabDelivery Note Item` dni on sii.dn_detail=dni.name and sii.qty=dni.qty - set sii.serial_no=dni.serial_no where sii.parent IN (select si.name - from `tabSales Invoice` si where si.update_stock=0 and si.docstatus=1)""") - - items = frappe.db.sql(""" select sii.parent, sii.serial_no from `tabSales Invoice Item` sii - left join `tabSales Invoice` si on sii.parent=si.name - where si.docstatus=1 and si.update_stock=0""", as_dict=True) - - for item in items: - sales_invoice = item.get("parent", None) - serial_nos = item.get("serial_no", "") - - if not sales_invoice or not serial_nos: - continue - - serial_nos = ["{}".format(frappe.db.escape(no)) for no in serial_nos.split("\n")] - - frappe.db.sql(""" - UPDATE - `tabSerial No` - SET - sales_invoice={sales_invoice} - WHERE - name in ({serial_nos}) - """.format( - sales_invoice=frappe.db.escape(sales_invoice), - serial_nos=",".join(serial_nos) - ) - ) \ No newline at end of file diff --git a/erpnext/patches/v8_0/update_customer_pos_id.py b/erpnext/patches/v8_0/update_customer_pos_id.py deleted file mode 100644 index a772ae90c5..0000000000 --- a/erpnext/patches/v8_0/update_customer_pos_id.py +++ /dev/null @@ -1,9 +0,0 @@ -# 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 - -def execute(): - frappe.reload_doctype("Customer") - frappe.db.sql(""" update `tabCustomer` set customer_pos_id = name """) \ No newline at end of file diff --git a/erpnext/patches/v8_0/update_production_orders.py b/erpnext/patches/v8_0/update_production_orders.py deleted file mode 100644 index 8e993cc102..0000000000 --- a/erpnext/patches/v8_0/update_production_orders.py +++ /dev/null @@ -1,49 +0,0 @@ -# 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 - -def execute(): - # reload schema - for doctype in ("Work Order", "Work Order Item", "Work Order Operation", - "BOM Item", "BOM Explosion Item", "BOM"): - frappe.reload_doctype(doctype) - - frappe.reload_doc("stock", "doctype", "item") - frappe.reload_doc("stock", "doctype", "item_default") - - # fetch all draft and submitted work orders - fields = ["name"] - if "source_warehouse" in frappe.db.get_table_columns("Work Order"): - fields.append("source_warehouse") - - wo_orders = frappe.get_all("Work Order", filters={"docstatus": ["!=", 2]}, fields=fields) - - count = 0 - for p in wo_orders: - wo_order = frappe.get_doc("Work Order", p.name) - count += 1 - - # set required items table - wo_order.set_required_items() - - for item in wo_order.get("required_items"): - # set source warehouse based on parent - if not item.source_warehouse and "source_warehouse" in fields: - item.source_warehouse = wo_order.get("source_warehouse") - item.db_update() - - if wo_order.docstatus == 1: - # update transferred qty based on Stock Entry, it also updates db - wo_order.update_transaferred_qty_for_required_items() - - # Set status where it was 'Unstopped', as it is deprecated - if wo_order.status == "Unstopped": - status = wo_order.get_status() - wo_order.db_set("status", status) - elif wo_order.status == "Stopped": - wo_order.update_reserved_qty_for_production() - - if count % 200 == 0: - frappe.db.commit() \ No newline at end of file diff --git a/erpnext/patches/v8_0/update_sales_cost_in_project.py b/erpnext/patches/v8_0/update_sales_cost_in_project.py deleted file mode 100644 index 1a29fc4db4..0000000000 --- a/erpnext/patches/v8_0/update_sales_cost_in_project.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("projects", "doctype", "project") - - frappe.db.sql(""" - update `tabProject` p - set total_sales_amount = ifnull((select sum(base_grand_total) - from `tabSales Order` where project=p.name and docstatus=1), 0) - """) \ No newline at end of file diff --git a/erpnext/patches/v8_0/update_status_as_paid_for_completed_expense_claim.py b/erpnext/patches/v8_0/update_status_as_paid_for_completed_expense_claim.py deleted file mode 100644 index 19d27b206b..0000000000 --- a/erpnext/patches/v8_0/update_status_as_paid_for_completed_expense_claim.py +++ /dev/null @@ -1,19 +0,0 @@ -# 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 - -def execute(): - """ set status as Paid in Expense Claim if total_sactioned_amount - and total_amount_reimbursed is equal """ - - frappe.reload_doctype('Expense Claim') - - frappe.db.sql(""" - update - `tabExpense Claim` - set status = 'Paid' - where - total_sanctioned_amount = total_amount_reimbursed - """) diff --git a/erpnext/patches/v8_0/update_stock_qty_value_in_bom_item.py b/erpnext/patches/v8_0/update_stock_qty_value_in_bom_item.py deleted file mode 100644 index 1f937bb8af..0000000000 --- a/erpnext/patches/v8_0/update_stock_qty_value_in_bom_item.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('manufacturing', 'doctype', 'bom_item') - frappe.reload_doc('manufacturing', 'doctype', 'bom_explosion_item') - frappe.reload_doc('manufacturing', 'doctype', 'bom_scrap_item') - frappe.db.sql("update `tabBOM Item` set stock_qty = qty, uom = stock_uom, conversion_factor = 1") - frappe.db.sql("update `tabBOM Explosion Item` set stock_qty = qty") - if "qty" in frappe.db.get_table_columns("BOM Scrap Item"): - frappe.db.sql("update `tabBOM Scrap Item` set stock_qty = qty") \ No newline at end of file diff --git a/erpnext/patches/v8_0/update_stock_qty_value_in_purchase_invoice.py b/erpnext/patches/v8_0/update_stock_qty_value_in_purchase_invoice.py deleted file mode 100644 index be5cf3aed7..0000000000 --- a/erpnext/patches/v8_0/update_stock_qty_value_in_purchase_invoice.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'purchase_invoice_item') - frappe.db.sql("update `tabPurchase Invoice Item` set stock_qty = qty, stock_uom = uom") \ No newline at end of file diff --git a/erpnext/patches/v8_0/update_student_groups_from_student_batches.py b/erpnext/patches/v8_0/update_student_groups_from_student_batches.py deleted file mode 100644 index ae24fe4a14..0000000000 --- a/erpnext/patches/v8_0/update_student_groups_from_student_batches.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import * -from frappe.model.mapper import get_mapped_doc - - -def execute(): - if frappe.db.table_exists("Student Batch"): - student_batches = frappe.db.sql('''select name from `tabStudent Batch`''', as_dict=1) - - for student_batch in student_batches: - if frappe.db.exists("Student Group", student_batch.get("name")): - student_group = frappe.get_doc("Student Group", student_batch.get("name")) - - if frappe.db.table_exists("Student Batch Student"): - current_student_list = frappe.db.sql_list('''select student from `tabStudent Group Student` - where parent=%s''', (student_group.name)) - batch_student_list = frappe.db.sql_list('''select student from `tabStudent Batch Student` - where parent=%s''', (student_group.name)) - - student_list = list(set(batch_student_list)-set(current_student_list)) - if student_list: - student_group.extend("students", [{"student":d} for d in student_list]) - - if frappe.db.table_exists("Student Batch Instructor"): - current_instructor_list = frappe.db.sql_list('''select instructor from `tabStudent Group Instructor` - where parent=%s''', (student_group.name)) - batch_instructor_list = frappe.db.sql_list('''select instructor from `tabStudent Batch Instructor` - where parent=%s''', (student_group.name)) - - instructor_list = list(set(batch_instructor_list)-set(current_instructor_list)) - if instructor_list: - student_group.extend("instructors", [{"instructor":d} for d in instructor_list]) - - student_group.save() diff --git a/erpnext/patches/v8_0/update_supplier_address_in_stock_entry.py b/erpnext/patches/v8_0/update_supplier_address_in_stock_entry.py deleted file mode 100644 index a2173048fd..0000000000 --- a/erpnext/patches/v8_0/update_supplier_address_in_stock_entry.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - # copy supplier_address to address_display, and set supplier_address to blank - - stock_entries = frappe.db.sql(""" select name, purchase_order, supplier_address from `tabStock Entry` - where ifnull(supplier_address, '') <> ''""", as_dict=True) - - frappe.reload_doc('stock', 'doctype', 'stock_entry') - - for stock_entry in stock_entries: - # move supplier address to address_display, and fetch the supplier address from purchase order - - se = frappe.get_doc("Stock Entry", stock_entry.get("name")) - se.address_display = stock_entry.get("supplier_address") - se.supplier_address = frappe.db.get_value("Purchase Order", stock_entry.get("purchase_order"),"supplier_address") or None - - se.db_update() diff --git a/erpnext/patches/v8_1/__init__.py b/erpnext/patches/v8_1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v8_1/add_hsn_sac_codes.py b/erpnext/patches/v8_1/add_hsn_sac_codes.py deleted file mode 100644 index 0fce96a8d4..0000000000 --- a/erpnext/patches/v8_1/add_hsn_sac_codes.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext.regional.india.setup import setup - -def execute(): - company = frappe.get_all('Company', filters = {'country': 'India'}) - if not company: - return - - # call setup for india - setup(patch=True) \ No newline at end of file diff --git a/erpnext/patches/v8_1/add_indexes_in_transaction_doctypes.py b/erpnext/patches/v8_1/add_indexes_in_transaction_doctypes.py deleted file mode 100644 index 4631602606..0000000000 --- a/erpnext/patches/v8_1/add_indexes_in_transaction_doctypes.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 - -def execute(): - for dt in ("Sales Order Item", "Purchase Order Item", - "Material Request Item", "Work Order Item", "Packed Item"): - frappe.get_doc("DocType", dt).run_module_method("on_doctype_update") \ No newline at end of file diff --git a/erpnext/patches/v8_1/allow_invoice_copy_to_edit_after_submit.py b/erpnext/patches/v8_1/allow_invoice_copy_to_edit_after_submit.py deleted file mode 100644 index 4c606af424..0000000000 --- a/erpnext/patches/v8_1/allow_invoice_copy_to_edit_after_submit.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - inv_copy_options = "ORIGINAL FOR RECIPIENT\nDUPLICATE FOR TRANSPORTER\nDUPLICATE FOR SUPPLIER\nTRIPLICATE FOR SUPPLIER" - - frappe.db.sql("""update `tabCustom Field` set allow_on_submit=1, options=%s - where fieldname='invoice_copy' and dt = 'Sales Invoice' - """, inv_copy_options) - - frappe.db.sql("""update `tabCustom Field` set read_only=1 - where fieldname='gst_state_number' and dt = 'Address' - """) diff --git a/erpnext/patches/v8_1/delete_deprecated_reports.py b/erpnext/patches/v8_1/delete_deprecated_reports.py deleted file mode 100644 index 3e0fdee719..0000000000 --- a/erpnext/patches/v8_1/delete_deprecated_reports.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - """ delete deprecated reports """ - - reports = [ - "Monthly Salary Register", "Customer Addresses And Contacts", - "Supplier Addresses And Contacts" - ] - - for report in reports: - if frappe.db.exists("Report", report): - check_and_update_auto_email_report(report) - frappe.db.commit() - - frappe.delete_doc("Report", report, ignore_permissions=True) - -def check_and_update_auto_email_report(report): - """ delete or update auto email report for deprecated report """ - - auto_email_report = frappe.db.get_value("Auto Email Report", {"report": report}) - if not auto_email_report: - return - - if report == "Monthly Salary Register": - frappe.delete_doc("Auto Email Report", auto_email_report) - - elif report in ["Customer Addresses And Contacts", "Supplier Addresses And Contacts"]: - frappe.db.set_value("Auto Email Report", auto_email_report, "report", report) \ No newline at end of file diff --git a/erpnext/patches/v8_1/gst_fixes.py b/erpnext/patches/v8_1/gst_fixes.py deleted file mode 100644 index 34255eb0a4..0000000000 --- a/erpnext/patches/v8_1/gst_fixes.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.custom.doctype.custom_field.custom_field import create_custom_field -from erpnext.regional.address_template.setup import set_up_address_templates - - -def execute(): - company = frappe.get_all('Company', filters = {'country': 'India'}) - if not company: - return - - update_existing_custom_fields() - add_custom_fields() - set_up_address_templates(default_country='India') - frappe.reload_doc("regional", "print_format", "gst_tax_invoice") - - -def update_existing_custom_fields(): - frappe.db.sql("""update `tabCustom Field` set label = 'HSN/SAC' - where fieldname='gst_hsn_code' and label='GST HSN Code' - """) - - frappe.db.sql("""update `tabCustom Field` set print_hide = 1 - where fieldname in ('customer_gstin', 'supplier_gstin', 'company_gstin') - """) - - frappe.db.sql("""update `tabCustom Field` set insert_after = 'address_display' - where fieldname in ('customer_gstin', 'supplier_gstin') - """) - - frappe.db.sql("""update `tabCustom Field` set insert_after = 'company_address_display' - where fieldname = 'company_gstin' - """) - - frappe.db.sql("""update `tabCustom Field` set insert_after = 'description' - where fieldname='gst_hsn_code' and dt in ('Sales Invoice Item', 'Purchase Invoice Item') - """) - - -def add_custom_fields(): - hsn_sac_field = dict(fieldname='gst_hsn_code', label='HSN/SAC', - fieldtype='Data', options='item_code.gst_hsn_code', insert_after='description') - - custom_fields = { - 'Address': [ - dict(fieldname='gst_state_number', label='GST State Number', - fieldtype='Int', insert_after='gst_state'), - ], - 'Sales Invoice': [ - dict(fieldname='invoice_copy', label='Invoice Copy', - fieldtype='Select', insert_after='project', print_hide=1, allow_on_submit=1, - options='ORIGINAL FOR RECIPIENT\nDUPLICATE FOR TRANSPORTER\nTRIPLICATE FOR SUPPLIER'), - ], - 'Sales Order Item': [hsn_sac_field], - 'Delivery Note Item': [hsn_sac_field], - 'Purchase Order Item': [hsn_sac_field], - 'Purchase Receipt Item': [hsn_sac_field] - } - - for doctype, fields in custom_fields.items(): - for df in fields: - create_custom_field(doctype, df) diff --git a/erpnext/patches/v8_1/remove_sales_invoice_from_returned_serial_no.py b/erpnext/patches/v8_1/remove_sales_invoice_from_returned_serial_no.py deleted file mode 100644 index 3962f8f1f2..0000000000 --- a/erpnext/patches/v8_1/remove_sales_invoice_from_returned_serial_no.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Serial No") - - frappe.db.sql(""" - update - `tabSerial No` - set - sales_invoice = NULL - where - sales_invoice in (select return_against from - `tabSales Invoice` where docstatus =1 and is_return=1) - and sales_invoice is not null and sales_invoice !='' """) \ No newline at end of file diff --git a/erpnext/patches/v8_1/removed_report_support_hours.py b/erpnext/patches/v8_1/removed_report_support_hours.py deleted file mode 100644 index 0936b2231b..0000000000 --- a/erpnext/patches/v8_1/removed_report_support_hours.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql(""" update `tabAuto Email Report` set report = %s - where name = %s""", ('Support Hour Distribution', 'Support Hours')) - - frappe.db.sql(""" update `tabCustom Role` set report = %s - where report = %s""", ('Support Hour Distribution', 'Support Hours')) - - frappe.delete_doc('Report', 'Support Hours') \ No newline at end of file diff --git a/erpnext/patches/v8_1/set_delivery_date_in_so_item.py b/erpnext/patches/v8_1/set_delivery_date_in_so_item.py deleted file mode 100644 index af2d28b857..0000000000 --- a/erpnext/patches/v8_1/set_delivery_date_in_so_item.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Sales Order") - frappe.reload_doctype("Sales Order Item") - - if "final_delivery_date" in frappe.db.get_table_columns("Sales Order"): - frappe.db.sql(""" - update `tabSales Order` - set delivery_date = final_delivery_date - where (delivery_date is null or delivery_date = '0000-00-00') - and order_type = 'Sales'""") - - frappe.db.sql(""" - update `tabSales Order` so, `tabSales Order Item` so_item - set so_item.delivery_date = so.delivery_date - where so.name = so_item.parent - and so.order_type = 'Sales' - and (so_item.delivery_date is null or so_item.delivery_date = '0000-00-00') - and (so.delivery_date is not null and so.delivery_date != '0000-00-00') - """) \ No newline at end of file diff --git a/erpnext/patches/v8_1/update_expense_claim_status.py b/erpnext/patches/v8_1/update_expense_claim_status.py deleted file mode 100644 index 4c1b85a13f..0000000000 --- a/erpnext/patches/v8_1/update_expense_claim_status.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('Expense Claim') - - for data in frappe.db.sql(""" select name from `tabExpense Claim` - where (docstatus=1 and total_sanctioned_amount=0 and status = 'Paid') or - (docstatus = 1 and approval_status = 'Rejected' and total_sanctioned_amount > 0)""", as_dict=1): - doc = frappe.get_doc('Expense Claim', data.name) - if doc.approval_status == 'Rejected': - for d in doc.expenses: - d.db_set("sanctioned_amount", 0, update_modified = False) - doc.db_set("total_sanctioned_amount", 0, update_modified = False) - - frappe.db.sql(""" delete from `tabGL Entry` where voucher_type = 'Expense Claim' - and voucher_no = %s""", (doc.name)) - - doc.set_status() - doc.db_set("status", doc.status, update_modified = False) \ No newline at end of file diff --git a/erpnext/patches/v8_1/update_gst_state.py b/erpnext/patches/v8_1/update_gst_state.py deleted file mode 100644 index 7aaf2d5ff3..0000000000 --- a/erpnext/patches/v8_1/update_gst_state.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext.regional.india import states - -def execute(): - company = frappe.get_all('Company', filters = {'country': 'India'}) - if not company: - return - - if not frappe.db.get_value("Custom Field", filters={'fieldname':'gst_state'}): - return - - frappe.db.sql("update `tabCustom Field` set options=%s where fieldname='gst_state'", '\n'.join(states)) - frappe.db.sql("update `tabAddress` set gst_state='Chhattisgarh' where gst_state='Chattisgarh'") - frappe.db.sql("update `tabAddress` set gst_state_number='05' where gst_state='Uttarakhand'") diff --git a/erpnext/patches/v8_10/__init__.py b/erpnext/patches/v8_10/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py deleted file mode 100644 index 992be17da0..0000000000 --- a/erpnext/patches/v8_10/change_default_customer_credit_days.py +++ /dev/null @@ -1,89 +0,0 @@ -from __future__ import unicode_literals -import frappe - - -def execute(): - frappe.reload_doc("selling", "doctype", "customer") - frappe.reload_doc("buying", "doctype", "supplier") - frappe.reload_doc("setup", "doctype", "supplier_type") - frappe.reload_doc("accounts", "doctype", "payment_term") - frappe.reload_doc("accounts", "doctype", "payment_terms_template_detail") - frappe.reload_doc("accounts", "doctype", "payment_terms_template") - - payment_terms = [] - records = [] - for doctype in ("Customer", "Supplier", "Supplier Type"): - credit_days = frappe.db.sql(""" - SELECT DISTINCT `credit_days`, `credit_days_based_on`, `name` - from `tab{0}` - where - ((credit_days_based_on='Fixed Days' or credit_days_based_on is null) - and credit_days is not null) - or credit_days_based_on='Last Day of the Next Month' - """.format(doctype)) - - credit_records = ((record[0], record[1], record[2]) for record in credit_days) - for days, based_on, party_name in credit_records: - if based_on == "Fixed Days": - pyt_template_name = 'Default Payment Term - N{0}'.format(days) - else: - pyt_template_name = 'Default Payment Term - EO2M' - - if not frappe.db.exists("Payment Terms Template", pyt_template_name): - payment_term = make_payment_term(days, based_on) - template = make_template(payment_term) - else: - template = frappe.get_doc("Payment Terms Template", pyt_template_name) - - payment_terms.append('WHEN `name`={0} THEN {1}'.format(frappe.db.escape(party_name), template.template_name)) - records.append(frappe.db.escape(party_name)) - - begin_query_str = "UPDATE `tab{0}` SET `payment_terms` = CASE ".format(doctype) - value_query_str = " ".join(payment_terms) - cond_query_str = " ELSE `payment_terms` END WHERE " - - if records: - frappe.db.sql( - begin_query_str + value_query_str + cond_query_str + '`name` IN %s', - (records,) - ) - - -def make_template(payment_term): - doc = frappe.new_doc('Payment Terms Template Detail') - doc.payment_term = payment_term.payment_term_name - doc.due_date_based_on = payment_term.due_date_based_on - doc.invoice_portion = payment_term.invoice_portion - doc.description = payment_term.description - doc.credit_days = payment_term.credit_days - doc.credit_months = payment_term.credit_months - - template = frappe.new_doc('Payment Terms Template') - template.template_name = 'Default Payment Term - {0}'.format(payment_term.payment_term_name) - template.append('terms', doc) - template.save() - - return template - - -def make_payment_term(days, based_on): - based_on_map = { - 'Fixed Days': 'Day(s) after invoice date', - 'Last Day of the Next Month': 'Month(s) after the end of the invoice month' - } - - doc = frappe.new_doc('Payment Term') - doc.due_date_based_on = based_on_map.get(based_on) - doc.invoice_portion = 100 - - if based_on == 'Fixed Days': - doc.credit_days = days - doc.description = 'Net payable within {0} days'.format(days) - doc.payment_term_name = 'N{0}'.format(days) - else: - doc.credit_months = 1 - doc.description = 'Net payable by the end of next month' - doc.payment_term_name = 'EO2M' - - doc.save() - return doc diff --git a/erpnext/patches/v8_3/__init__.py b/erpnext/patches/v8_3/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v8_3/set_restrict_to_domain_for_module_def.py b/erpnext/patches/v8_3/set_restrict_to_domain_for_module_def.py deleted file mode 100644 index 6c4c6d5bd8..0000000000 --- a/erpnext/patches/v8_3/set_restrict_to_domain_for_module_def.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - """ set the restrict to domain in module def """ - pass \ No newline at end of file diff --git a/erpnext/patches/v8_3/update_company_total_sales.py b/erpnext/patches/v8_3/update_company_total_sales.py deleted file mode 100644 index 78efecb387..0000000000 --- a/erpnext/patches/v8_3/update_company_total_sales.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from erpnext.setup.doctype.company.company import update_company_current_month_sales, update_company_monthly_sales - -def execute(): - '''Update company monthly sales history based on sales invoices''' - frappe.reload_doctype("Company") - companies = [d['name'] for d in frappe.get_list("Company")] - - for company in companies: - update_company_current_month_sales(company) - update_company_monthly_sales(company) diff --git a/erpnext/patches/v8_4/__init__.py b/erpnext/patches/v8_4/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v8_4/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v8_4/make_scorecard_records.py b/erpnext/patches/v8_4/make_scorecard_records.py deleted file mode 100644 index 73afa277b4..0000000000 --- a/erpnext/patches/v8_4/make_scorecard_records.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -from erpnext.buying.doctype.supplier_scorecard.supplier_scorecard import make_default_records -def execute(): - frappe.reload_doc('buying', 'doctype', 'supplier_scorecard_variable') - frappe.reload_doc('buying', 'doctype', 'supplier_scorecard_standing') - make_default_records() \ No newline at end of file diff --git a/erpnext/patches/v8_5/__init__.py b/erpnext/patches/v8_5/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v8_5/fix_tax_breakup_for_non_invoice_docs.py b/erpnext/patches/v8_5/fix_tax_breakup_for_non_invoice_docs.py deleted file mode 100644 index 82beba3770..0000000000 --- a/erpnext/patches/v8_5/fix_tax_breakup_for_non_invoice_docs.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import unicode_literals -import frappe -from erpnext.regional.india.setup import make_custom_fields -from erpnext.controllers.taxes_and_totals import get_itemised_tax_breakup_html - -def execute(): - companies = [d.name for d in frappe.get_all('Company', filters = {'country': 'India'})] - if not companies: - return - - make_custom_fields() - - # update invoice copy value - values = ["Original for Recipient", "Duplicate for Transporter", - "Duplicate for Supplier", "Triplicate for Supplier"] - for d in values: - frappe.db.sql("update `tabSales Invoice` set invoice_copy=%s where invoice_copy=%s", (d, d)) - - # update tax breakup in transactions made after 1st July 2017 - doctypes = ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice", - "Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"] - - for doctype in doctypes: - frappe.reload_doctype(doctype) - - date_field = "posting_date" - if doctype in ["Quotation", "Sales Order", "Supplier Quotation", "Purchase Order"]: - date_field = "transaction_date" - - records = [d.name for d in frappe.get_all(doctype, filters={ - "docstatus": ["!=", 2], - date_field: [">=", "2017-07-01"], - "company": ["in", companies], - "total_taxes_and_charges": [">", 0], - "other_charges_calculation": "" - })] - if records: - frappe.db.sql(""" - update `tab%s Item` dt_item - set gst_hsn_code = (select gst_hsn_code from tabItem where name=dt_item.item_code) - where parent in (%s) - and (gst_hsn_code is null or gst_hsn_code = '') - """ % (doctype, ', '.join(['%s']*len(records))), tuple(records)) - - for record in records: - doc = frappe.get_doc(doctype, record) - html = get_itemised_tax_breakup_html(doc) - doc.db_set("other_charges_calculation", html, update_modified=False) \ No newline at end of file diff --git a/erpnext/patches/v8_5/remove_project_type_property_setter.py b/erpnext/patches/v8_5/remove_project_type_property_setter.py deleted file mode 100644 index 70a08f5377..0000000000 --- a/erpnext/patches/v8_5/remove_project_type_property_setter.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - ps = frappe.db.get_value('Property Setter', dict(doc_type='Project', field_name='project_type', - property='options')) - if ps: - frappe.delete_doc('Property Setter', ps) - - project_types = frappe.db.sql_list('select distinct project_type from tabProject') - - for project_type in project_types: - if project_type and not frappe.db.exists("Project Type", project_type): - p_type = frappe.get_doc({ - "doctype": "Project Type", - "project_type": project_type - }) - p_type.insert() \ No newline at end of file diff --git a/erpnext/patches/v8_5/remove_quotations_route_in_sidebar.py b/erpnext/patches/v8_5/remove_quotations_route_in_sidebar.py deleted file mode 100644 index 2d7df4a179..0000000000 --- a/erpnext/patches/v8_5/remove_quotations_route_in_sidebar.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Portal Settings") - - frappe.db.sql(""" - delete from - `tabPortal Menu Item` - where - (route = '/quotations' and title = 'Supplier Quotation') - or (route = '/quotation' and title = 'Quotations') - """) \ No newline at end of file diff --git a/erpnext/patches/v8_5/set_default_mode_of_payment.py b/erpnext/patches/v8_5/set_default_mode_of_payment.py deleted file mode 100644 index 34ecbb0a3c..0000000000 --- a/erpnext/patches/v8_5/set_default_mode_of_payment.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("POS Profile") - frappe.reload_doctype("Sales Invoice Payment") - - frappe.db.sql(""" - update - `tabSales Invoice Payment` - set `tabSales Invoice Payment`.default = 1 - where - `tabSales Invoice Payment`.parenttype = 'POS Profile' - and `tabSales Invoice Payment`.idx=1""") \ No newline at end of file diff --git a/erpnext/patches/v8_5/update_customer_group_in_POS_profile.py b/erpnext/patches/v8_5/update_customer_group_in_POS_profile.py deleted file mode 100644 index 2661914401..0000000000 --- a/erpnext/patches/v8_5/update_customer_group_in_POS_profile.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('POS Profile') - customer_group = frappe.db.get_single_value('Selling Settings', 'customer_group') - if customer_group: - frappe.db.sql(""" update `tabPOS Profile` - set customer_group = %s where customer_group is null """, (customer_group)) \ No newline at end of file diff --git a/erpnext/patches/v8_5/update_existing_data_in_project_type.py b/erpnext/patches/v8_5/update_existing_data_in_project_type.py deleted file mode 100644 index 497da0602e..0000000000 --- a/erpnext/patches/v8_5/update_existing_data_in_project_type.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("projects", "doctype", "project_type") - frappe.reload_doc("projects", "doctype", "project") - - project_types = ["Internal", "External", "Other"] - - for project_type in project_types: - if not frappe.db.exists("Project Type", project_type): - p_type = frappe.get_doc({ - "doctype": "Project Type", - "project_type": project_type - }) - p_type.insert() \ No newline at end of file diff --git a/erpnext/patches/v8_6/__init__.py b/erpnext/patches/v8_6/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v8_6/point_sms_doctype_module_to_frappe_core.py b/erpnext/patches/v8_6/point_sms_doctype_module_to_frappe_core.py deleted file mode 100644 index 014a74abe3..0000000000 --- a/erpnext/patches/v8_6/point_sms_doctype_module_to_frappe_core.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql('''UPDATE `tabDocType` SET module="Core" - WHERE name IN ("SMS Parameter", "SMS Settings");''') \ No newline at end of file diff --git a/erpnext/patches/v8_6/rename_bom_update_tool.py b/erpnext/patches/v8_6/rename_bom_update_tool.py deleted file mode 100644 index ef5f335e45..0000000000 --- a/erpnext/patches/v8_6/rename_bom_update_tool.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.delete_doc_if_exists("DocType", "BOM Replace Tool") - - frappe.reload_doctype("BOM") - frappe.db.sql("update tabBOM set conversion_rate=1 where conversion_rate is null or conversion_rate=0") - frappe.db.sql("update tabBOM set set_rate_of_sub_assembly_item_based_on_bom=1") \ No newline at end of file diff --git a/erpnext/patches/v8_6/set_write_permission_for_quotation_for_sales_manager.py b/erpnext/patches/v8_6/set_write_permission_for_quotation_for_sales_manager.py deleted file mode 100644 index db4f94748e..0000000000 --- a/erpnext/patches/v8_6/set_write_permission_for_quotation_for_sales_manager.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - # Set write permission to permlevel 1 for sales manager role in Quotation doctype - frappe.db.sql(""" update `tabCustom DocPerm` set `tabCustom DocPerm`.write = 1 - where `tabCustom DocPerm`.parent = 'Quotation' and `tabCustom DocPerm`.role = 'Sales Manager' - and `tabCustom DocPerm`.permlevel = 1 """) \ No newline at end of file diff --git a/erpnext/patches/v8_6/update_timesheet_company_from_PO.py b/erpnext/patches/v8_6/update_timesheet_company_from_PO.py deleted file mode 100644 index 2d46bee7ca..0000000000 --- a/erpnext/patches/v8_6/update_timesheet_company_from_PO.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('Timesheet') - company = frappe.get_all('Company') - - #Check more than one company exists - if len(company) > 1: - frappe.db.sql(""" update `tabTimesheet` set `tabTimesheet`.company = - (select company from `tabWork Order` where name = `tabTimesheet`.work_order) - where workn_order is not null and work_order !=''""") \ No newline at end of file diff --git a/erpnext/patches/v8_7/__init__.py b/erpnext/patches/v8_7/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v8_7/fix_purchase_receipt_status.py b/erpnext/patches/v8_7/fix_purchase_receipt_status.py deleted file mode 100644 index 99ecb44214..0000000000 --- a/erpnext/patches/v8_7/fix_purchase_receipt_status.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - # there is no more status called "Submitted", there was an old issue that used - # to set it as Submitted, fixed in this commit - frappe.db.sql(""" - update - `tabPurchase Receipt` - set - status = 'To Bill' - where - status = 'Submitted'""") \ No newline at end of file diff --git a/erpnext/patches/v8_7/make_subscription_from_recurring_data.py b/erpnext/patches/v8_7/make_subscription_from_recurring_data.py deleted file mode 100644 index 2932749116..0000000000 --- a/erpnext/patches/v8_7/make_subscription_from_recurring_data.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe.utils import today - -def execute(): - frappe.reload_doc('accounts', 'doctype', 'subscription') - frappe.reload_doc('selling', 'doctype', 'sales_order') - frappe.reload_doc('selling', 'doctype', 'quotation') - frappe.reload_doc('buying', 'doctype', 'purchase_order') - frappe.reload_doc('buying', 'doctype', 'supplier_quotation') - frappe.reload_doc('accounts', 'doctype', 'sales_invoice') - frappe.reload_doc('accounts', 'doctype', 'purchase_invoice') - frappe.reload_doc('stock', 'doctype', 'purchase_receipt') - frappe.reload_doc('stock', 'doctype', 'delivery_note') - frappe.reload_doc('accounts', 'doctype', 'journal_entry') - frappe.reload_doc('accounts', 'doctype', 'payment_entry') - - for doctype in ['Sales Order', 'Sales Invoice', 'Purchase Order', 'Purchase Invoice']: - date_field = "transaction_date" - if doctype in ("Sales Invoice", "Purchase Invoice"): - date_field = "posting_date" - - for data in get_data(doctype, date_field): - make_subscription(doctype, data, date_field) - -def get_data(doctype, date_field): - return frappe.db.sql(""" select name, from_date, end_date, recurring_type, recurring_id, - next_date, notify_by_email, notification_email_address, recurring_print_format, - repeat_on_day_of_month, submit_on_creation, docstatus, {0} - from `tab{1}` where is_recurring = 1 and next_date >= %s and docstatus < 2 - order by next_date desc - """.format(date_field, doctype), today(), as_dict=1) - -def make_subscription(doctype, data, date_field): - if data.name == data.recurring_id: - start_date = data.get(date_field) - else: - start_date = frappe.db.get_value(doctype, data.recurring_id, date_field) - - doc = frappe.get_doc({ - 'doctype': 'Subscription', - 'reference_doctype': doctype, - 'reference_document': data.recurring_id, - 'start_date': start_date, - 'end_date': data.end_date, - 'frequency': data.recurring_type, - 'repeat_on_day': data.repeat_on_day_of_month, - 'notify_by_email': data.notify_by_email, - 'recipients': data.notification_email_address, - 'next_schedule_date': data.next_date, - 'submit_on_creation': data.submit_on_creation - }).insert(ignore_permissions=True) - - if data.docstatus == 1: - doc.submit() \ No newline at end of file diff --git a/erpnext/patches/v8_8/__init__.py b/erpnext/patches/v8_8/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v8_8/add_new_fields_in_accounts_settings.py b/erpnext/patches/v8_8/add_new_fields_in_accounts_settings.py deleted file mode 100644 index bd25f15d78..0000000000 --- a/erpnext/patches/v8_8/add_new_fields_in_accounts_settings.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - - -def execute(): - frappe.db.sql( - "INSERT INTO `tabSingles` (`doctype`, `field`, `value`) VALUES ('Accounts Settings', 'allow_stale', '1'), " - "('Accounts Settings', 'stale_days', '1')" - ) diff --git a/erpnext/patches/v8_8/set_bom_rate_as_per_uom.py b/erpnext/patches/v8_8/set_bom_rate_as_per_uom.py deleted file mode 100644 index 5b169cdff2..0000000000 --- a/erpnext/patches/v8_8/set_bom_rate_as_per_uom.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.db.sql(""" - update `tabBOM Item` - set rate = rate * conversion_factor - where uom != stock_uom and docstatus < 2 - and conversion_factor not in (0, 1) - """) \ No newline at end of file diff --git a/erpnext/patches/v8_9/__init__.py b/erpnext/patches/v8_9/__init__.py deleted file mode 100644 index 8b13789179..0000000000 --- a/erpnext/patches/v8_9/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/erpnext/patches/v8_9/add_setup_progress_actions.py b/erpnext/patches/v8_9/add_setup_progress_actions.py deleted file mode 100644 index 77501073cf..0000000000 --- a/erpnext/patches/v8_9/add_setup_progress_actions.py +++ /dev/null @@ -1,47 +0,0 @@ - -from __future__ import unicode_literals -import frappe -from frappe import _ - -def execute(): - """Add setup progress actions""" - if not frappe.db.exists('DocType', 'Setup Progress') or not frappe.db.exists('DocType', 'Setup Progress Action'): - return - - frappe.reload_doc("setup", "doctype", "setup_progress") - frappe.reload_doc("setup", "doctype", "setup_progress_action") - - actions = [ - {"action_name": "Add Company", "action_doctype": "Company", "min_doc_count": 1, "is_completed": 1, - "domains": '[]' }, - {"action_name": "Set Sales Target", "action_doctype": "Company", "min_doc_count": 99, - "action_document": frappe.defaults.get_defaults().get("company") or '', - "action_field": "monthly_sales_target", "is_completed": 0, - "domains": '["Manufacturing", "Services", "Retail", "Distribution"]' }, - {"action_name": "Add Customers", "action_doctype": "Customer", "min_doc_count": 1, "is_completed": 0, - "domains": '["Manufacturing", "Services", "Retail", "Distribution"]' }, - {"action_name": "Add Suppliers", "action_doctype": "Supplier", "min_doc_count": 1, "is_completed": 0, - "domains": '["Manufacturing", "Services", "Retail", "Distribution"]' }, - {"action_name": "Add Products", "action_doctype": "Item", "min_doc_count": 1, "is_completed": 0, - "domains": '["Manufacturing", "Services", "Retail", "Distribution"]' }, - {"action_name": "Add Programs", "action_doctype": "Program", "min_doc_count": 1, "is_completed": 0, - "domains": '["Education"]' }, - {"action_name": "Add Instructors", "action_doctype": "Instructor", "min_doc_count": 1, "is_completed": 0, - "domains": '["Education"]' }, - {"action_name": "Add Courses", "action_doctype": "Course", "min_doc_count": 1, "is_completed": 0, - "domains": '["Education"]' }, - {"action_name": "Add Rooms", "action_doctype": "Room", "min_doc_count": 1, "is_completed": 0, - "domains": '["Education"]' }, - {"action_name": "Add Users", "action_doctype": "User", "min_doc_count": 4, "is_completed": 0, - "domains": '[]' }, - {"action_name": "Add Letterhead", "action_doctype": "Letter Head", "min_doc_count": 1, "is_completed": 0, - "domains": '[]' } - ] - - setup_progress = frappe.get_doc("Setup Progress", "Setup Progress") - setup_progress.actions = [] - for action in actions: - setup_progress.append("actions", action) - - setup_progress.save(ignore_permissions=True) - diff --git a/erpnext/patches/v8_9/delete_gst_doctypes_for_outside_india_accounts.py b/erpnext/patches/v8_9/delete_gst_doctypes_for_outside_india_accounts.py deleted file mode 100644 index f67af90555..0000000000 --- a/erpnext/patches/v8_9/delete_gst_doctypes_for_outside_india_accounts.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - company = frappe.get_all('Company', filters = {'country': 'India'}) - if not company: - if frappe.db.exists("DocType", "GST Settings"): - frappe.delete_doc("DocType", "GST Settings") - frappe.delete_doc("DocType", "GST HSN Code") - - for report_name in ('GST Sales Register', 'GST Purchase Register', - 'GST Itemised Sales Register', 'GST Itemised Purchase Register'): - - frappe.delete_doc('Report', report_name) \ No newline at end of file diff --git a/erpnext/patches/v8_9/remove_employee_from_salary_structure_parent.py b/erpnext/patches/v8_9/remove_employee_from_salary_structure_parent.py deleted file mode 100644 index 808ae6d527..0000000000 --- a/erpnext/patches/v8_9/remove_employee_from_salary_structure_parent.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if 'employee' in frappe.db.get_table_columns("Salary Structure"): - frappe.db.sql("alter table `tabSalary Structure` drop column employee") diff --git a/erpnext/patches/v8_9/rename_company_sales_target_field.py b/erpnext/patches/v8_9/rename_company_sales_target_field.py deleted file mode 100644 index 5433eb673e..0000000000 --- a/erpnext/patches/v8_9/rename_company_sales_target_field.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - frappe.reload_doc("setup", "doctype", "company") - if frappe.db.has_column('Company', 'sales_target'): - rename_field("Company", "sales_target", "monthly_sales_target") diff --git a/erpnext/patches/v8_9/set_default_customer_group.py b/erpnext/patches/v8_9/set_default_customer_group.py deleted file mode 100644 index cbbe09daf5..0000000000 --- a/erpnext/patches/v8_9/set_default_customer_group.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - selling_settings = frappe.get_single('Selling Settings') - selling_settings.set_default_customer_group_and_territory() - selling_settings.flags.ignore_mandatory = True - selling_settings.save() diff --git a/erpnext/patches/v8_9/set_default_fields_in_variant_settings.py b/erpnext/patches/v8_9/set_default_fields_in_variant_settings.py deleted file mode 100644 index a550d093fa..0000000000 --- a/erpnext/patches/v8_9/set_default_fields_in_variant_settings.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('stock', 'doctype', 'item_variant_settings') - frappe.reload_doc('stock', 'doctype', 'variant_field') - - doc = frappe.get_doc('Item Variant Settings') - doc.set_default_fields() - doc.save() \ No newline at end of file diff --git a/erpnext/patches/v8_9/set_member_party_type.py b/erpnext/patches/v8_9/set_member_party_type.py deleted file mode 100644 index 33bbc11a93..0000000000 --- a/erpnext/patches/v8_9/set_member_party_type.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if not frappe.db.exists("Party Type", "Member"): - frappe.reload_doc("non_profit", "doctype", "member") - party = frappe.new_doc("Party Type") - party.party_type = "Member" - party.save() diff --git a/erpnext/patches/v8_9/set_print_zero_amount_taxes.py b/erpnext/patches/v8_9/set_print_zero_amount_taxes.py deleted file mode 100644 index 3c508eaa09..0000000000 --- a/erpnext/patches/v8_9/set_print_zero_amount_taxes.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -from erpnext.setup.install import create_print_zero_amount_taxes_custom_field - -def execute(): - frappe.reload_doc('printing', 'doctype', 'print_style') - frappe.reload_doc('printing', 'doctype', 'print_settings') - create_print_zero_amount_taxes_custom_field() \ No newline at end of file diff --git a/erpnext/patches/v8_9/update_billing_gstin_for_indian_account.py b/erpnext/patches/v8_9/update_billing_gstin_for_indian_account.py deleted file mode 100644 index 24e20409c1..0000000000 --- a/erpnext/patches/v8_9/update_billing_gstin_for_indian_account.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - company = frappe.get_all('Company', filters = {'country': 'India'}) - - if company: - for doctype in ['Sales Invoice', 'Delivery Note']: - frappe.db.sql(""" update `tab{0}` - set billing_address_gstin = (select gstin from `tabAddress` - where name = customer_address) - where customer_address is not null and customer_address != ''""".format(doctype)) \ No newline at end of file diff --git a/erpnext/patches/v9_0/__init__.py b/erpnext/patches/v9_0/__init__.py deleted file mode 100644 index baffc48825..0000000000 --- a/erpnext/patches/v9_0/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/patches/v9_0/add_healthcare_domain.py b/erpnext/patches/v9_0/add_healthcare_domain.py deleted file mode 100644 index 3c0433b9d4..0000000000 --- a/erpnext/patches/v9_0/add_healthcare_domain.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - domain = 'Healthcare' - if not frappe.db.exists('Domain', domain): - frappe.get_doc({ - 'doctype': 'Domain', - 'domain': domain - }).insert(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/patches/v9_0/add_user_to_child_table_in_pos_profile.py b/erpnext/patches/v9_0/add_user_to_child_table_in_pos_profile.py deleted file mode 100644 index 8a8c8064dd..0000000000 --- a/erpnext/patches/v9_0/add_user_to_child_table_in_pos_profile.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.table_exists("POS Profile User"): - frappe.reload_doc('accounts', 'doctype', 'pos_profile_user') - - frappe.db.sql(""" update `tabPOS Profile User`, - (select `tabPOS Profile User`.name from `tabPOS Profile User`, `tabPOS Profile` - where `tabPOS Profile`.name = `tabPOS Profile User`.parent - group by `tabPOS Profile User`.user, `tabPOS Profile`.company) as pfu - set - `tabPOS Profile User`.default = 1 - where `tabPOS Profile User`.name = pfu.name""") - else: - doctype = 'POS Profile' - frappe.reload_doc('accounts', 'doctype', doctype) - frappe.reload_doc('accounts', 'doctype', 'pos_profile_user') - frappe.reload_doc('accounts', 'doctype', 'pos_item_group') - frappe.reload_doc('accounts', 'doctype', 'pos_customer_group') - - for doc in frappe.get_all(doctype): - _doc = frappe.get_doc(doctype, doc.name) - user = frappe.db.get_value(doctype, doc.name, 'user') - - if not user: continue - - _doc.append('applicable_for_users', { - 'user': user, - 'default': 1 - }) - - _doc.flags.ignore_validate = True - _doc.flags.ignore_mandatory = True - _doc.save() \ No newline at end of file diff --git a/erpnext/patches/v9_0/copy_old_fees_field_data.py b/erpnext/patches/v9_0/copy_old_fees_field_data.py deleted file mode 100644 index 14278209c7..0000000000 --- a/erpnext/patches/v9_0/copy_old_fees_field_data.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - # 'Schools' module changed to the 'Education' - # frappe.reload_doc("schools", "doctype", "fees") - frappe.reload_doc("education", "doctype", "fees") - - if "total_amount" not in frappe.db.get_table_columns("Fees"): - return - - frappe.db.sql("""update tabFees set grand_total=total_amount where grand_total = 0.0""") \ No newline at end of file diff --git a/erpnext/patches/v9_0/remove_non_existing_warehouse_from_stock_settings.py b/erpnext/patches/v9_0/remove_non_existing_warehouse_from_stock_settings.py deleted file mode 100644 index c685bbc681..0000000000 --- a/erpnext/patches/v9_0/remove_non_existing_warehouse_from_stock_settings.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - default_warehouse = frappe.db.get_value("Stock Settings", None, "default_warehouse") - if default_warehouse: - if not frappe.db.get_value("Warehouse", {"name": default_warehouse}): - frappe.db.set_value("Stock Settings", None, "default_warehouse", "") \ No newline at end of file diff --git a/erpnext/patches/v9_0/remove_subscription_module.py b/erpnext/patches/v9_0/remove_subscription_module.py deleted file mode 100644 index 493873f3e8..0000000000 --- a/erpnext/patches/v9_0/remove_subscription_module.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.exists('Module Def', 'Subscription'): - frappe.db.sql(""" delete from `tabModule Def` where name = 'Subscription'""") \ No newline at end of file diff --git a/erpnext/patches/v9_0/revert_manufacturing_user_role.py b/erpnext/patches/v9_0/revert_manufacturing_user_role.py deleted file mode 100644 index f38b7f29ce..0000000000 --- a/erpnext/patches/v9_0/revert_manufacturing_user_role.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if 'Manufacturing' in frappe.get_active_domains(): return - - role = 'Manufacturing User' - frappe.db.set_value('Role', role, 'restrict_to_domain', '') - frappe.db.set_value('Role', role, 'disabled', 0) - - users = frappe.get_all('Has Role', filters = { - 'parenttype': 'User', - 'role': ('in', ['System Manager', 'Manufacturing Manager']) - }, fields=['parent'], as_list=1) - - for user in users: - _user = frappe.get_doc('User', user[0]) - _user.append('roles', { - 'role': role - }) - _user.flags.ignore_validate = True - _user.save() diff --git a/erpnext/patches/v9_0/set_pos_profile_name.py b/erpnext/patches/v9_0/set_pos_profile_name.py deleted file mode 100644 index a3a9735215..0000000000 --- a/erpnext/patches/v9_0/set_pos_profile_name.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - doctype = 'POS Profile' - frappe.reload_doctype(doctype) - - for pos in frappe.get_all(doctype, filters={'disabled': 0}): - doc = frappe.get_doc(doctype, pos.name) - - if not doc.user: continue - - try: - pos_profile_name = doc.user + ' - ' + doc.company - doc.flags.ignore_validate = True - doc.flags.ignore_mandatory = True - doc.save() - - frappe.rename_doc(doctype, doc.name, pos_profile_name, force=True) - except frappe.LinkValidationError: - frappe.db.set_value("POS Profile", doc.name, 'disabled', 1) diff --git a/erpnext/patches/v9_0/set_schedule_date_for_material_request_and_purchase_order.py b/erpnext/patches/v9_0/set_schedule_date_for_material_request_and_purchase_order.py deleted file mode 100644 index 3d012978fa..0000000000 --- a/erpnext/patches/v9_0/set_schedule_date_for_material_request_and_purchase_order.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - for doctype in ("Material Request", "Purchase Order"): - frappe.reload_doctype(doctype) - frappe.reload_doctype(doctype + " Item") - - if not frappe.db.has_column(doctype, "schedule_date"): - continue - - #Update only submitted MR - for record in frappe.get_all(doctype, filters= [["docstatus", "=", 1]], fields=["name"]): - doc = frappe.get_doc(doctype, record) - if doc.items: - if not doc.schedule_date: - schedule_dates = [d.schedule_date for d in doc.items if d.schedule_date] - if len(schedule_dates) > 0: - min_schedule_date = min(schedule_dates) - frappe.db.set_value(doctype, record, - "schedule_date", min_schedule_date, update_modified=False) \ No newline at end of file diff --git a/erpnext/patches/v9_0/set_shipping_type_for_existing_shipping_rules.py b/erpnext/patches/v9_0/set_shipping_type_for_existing_shipping_rules.py deleted file mode 100644 index 5092695b7d..0000000000 --- a/erpnext/patches/v9_0/set_shipping_type_for_existing_shipping_rules.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype("Shipping Rule") - - # default "calculate_based_on" - frappe.db.sql('''update `tabShipping Rule` - set calculate_based_on = "Net Weight" - where ifnull(calculate_based_on, '') = '' ''') - - # default "shipping_rule_type" - frappe.db.sql('''update `tabShipping Rule` - set shipping_rule_type = "Selling" - where ifnull(shipping_rule_type, '') = '' ''') diff --git a/erpnext/patches/v9_0/set_uoms_in_variant_field.py b/erpnext/patches/v9_0/set_uoms_in_variant_field.py deleted file mode 100644 index 9e783d99be..0000000000 --- a/erpnext/patches/v9_0/set_uoms_in_variant_field.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -import frappe - - -def execute(): - doc = frappe.get_doc('Item Variant Settings') - variant_field_names = [vf.field_name for vf in doc.fields] - if 'uoms' not in variant_field_names: - doc.append( - 'fields', { - 'field_name': 'uoms' - } - ) - doc.save() diff --git a/erpnext/patches/v9_0/set_variant_item_description.py b/erpnext/patches/v9_0/set_variant_item_description.py deleted file mode 100644 index 82d6148508..0000000000 --- a/erpnext/patches/v9_0/set_variant_item_description.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils import cstr - -def execute(): - ''' - Issue: - While copying data from template item to variant item, - the system appending description multiple times to the respective variant. - - Purpose: - Check variant description, - if variant have user defined description remove all system appended descriptions - else replace multiple system generated descriptions with single description - - Steps: - 1. Get all variant items - 2. Create system generated variant description - 3. If variant have user defined description, remove all system generated descriptions - 4. If variant description only contains system generated description, - replace multiple descriptions by new description. - ''' - for item in frappe.db.sql(""" select name from tabItem - where ifnull(variant_of, '') != '' """,as_dict=1): - variant = frappe.get_doc("Item", item.name) - temp_variant_description = '\n' - - if variant.attributes: - for d in variant.attributes: - temp_variant_description += "
" + d.attribute + ": " + cstr(d.attribute_value) + "
" - - variant_description = variant.description.replace(temp_variant_description, '').rstrip() - if variant_description: - splitted_desc = variant.description.strip().split(temp_variant_description) - - if len(splitted_desc) > 2: - if splitted_desc[0] == '': - variant_description = temp_variant_description + variant_description - elif splitted_desc[1] == '' or splitted_desc[1] == '\n': - variant_description += temp_variant_description - variant.db_set('description', variant_description, update_modified=False) - else: - variant.db_set('description', variant_description, update_modified=False) - - else: - variant.db_set('description', temp_variant_description, update_modified=False) \ No newline at end of file diff --git a/erpnext/patches/v9_0/student_admission_childtable_migrate.py b/erpnext/patches/v9_0/student_admission_childtable_migrate.py deleted file mode 100644 index a5712c76dc..0000000000 --- a/erpnext/patches/v9_0/student_admission_childtable_migrate.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - # 'Schools' module changed to the 'Education' - # frappe.reload_doc('schools', 'doctype', 'Student Admission Program') - # frappe.reload_doc('schools', 'doctype', 'student_admission') - frappe.reload_doc('education', 'doctype', 'Student Admission Program') - frappe.reload_doc('education', 'doctype', 'student_admission') - - if "program" not in frappe.db.get_table_columns("Student Admission"): - return - - student_admissions = frappe.get_all("Student Admission", fields=["name", "application_fee", \ - "naming_series_for_student_applicant", "program", "introduction", "eligibility"]) - for student_admission in student_admissions: - doc = frappe.get_doc("Student Admission", student_admission.name) - doc.append("program_details", { - "program": student_admission.get("program"), - "application_fee": student_admission.get("application_fee"), - "applicant_naming_series": student_admission.get("naming_series_for_student_applicant"), - }) - if student_admission.eligibility and student_admission.introduction: - doc.introduction = student_admission.introduction + "
" + \ - student_admission.eligibility + "
" - doc.flags.ignore_validate = True - doc.flags.ignore_mandatory = True - doc.save() diff --git a/erpnext/patches/v9_0/update_employee_loan_details.py b/erpnext/patches/v9_0/update_employee_loan_details.py deleted file mode 100644 index ef8d32855f..0000000000 --- a/erpnext/patches/v9_0/update_employee_loan_details.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc('Payroll', 'doctype', 'salary_slip_loan') - frappe.reload_doc('Payroll', 'doctype', 'salary_slip') - - for data in frappe.db.sql(""" select name, - start_date, end_date, total_loan_repayment - from - `tabSalary Slip` - where - docstatus < 2 and ifnull(total_loan_repayment, 0) > 0""", as_dict=1): - salary_slip = frappe.get_doc('Salary Slip', data.name) - salary_slip.set_loan_repayment() - - if salary_slip.total_loan_repayment == data.total_loan_repayment: - for row in salary_slip.loans: - row.db_update() - - salary_slip.db_update() diff --git a/erpnext/patches/v9_0/update_multi_uom_fields_in_material_request.py b/erpnext/patches/v9_0/update_multi_uom_fields_in_material_request.py deleted file mode 100644 index 45610ed5a7..0000000000 --- a/erpnext/patches/v9_0/update_multi_uom_fields_in_material_request.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doctype('Material Request') - frappe.reload_doctype('Material Request Item') - - frappe.db.sql(""" update `tabMaterial Request Item` - set stock_uom = uom, stock_qty = qty, conversion_factor = 1.0""") \ No newline at end of file diff --git a/erpnext/patches/v9_1/__init__.py b/erpnext/patches/v9_1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v9_1/create_issue_opportunity_type.py b/erpnext/patches/v9_1/create_issue_opportunity_type.py deleted file mode 100644 index aa8bbd1e79..0000000000 --- a/erpnext/patches/v9_1/create_issue_opportunity_type.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2017, Frappe and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe import _ - -def execute(): - # delete custom field if exists - for doctype, fieldname in (('Issue', 'issue_type'), ('Opportunity', 'opportunity_type')): - custom_field = frappe.db.get_value("Custom Field", {"fieldname": fieldname, 'dt': doctype}) - if custom_field: - frappe.delete_doc("Custom Field", custom_field, ignore_permissions=True) - - frappe.reload_doc('support', 'doctype', 'issue_type') - frappe.reload_doc('support', 'doctype', 'issue') - frappe.reload_doc('crm', 'doctype', 'opportunity_type') - frappe.reload_doc('crm', 'doctype', 'opportunity') - - # rename enquiry_type -> opportunity_type - from frappe.model.utils.rename_field import rename_field - rename_field('Opportunity', 'enquiry_type', 'opportunity_type') - - # create values if already set - for opts in (('Issue', 'issue_type', 'Issue Type'), - ('Opportunity', 'opportunity_type', 'Opportunity Type')): - for d in frappe.db.sql('select distinct {0} from `tab{1}`'.format(opts[1], opts[0])): - if d[0] and not frappe.db.exists(opts[2], d[0]): - frappe.get_doc(dict(doctype = opts[2], name=d[0])).insert() - - # fixtures - for name in ('Hub', _('Sales'), _('Support'), _('Maintenance')): - if not frappe.db.exists('Opportunity Type', name): - frappe.get_doc(dict(doctype = 'Opportunity Type', name=name)).insert() diff --git a/erpnext/patches/v9_2/__init__.py b/erpnext/patches/v9_2/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/patches/v9_2/delete_healthcare_domain_default_items.py b/erpnext/patches/v9_2/delete_healthcare_domain_default_items.py deleted file mode 100644 index 54ae18b8e2..0000000000 --- a/erpnext/patches/v9_2/delete_healthcare_domain_default_items.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.utils import getdate - -def execute(): - domain_settings = frappe.get_doc('Domain Settings') - active_domains = [d.domain for d in domain_settings.active_domains] - - if "Healthcare" not in active_domains: - items = ["TTT", "MCH", "LDL", "GTT", "HDL", "BILT", "BILD", "BP", "BS"] - for item_code in items: - try: - item = frappe.db.get_value("Item", {"item_code": item_code}, ["name", "creation"], as_dict=1) - if item and getdate(item.creation) >= getdate("2017-11-10"): - frappe.delete_doc("Item", item.name) - except: - pass \ No newline at end of file diff --git a/erpnext/patches/v9_2/delete_process_payroll.py b/erpnext/patches/v9_2/delete_process_payroll.py deleted file mode 100644 index 91c49f577f..0000000000 --- a/erpnext/patches/v9_2/delete_process_payroll.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.delete_doc("DocType", "Process Payroll") diff --git a/erpnext/patches/v9_2/remove_company_from_patient.py b/erpnext/patches/v9_2/remove_company_from_patient.py deleted file mode 100644 index 1a50088f23..0000000000 --- a/erpnext/patches/v9_2/remove_company_from_patient.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - if frappe.db.exists("DocType", "Patient"): - if 'company' in frappe.db.get_table_columns("Patient"): - frappe.db.sql("alter table `tabPatient` drop column company") diff --git a/erpnext/patches/v9_2/rename_net_weight_in_item_master.py b/erpnext/patches/v9_2/rename_net_weight_in_item_master.py deleted file mode 100644 index cad979deab..0000000000 --- a/erpnext/patches/v9_2/rename_net_weight_in_item_master.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe.model.utils.rename_field import rename_field - -def execute(): - frappe.reload_doc("stock", "doctype", "item") - if frappe.db.has_column('Item', 'net_weight'): - rename_field("Item", "net_weight", "weight_per_unit") diff --git a/erpnext/patches/v9_2/rename_translated_domains_in_en.py b/erpnext/patches/v9_2/rename_translated_domains_in_en.py deleted file mode 100644 index e5a9e2461f..0000000000 --- a/erpnext/patches/v9_2/rename_translated_domains_in_en.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import unicode_literals -import frappe -from frappe import _ -from frappe.model.rename_doc import rename_doc - -def execute(): - frappe.reload_doc('stock', 'doctype', 'item') - language = frappe.get_single("System Settings").language - - if language and language.startswith('en'): return - - frappe.local.lang = language - - all_domains = frappe.get_hooks("domains") - - for domain in all_domains: - translated_domain = _(domain, lang=language) - if frappe.db.exists("Domain", translated_domain): - #if domain already exists merged translated_domain and domain - merge = False - if frappe.db.exists("Domain", domain): - merge=True - - rename_doc("Domain", translated_domain, domain, ignore_permissions=True, merge=merge) - - domain_settings = frappe.get_single("Domain Settings") - active_domains = [d.domain for d in domain_settings.active_domains] - - try: - for domain in active_domains: - domain = frappe.get_doc("Domain", domain) - domain.setup_domain() - - if int(frappe.db.get_single_value('System Settings', 'setup_complete')): - domain.setup_sidebar_items() - domain.setup_desktop_icons() - domain.set_default_portal_role() - except frappe.LinkValidationError: - pass \ No newline at end of file diff --git a/erpnext/patches/v9_2/repost_reserved_qty_for_production.py b/erpnext/patches/v9_2/repost_reserved_qty_for_production.py deleted file mode 100644 index 040e655bd8..0000000000 --- a/erpnext/patches/v9_2/repost_reserved_qty_for_production.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - frappe.reload_doc("stock", "doctype", "bin") - bins = frappe.db.sql("select name from `tabBin` where reserved_qty_for_production > 0") - for d in bins: - bin_doc = frappe.get_doc("Bin", d[0]) - bin_doc.update_reserved_qty_for_production() diff --git a/erpnext/patches/v9_2/set_item_name_in_production_order.py b/erpnext/patches/v9_2/set_item_name_in_production_order.py deleted file mode 100644 index 1f490e62c8..0000000000 --- a/erpnext/patches/v9_2/set_item_name_in_production_order.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import unicode_literals -import frappe - -def execute(): - - frappe.db.sql(""" - update `tabBOM Item` bom, `tabWork Order Item` po_item - set po_item.item_name = bom.item_name, - po_item.description = bom.description - where po_item.item_code = bom.item_code - and (po_item.item_name is null or po_item.description is null) - """) From 3dfbfe87e9e67a3605cf6f92c05a63455fd1bff1 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 4 Jun 2021 11:47:09 +0530 Subject: [PATCH 39/53] chore: Drop < v10 patches from list v7 backup was restored and upgraded to latest v10.x.x branch. The patches run uptil the upgrade are removed in this change. This means only existing v10 sites are allowed direct upgrade to v13 and newer There are older version patches still left since they're being used in later ERPNext versions too. --- erpnext/patches.txt | 495 -------------------------------------------- 1 file changed, 495 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 93689a0ef3..ed6fefdd87 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -1,494 +1,19 @@ -execute:import unidecode # new requirement -erpnext.patches.v8_0.move_perpetual_inventory_setting -erpnext.patches.v8_9.set_print_zero_amount_taxes erpnext.patches.v12_0.update_is_cancelled_field erpnext.patches.v11_0.rename_production_order_to_work_order erpnext.patches.v11_0.refactor_naming_series erpnext.patches.v11_0.refactor_autoname_naming -erpnext.patches.v10_0.rename_schools_to_education -erpnext.patches.v4_0.validate_v3_patch -erpnext.patches.v4_0.fix_employee_user_id -erpnext.patches.v4_0.remove_employee_role_if_no_employee -erpnext.patches.v4_0.update_user_properties -erpnext.patches.v4_0.apply_user_permissions -erpnext.patches.v4_0.move_warehouse_user_to_restrictions -erpnext.patches.v4_0.global_defaults_to_system_settings -erpnext.patches.v4_0.update_incharge_name_to_sales_person_in_maintenance_schedule execute:frappe.reload_doc("accounts", "doctype", "POS Payment Method") #2020-05-28 execute:frappe.reload_doc("HR", "doctype", "HR Settings") #2020-01-16 #2020-07-24 -execute:frappe.reload_doc('stock', 'doctype', 'warehouse') # 2017-04-24 -execute:frappe.reload_doc('accounts', 'doctype', 'sales_invoice') # 2016-08-31 -execute:frappe.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-29 -execute:frappe.reload_doc('selling', 'doctype', 'quotation') # 2014-01-29 -execute:frappe.reload_doc('stock', 'doctype', 'delivery_note') # 2014-01-29 -erpnext.patches.v4_0.reload_sales_print_format -execute:frappe.reload_doc('accounts', 'doctype', 'purchase_invoice') # 2014-01-29 -execute:frappe.reload_doc('buying', 'doctype', 'purchase_order') # 2014-01-29 -execute:frappe.reload_doc('buying', 'doctype', 'supplier_quotation') # 2014-01-29 -execute:frappe.reload_doc('stock', 'doctype', 'purchase_receipt') # 2014-01-29 -execute:frappe.reload_doc('accounts', 'doctype', 'pos_setting') # 2014-01-29 -execute:frappe.reload_doc('selling', 'doctype', 'customer') # 2014-01-29 -execute:frappe.reload_doc('buying', 'doctype', 'supplier') # 2014-01-29 -execute:frappe.reload_doc('accounts', 'doctype', 'asset_category') -execute:frappe.reload_doc('accounts', 'doctype', 'pricing_rule') -erpnext.patches.v4_0.map_charge_to_taxes_and_charges -execute:frappe.reload_doc('support', 'doctype', 'newsletter') # 2014-01-31 -execute:frappe.reload_doc('hr', 'doctype', 'employee') # 2014-02-03 -execute:frappe.db.sql("update tabPage set module='Core' where name='Setup'") -erpnext.patches.v5_2.change_item_selects_to_checks -execute:frappe.reload_doctype('Item') -erpnext.patches.v4_0.fields_to_be_renamed -erpnext.patches.v4_0.rename_sitemap_to_route -erpnext.patches.v7_0.re_route #2016-06-27 -erpnext.patches.v4_0.fix_contact_address -erpnext.patches.v4_0.customer_discount_to_pricing_rule -execute:frappe.db.sql("""delete from `tabWebsite Item Group` where ifnull(item_group, '')=''""") -erpnext.patches.v4_0.remove_module_home_pages -erpnext.patches.v4_0.split_email_settings -erpnext.patches.v4_0.import_country_codes -erpnext.patches.v4_0.countrywise_coa -execute:frappe.delete_doc("DocType", "MIS Control") -execute:frappe.delete_doc("Page", "Financial Statements") -execute:frappe.delete_doc("DocType", "Stock Ledger") -execute:frappe.delete_doc("DocType", "Grade") -execute:frappe.db.sql("delete from `tabWebsite Item Group` where ifnull(item_group, '')=''") -execute:frappe.delete_doc("Print Format", "SalesInvoice") -execute:import frappe.defaults;frappe.defaults.clear_default("price_list_currency") -erpnext.patches.v4_0.update_account_root_type -execute:frappe.delete_doc("Report", "Purchase In Transit") -erpnext.patches.v4_0.new_address_template -execute:frappe.delete_doc("DocType", "SMS Control") -execute:frappe.delete_doc_if_exists("DocType", "Bulk SMS") #2015-08-18 -erpnext.patches.v4_0.fix_case_of_hr_module_def -erpnext.patches.v4_0.fix_address_template - -# WATCHOUT: This patch reload's documents -erpnext.patches.v4_0.reset_permissions_for_masters -erpnext.patches.v6_20x.rename_project_name_to_project #2016-03-14 - -erpnext.patches.v4_0.update_tax_amount_after_discount -execute:frappe.permissions.reset_perms("GL Entry") #2014-06-09 -execute:frappe.permissions.reset_perms("Stock Ledger Entry") #2014-06-09 -erpnext.patches.v4_0.create_custom_fields_for_india_specific_fields -erpnext.patches.v4_0.save_default_letterhead -erpnext.patches.v4_0.update_custom_print_formats_for_renamed_fields -erpnext.patches.v4_0.update_other_charges_in_custom_purchase_print_formats -erpnext.patches.v4_0.create_price_list_if_missing -execute:frappe.db.sql("update `tabItem` set end_of_life=null where end_of_life='0000-00-00'") #2014-06-16 -erpnext.patches.v4_0.update_users_report_view_settings -erpnext.patches.v4_0.set_pricing_rule_for_buying_or_selling -erpnext.patches.v4_1.set_outgoing_email_footer -erpnext.patches.v4_1.fix_sales_order_delivered_status -erpnext.patches.v4_1.fix_delivery_and_billing_status -execute:frappe.db.sql("update `tabAccount` set root_type='Liability' where root_type='Income' and report_type='Balance Sheet'") -execute:frappe.delete_doc("DocType", "Payment to Invoice Matching Tool") # 29-07-2014 -execute:frappe.delete_doc("DocType", "Payment to Invoice Matching Tool Detail") # 29-07-2014 -execute:frappe.delete_doc("Page", "trial-balance") #2014-07-22 -erpnext.patches.v4_2.delete_old_print_formats #2014-07-29 -erpnext.patches.v4_2.toggle_rounded_total #2014-07-30 -erpnext.patches.v4_2.fix_account_master_type -erpnext.patches.v4_2.update_project_milestones -erpnext.patches.v4_2.add_currency_turkish_lira #2014-08-08 -execute:frappe.delete_doc("DocType", "Landed Cost Wizard") -erpnext.patches.v4_2.default_website_style -erpnext.patches.v4_2.set_company_country -erpnext.patches.v4_2.update_sales_order_invoice_field_name -erpnext.patches.v4_2.seprate_manufacture_and_repack -execute:frappe.delete_doc("Report", "Warehouse-Wise Stock Balance") -execute:frappe.delete_doc("DocType", "Purchase Request") -execute:frappe.delete_doc("DocType", "Purchase Request Item") -erpnext.patches.v4_2.recalculate_bom_cost -erpnext.patches.v4_2.fix_gl_entries_for_stock_transactions erpnext.patches.v4_2.update_requested_and_ordered_qty #2021-03-31 -execute:frappe.rename_doc("DocType", "Support Ticket", "Issue", force=True) -erpnext.patches.v4_4.make_email_accounts -execute:frappe.delete_doc("DocType", "Contact Control") -erpnext.patches.v4_2.discount_amount -erpnext.patches.v4_2.reset_bom_costs -erpnext.patches.v5_0.update_frozen_accounts_permission_role -erpnext.patches.v5_0.update_dn_against_doc_fields -execute:frappe.db.sql("update `tabMaterial Request` set material_request_type = 'Material Transfer' where material_request_type = 'Transfer'") -execute:frappe.reload_doc('stock', 'doctype', 'item') -erpnext.patches.v5_0.set_default_company_in_bom -execute:frappe.reload_doc('crm', 'doctype', 'lead') -execute:frappe.reload_doc('crm', 'doctype', 'opportunity') -erpnext.patches.v5_0.rename_taxes_and_charges_master -erpnext.patches.v5_1.sales_bom_rename -erpnext.patches.v5_0.rename_table_fieldnames -execute:frappe.db.sql("update `tabJournal Entry` set voucher_type='Journal Entry' where ifnull(voucher_type, '')=''") -erpnext.patches.v5_0.is_group -erpnext.patches.v4_2.party_model -erpnext.patches.v5_0.party_model_patch_fix -erpnext.patches.v4_1.fix_jv_remarks -erpnext.patches.v4_2.update_landed_cost_voucher -erpnext.patches.v4_2.set_item_has_batch -erpnext.patches.v4_2.update_stock_uom_for_dn_in_sle -erpnext.patches.v5_0.recalculate_total_amount_in_jv -erpnext.patches.v5_0.update_companywise_payment_account -erpnext.patches.v5_0.remove_birthday_events -erpnext.patches.v5_0.update_item_name_in_bom -erpnext.patches.v5_0.rename_customer_issue -erpnext.patches.v5_0.rename_total_fields -erpnext.patches.v5_0.new_crm_module -erpnext.patches.v5_0.rename_customer_issue -erpnext.patches.v5_0.update_material_transfer_for_manufacture -execute:frappe.reload_doc('crm', 'doctype', 'opportunity_item') -erpnext.patches.v5_0.update_item_description_and_image -erpnext.patches.v5_0.update_material_transferred_for_manufacturing -erpnext.patches.v5_0.stock_entry_update_value -erpnext.patches.v5_0.convert_stock_reconciliation -erpnext.patches.v5_0.update_projects -erpnext.patches.v5_0.item_patches -erpnext.patches.v5_0.update_journal_entry_title -erpnext.patches.v5_0.taxes_and_totals_in_party_currency -erpnext.patches.v5_0.replace_renamed_fields_in_custom_scripts_and_print_formats -erpnext.patches.v5_0.update_from_bom -erpnext.patches.v5_0.update_account_types -erpnext.patches.v5_0.update_sms_sender -erpnext.patches.v5_0.set_appraisal_remarks -erpnext.patches.v5_0.update_time_log_title -erpnext.patches.v7_0.create_warehouse_nestedset -erpnext.patches.v7_0.merge_account_type_stock_and_warehouse_to_stock -erpnext.patches.v7_0.set_is_group_for_warehouse -erpnext.patches.v7_2.stock_uom_in_selling -erpnext.patches.v4_2.repost_sle_for_si_with_no_warehouse -erpnext.patches.v5_0.newsletter -execute:frappe.delete_doc("DocType", "Chart of Accounts") -execute:frappe.delete_doc("DocType", "Style Settings") -erpnext.patches.v5_0.update_opportunity -erpnext.patches.v5_0.opportunity_not_submittable -execute:frappe.permissions.reset_perms("Purchase Taxes and Charges Template") #2014-06-09 -execute:frappe.permissions.reset_perms("Expense Claim Type") #2014-06-19 -erpnext.patches.v5_0.execute_on_doctype_update -erpnext.patches.v4_2.fix_recurring_orders -erpnext.patches.v4_2.delete_gl_entries_for_cancelled_invoices -erpnext.patches.v5_0.project_costing -erpnext.patches.v5_0.update_temporary_account -erpnext.patches.v5_0.update_advance_paid -erpnext.patches.v5_0.link_warehouse_with_account -execute:frappe.delete_doc("Page", "stock-ledger") -execute:frappe.delete_doc("Page","stock-level") -erpnext.patches.v5_0.reclculate_planned_operating_cost_in_production_order -erpnext.patches.v5_0.repost_requested_qty -erpnext.patches.v5_0.fix_taxes_and_totals_in_party_currency -erpnext.patches.v5_0.update_tax_amount_after_discount_in_purchase_cycle -erpnext.patches.v5_0.rename_pos_setting -erpnext.patches.v5_0.update_operation_description -erpnext.patches.v5_0.set_footer_address -execute:frappe.db.set_value("Backup Manager", None, "send_backups_to_dropbox", 1 if frappe.db.get_value("Backup Manager", None, "upload_backups_to_dropbox") in ("Daily", "Weekly") else 0) -execute:frappe.db.sql_list("delete from `tabDocPerm` where parent='Issue' and modified_by='Administrator' and role='Guest'") -erpnext.patches.v5_0.update_item_and_description_again -erpnext.patches.v6_0.multi_currency -erpnext.patches.v7_0.create_budget_record -erpnext.patches.v5_0.repost_gle_for_jv_with_multiple_party -erpnext.patches.v5_0.portal_fixes -erpnext.patches.v5_0.reset_values_in_tools # 02-05-2016 -execute:frappe.delete_doc("Page", "users") -erpnext.patches.v5_0.update_material_transferred_for_manufacturing_again -erpnext.patches.v5_0.index_on_account_and_gl_entry -execute:frappe.db.sql("""delete from `tabProject Task`""") -erpnext.patches.v5_0.update_item_desc_in_invoice -erpnext.patches.v5_1.fix_against_account -execute:frappe.rename_doc("DocType", "Salary Manager", "Process Payroll", force=True) -erpnext.patches.v5_1.rename_roles -erpnext.patches.v5_1.default_bom -execute:frappe.delete_doc("DocType", "Party Type") -execute:frappe.delete_doc("Module Def", "Contacts") -erpnext.patches.v5_4.fix_reserved_qty_and_sle_for_packed_items # 30-07-2015 -execute:frappe.reload_doctype("Leave Type") -execute:frappe.db.sql("update `tabLeave Type` set include_holiday=0") -erpnext.patches.v5_4.set_root_and_report_type -erpnext.patches.v5_4.notify_system_managers_regarding_wrong_tax_calculation -erpnext.patches.v5_4.fix_invoice_outstanding -execute:frappe.db.sql("update `tabStock Ledger Entry` set stock_queue = '[]' where voucher_type = 'Stock Reconciliation' and ifnull(qty_after_transaction, 0) = 0") -erpnext.patches.v5_4.fix_missing_item_images -erpnext.patches.v5_4.stock_entry_additional_costs -erpnext.patches.v5_4.cleanup_journal_entry #2015-08-14 erpnext.patches.v5_7.update_item_description_based_on_item_master -erpnext.patches.v5_7.item_template_attributes -execute:frappe.delete_doc_if_exists("DocType", "Manage Variants") -execute:frappe.delete_doc_if_exists("DocType", "Manage Variants Item") erpnext.patches.v4_2.repost_reserved_qty #2021-03-31 -erpnext.patches.v5_4.update_purchase_cost_against_project -erpnext.patches.v5_8.update_order_reference_in_return_entries -erpnext.patches.v5_8.add_credit_note_print_heading -execute:frappe.delete_doc_if_exists("Print Format", "Credit Note - Negative Invoice") - -# V6.0 -erpnext.patches.v6_0.set_default_title # 2015-09-03 -erpnext.patches.v6_0.default_activity_rate -execute:frappe.db.set_value("Stock Settings", None, "automatically_set_serial_nos_based_on_fifo", 1) -execute:frappe.db.sql("""update `tabProject` set percent_complete=round(percent_complete, 2) where percent_complete is not null""") -erpnext.patches.v6_0.fix_outstanding_amount -erpnext.patches.v6_0.fix_planned_qty -erpnext.patches.v6_2.remove_newsletter_duplicates -erpnext.patches.v6_2.fix_missing_default_taxes_and_lead -erpnext.patches.v6_3.convert_applicable_territory -erpnext.patches.v6_4.round_status_updater_percentages -erpnext.patches.v6_4.repost_gle_for_journal_entries_where_reference_name_missing -erpnext.patches.v6_4.fix_journal_entries_due_to_reconciliation -erpnext.patches.v6_4.fix_status_in_sales_and_purchase_order -erpnext.patches.v6_4.fix_modified_in_sales_order_and_purchase_order -erpnext.patches.v6_4.fix_duplicate_bins -erpnext.patches.v6_4.fix_sales_order_maintenance_status -erpnext.patches.v6_4.email_digest_update - -# delete shopping cart doctypes -execute:frappe.delete_doc_if_exists("DocType", "Applicable Territory") -execute:frappe.delete_doc_if_exists("DocType", "Shopping Cart Price List") -execute:frappe.delete_doc_if_exists("DocType", "Shopping Cart Taxes and Charges Master") - -erpnext.patches.v6_4.set_user_in_contact -erpnext.patches.v6_4.make_image_thumbnail #2015-10-20 -erpnext.patches.v6_5.show_in_website_for_template_item -erpnext.patches.v6_4.fix_expense_included_in_valuation -execute:frappe.delete_doc_if_exists("Report", "Item-wise Last Purchase Rate") -erpnext.patches.v6_6.fix_website_image -erpnext.patches.v6_6.remove_fiscal_year_from_leave_allocation -execute:frappe.delete_doc_if_exists("DocType", "Stock UOM Replace Utility") -erpnext.patches.v6_8.make_webform_standard #2015-11-23 -erpnext.patches.v6_8.move_drop_ship_to_po_items -erpnext.patches.v6_10.fix_ordered_received_billed -erpnext.patches.v6_10.fix_jv_total_amount #2015-11-30 -erpnext.patches.v6_10.email_digest_default_quote -erpnext.patches.v6_10.fix_billed_amount_in_drop_ship_po -erpnext.patches.v6_10.fix_delivery_status_of_drop_ship_item #2015-12-08 -erpnext.patches.v5_8.tax_rule #2015-12-08 -erpnext.patches.v6_12.set_overdue_tasks -erpnext.patches.v6_16.update_billing_status_in_dn_and_pr -erpnext.patches.v6_16.create_manufacturer_records -execute:frappe.db.sql("update `tabPricing Rule` set title=name where title='' or title is null") #2016-01-27 -erpnext.patches.v6_20.set_party_account_currency_in_orders -erpnext.patches.v6_19.comment_feed_communication -erpnext.patches.v6_21.fix_reorder_level -erpnext.patches.v6_21.rename_material_request_fields -erpnext.patches.v6_23.update_stopped_status_to_closed -erpnext.patches.v6_24.set_recurring_id -erpnext.patches.v6_20x.set_compact_print -execute:frappe.delete_doc_if_exists("Web Form", "contact") #2016-03-10 -erpnext.patches.v6_20x.remove_fiscal_year_from_holiday_list -erpnext.patches.v6_24.map_customer_address_to_shipping_address_on_po -erpnext.patches.v6_27.fix_recurring_order_status -erpnext.patches.v6_20x.update_product_bundle_description -erpnext.patches.v7_0.update_party_status #2016-09-22 -erpnext.patches.v7_0.remove_features_setup -erpnext.patches.v7_0.update_home_page -execute:frappe.delete_doc_if_exists("Page", "financial-analytics") -erpnext.patches.v7_0.update_project_in_gl_entry -execute:frappe.db.sql('update tabQuotation set status="Cancelled" where docstatus=2') -execute:frappe.rename_doc("DocType", "Payments", "Sales Invoice Payment", force=True) -erpnext.patches.v7_0.update_mins_to_first_response -erpnext.patches.v6_20x.repost_valuation_rate_for_negative_inventory -erpnext.patches.v7_0.migrate_mode_of_payments_v6_to_v7 -erpnext.patches.v7_0.system_settings_setup_complete -erpnext.patches.v7_0.set_naming_series_for_timesheet #2016-07-27 -execute:frappe.reload_doc('projects', 'doctype', 'project') -execute:frappe.reload_doc('projects', 'doctype', 'project_user') -erpnext.patches.v7_0.convert_timelogbatch_to_timesheet -erpnext.patches.v7_0.convert_timelog_to_timesheet -erpnext.patches.v7_0.move_timelogbatch_from_salesinvoiceitem_to_salesinvoicetimesheet -erpnext.patches.v7_0.remove_doctypes_and_reports #2016-10-29 -erpnext.patches.v7_0.update_maintenance_module_in_doctype -erpnext.patches.v7_0.update_prevdoc_values_for_supplier_quotation_item -erpnext.patches.v7_0.rename_advance_table_fields -erpnext.patches.v7_0.rename_salary_components -erpnext.patches.v7_0.rename_prevdoc_fields -erpnext.patches.v7_0.rename_time_sheet_doctype -execute:frappe.delete_doc_if_exists("Report", "Customers Not Buying Since Long Time") -erpnext.patches.v7_0.make_is_group_fieldtype_as_check -execute:frappe.reload_doc('projects', 'doctype', 'timesheet') #2016-09-12 -erpnext.patches.v7_1.rename_field_timesheet -execute:frappe.delete_doc_if_exists("Report", "Employee Holiday Attendance") -execute:frappe.delete_doc_if_exists("DocType", "Payment Tool") -execute:frappe.delete_doc_if_exists("DocType", "Payment Tool Detail") -erpnext.patches.v7_0.setup_account_table_for_expense_claim_type_if_exists -erpnext.patches.v7_0.migrate_schools_to_erpnext -erpnext.patches.v7_1.update_lead_source -erpnext.patches.v6_20x.remove_customer_supplier_roles -erpnext.patches.v7_0.remove_administrator_role_in_doctypes -erpnext.patches.v7_0.rename_fee_amount_to_fee_component -erpnext.patches.v7_0.calculate_total_costing_amount -erpnext.patches.v7_0.fix_nonwarehouse_ledger_gl_entries_for_transactions -erpnext.patches.v7_0.remove_old_earning_deduction_doctypes -erpnext.patches.v7_0.make_guardian -erpnext.patches.v7_0.update_refdoc_in_landed_cost_voucher -erpnext.patches.v7_0.set_material_request_type_in_item -erpnext.patches.v7_0.rename_examination_to_assessment -erpnext.patches.v7_0.set_portal_settings -erpnext.patches.v7_0.update_change_amount_account -erpnext.patches.v7_0.fix_duplicate_icons -erpnext.patches.v7_0.repost_gle_for_pos_sales_return -erpnext.patches.v7_1.update_total_billing_hours -erpnext.patches.v7_1.update_component_type -erpnext.patches.v7_0.repost_gle_for_pos_sales_return -erpnext.patches.v7_0.update_missing_employee_in_timesheet -erpnext.patches.v7_0.update_status_for_timesheet -erpnext.patches.v7_0.set_party_name_in_payment_entry -erpnext.patches.v7_1.set_student_guardian -erpnext.patches.v7_0.update_conversion_factor_in_supplier_quotation_item -erpnext.patches.v7_1.move_sales_invoice_from_parent_to_child_timesheet -execute:frappe.db.sql("update `tabTimesheet` ts, `tabEmployee` emp set ts.employee_name = emp.employee_name where emp.name = ts.employee and ts.employee_name is null and ts.employee is not null") -erpnext.patches.v7_1.fix_link_for_customer_from_lead -execute:frappe.db.sql("delete from `tabTimesheet Detail` where NOT EXISTS (select name from `tabTimesheet` where name = `tabTimesheet Detail`.parent)") -erpnext.patches.v7_0.update_mode_of_payment_type - -execute:frappe.reload_doctype('Employee') #2016-10-18 -execute:frappe.db.sql("update `tabEmployee` set prefered_contact_email = IFNULL(prefered_contact_email,'') ") execute:frappe.reload_doc("Payroll", "doctype", "salary_slip") -execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation") -execute:frappe.reload_doc("stock", "doctype", "stock_settings") -erpnext.patches.v8_0.create_domain_docs #16-05-2017 -erpnext.patches.v7_1.update_portal_roles -erpnext.patches.v7_1.set_total_amount_currency_in_je -finally:erpnext.patches.v7_0.update_timesheet_communications -erpnext.patches.v7_0.update_status_of_zero_amount_sales_order -erpnext.patches.v7_1.add_field_for_task_dependent -erpnext.patches.v7_0.repost_bin_qty_and_item_projected_qty -erpnext.patches.v7_1.set_prefered_contact_email -execute:frappe.reload_doc('accounts', 'doctype', 'accounts_settings') -execute:frappe.db.set_value("Accounts Settings", "Accounts Settings", "unlink_payment_on_cancellation_of_invoice", 0) -execute:frappe.db.sql("update `tabStock Entry` set total_amount = 0 where purpose in('Repack', 'Manufacture')") -erpnext.patches.v7_1.save_stock_settings -erpnext.patches.v7_0.repost_gle_for_pi_with_update_stock #2016-11-01 -erpnext.patches.v7_1.add_account_user_role_for_timesheet -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_1.rename_quality_inspection_field -erpnext.patches.v7_0.update_autoname_field -erpnext.patches.v7_1.update_bom_base_currency -erpnext.patches.v7_0.update_status_of_po_so -erpnext.patches.v7_1.set_budget_against_as_cost_center -erpnext.patches.v7_1.set_currency_exchange_date -erpnext.patches.v7_1.set_sales_person_status -erpnext.patches.v7_1.repost_stock_for_deleted_bins_for_merging_items -erpnext.patches.v7_2.update_website_for_variant -erpnext.patches.v7_2.update_assessment_modules -erpnext.patches.v7_2.update_doctype_status -erpnext.patches.v7_2.update_salary_slips -erpnext.patches.v7_2.delete_fleet_management_module_def -erpnext.patches.v7_2.contact_address_links -erpnext.patches.v7_2.mark_students_active -erpnext.patches.v7_2.set_null_value_to_fields -erpnext.patches.v7_2.update_guardian_name_in_student_master -erpnext.patches.v7_2.update_abbr_in_salary_slips -erpnext.patches.v7_2.rename_evaluation_criteria -erpnext.patches.v7_2.update_party_type -erpnext.patches.v7_2.setup_auto_close_settings -erpnext.patches.v7_2.empty_supplied_items_for_non_subcontracted -erpnext.patches.v7_2.arrear_leave_encashment_as_salary_component -erpnext.patches.v7_2.rename_att_date_attendance -erpnext.patches.v7_2.update_attendance_docstatus -erpnext.patches.v7_2.make_all_assessment_group -erpnext.patches.v8_0.repost_reserved_qty_for_multiple_sales_uom -erpnext.patches.v8_0.addresses_linked_to_lead -execute:frappe.delete_doc('DocType', 'Purchase Common') -erpnext.patches.v8_0.update_stock_qty_value_in_purchase_invoice -erpnext.patches.v8_0.update_supplier_address_in_stock_entry -erpnext.patches.v8_0.rename_is_sample_item_to_allow_zero_valuation_rate -erpnext.patches.v8_0.set_null_to_serial_nos_for_disabled_sales_invoices -erpnext.patches.v8_0.enable_booking_asset_depreciation_automatically -erpnext.patches.v8_0.set_project_copied_from -erpnext.patches.v8_0.update_status_as_paid_for_completed_expense_claim -erpnext.patches.v7_2.stock_uom_in_selling -erpnext.patches.v8_0.revert_manufacturers_table_from_item -erpnext.patches.v8_0.disable_instructor_role -erpnext.patches.v8_0.merge_student_batch_and_student_group -erpnext.patches.v8_0.rename_total_margin_to_rate_with_margin # 11-05-2017 -erpnext.patches.v8_0.fix_status_for_invoices_with_negative_outstanding -erpnext.patches.v8_0.make_payments_table_blank_for_non_pos_invoice -erpnext.patches.v8_0.set_sales_invoice_serial_number_from_delivery_note -erpnext.patches.v8_0.delete_schools_depricated_doctypes -erpnext.patches.v8_0.update_customer_pos_id -erpnext.patches.v8_0.rename_items_in_status_field_of_material_request -erpnext.patches.v8_0.delete_bin_indexes -erpnext.patches.v8_0.move_account_head_from_account_to_warehouse_for_inventory -erpnext.patches.v8_0.change_in_words_varchar_length -erpnext.patches.v8_0.update_stock_qty_value_in_bom_item -erpnext.patches.v8_0.update_sales_cost_in_project -erpnext.patches.v8_0.save_system_settings -erpnext.patches.v8_1.delete_deprecated_reports -erpnext.patches.v9_0.remove_subscription_module -erpnext.patches.v8_7.make_subscription_from_recurring_data erpnext.patches.v8_1.setup_gst_india #2017-06-27 -execute:frappe.reload_doc('regional', 'doctype', 'gst_hsn_code') erpnext.patches.v8_1.removed_roles_from_gst_report_non_indian_account #16-08-2018 -erpnext.patches.v8_1.gst_fixes #2017-07-06 -erpnext.patches.v8_0.update_production_orders -erpnext.patches.v8_1.remove_sales_invoice_from_returned_serial_no -erpnext.patches.v8_1.allow_invoice_copy_to_edit_after_submit -erpnext.patches.v8_1.add_hsn_sac_codes -erpnext.patches.v8_1.update_gst_state #17-07-2017 -erpnext.patches.v8_1.removed_report_support_hours -erpnext.patches.v8_1.add_indexes_in_transaction_doctypes -erpnext.patches.v8_3.set_restrict_to_domain_for_module_def -erpnext.patches.v8_1.update_expense_claim_status -erpnext.patches.v8_3.update_company_total_sales #2017-08-16 -erpnext.patches.v8_4.make_scorecard_records -erpnext.patches.v8_1.set_delivery_date_in_so_item #2017-07-28 -erpnext.patches.v8_5.fix_tax_breakup_for_non_invoice_docs -erpnext.patches.v8_5.remove_quotations_route_in_sidebar -erpnext.patches.v8_5.update_existing_data_in_project_type -erpnext.patches.v8_5.set_default_mode_of_payment -erpnext.patches.v8_5.update_customer_group_in_POS_profile -erpnext.patches.v8_6.update_timesheet_company_from_PO -erpnext.patches.v8_6.set_write_permission_for_quotation_for_sales_manager -erpnext.patches.v8_5.remove_project_type_property_setter erpnext.patches.v8_7.sync_india_custom_fields -erpnext.patches.v8_7.fix_purchase_receipt_status -erpnext.patches.v8_6.rename_bom_update_tool -erpnext.patches.v8_9.add_setup_progress_actions #08-09-2017 #26-09-2017 #22-11-2017 #15-12-2017 -erpnext.patches.v8_9.rename_company_sales_target_field -erpnext.patches.v8_8.set_bom_rate_as_per_uom -erpnext.patches.v8_8.add_new_fields_in_accounts_settings -erpnext.patches.v8_9.set_default_customer_group -erpnext.patches.v8_9.delete_gst_doctypes_for_outside_india_accounts -erpnext.patches.v8_9.set_default_fields_in_variant_settings -erpnext.patches.v8_9.update_billing_gstin_for_indian_account -erpnext.patches.v8_9.set_member_party_type -erpnext.patches.v9_0.add_user_to_child_table_in_pos_profile -erpnext.patches.v9_0.set_schedule_date_for_material_request_and_purchase_order -erpnext.patches.v9_0.student_admission_childtable_migrate -erpnext.patches.v9_0.add_healthcare_domain -erpnext.patches.v9_0.set_variant_item_description -erpnext.patches.v9_0.set_uoms_in_variant_field -erpnext.patches.v9_0.copy_old_fees_field_data -execute:frappe.delete_doc_if_exists("DocType", "Program Fee") -erpnext.patches.v9_0.set_pos_profile_name -erpnext.patches.v9_0.remove_non_existing_warehouse_from_stock_settings -execute:frappe.delete_doc_if_exists("DocType", "Program Fee") -erpnext.patches.v8_10.change_default_customer_credit_days -erpnext.patches.v9_0.update_employee_loan_details -erpnext.patches.v9_2.delete_healthcare_domain_default_items -erpnext.patches.v9_1.create_issue_opportunity_type -erpnext.patches.v9_2.rename_translated_domains_in_en -erpnext.patches.v9_0.set_shipping_type_for_existing_shipping_rules -erpnext.patches.v9_0.update_multi_uom_fields_in_material_request -erpnext.patches.v9_2.repost_reserved_qty_for_production -erpnext.patches.v9_2.remove_company_from_patient -erpnext.patches.v9_2.set_item_name_in_production_order -erpnext.patches.v10_0.update_lft_rgt_for_employee -erpnext.patches.v9_2.rename_net_weight_in_item_master -erpnext.patches.v9_2.delete_process_payroll -erpnext.patches.v10_0.add_agriculture_domain -erpnext.patches.v10_0.add_non_profit_domain -erpnext.patches.v10_0.setup_vat_for_uae_and_saudi_arabia #2017-12-28 -erpnext.patches.v10_0.set_primary_contact_for_customer -erpnext.patches.v10_0.copy_projects_renamed_fields -erpnext.patches.v10_0.enabled_regional_print_format_based_on_country -erpnext.patches.v10_0.update_asset_calculate_depreciation -erpnext.patches.v10_0.add_guardian_role_for_parent_portal -erpnext.patches.v10_0.set_numeric_ranges_in_template_if_blank -erpnext.patches.v10_0.update_reserved_qty_for_purchase_order erpnext.patches.v10_0.fichier_des_ecritures_comptables_for_france -erpnext.patches.v10_0.update_assessment_plan -erpnext.patches.v10_0.update_assessment_result -erpnext.patches.v10_0.set_default_payment_terms_based_on_company -erpnext.patches.v10_0.update_sales_order_link_to_purchase_order erpnext.patches.v10_0.rename_price_to_rate_in_pricing_rule erpnext.patches.v10_0.set_currency_in_pricing_rule -erpnext.patches.v10_0.set_b2c_limit erpnext.patches.v10_0.update_translatable_fields erpnext.patches.v10_0.rename_offer_letter_to_job_offer execute:frappe.delete_doc('DocType', 'Production Planning Tool', ignore_missing=True) @@ -496,16 +21,6 @@ erpnext.patches.v10_0.migrate_daily_work_summary_settings_to_daily_work_summary_ erpnext.patches.v10_0.add_default_cash_flow_mappers erpnext.patches.v11_0.rename_duplicate_item_code_values erpnext.patches.v11_0.make_quality_inspection_template -erpnext.patches.v10_0.update_status_for_multiple_source_in_po -erpnext.patches.v10_0.set_auto_created_serial_no_in_stock_entry -erpnext.patches.v10_0.update_territory_and_customer_group -erpnext.patches.v10_0.update_warehouse_address_details -erpnext.patches.v10_0.update_reserved_qty_for_purchase_order -erpnext.patches.v10_0.update_hub_connector_domain -erpnext.patches.v10_0.set_student_party_type -erpnext.patches.v10_0.update_project_in_sle -erpnext.patches.v10_0.fix_reserved_qty_for_sub_contract -erpnext.patches.v10_0.repost_requested_qty_for_non_stock_uom_items erpnext.patches.v11_0.merge_land_unit_with_location erpnext.patches.v11_0.add_index_on_nestedset_doctypes erpnext.patches.v11_0.remove_modules_setup_page @@ -514,7 +29,6 @@ erpnext.patches.v11_0.update_department_lft_rgt erpnext.patches.v11_0.add_default_email_template_for_leave erpnext.patches.v11_0.set_default_email_template_in_hr #08-06-2018 erpnext.patches.v11_0.uom_conversion_data #30-06-2018 -erpnext.patches.v10_0.taxes_issue_with_pos erpnext.patches.v11_0.update_account_type_in_party_type erpnext.patches.v11_0.rename_healthcare_doctype_and_fields erpnext.patches.v11_0.rename_supplier_type_to_supplier_group @@ -522,8 +36,6 @@ erpnext.patches.v10_1.transfer_subscription_to_auto_repeat erpnext.patches.v11_0.update_brand_in_item_price erpnext.patches.v11_0.create_default_success_action erpnext.patches.v11_0.add_healthcare_service_unit_tree_root -erpnext.patches.v10_0.set_qty_in_transactions_based_on_serial_no_input -erpnext.patches.v10_0.show_leaves_of_all_department_members_in_calendar erpnext.patches.v11_0.rename_field_max_days_allowed erpnext.patches.v11_0.create_salary_structure_assignments erpnext.patches.v11_0.rename_health_insurance @@ -536,7 +48,6 @@ erpnext.patches.v11_0.move_item_defaults_to_child_table_for_multicompany #02-07- erpnext.patches.v11_0.refactor_erpnext_shopify #2018-09-07 erpnext.patches.v11_0.rename_overproduction_percent_field erpnext.patches.v11_0.update_backflush_subcontract_rm_based_on_bom -erpnext.patches.v10_0.update_status_in_purchase_receipt erpnext.patches.v11_0.inter_state_field_for_gst erpnext.patches.v11_0.rename_members_with_naming_series #04-06-2018 erpnext.patches.v11_0.set_update_field_and_value_in_workflow_state @@ -550,13 +61,10 @@ erpnext.patches.v11_0.skip_user_permission_check_for_department erpnext.patches.v11_0.set_department_for_doctypes erpnext.patches.v11_0.update_allow_transfer_for_manufacture erpnext.patches.v11_0.add_item_group_defaults -erpnext.patches.v10_0.update_address_template_for_india erpnext.patches.v11_0.add_expense_claim_default_account execute:frappe.delete_doc("Page", "hub") erpnext.patches.v11_0.reset_publish_in_hub_for_all_items erpnext.patches.v11_0.update_hub_url # 2018-08-31 # 2018-09-03 -erpnext.patches.v10_0.set_discount_amount -erpnext.patches.v10_0.recalculate_gross_margin_for_project erpnext.patches.v11_0.make_job_card erpnext.patches.v11_0.redesign_healthcare_billing_work_flow erpnext.patches.v10_0.delete_hub_documents # 12-08-2018 @@ -570,9 +78,6 @@ execute:frappe.delete_doc_if_exists("Page", "stock-analytics") execute:frappe.delete_doc_if_exists("Page", "production-analytics") erpnext.patches.v11_0.ewaybill_fields_gst_india #2018-11-13 #2019-01-09 #2019-04-01 #2019-04-26 #2019-05-03 erpnext.patches.v11_0.drop_column_max_days_allowed -erpnext.patches.v10_0.update_user_image_in_employee -erpnext.patches.v10_0.repost_gle_for_purchase_receipts_with_rejected_items -erpnext.patches.v10_0.allow_operators_in_supplier_scorecard erpnext.patches.v10_0.item_barcode_childtable_migrate # 16-02-2019 erpnext.patches.v11_0.update_delivery_trip_status erpnext.patches.v11_0.set_missing_gst_hsn_code From 43a24f2aa87eef372cf2fddf1b99ef68245cb643 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Thu, 3 Jun 2021 20:05:00 +0530 Subject: [PATCH 40/53] ci: Update ERPNext backup patch test >= v10 * Generated v10 backup archive * used old v7 erpnext backup hosted via build.erpnext.com * upgraded to v10 frappe + erpnext * Hosted backup on https://erpnext.com/files/v10-erpnext.sql.gz --- .github/workflows/patch.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/patch.yml b/.github/workflows/patch.yml index 7c9e0272c9..b96a3d6bbe 100644 --- a/.github/workflows/patch.yml +++ b/.github/workflows/patch.yml @@ -66,4 +66,8 @@ jobs: run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh - name: Run Patch Tests - run: cd ~/frappe-bench/ && wget http://build.erpnext.com/20171108_190013_955977f8_database.sql.gz && bench --site test_site --force restore ~/frappe-bench/20171108_190013_955977f8_database.sql.gz && bench --site test_site migrate + run: | + cd ~/frappe-bench/ + wget https://erpnext.com/files/v10-erpnext.sql.gz + bench --site test_site --force restore ~/frappe-bench/v10-erpnext.sql.gz + bench --site test_site migrate From 96f8ebc308ba2ceada92ab5a46ec582a7a9ba15f Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 4 Jun 2021 17:07:45 +0530 Subject: [PATCH 41/53] fix(patch): Handle NULL values from fieldtype change --- erpnext/patches/v11_0/rename_bom_wo_fields.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/patches/v11_0/rename_bom_wo_fields.py b/erpnext/patches/v11_0/rename_bom_wo_fields.py index b4a740fabb..882ec84e64 100644 --- a/erpnext/patches/v11_0/rename_bom_wo_fields.py +++ b/erpnext/patches/v11_0/rename_bom_wo_fields.py @@ -6,6 +6,10 @@ import frappe from frappe.model.utils.rename_field import rename_field def execute(): + # updating column value to handle field change from Data to Currency + changed_field = "base_scrap_material_cost" + frappe.db.sql(f"update `tabBOM` set {changed_field} = '0' where trim(coalesce({changed_field}, ''))= ''") + for doctype in ['BOM Explosion Item', 'BOM Item', 'Work Order Item', 'Item']: if frappe.db.has_column(doctype, 'allow_transfer_for_manufacture'): if doctype != 'Item': From 137d08a9d7bddb5903e5b01612a07c5a1223c378 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 4 Jun 2021 20:11:34 +0530 Subject: [PATCH 42/53] fix: Manually link_fields from flags before rename_doc --- .../v13_0/healthcare_lab_module_rename_doctypes.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/erpnext/patches/v13_0/healthcare_lab_module_rename_doctypes.py b/erpnext/patches/v13_0/healthcare_lab_module_rename_doctypes.py index 9af0a8dbef..2549a1e91e 100644 --- a/erpnext/patches/v13_0/healthcare_lab_module_rename_doctypes.py +++ b/erpnext/patches/v13_0/healthcare_lab_module_rename_doctypes.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import frappe from frappe.model.utils.rename_field import rename_field + def execute(): if frappe.db.exists('DocType', 'Lab Test') and frappe.db.exists('DocType', 'Lab Test Template'): # rename child doctypes @@ -17,7 +18,12 @@ def execute(): frappe.reload_doc('healthcare', 'doctype', 'lab_test_template') for old_dt, new_dt in doctypes.items(): - if not frappe.db.table_exists(new_dt) and frappe.db.table_exists(old_dt): + frappe.flags.link_fields = {} + should_rename = ( + frappe.db.table_exists(old_dt) + and not frappe.db.table_exists(new_dt) + ) + if should_rename: frappe.reload_doc('healthcare', 'doctype', frappe.scrub(old_dt)) frappe.rename_doc('DocType', old_dt, new_dt, force=True) frappe.reload_doc('healthcare', 'doctype', frappe.scrub(new_dt)) From a5c3427293a8bfeb38bd83c08fe155b9d33179a4 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 10 Jun 2021 18:09:49 +0530 Subject: [PATCH 43/53] fix: Sort account balances by account name --- .../report/account_balance/account_balance.py | 4 +--- .../account_balance/test_account_balance.py | 22 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/erpnext/accounts/report/account_balance/account_balance.py b/erpnext/accounts/report/account_balance/account_balance.py index 65e7d789bb..be64c327fd 100644 --- a/erpnext/accounts/report/account_balance/account_balance.py +++ b/erpnext/accounts/report/account_balance/account_balance.py @@ -58,11 +58,9 @@ def get_conditions(filters): def get_data(filters): data = [] - conditions = get_conditions(filters) - accounts = frappe.db.get_all("Account", fields=["name", "account_currency"], - filters=conditions) + filters=conditions, order_by='name') for d in accounts: balance = get_balance_on(d.name, date=filters.report_date) diff --git a/erpnext/accounts/report/account_balance/test_account_balance.py b/erpnext/accounts/report/account_balance/test_account_balance.py index b6ced312d0..14ddf4a30f 100644 --- a/erpnext/accounts/report/account_balance/test_account_balance.py +++ b/erpnext/accounts/report/account_balance/test_account_balance.py @@ -23,7 +23,7 @@ class TestAccountBalance(unittest.TestCase): expected_data = [ { - "account": 'Sales - _TC2', + "account": 'Direct Income - _TC2', "currency": 'EUR', "balance": -100.0, }, @@ -32,21 +32,21 @@ class TestAccountBalance(unittest.TestCase): "currency": 'EUR', "balance": -100.0, }, - { - "account": 'Service - _TC2', - "currency": 'EUR', - "balance": 0.0, - }, - { - "account": 'Direct Income - _TC2', - "currency": 'EUR', - "balance": -100.0, - }, { "account": 'Indirect Income - _TC2', "currency": 'EUR', "balance": 0.0, }, + { + "account": 'Sales - _TC2', + "currency": 'EUR', + "balance": -100.0, + }, + { + "account": 'Service - _TC2', + "currency": 'EUR', + "balance": 0.0, + } ] self.assertEqual(expected_data, report[1]) From 9a243ed4699f2ae9e96397b221193f1fe40a2cb0 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 10 Jun 2021 18:09:49 +0530 Subject: [PATCH 44/53] fix: Sort account balances by account name --- .../report/account_balance/account_balance.py | 4 +--- .../account_balance/test_account_balance.py | 22 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/erpnext/accounts/report/account_balance/account_balance.py b/erpnext/accounts/report/account_balance/account_balance.py index 65e7d789bb..be64c327fd 100644 --- a/erpnext/accounts/report/account_balance/account_balance.py +++ b/erpnext/accounts/report/account_balance/account_balance.py @@ -58,11 +58,9 @@ def get_conditions(filters): def get_data(filters): data = [] - conditions = get_conditions(filters) - accounts = frappe.db.get_all("Account", fields=["name", "account_currency"], - filters=conditions) + filters=conditions, order_by='name') for d in accounts: balance = get_balance_on(d.name, date=filters.report_date) diff --git a/erpnext/accounts/report/account_balance/test_account_balance.py b/erpnext/accounts/report/account_balance/test_account_balance.py index b6ced312d0..14ddf4a30f 100644 --- a/erpnext/accounts/report/account_balance/test_account_balance.py +++ b/erpnext/accounts/report/account_balance/test_account_balance.py @@ -23,7 +23,7 @@ class TestAccountBalance(unittest.TestCase): expected_data = [ { - "account": 'Sales - _TC2', + "account": 'Direct Income - _TC2', "currency": 'EUR', "balance": -100.0, }, @@ -32,21 +32,21 @@ class TestAccountBalance(unittest.TestCase): "currency": 'EUR', "balance": -100.0, }, - { - "account": 'Service - _TC2', - "currency": 'EUR', - "balance": 0.0, - }, - { - "account": 'Direct Income - _TC2', - "currency": 'EUR', - "balance": -100.0, - }, { "account": 'Indirect Income - _TC2', "currency": 'EUR', "balance": 0.0, }, + { + "account": 'Sales - _TC2', + "currency": 'EUR', + "balance": -100.0, + }, + { + "account": 'Service - _TC2', + "currency": 'EUR', + "balance": 0.0, + } ] self.assertEqual(expected_data, report[1]) From 9a67141bfb0069d9254a902dd2f366d7a22b36be Mon Sep 17 00:00:00 2001 From: Saqib Date: Thu, 10 Jun 2021 18:48:55 +0530 Subject: [PATCH 45/53] fix(einvoicing): service item check (#26010) --- erpnext/regional/india/e_invoice/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index a1179ff9b6..0eaf790538 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -199,7 +199,7 @@ def get_item_list(invoice): item.batch_expiry_date = frappe.db.get_value('Batch', d.batch_no, 'expiry_date') if d.batch_no else None item.batch_expiry_date = format_date(item.batch_expiry_date, 'dd/mm/yyyy') if item.batch_expiry_date else None - item.is_service_item = 'Y' if item.gst_hsn_code[:2] == "99" else 'N' + item.is_service_item = 'Y' if item.gst_hsn_code and item.gst_hsn_code[:2] == "99" else 'N' item.serial_no = "" item = update_item_taxes(invoice, item) From 687ad9b9421074a073d3087e3c266a72473bb7c7 Mon Sep 17 00:00:00 2001 From: marination Date: Thu, 10 Jun 2021 21:18:19 +0530 Subject: [PATCH 46/53] fix: Report Raw Materials to be Transferred --- ...tracted_raw_materials_to_be_transferred.py | 118 ++++++------------ 1 file changed, 39 insertions(+), 79 deletions(-) diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py index de2ae8fc73..5a0381b017 100644 --- a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py +++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py @@ -9,10 +9,10 @@ def execute(filters=None): if filters.from_date >= filters.to_date: frappe.msgprint(_("To Date must be greater than From Date")) - data = [] columns = get_columns() - get_data(data , filters) - return columns, data + data = get_data(filters) + + return columns, data or [] def get_columns(): return [ @@ -21,13 +21,12 @@ def get_columns(): "fieldtype": "Link", "fieldname": "purchase_order", "options": "Purchase Order", - "width": 150 + "width": 200 }, { "label": _("Date"), "fieldtype": "Date", "fieldname": "date", - "hidden": 1, "width": 150 }, { @@ -41,97 +40,58 @@ def get_columns(): "label": _("Item Code"), "fieldtype": "Data", "fieldname": "rm_item_code", - "width": 100 + "width": 150 }, { "label": _("Required Quantity"), "fieldtype": "Float", - "fieldname": "r_qty", - "width": 100 + "fieldname": "reqd_qty", + "width": 150 }, { "label": _("Transferred Quantity"), "fieldtype": "Float", - "fieldname": "t_qty", - "width": 100 + "fieldname": "transferred_qty", + "width": 200 }, { "label": _("Pending Quantity"), "fieldtype": "Float", "fieldname": "p_qty", - "width": 100 + "width": 150 } ] -def get_data(data, filters): - po = get_po(filters) - po_transferred_qty_map = frappe._dict(get_transferred_quantity([v.name for v in po])) +def get_data(filters): + po_rm_item_details = get_po_items_to_supply(filters) - sub_items = get_purchase_order_item_supplied([v.name for v in po]) + data = [] + for row in po_rm_item_details: + transferred_qty = row.get("transferred_qty") or 0 + if transferred_qty < row.get("reqd_qty", 0): + pending_qty = frappe.utils.flt(row.get("reqd_qty", 0) - transferred_qty) + row.p_qty = pending_qty if pending_qty > 0 else 0 + data.append(row) - for order in po: - for item in sub_items: - if order.name == item.parent and order.name in po_transferred_qty_map and \ - item.required_qty != po_transferred_qty_map.get(order.name).get(item.rm_item_code): - transferred_qty = po_transferred_qty_map.get(order.name).get(item.rm_item_code) \ - if po_transferred_qty_map.get(order.name).get(item.rm_item_code) else 0 - row ={ - 'purchase_order': item.parent, - 'date': order.transaction_date, - 'supplier': order.supplier, - 'rm_item_code': item.rm_item_code, - 'r_qty': item.required_qty, - 't_qty':transferred_qty, - 'p_qty':item.required_qty - transferred_qty - } + return data - data.append(row) - - return(data) - -def get_po(filters): - record_filters = [ - ["is_subcontracted", "=", "Yes"], - ["supplier", "=", filters.supplier], - ["transaction_date", "<=", filters.to_date], - ["transaction_date", ">=", filters.from_date], - ["docstatus", "=", 1] - ] - return frappe.get_all("Purchase Order", filters=record_filters, fields=["name", "transaction_date", "supplier"]) - -def get_transferred_quantity(po_name): - stock_entries = get_stock_entry(po_name) - stock_entries_detail = get_stock_entry_detail([v.name for v in stock_entries]) - po_transferred_qty_map = {} - - - for entry in stock_entries: - for details in stock_entries_detail: - if details.parent == entry.name: - details["Purchase_order"] = entry.purchase_order - if entry.purchase_order not in po_transferred_qty_map: - po_transferred_qty_map[entry.purchase_order] = {} - po_transferred_qty_map[entry.purchase_order][details.item_code] = details.qty - else: - po_transferred_qty_map[entry.purchase_order][details.item_code] = po_transferred_qty_map[entry.purchase_order].get(details.item_code, 0) + details.qty - - return po_transferred_qty_map - - -def get_stock_entry(po): - return frappe.get_all("Stock Entry", filters=[ - ('purchase_order', 'IN', po), - ('stock_entry_type', '=', 'Send to Subcontractor'), - ('docstatus', '=', 1) - ], fields=["name", "purchase_order"]) - -def get_stock_entry_detail(se): - return frappe.get_all("Stock Entry Detail", filters=[ - ["parent", "in", se] +def get_po_items_to_supply(filters): + return frappe.db.get_all( + "Purchase Order", + fields=[ + "name as purchase_order", + "transaction_date as date", + "supplier as supplier", + "`tabPurchase Order Item Supplied`.rm_item_code as rm_item_code", + "`tabPurchase Order Item Supplied`.required_qty as reqd_qty", + "`tabPurchase Order Item Supplied`.supplied_qty as transferred_qty" ], - fields=["parent", "item_code", "qty"]) - -def get_purchase_order_item_supplied(po): - return frappe.get_all("Purchase Order Item Supplied", filters=[ - ('parent', 'IN', po) - ], fields=['parent', 'rm_item_code', 'required_qty']) + filters = [ + ["Purchase Order", "per_received", "<", "100"], + ["Purchase Order", "is_subcontracted", "=", "Yes"], + ["Purchase Order", "supplier", "=", filters.supplier], + ["Purchase Order", "transaction_date", "<=", filters.to_date], + ["Purchase Order", "transaction_date", ">=", filters.from_date], + ["Purchase Order", "docstatus", "=", 1] + ] + ) \ No newline at end of file From ec4a3723cc1343e1ce99d9114ecb9bd610f8c034 Mon Sep 17 00:00:00 2001 From: marination Date: Fri, 11 Jun 2021 12:47:06 +0530 Subject: [PATCH 47/53] fix: Sider --- .../subcontracted_raw_materials_to_be_transferred.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py index 5a0381b017..68426abbb0 100644 --- a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py +++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py @@ -70,7 +70,7 @@ def get_data(filters): transferred_qty = row.get("transferred_qty") or 0 if transferred_qty < row.get("reqd_qty", 0): pending_qty = frappe.utils.flt(row.get("reqd_qty", 0) - transferred_qty) - row.p_qty = pending_qty if pending_qty > 0 else 0 + row.p_qty = pending_qty if pending_qty > 0 else 0 data.append(row) return data From 5bb89b0ead96f0bb7e2346fb01bd8710bbb7a3b2 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Fri, 11 Jun 2021 15:57:01 +0530 Subject: [PATCH 48/53] test(perf): eliminate repeat creation of HSN codes (#25947) --- erpnext/regional/india/setup.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py index 229e0c031e..3e0b9b733b 100644 --- a/erpnext/regional/india/setup.py +++ b/erpnext/regional/india/setup.py @@ -27,6 +27,9 @@ def setup_company_independent_fixtures(patch=False): add_print_formats() def add_hsn_sac_codes(): + if frappe.flags.in_test and frappe.flags.created_hsn_codes: + return + # HSN codes with open(os.path.join(os.path.dirname(__file__), 'hsn_code_data.json'), 'r') as f: hsn_codes = json.loads(f.read()) @@ -38,6 +41,9 @@ def add_hsn_sac_codes(): sac_codes = json.loads(f.read()) create_hsn_codes(sac_codes, code_field="sac_code") + if frappe.flags.in_test: + frappe.flags.created_hsn_codes = True + def create_hsn_codes(data, code_field): for d in data: hsn_code = frappe.new_doc('GST HSN Code') From a9c84f749a64f2627885d61d571bf10c04fd61a8 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Fri, 11 Jun 2021 16:00:48 +0530 Subject: [PATCH 49/53] perf(minor): remove unnecessary comprehensions (#25645) --- erpnext/accounts/doctype/c_form/c_form.py | 2 +- .../doctype/coupon_code/coupon_code.py | 2 +- .../invoice_discounting/invoice_discounting.py | 2 +- .../doctype/journal_entry/journal_entry.py | 4 ++-- .../monthly_distribution.py | 2 +- .../doctype/payment_entry/payment_entry.py | 10 +++++----- .../doctype/payment_request/payment_request.py | 2 +- erpnext/accounts/doctype/pricing_rule/utils.py | 18 +++++++++--------- .../purchase_invoice/test_purchase_invoice.py | 2 +- .../test_tax_withholding_category.py | 2 +- erpnext/accounts/general_ledger.py | 2 +- .../report/cash_flow/custom_cash_flow.py | 8 ++++---- .../customer_ledger_summary.py | 2 +- .../accounts/report/financial_statements.py | 2 +- .../item_wise_purchase_register.py | 2 +- .../item_wise_sales_register.py | 2 +- .../report/pos_register/pos_register.py | 6 +++--- .../purchase_register/purchase_register.py | 14 +++++++------- .../sales_payment_summary.py | 4 ++-- .../report/sales_register/sales_register.py | 16 ++++++++-------- .../tds_computation_summary.py | 4 ++-- erpnext/accounts/report/utils.py | 2 +- erpnext/accounts/utils.py | 2 +- erpnext/assets/doctype/asset/test_asset.py | 2 +- .../asset_value_adjustment.py | 2 +- .../doctype/purchase_order/purchase_order.py | 6 +++--- .../purchase_order/test_purchase_order.py | 2 +- .../request_for_quotation.py | 2 +- erpnext/controllers/accounts_controller.py | 8 ++++---- erpnext/controllers/buying_controller.py | 6 +++--- erpnext/controllers/queries.py | 2 +- erpnext/controllers/selling_controller.py | 2 +- erpnext/controllers/status_updater.py | 4 ++-- erpnext/controllers/stock_controller.py | 6 +++--- erpnext/controllers/taxes_and_totals.py | 12 ++++++------ erpnext/controllers/tests/test_mapper.py | 4 ++-- .../controllers/website_list_for_contact.py | 2 +- .../manufacturing/doctype/job_card/job_card.py | 2 +- erpnext/projects/doctype/task/task.py | 2 +- .../projects/doctype/timesheet/timesheet.py | 4 ++-- .../report/project_summary/project_summary.py | 2 +- erpnext/selling/doctype/customer/customer.py | 2 +- erpnext/selling/doctype/quotation/quotation.py | 2 +- .../selling/doctype/sales_order/sales_order.py | 2 +- erpnext/setup/doctype/company/company.py | 4 ++-- erpnext/setup/doctype/item_group/item_group.py | 4 ++-- erpnext/stock/doctype/batch/batch.py | 2 +- .../doctype/delivery_note/delivery_note.py | 2 +- .../doctype/delivery_trip/delivery_trip.py | 6 +++--- .../landed_cost_voucher/landed_cost_voucher.py | 8 ++++---- .../test_landed_cost_voucher.py | 2 +- .../stock/doctype/packing_slip/packing_slip.py | 4 ++-- .../purchase_receipt/test_purchase_receipt.py | 2 +- erpnext/stock/doctype/serial_no/serial_no.py | 2 +- .../stock/doctype/stock_entry/stock_entry.py | 2 +- .../item_price_stock/item_price_stock.py | 2 +- .../itemwise_recommended_reorder_level.py | 2 +- .../product_bundle_balance.py | 2 +- .../report/stock_balance/stock_balance.py | 6 +++--- .../stock/report/stock_ledger/stock_ledger.py | 4 ++-- erpnext/stock/stock_ledger.py | 2 +- .../doctype/warranty_claim/warranty_claim.py | 2 +- erpnext/utilities/product.py | 2 +- erpnext/utilities/transaction_base.py | 4 ++-- 64 files changed, 126 insertions(+), 126 deletions(-) diff --git a/erpnext/accounts/doctype/c_form/c_form.py b/erpnext/accounts/doctype/c_form/c_form.py index fd86ed4c90..cfe28f3ff9 100644 --- a/erpnext/accounts/doctype/c_form/c_form.py +++ b/erpnext/accounts/doctype/c_form/c_form.py @@ -54,7 +54,7 @@ class CForm(Document): frappe.throw(_("Please enter atleast 1 invoice in the table")) def set_total_invoiced_amount(self): - total = sum([flt(d.grand_total) for d in self.get('invoices')]) + total = sum(flt(d.grand_total) for d in self.get('invoices')) frappe.db.set(self, 'total_invoiced_amount', total) @frappe.whitelist() diff --git a/erpnext/accounts/doctype/coupon_code/coupon_code.py b/erpnext/accounts/doctype/coupon_code/coupon_code.py index 7829c9320d..55c119315e 100644 --- a/erpnext/accounts/doctype/coupon_code/coupon_code.py +++ b/erpnext/accounts/doctype/coupon_code/coupon_code.py @@ -14,7 +14,7 @@ class CouponCode(Document): if not self.coupon_code: if self.coupon_type == "Promotional": - self.coupon_code =''.join([i for i in self.coupon_name if not i.isdigit()])[0:8].upper() + self.coupon_code =''.join(i for i in self.coupon_name if not i.isdigit())[0:8].upper() elif self.coupon_type == "Gift Card": self.coupon_code = frappe.generate_hash()[:10].upper() diff --git a/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py b/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py index 95d2ee56d9..b73d8bfbb1 100644 --- a/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py +++ b/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py @@ -42,7 +42,7 @@ class InvoiceDiscounting(AccountsController): record.idx, frappe.bold(actual_outstanding), frappe.bold(record.sales_invoice))) def calculate_total_amount(self): - self.total_amount = sum([flt(d.outstanding_amount) for d in self.invoices]) + self.total_amount = sum(flt(d.outstanding_amount) for d in self.invoices) def on_submit(self): self.update_sales_invoice() diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index ed1bd28223..937597bc55 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -196,8 +196,8 @@ class JournalEntry(AccountsController): frappe.throw(_("Row {0}: Party Type and Party is required for Receivable / Payable account {1}").format(d.idx, d.account)) def check_credit_limit(self): - customers = list(set([d.party for d in self.get("accounts") - if d.party_type=="Customer" and d.party and flt(d.debit) > 0])) + customers = list(set(d.party for d in self.get("accounts") + if d.party_type=="Customer" and d.party and flt(d.debit) > 0)) if customers: from erpnext.selling.doctype.customer.customer import check_credit_limit for customer in customers: diff --git a/erpnext/accounts/doctype/monthly_distribution/monthly_distribution.py b/erpnext/accounts/doctype/monthly_distribution/monthly_distribution.py index 88667d7207..bff6422732 100644 --- a/erpnext/accounts/doctype/monthly_distribution/monthly_distribution.py +++ b/erpnext/accounts/doctype/monthly_distribution/monthly_distribution.py @@ -21,7 +21,7 @@ class MonthlyDistribution(Document): idx += 1 def validate(self): - total = sum([flt(d.percentage_allocation) for d in self.get("percentages")]) + total = sum(flt(d.percentage_allocation) for d in self.get("percentages")) if flt(total, 2) != 100.0: frappe.throw(_("Percentage Allocation should be equal to 100%") + \ diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index edca210142..2c6deb3896 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -309,7 +309,7 @@ class PaymentEntry(AccountsController): for k, v in no_oustanding_refs.items(): frappe.msgprint( _("{} - {} now have {} as they had no outstanding amount left before submitting the Payment Entry.") - .format(k, frappe.bold(", ".join([d.reference_name for d in v])), frappe.bold("negative outstanding amount")) + .format(k, frappe.bold(", ".join(d.reference_name for d in v)), frappe.bold("negative outstanding amount")) + "

" + _("If this is undesirable please cancel the corresponding Payment Entry."), title=_("Warning"), indicator="orange") @@ -524,7 +524,7 @@ class PaymentEntry(AccountsController): def set_unallocated_amount(self): self.unallocated_amount = 0 if self.party: - total_deductions = sum([flt(d.amount) for d in self.get("deductions")]) + total_deductions = sum(flt(d.amount) for d in self.get("deductions")) if self.payment_type == "Receive" \ and self.base_total_allocated_amount < self.base_received_amount_after_tax + total_deductions \ and self.total_allocated_amount < self.paid_amount_after_tax + (total_deductions / self.source_exchange_rate): @@ -549,7 +549,7 @@ class PaymentEntry(AccountsController): else: self.difference_amount = self.base_paid_amount_after_tax - flt(self.base_received_amount_after_tax) - total_deductions = sum([flt(d.amount) for d in self.get("deductions")]) + total_deductions = sum(flt(d.amount) for d in self.get("deductions")) self.difference_amount = flt(self.difference_amount - total_deductions, self.precision("difference_amount")) @@ -565,8 +565,8 @@ class PaymentEntry(AccountsController): if ((self.payment_type=="Pay" and self.party_type=="Customer") or (self.payment_type=="Receive" and self.party_type=="Supplier")): - total_negative_outstanding = sum([abs(flt(d.outstanding_amount)) - for d in self.get("references") if flt(d.outstanding_amount) < 0]) + total_negative_outstanding = sum(abs(flt(d.outstanding_amount)) + for d in self.get("references") if flt(d.outstanding_amount) < 0) paid_amount = self.paid_amount if self.payment_type=="Receive" else self.received_amount additional_charges = sum([flt(d.amount) for d in self.deductions]) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 468978785b..438951db62 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -112,7 +112,7 @@ class PaymentRequest(Document): if not data_of_completed_requests: return self.grand_total - request_amounts = sum([json.loads(d).get('request_amount') for d in data_of_completed_requests]) + request_amounts = sum(json.loads(d).get('request_amount') for d in data_of_completed_requests) return request_amounts def on_cancel(self): diff --git a/erpnext/accounts/doctype/pricing_rule/utils.py b/erpnext/accounts/doctype/pricing_rule/utils.py index d23b952bdc..b54d0e73a8 100644 --- a/erpnext/accounts/doctype/pricing_rule/utils.py +++ b/erpnext/accounts/doctype/pricing_rule/utils.py @@ -20,9 +20,9 @@ from frappe.utils import cint, flt, get_link_to_form, getdate, today, fmt_money class MultiplePricingRuleConflict(frappe.ValidationError): pass apply_on_table = { - 'Item Code': 'items', - 'Item Group': 'item_groups', - 'Brand': 'brands' + 'Item Code': 'items', + 'Item Group': 'item_groups', + 'Brand': 'brands' } def get_pricing_rules(args, doc=None): @@ -183,7 +183,7 @@ def _get_tree_conditions(args, parenttype, table, allow_blank=True): condition = "ifnull({table}.{field}, '') in ({parent_groups})".format( table=table, field=field, - parent_groups=", ".join([frappe.db.escape(d) for d in parent_groups]) + parent_groups=", ".join(frappe.db.escape(d) for d in parent_groups) ) frappe.flags.tree_conditions[key] = condition @@ -264,7 +264,7 @@ def filter_pricing_rules(args, pricing_rules, doc=None): # find pricing rule with highest priority if pricing_rules: - max_priority = max([cint(p.priority) for p in pricing_rules]) + max_priority = max(cint(p.priority) for p in pricing_rules) if max_priority: pricing_rules = list(filter(lambda x: cint(x.priority)==max_priority, pricing_rules)) @@ -272,14 +272,14 @@ def filter_pricing_rules(args, pricing_rules, doc=None): pricing_rules = list(pricing_rules) if len(pricing_rules) > 1: - rate_or_discount = list(set([d.rate_or_discount for d in pricing_rules])) + rate_or_discount = list(set(d.rate_or_discount for d in pricing_rules)) if len(rate_or_discount) == 1 and rate_or_discount[0] == "Discount Percentage": pricing_rules = list(filter(lambda x: x.for_price_list==args.price_list, pricing_rules)) \ or pricing_rules if len(pricing_rules) > 1 and not args.for_shopping_cart: frappe.throw(_("Multiple Price Rules exists with same criteria, please resolve conflict by assigning priority. Price Rules: {0}") - .format("\n".join([d.name for d in pricing_rules])), MultiplePricingRuleConflict) + .format("\n".join(d.name for d in pricing_rules)), MultiplePricingRuleConflict) elif pricing_rules: return pricing_rules[0] @@ -541,7 +541,7 @@ def get_product_discount_rule(pricing_rule, item_details, args=None, doc=None): def apply_pricing_rule_for_free_items(doc, pricing_rule_args, set_missing_values=False): if pricing_rule_args: - items = tuple([(d.item_code, d.pricing_rules) for d in doc.items if d.is_free_item]) + items = tuple((d.item_code, d.pricing_rules) for d in doc.items if d.is_free_item) for args in pricing_rule_args: if not items or (args.get('item_code'), args.get('pricing_rules')) not in items: @@ -589,4 +589,4 @@ def update_coupon_code_count(coupon_name,transaction_type): elif transaction_type=='cancelled': if coupon.used>0: coupon.used=coupon.used-1 - coupon.save(ignore_permissions=True) \ No newline at end of file + coupon.save(ignore_permissions=True) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 723d151ad8..503dda7728 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -632,7 +632,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual(len(pi.get("supplied_items")), 2) - rm_supp_cost = sum([d.amount for d in pi.get("supplied_items")]) + rm_supp_cost = sum(d.amount for d in pi.get("supplied_items")) self.assertEqual(flt(pi.get("items")[0].rm_supp_cost, 2), flt(rm_supp_cost, 2)) def test_rejected_serial_no(self): diff --git a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py index 0cea7612dd..dd26be7c99 100644 --- a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py +++ b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py @@ -112,7 +112,7 @@ class TestTaxWithholdingCategory(unittest.TestCase): si = create_sales_invoice(customer = "Test TCS Customer", rate=5000) si.submit() - tcs_charged = sum([d.base_tax_amount for d in si.taxes if d.account_head == 'TCS - _TC']) + tcs_charged = sum(d.base_tax_amount for d in si.taxes if d.account_head == 'TCS - _TC') self.assertEqual(tcs_charged, 500) invoices.append(si) diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index d4b249429b..59009ae621 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -143,7 +143,7 @@ def make_entry(args, adv_adj, update_outstanding, from_repost=False): validate_expense_against_budget(args) def validate_cwip_accounts(gl_map): - cwip_enabled = any([cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category","enable_cwip_accounting")]) + cwip_enabled = any(cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category","enable_cwip_accounting")) if cwip_enabled and gl_map[0].voucher_type == "Journal Entry": cwip_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount diff --git a/erpnext/accounts/report/cash_flow/custom_cash_flow.py b/erpnext/accounts/report/cash_flow/custom_cash_flow.py index ff87276a87..c11c15390b 100644 --- a/erpnext/accounts/report/cash_flow/custom_cash_flow.py +++ b/erpnext/accounts/report/cash_flow/custom_cash_flow.py @@ -32,7 +32,7 @@ def get_accounts_in_mappers(mapping_names): join `tabCash Flow Mapping` cfm on cfma.parent=cfm.name where cfma.parent in (%s) order by cfm.is_working_capital - ''', (', '.join(['"%s"' % d for d in mapping_names]))) + ''', (', '.join('"%s"' % d for d in mapping_names))) def setup_mappers(mappers): @@ -83,8 +83,8 @@ def setup_mappers(mappers): account_types_labels = sorted( set( - [(d['label'], d['is_working_capital'], d['is_income_tax_liability'], d['is_income_tax_expense']) - for d in account_types] + (d['label'], d['is_working_capital'], d['is_income_tax_liability'], d['is_income_tax_expense']) + for d in account_types ), key=lambda x: x[1] ) @@ -375,7 +375,7 @@ def _get_account_type_based_data(filters, account_names, period_list, accumulate total = 0 for period in period_list: start_date = get_start_date(period, accumulated_values, company) - accounts = ', '.join(['"%s"' % d for d in account_names]) + accounts = ', '.join('"%s"' % d for d in account_names) if opening_balances: date_info = dict(date=start_date) diff --git a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py index 10b32fea56..c79d7401e6 100644 --- a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py +++ b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py @@ -145,7 +145,7 @@ class PartyLedgerSummaryReport(object): out = [] for party, row in iteritems(self.party_data): if row.opening_balance or row.invoiced_amount or row.paid_amount or row.return_amount or row.closing_amount: - total_party_adjustment = sum([amount for amount in itervalues(self.party_adjustment_details.get(party, {}))]) + total_party_adjustment = sum(amount for amount in itervalues(self.party_adjustment_details.get(party, {}))) row.paid_amount -= total_party_adjustment adjustments = self.party_adjustment_details.get(party, {}) diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index d20ddbde5c..39ff804518 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -369,7 +369,7 @@ def set_gl_entries_by_account( if accounts: additional_conditions += " and account in ({})"\ - .format(", ".join([frappe.db.escape(d) for d in accounts])) + .format(", ".join(frappe.db.escape(d) for d in accounts)) gl_filters = { "company": company, diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py index cb4d9b43db..685419a17e 100644 --- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py +++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py @@ -334,7 +334,7 @@ def get_aii_accounts(): def get_purchase_receipts_against_purchase_order(item_list): po_pr_map = frappe._dict() - po_item_rows = list(set([d.po_detail for d in item_list])) + po_item_rows = list(set(d.po_detail for d in item_list)) if po_item_rows: purchase_receipts = frappe.db.sql(""" diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py index 928b373eff..2e794da842 100644 --- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py +++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py @@ -23,7 +23,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum if item_list: itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency) - mode_of_payments = get_mode_of_payments(set([d.parent for d in item_list])) + mode_of_payments = get_mode_of_payments(set(d.parent for d in item_list)) so_dn_map = get_delivery_notes_against_sales_order(item_list) data = [] diff --git a/erpnext/accounts/report/pos_register/pos_register.py b/erpnext/accounts/report/pos_register/pos_register.py index cfbd7fd0c8..6a42bb4fb6 100644 --- a/erpnext/accounts/report/pos_register/pos_register.py +++ b/erpnext/accounts/report/pos_register/pos_register.py @@ -77,14 +77,14 @@ def get_pos_entries(filters, group_by_field): ), filters, as_dict=1) def concat_mode_of_payments(pos_entries): - mode_of_payments = get_mode_of_payments(set([d.pos_invoice for d in pos_entries])) + mode_of_payments = get_mode_of_payments(set(d.pos_invoice for d in pos_entries)) for entry in pos_entries: if mode_of_payments.get(entry.pos_invoice): entry.mode_of_payment = ", ".join(mode_of_payments.get(entry.pos_invoice, [])) def add_subtotal_row(data, group_invoices, group_by_field, group_by_value): - grand_total = sum([d.grand_total for d in group_invoices]) - paid_amount = sum([d.paid_amount for d in group_invoices]) + grand_total = sum(d.grand_total for d in group_invoices) + paid_amount = sum(d.paid_amount for d in group_invoices) data.append({ group_by_field: group_by_value, "grand_total": grand_total, diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py index 8ac749d629..10edd41aa8 100644 --- a/erpnext/accounts/report/purchase_register/purchase_register.py +++ b/erpnext/accounts/report/purchase_register/purchase_register.py @@ -26,7 +26,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum invoice_expense_map, invoice_tax_map = get_invoice_tax_map(invoice_list, invoice_expense_map, expense_accounts) invoice_po_pr_map = get_invoice_po_pr_map(invoice_list) - suppliers = list(set([d.supplier for d in invoice_list])) + suppliers = list(set(d.supplier for d in invoice_list)) supplier_details = get_supplier_details(suppliers) company_currency = frappe.get_cached_value('Company', filters.company, "default_currency") @@ -120,13 +120,13 @@ def get_columns(invoice_list, additional_table_columns): and docstatus = 1 and (account_head is not null and account_head != '') and category in ('Total', 'Valuation and Total') and parent in (%s) order by account_head""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list)) unrealized_profit_loss_accounts = frappe.db.sql_list("""SELECT distinct unrealized_profit_loss_account from `tabPurchase Invoice` where docstatus = 1 and name in (%s) and ifnull(unrealized_profit_loss_account, '') != '' order by unrealized_profit_loss_account""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list)) expense_columns = [(account + ":Currency/currency:120") for account in expense_accounts] unrealized_profit_loss_account_columns = [(account + ":Currency/currency:120") for account in unrealized_profit_loss_accounts] @@ -208,7 +208,7 @@ def get_invoice_expense_map(invoice_list): from `tabPurchase Invoice Item` where parent in (%s) group by parent, expense_account - """ % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + """ % ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) invoice_expense_map = {} for d in expense_details: @@ -221,7 +221,7 @@ def get_internal_invoice_map(invoice_list): unrealized_amount_details = frappe.db.sql("""SELECT name, unrealized_profit_loss_account, base_net_total as amount from `tabPurchase Invoice` where name in (%s) and is_internal_supplier = 1 and company = represents_company""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) internal_invoice_map = {} for d in unrealized_amount_details: @@ -238,7 +238,7 @@ def get_invoice_tax_map(invoice_list, invoice_expense_map, expense_accounts): where parent in (%s) and category in ('Total', 'Valuation and Total') and base_tax_amount_after_discount_amount != 0 group by parent, account_head, add_deduct_tax - """ % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + """ % ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) invoice_tax_map = {} for d in tax_details: @@ -258,7 +258,7 @@ def get_invoice_po_pr_map(invoice_list): select parent, purchase_order, purchase_receipt, po_detail, project from `tabPurchase Invoice Item` where parent in (%s) - """ % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + """ % ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) invoice_po_pr_map = {} for d in pi_items: diff --git a/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py b/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py index c234da0fe3..ff774681a2 100644 --- a/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py +++ b/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py @@ -158,7 +158,7 @@ def get_sales_invoice_data(filters): def get_mode_of_payments(filters): mode_of_payments = {} invoice_list = get_invoices(filters) - invoice_list_names = ",".join(['"' + invoice['name'] + '"' for invoice in invoice_list]) + invoice_list_names = ",".join('"' + invoice['name'] + '"' for invoice in invoice_list) if invoice_list: inv_mop = frappe.db.sql("""select a.owner,a.posting_date, ifnull(b.mode_of_payment, '') as mode_of_payment from `tabSales Invoice` a, `tabSales Invoice Payment` b @@ -197,7 +197,7 @@ def get_invoices(filters): def get_mode_of_payment_details(filters): mode_of_payment_details = {} invoice_list = get_invoices(filters) - invoice_list_names = ",".join(['"' + invoice['name'] + '"' for invoice in invoice_list]) + invoice_list_names = ",".join('"' + invoice['name'] + '"' for invoice in invoice_list) if invoice_list: inv_mop_detail = frappe.db.sql("""select a.owner, a.posting_date, ifnull(b.mode_of_payment, '') as mode_of_payment, sum(b.base_amount) as paid_amount diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py index cb2c98b64a..909959323f 100644 --- a/erpnext/accounts/report/sales_register/sales_register.py +++ b/erpnext/accounts/report/sales_register/sales_register.py @@ -248,19 +248,19 @@ def get_columns(invoice_list, additional_table_columns): income_accounts = frappe.db.sql_list("""select distinct income_account from `tabSales Invoice Item` where docstatus = 1 and parent in (%s) order by income_account""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list)) tax_accounts = frappe.db.sql_list("""select distinct account_head from `tabSales Taxes and Charges` where parenttype = 'Sales Invoice' and docstatus = 1 and base_tax_amount_after_discount_amount != 0 and parent in (%s) order by account_head""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list)) unrealized_profit_loss_accounts = frappe.db.sql_list("""SELECT distinct unrealized_profit_loss_account from `tabSales Invoice` where docstatus = 1 and name in (%s) and ifnull(unrealized_profit_loss_account, '') != '' order by unrealized_profit_loss_account""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list)) for account in income_accounts: income_columns.append({ @@ -406,7 +406,7 @@ def get_invoices(filters, additional_query_columns): def get_invoice_income_map(invoice_list): income_details = frappe.db.sql("""select parent, income_account, sum(base_net_amount) as amount from `tabSales Invoice Item` where parent in (%s) group by parent, income_account""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) invoice_income_map = {} for d in income_details: @@ -419,7 +419,7 @@ def get_internal_invoice_map(invoice_list): unrealized_amount_details = frappe.db.sql("""SELECT name, unrealized_profit_loss_account, base_net_total as amount from `tabSales Invoice` where name in (%s) and is_internal_customer = 1 and company = represents_company""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) internal_invoice_map = {} for d in unrealized_amount_details: @@ -432,7 +432,7 @@ def get_invoice_tax_map(invoice_list, invoice_income_map, income_accounts): tax_details = frappe.db.sql("""select parent, account_head, sum(base_tax_amount_after_discount_amount) as tax_amount from `tabSales Taxes and Charges` where parent in (%s) group by parent, account_head""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) invoice_tax_map = {} for d in tax_details: @@ -451,7 +451,7 @@ def get_invoice_so_dn_map(invoice_list): si_items = frappe.db.sql("""select parent, sales_order, delivery_note, so_detail from `tabSales Invoice Item` where parent in (%s) and (ifnull(sales_order, '') != '' or ifnull(delivery_note, '') != '')""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) invoice_so_dn_map = {} for d in si_items: @@ -475,7 +475,7 @@ def get_invoice_cc_wh_map(invoice_list): si_items = frappe.db.sql("""select parent, cost_center, warehouse from `tabSales Invoice Item` where parent in (%s) and (ifnull(cost_center, '') != '' or ifnull(warehouse, '') != '')""" % - ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + ', '.join(['%s']*len(invoice_list)), tuple(inv.name for inv in invoice_list), as_dict=1) invoice_cc_wh_map = {} for d in si_items: diff --git a/erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py b/erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py index a8280c1b18..e15715dccd 100644 --- a/erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py +++ b/erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py @@ -78,7 +78,7 @@ def get_invoice_and_tds_amount(supplier, account, company, from_date, to_date, f and company=%s and posting_date between %s and %s """, (supplier, company, from_date, to_date), as_dict=1) - supplier_credit_amount = flt(sum([d.credit for d in entries])) + supplier_credit_amount = flt(sum(d.credit for d in entries)) vouchers = [d.voucher_no for d in entries] vouchers += get_advance_vouchers([supplier], company=company, @@ -91,7 +91,7 @@ def get_invoice_and_tds_amount(supplier, account, company, from_date, to_date, f from `tabGL Entry` where account=%s and posting_date between %s and %s and company=%s and credit > 0 and voucher_no in ({0}) - """.format(', '.join(["'%s'" % d for d in vouchers])), + """.format(', '.join("'%s'" % d for d in vouchers)), (account, from_date, to_date, company))[0][0]) date_range_filter = [fiscal_year, from_date, to_date] diff --git a/erpnext/accounts/report/utils.py b/erpnext/accounts/report/utils.py index b020d0a506..ba461edaf8 100644 --- a/erpnext/accounts/report/utils.py +++ b/erpnext/accounts/report/utils.py @@ -139,6 +139,6 @@ def get_invoiced_item_gross_margin(sales_invoice=None, item_code=None, company=N gross_profit_data = GrossProfitGenerator(filters) result = gross_profit_data.grouped_data if not with_item_data: - result = sum([d.gross_profit for d in result]) + result = sum(d.gross_profit for d in result) return result diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 5a64e27ccb..66a9b60125 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -635,7 +635,7 @@ def get_held_invoices(party_type, party): 'select name from `tabPurchase Invoice` where release_date IS NOT NULL and release_date > CURDATE()', as_dict=1 ) - held_invoices = set([d['name'] for d in held_invoices]) + held_invoices = set(d['name'] for d in held_invoices) return held_invoices diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 3cd4b802c1..8845f24d10 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -470,7 +470,7 @@ class TestAsset(unittest.TestCase): }) asset.insert() accumulated_depreciation_after_full_schedule = \ - max([d.accumulated_depreciation_amount for d in asset.get("schedules")]) + max(d.accumulated_depreciation_amount for d in asset.get("schedules")) asset_value_after_full_schedule = (flt(asset.gross_purchase_amount) - flt(accumulated_depreciation_after_full_schedule)) diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py index 14308277c1..2f6b5ee2dc 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -92,7 +92,7 @@ class AssetValueAdjustment(Document): d.value_after_depreciation = asset_value if d.depreciation_method in ("Straight Line", "Manual"): - end_date = max([s.schedule_date for s in asset.schedules if cint(s.finance_book_id) == d.idx]) + end_date = max(s.schedule_date for s in asset.schedules if cint(s.finance_book_id) == d.idx) total_days = date_diff(end_date, self.date) rate_per_day = flt(d.value_after_depreciation) / flt(total_days) from_date = self.date diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 782593a5c5..2629ba7d61 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -139,7 +139,7 @@ class PurchaseOrder(BuyingController): def validate_minimum_order_qty(self): if not self.get("items"): return - items = list(set([d.item_code for d in self.get("items")])) + items = list(set(d.item_code for d in self.get("items"))) itemwise_min_order_qty = frappe._dict(frappe.db.sql("""select name, min_order_qty from tabItem where name in ({0})""".format(", ".join(["%s"] * len(items))), items)) @@ -326,10 +326,10 @@ class PurchaseOrder(BuyingController): so.notify_update() def has_drop_ship_item(self): - return any([d.delivered_by_supplier for d in self.items]) + return any(d.delivered_by_supplier for d in self.items) def is_against_so(self): - return any([d.sales_order for d in self.items if d.sales_order]) + return any(d.sales_order for d in self.items if d.sales_order) def set_received_qty_for_drop_ship_items(self): for item in self.items: diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 39171960d8..3b9f8e9775 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -359,7 +359,7 @@ class TestPurchaseOrder(unittest.TestCase): update_child_qty_rate('Purchase Order', trans_item, po.name) po.reload() - total_reqd_qty_after_change = sum([d.get("required_qty") for d in po.as_dict().get("supplied_items")]) + total_reqd_qty_after_change = sum(d.get("required_qty") for d in po.as_dict().get("supplied_items")) self.assertEqual(total_reqd_qty_after_change, 2 * total_reqd_qty) diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py index 180ba93666..0127eb8163 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -391,7 +391,7 @@ def get_item_from_material_requests_based_on_supplier(source_name, target_doc = def get_supplier_tag(): if not frappe.cache().hget("Supplier", "Tags"): filters = {"document_type": "Supplier"} - tags = list(set([tag.tag for tag in frappe.get_all("Tag Link", filters=filters, fields=["tag"]) if tag])) + tags = list(set(tag.tag for tag in frappe.get_all("Tag Link", filters=filters, fields=["tag"]) if tag)) frappe.cache().hset("Supplier", "Tags", tags) return frappe.cache().hget("Supplier", "Tags") diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 53ded33b6f..7c6061defa 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -610,8 +610,8 @@ class AccountsController(TransactionBase): order_field = "purchase_order" order_doctype = "Purchase Order" - order_list = list(set([d.get(order_field) - for d in self.get("items") if d.get(order_field)])) + order_list = list(set(d.get(order_field) + for d in self.get("items") if d.get(order_field))) journal_entries = get_advance_journal_entries(party_type, party, party_account, amount_field, order_doctype, order_list, include_unallocated) @@ -635,8 +635,8 @@ class AccountsController(TransactionBase): def validate_advance_entries(self): order_field = "sales_order" if self.doctype == "Sales Invoice" else "purchase_order" - order_list = list(set([d.get(order_field) - for d in self.get("items") if d.get(order_field)])) + order_list = list(set(d.get(order_field) + for d in self.get("items") if d.get(order_field))) if not order_list: return diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 3f2d3390c0..da819119b1 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -181,8 +181,8 @@ class BuyingController(StockController): stock_and_asset_items_amount += flt(d.base_net_amount) last_item_idx = d.idx - total_valuation_amount = sum([flt(d.base_tax_amount_after_discount_amount) for d in self.get("taxes") - if d.category in ["Valuation", "Valuation and Total"]]) + total_valuation_amount = sum(flt(d.base_tax_amount_after_discount_amount) for d in self.get("taxes") + if d.category in ["Valuation", "Valuation and Total"]) valuation_amount_adjustment = total_valuation_amount for i, item in enumerate(self.get("items")): @@ -325,7 +325,7 @@ class BuyingController(StockController): def update_raw_materials_supplied_based_on_stock_entries(self): self.set('supplied_items', []) - purchase_orders = set([d.purchase_order for d in self.items]) + purchase_orders = set(d.purchase_order for d in self.items) # qty of raw materials backflushed (for each item per purchase order) backflushed_raw_materials_map = get_backflushed_subcontracted_raw_materials(purchase_orders) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 81ac234e70..7bd739a6ad 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -88,7 +88,7 @@ def customer_query(doctype, txt, searchfield, start, page_len, filters): fields = get_fields("Customer", fields) searchfields = frappe.get_meta("Customer").get_search_fields() - searchfields = " or ".join([field + " like %(txt)s" for field in searchfields]) + searchfields = " or ".join(field + " like %(txt)s" for field in searchfields) return frappe.db.sql("""select {fields} from `tabCustomer` where docstatus < 2 diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 54156f379c..7f28289760 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -428,7 +428,7 @@ class SellingController(StockController): self.po_no = ', '.join(list(set(x.strip() for x in ','.join(po_nos).split(',')))) def get_po_nos(self, ref_doctype, ref_fieldname, po_nos): - doc_list = list(set([d.get(ref_fieldname) for d in self.items if d.get(ref_fieldname)])) + doc_list = list(set(d.get(ref_fieldname) for d in self.items if d.get(ref_fieldname))) if doc_list: po_nos += [d.po_no for d in frappe.get_all(ref_doctype, 'po_no', filters = {'name': ('in', doc_list)}) if d.get('po_no')] diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index 83d4c33140..943f7aaeb1 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -299,8 +299,8 @@ class StatusUpdater(Document): args['name'] = self.get(args['percent_join_field_parent']) self._update_percent_field(args, update_modified) else: - distinct_transactions = set([d.get(args['percent_join_field']) - for d in self.get_all_children(args['source_dt'])]) + distinct_transactions = set(d.get(args['percent_join_field']) + for d in self.get_all_children(args['source_dt'])) for name in distinct_transactions: if name: diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 0da723d56e..9c29b0076b 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -313,7 +313,7 @@ class StockController(AccountsController): def get_serialized_items(self): serialized_items = [] - item_codes = list(set([d.item_code for d in self.get("items")])) + item_codes = list(set(d.item_code for d in self.get("items"))) if item_codes: serialized_items = frappe.db.sql_list("""select name from `tabItem` where has_serial_no=1 and name in ({})""".format(", ".join(["%s"]*len(item_codes))), @@ -324,8 +324,8 @@ class StockController(AccountsController): def validate_warehouse(self): from erpnext.stock.utils import validate_disabled_warehouse, validate_warehouse_company - warehouses = list(set([d.warehouse for d in - self.get("items") if getattr(d, "warehouse", None)])) + warehouses = list(set(d.warehouse for d in + self.get("items") if getattr(d, "warehouse", None))) target_warehouses = list(set([d.target_warehouse for d in self.get("items") if getattr(d, "target_warehouse", None)])) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 0b4fb3a3ed..2bb83ea7f0 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -378,10 +378,10 @@ class calculate_taxes_and_totals(object): def manipulate_grand_total_for_inclusive_tax(self): # if fully inclusive taxes and diff - if self.doc.get("taxes") and any([cint(t.included_in_print_rate) for t in self.doc.get("taxes")]): + if self.doc.get("taxes") and any(cint(t.included_in_print_rate) for t in self.doc.get("taxes")): last_tax = self.doc.get("taxes")[-1] - non_inclusive_tax_amount = sum([flt(d.tax_amount_after_discount_amount) - for d in self.doc.get("taxes") if not d.included_in_print_rate]) + non_inclusive_tax_amount = sum(flt(d.tax_amount_after_discount_amount) + for d in self.doc.get("taxes") if not d.included_in_print_rate) diff = self.doc.total + non_inclusive_tax_amount \ - flt(last_tax.total, last_tax.precision("total")) @@ -521,8 +521,8 @@ class calculate_taxes_and_totals(object): def calculate_total_advance(self): if self.doc.docstatus < 2: - total_allocated_amount = sum([flt(adv.allocated_amount, adv.precision("allocated_amount")) - for adv in self.doc.get("advances")]) + total_allocated_amount = sum(flt(adv.allocated_amount, adv.precision("allocated_amount")) + for adv in self.doc.get("advances")) self.doc.total_advance = flt(total_allocated_amount, self.doc.precision("total_advance")) @@ -622,7 +622,7 @@ class calculate_taxes_and_totals(object): if self.doc.doctype == "Sales Invoice" \ and self.doc.paid_amount > self.doc.grand_total and not self.doc.is_return \ - and any([d.type == "Cash" for d in self.doc.payments]): + and any(d.type == "Cash" for d in self.doc.payments): grand_total = self.doc.rounded_total or self.doc.grand_total base_grand_total = self.doc.base_rounded_total or self.doc.base_grand_total diff --git a/erpnext/controllers/tests/test_mapper.py b/erpnext/controllers/tests/test_mapper.py index 66459fdbf8..7a4b2d3614 100644 --- a/erpnext/controllers/tests/test_mapper.py +++ b/erpnext/controllers/tests/test_mapper.py @@ -26,8 +26,8 @@ class TestMapper(unittest.TestCase): # Assert that all inserted items are present in updated sales order src_items = item_list_1 + item_list_2 + item_list_3 - self.assertEqual(set([d for d in src_items]), - set([d.item_code for d in updated_so.items])) + self.assertEqual(set(d for d in src_items), + set(d.item_code for d in updated_so.items)) def make_quotation(self, item_list, customer): diff --git a/erpnext/controllers/website_list_for_contact.py b/erpnext/controllers/website_list_for_contact.py index ecf041efd1..7c072e4fad 100644 --- a/erpnext/controllers/website_list_for_contact.py +++ b/erpnext/controllers/website_list_for_contact.py @@ -113,7 +113,7 @@ def post_process(doctype, data): doc.set_indicator() doc.status_display = ", ".join(doc.status_display) - doc.items_preview = ", ".join([d.item_name for d in doc.items if d.item_name]) + doc.items_preview = ", ".join(d.item_name for d in doc.items if d.item_name) result.append(doc) return result diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index d764db33f8..cdc4518894 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -317,7 +317,7 @@ class JobCard(Document): 'docstatus': ('!=', 2)}, fields = 'sum(transferred_qty) as qty', group_by='operation_id') if job_cards: - qty = min([d.qty for d in job_cards]) + qty = min(d.qty for d in job_cards) doc.db_set('material_transferred_for_manufacturing', qty) diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index d1583f1473..39a6024e2c 100755 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -232,7 +232,7 @@ def get_project(doctype, txt, searchfield, start, page_len, filters): meta = frappe.get_meta(doctype) searchfields = meta.get_search_fields() search_columns = ", " + ", ".join(searchfields) if searchfields else '' - search_cond = " or " + " or ".join([field + " like %(txt)s" for field in searchfields]) + search_cond = " or " + " or ".join(field + " like %(txt)s" for field in searchfields) return frappe.db.sql(""" select name {search_columns} from `tabProject` where %(key)s like %(txt)s diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py index a3e4577f90..c8bd80fca0 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.py +++ b/erpnext/projects/doctype/timesheet/timesheet.py @@ -87,8 +87,8 @@ class Timesheet(Document): def set_dates(self): if self.docstatus < 2 and self.time_logs: - start_date = min([getdate(d.from_time) for d in self.time_logs]) - end_date = max([getdate(d.to_time) for d in self.time_logs]) + start_date = min(getdate(d.from_time) for d in self.time_logs) + end_date = max(getdate(d.to_time) for d in self.time_logs) if start_date and end_date: self.start_date = getdate(start_date) diff --git a/erpnext/projects/report/project_summary/project_summary.py b/erpnext/projects/report/project_summary/project_summary.py index 2c7bb49cfb..98dd617f9b 100644 --- a/erpnext/projects/report/project_summary/project_summary.py +++ b/erpnext/projects/report/project_summary/project_summary.py @@ -122,7 +122,7 @@ def get_report_summary(data): if not data: return None - avg_completion = sum([project.percent_complete for project in data]) / len(data) + avg_completion = sum(project.percent_complete for project in data) / len(data) total = sum([project.total_tasks for project in data]) total_overdue = sum([project.overdue_tasks for project in data]) completed = sum([project.completed_tasks for project in data]) diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index 51d86ff0bf..818888c0c1 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -75,7 +75,7 @@ class Customer(TransactionBase): self.loyalty_program_tier = customer.loyalty_program_tier if self.sales_team: - if sum([member.allocated_percentage or 0 for member in self.sales_team]) != 100: + if sum(member.allocated_percentage or 0 for member in self.sales_team) != 100: frappe.throw(_("Total contribution percentage should be equal to 100")) def check_customer_group_change(self): diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 246f9234a4..e4f8a47581 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -50,7 +50,7 @@ class Quotation(SellingController): self.customer_name = company_name or lead_name def update_opportunity(self, status): - for opportunity in list(set([d.prevdoc_docname for d in self.get("items")])): + for opportunity in set(d.prevdoc_docname for d in self.get("items")): if opportunity: self.update_opportunity_status(status, opportunity) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index d9e52e1d69..551f715bd5 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -151,7 +151,7 @@ class SalesOrder(SellingController): frappe.db.sql("update `tabOpportunity` set status = %s where name=%s",(flag,enq[0][0])) def update_prevdoc_status(self, flag=None): - for quotation in list(set([d.prevdoc_docname for d in self.get("items")])): + for quotation in set(d.prevdoc_docname for d in self.get("items")): if quotation: doc = frappe.get_doc("Quotation", quotation) if doc.docstatus==2: diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 077538d479..27e023c1e5 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -54,7 +54,7 @@ class Company(NestedSet): def validate_abbr(self): if not self.abbr: - self.abbr = ''.join([c[0] for c in self.company_name.split()]).upper() + self.abbr = ''.join(c[0] for c in self.company_name.split()).upper() self.abbr = self.abbr.strip() @@ -335,7 +335,7 @@ class Company(NestedSet): clear_defaults_cache() def abbreviate(self): - self.abbr = ''.join([c[0].upper() for c in self.company_name.split()]) + self.abbr = ''.join(c[0].upper() for c in self.company_name.split()) def on_trash(self): """ diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index bff806d547..db31d6d699 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -139,7 +139,7 @@ def get_product_list_for_group(product_group=None, start=0, limit=10, search=Non # return child item groups if the type is of "Is Group" return get_child_groups_for_list_in_html(item_group, start, limit, search) - child_groups = ", ".join([frappe.db.escape(i[0]) for i in get_child_groups(product_group)]) + child_groups = ", ".join(frappe.db.escape(i[0]) for i in get_child_groups(product_group)) # base query query = """select I.name, I.item_name, I.item_code, I.route, I.image, I.website_image, I.thumbnail, I.item_group, @@ -239,7 +239,7 @@ def get_item_for_list_in_html(context): return frappe.get_template(products_template).render(context) def get_group_item_count(item_group): - child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(item_group)]) + child_groups = ", ".join('"' + i[0] + '"' for i in get_child_groups(item_group)) return frappe.db.sql("""select count(*) from `tabItem` where docstatus = 0 and show_in_website = 1 and (item_group in (%s) diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py index 8fdda565d2..508e17c340 100644 --- a/erpnext/stock/doctype/batch/batch.py +++ b/erpnext/stock/doctype/batch/batch.py @@ -304,7 +304,7 @@ def validate_serial_no_with_batch(serial_nos, item_code): frappe.throw(_("The serial no {0} does not belong to item {1}") .format(get_link_to_form("Serial No", serial_nos[0]), get_link_to_form("Item", item_code))) - serial_no_link = ','.join([get_link_to_form("Serial No", sn) for sn in serial_nos]) + serial_no_link = ','.join(get_link_to_form("Serial No", sn) for sn in serial_nos) message = "Serial Nos" if len(serial_nos) > 1 else "Serial No" frappe.throw(_("There is no batch found against the {0}: {1}") diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index cce51cb9b1..dd31965fac 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -264,7 +264,7 @@ class DeliveryNote(SellingController): """ Validate that if packed qty exists, it should be equal to qty """ - if not any([flt(d.get('packed_qty')) for d in self.get("items")]): + if not any(flt(d.get('packed_qty')) for d in self.get("items")): return has_error = False for d in self.get("items"): diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py index 81e730126e..9ec28d8981 100644 --- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py +++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py @@ -68,7 +68,7 @@ class DeliveryTrip(Document): delete (bool, optional): Defaults to `False`. `True` if driver details need to be emptied, else `False`. """ - delivery_notes = list(set([stop.delivery_note for stop in self.delivery_stops if stop.delivery_note])) + delivery_notes = list(set(stop.delivery_note for stop in self.delivery_stops if stop.delivery_note)) update_fields = { "driver": self.driver, @@ -136,8 +136,8 @@ class DeliveryTrip(Document): # Include last leg in the final distance calculation self.uom = self.default_distance_uom - total_distance = sum([leg.get("distance", {}).get("value", 0.0) - for leg in directions.get("legs")]) # in meters + total_distance = sum(leg.get("distance", {}).get("value", 0.0) + for leg in directions.get("legs")) # in meters self.total_distance = total_distance * self.uom_conversion_factor else: idx += len(route) - 1 diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py index 83109469fc..5df4d8743f 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py @@ -78,7 +78,7 @@ class LandedCostVoucher(Document): .format(item.idx, item.item_code)) def set_total_taxes_and_charges(self): - self.total_taxes_and_charges = sum([flt(d.base_amount) for d in self.get("taxes")]) + self.total_taxes_and_charges = sum(flt(d.base_amount) for d in self.get("taxes")) def set_applicable_charges_on_item(self): if self.get('taxes') and self.distribute_charges_based_on != 'Distribute Manually': @@ -104,15 +104,15 @@ class LandedCostVoucher(Document): based_on = self.distribute_charges_based_on.lower() if based_on != 'distribute manually': - total = sum([flt(d.get(based_on)) for d in self.get("items")]) + total = sum(flt(d.get(based_on)) for d in self.get("items")) else: # consider for proportion while distributing manually - total = sum([flt(d.get('applicable_charges')) for d in self.get("items")]) + total = sum(flt(d.get('applicable_charges')) for d in self.get("items")) if not total: frappe.throw(_("Total {0} for all items is zero, may be you should change 'Distribute Charges Based On'").format(based_on)) - total_applicable_charges = sum([flt(d.applicable_charges) for d in self.get("items")]) + total_applicable_charges = sum(flt(d.applicable_charges) for d in self.get("items")) precision = get_field_precision(frappe.get_meta("Landed Cost Item").get_field("applicable_charges"), currency=frappe.get_cached_value('Company', self.company, "default_currency")) diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py index 984ae46c66..32b08f60c4 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py @@ -311,7 +311,7 @@ def create_landed_cost_voucher(receipt_document_type, receipt_document, company, def distribute_landed_cost_on_items(lcv): based_on = lcv.distribute_charges_based_on.lower() - total = sum([flt(d.get(based_on)) for d in lcv.get("items")]) + total = sum(flt(d.get(based_on)) for d in lcv.get("items")) for item in lcv.get("items"): item.applicable_charges = flt(item.get(based_on)) * flt(lcv.total_taxes_and_charges) / flt(total) diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.py b/erpnext/stock/doctype/packing_slip/packing_slip.py index 2008bffcd3..4a843e0fde 100644 --- a/erpnext/stock/doctype/packing_slip/packing_slip.py +++ b/erpnext/stock/doctype/packing_slip/packing_slip.py @@ -88,9 +88,9 @@ class PackingSlip(Document): rows = [d.item_code for d in self.get("items")] # also pick custom fields from delivery note - custom_fields = ', '.join(['dni.`{0}`'.format(d.fieldname) + custom_fields = ', '.join('dni.`{0}`'.format(d.fieldname) for d in frappe.get_meta("Delivery Note Item").get_custom_fields() - if d.fieldtype not in no_value_fields]) + if d.fieldtype not in no_value_fields) if custom_fields: custom_fields = ', ' + custom_fields diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 5095a80214..8d9b675bed 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -246,7 +246,7 @@ class TestPurchaseReceipt(unittest.TestCase): pr = make_purchase_receipt(item_code="_Test FG Item", qty=10, rate=500, is_subcontracted="Yes") self.assertEqual(len(pr.get("supplied_items")), 2) - rm_supp_cost = sum([d.amount for d in pr.get("supplied_items")]) + rm_supp_cost = sum(d.amount for d in pr.get("supplied_items")) self.assertEqual(pr.get("items")[0].rm_supp_cost, flt(rm_supp_cost, 2)) pr.cancel() diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 5ecc9f8140..b236f6a999 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -613,7 +613,7 @@ def fetch_serial_numbers(filters, qty, do_not_include=[]): batch_nos = filters.get("batch_no") expiry_date = filters.get("expiry_date") if batch_nos: - batch_no_condition = """and sr.batch_no in ({}) """.format(', '.join(["'%s'" % d for d in batch_nos])) + batch_no_condition = """and sr.batch_no in ({}) """.format(', '.join("'%s'" % d for d in batch_nos)) if expiry_date: batch_join_selection = "LEFT JOIN `tabBatch` batch on sr.batch_no = batch.name " diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 2f76bc7d56..560ceaa917 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -465,7 +465,7 @@ class StockEntry(StockController): """ # Set rate for outgoing items outgoing_items_cost = self.set_rate_for_outgoing_items(reset_outgoing_rate, raise_error_if_no_rate) - finished_item_qty = sum([d.transfer_qty for d in self.items if d.is_finished_item]) + finished_item_qty = sum(d.transfer_qty for d in self.items if d.is_finished_item) # Set basic rate for incoming items for d in self.get('items'): diff --git a/erpnext/stock/report/item_price_stock/item_price_stock.py b/erpnext/stock/report/item_price_stock/item_price_stock.py index 5296211fae..db7498bb21 100644 --- a/erpnext/stock/report/item_price_stock/item_price_stock.py +++ b/erpnext/stock/report/item_price_stock/item_price_stock.py @@ -89,7 +89,7 @@ def get_item_price_qty_data(filters): {conditions}""" .format(conditions=conditions), filters, as_dict=1) - price_list_names = list(set([item.price_list_name for item in item_results])) + price_list_names = list(set(item.price_list_name for item in item_results)) buying_price_map = get_price_map(price_list_names, buying=1) selling_price_map = get_price_map(price_list_names, selling=1) diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py index 2f70523264..2e13aa0b04 100644 --- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py +++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py @@ -66,7 +66,7 @@ def get_consumed_items(condition): purpose is NULL or purpose not in ({}) ) - """.format(', '.join([f"'{p}'" for p in purpose_to_exclude])) + """.format(', '.join(f"'{p}'" for p in purpose_to_exclude)) condition = condition.replace("posting_date", "sle.posting_date") consumed_items = frappe.db.sql(""" diff --git a/erpnext/stock/report/product_bundle_balance/product_bundle_balance.py b/erpnext/stock/report/product_bundle_balance/product_bundle_balance.py index 276e42ee43..8fffbccab3 100644 --- a/erpnext/stock/report/product_bundle_balance/product_bundle_balance.py +++ b/erpnext/stock/report/product_bundle_balance/product_bundle_balance.py @@ -141,7 +141,7 @@ def get_stock_ledger_entries(filters, items): return [] item_conditions_sql = ' and sle.item_code in ({})' \ - .format(', '.join([frappe.db.escape(i) for i in items])) + .format(', '.join(frappe.db.escape(i) for i in items)) conditions = get_sle_conditions(filters) diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py index bbd73e9112..b6a8063189 100644 --- a/erpnext/stock/report/stock_balance/stock_balance.py +++ b/erpnext/stock/report/stock_balance/stock_balance.py @@ -157,7 +157,7 @@ def get_stock_ledger_entries(filters, items): item_conditions_sql = '' if items: item_conditions_sql = ' and sle.item_code in ({})'\ - .format(', '.join([frappe.db.escape(i, percent=False) for i in items])) + .format(', '.join(frappe.db.escape(i, percent=False) for i in items)) conditions = get_conditions(filters) @@ -253,7 +253,7 @@ def get_items(filters): def get_item_details(items, sle, filters): item_details = {} if not items: - items = list(set([d.item_code for d in sle])) + items = list(set(d.item_code for d in sle)) if not items: return item_details @@ -291,7 +291,7 @@ def get_item_reorder_details(items): select parent, warehouse, warehouse_reorder_qty, warehouse_reorder_level from `tabItem Reorder` where parent in ({0}) - """.format(', '.join([frappe.db.escape(i, percent=False) for i in items])), as_dict=1) + """.format(', '.join(frappe.db.escape(i, percent=False) for i in items)), as_dict=1) return dict((d.parent + d.warehouse, d) for d in item_reorder_details) diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py index 36996e9674..8909f217f4 100644 --- a/erpnext/stock/report/stock_ledger/stock_ledger.py +++ b/erpnext/stock/report/stock_ledger/stock_ledger.py @@ -115,7 +115,7 @@ def get_stock_ledger_entries(filters, items): item_conditions_sql = '' if items: item_conditions_sql = 'and sle.item_code in ({})'\ - .format(', '.join([frappe.db.escape(i) for i in items])) + .format(', '.join(frappe.db.escape(i) for i in items)) sl_entries = frappe.db.sql(""" SELECT @@ -169,7 +169,7 @@ def get_items(filters): def get_item_details(items, sl_entries, include_uom): item_details = {} if not items: - items = list(set([d.item_code for d in sl_entries])) + items = list(set(d.item_code for d in sl_entries)) if not items: return item_details diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index b2825fc26f..fc82c789cc 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -521,7 +521,7 @@ class update_entries_after(object): fields=["purchase_rate", "name", "company"], filters = {'name': ('in', serial_nos)}) - incoming_values = sum([flt(d.purchase_rate) for d in all_serial_nos if d.company==sle.company]) + incoming_values = sum(flt(d.purchase_rate) for d in all_serial_nos if d.company==sle.company) # Get rate for serial nos which has been transferred to other company invalid_serial_nos = [d.name for d in all_serial_nos if d.company!=sle.company] diff --git a/erpnext/support/doctype/warranty_claim/warranty_claim.py b/erpnext/support/doctype/warranty_claim/warranty_claim.py index a3428a25af..a20e7a801b 100644 --- a/erpnext/support/doctype/warranty_claim/warranty_claim.py +++ b/erpnext/support/doctype/warranty_claim/warranty_claim.py @@ -29,7 +29,7 @@ class WarrantyClaim(TransactionBase): where t2.parent = t1.name and t2.prevdoc_docname = %s and t1.docstatus!=2""", (self.name)) if lst: - lst1 = ','.join([x[0] for x in lst]) + lst1 = ','.join(x[0] for x in lst) frappe.throw(_("Cancel Material Visit {0} before cancelling this Warranty Claim").format(lst1)) else: frappe.db.set(self, 'status', 'Cancelled') diff --git a/erpnext/utilities/product.py b/erpnext/utilities/product.py index 66d6cd3888..70b41767d6 100644 --- a/erpnext/utilities/product.py +++ b/erpnext/utilities/product.py @@ -131,6 +131,6 @@ def get_non_stock_item_status(item_code, item_warehouse_field): if frappe.db.exists("Product Bundle", item_code): items = frappe.get_doc("Product Bundle", item_code).get_all_children() bundle_warehouse = frappe.db.get_value('Item', item_code, item_warehouse_field) - return all([ get_qty_in_stock(d.item_code, item_warehouse_field, bundle_warehouse).in_stock for d in items ]) + return all(get_qty_in_stock(d.item_code, item_warehouse_field, bundle_warehouse).in_stock for d in items) else: return 1 diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py index f99da58e46..db997263c1 100644 --- a/erpnext/utilities/transaction_base.py +++ b/erpnext/utilities/transaction_base.py @@ -147,7 +147,7 @@ class TransactionBase(StatusUpdater): if hasattr(self, "prev_link_mapper") and self.prev_link_mapper.get(for_doctype): fieldname = self.prev_link_mapper[for_doctype]["fieldname"] - values = filter(None, tuple([item.as_dict()[fieldname] for item in self.items])) + values = filter(None, tuple(item.as_dict()[fieldname] for item in self.items)) if values: ret = { @@ -180,7 +180,7 @@ def validate_uom_is_integer(doc, uom_field, qty_fields, child_dt=None): if isinstance(qty_fields, string_types): qty_fields = [qty_fields] - distinct_uoms = list(set([d.get(uom_field) for d in doc.get_all_children()])) + distinct_uoms = list(set(d.get(uom_field) for d in doc.get_all_children())) integer_uoms = list(filter(lambda uom: frappe.db.get_value("UOM", uom, "must_be_whole_number", cache=True) or None, distinct_uoms)) From c4d851e45f591667a33e3fb7e50c5bf1cf14a993 Mon Sep 17 00:00:00 2001 From: marination Date: Fri, 11 Jun 2021 17:27:43 +0530 Subject: [PATCH 50/53] fix: Test --- ...tracted_raw_materials_to_be_transferred.py | 68 ++++++++++++++----- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py index c1fc6fb82f..11ec7669b0 100644 --- a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py +++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py @@ -12,34 +12,68 @@ import json, frappe, unittest class TestSubcontractedItemToBeTransferred(unittest.TestCase): def test_pending_and_transferred_qty(self): - po = create_purchase_order(item_code='_Test FG Item', is_subcontracted='Yes') + po = create_purchase_order(item_code='_Test FG Item', is_subcontracted='Yes', supplier_warehouse="_Test Warehouse 1 - _TC") + + # Material Receipt of RMs make_stock_entry(item_code='_Test Item', target='_Test Warehouse - _TC', qty=100, basic_rate=100) make_stock_entry(item_code='_Test Item Home Desktop 100', target='_Test Warehouse - _TC', qty=100, basic_rate=100) - transfer_subcontracted_raw_materials(po.name) - col, data = execute(filters=frappe._dict({'supplier': po.supplier, - 'from_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=-10)), - 'to_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=10))})) - self.assertEqual(data[0]['purchase_order'], po.name) - self.assertIn(data[0]['rm_item_code'], ['_Test Item', '_Test Item Home Desktop 100']) - self.assertIn(data[0]['p_qty'], [9, 18]) - self.assertIn(data[0]['t_qty'], [1, 2]) + + se = transfer_subcontracted_raw_materials(po) + + col, data = execute(filters=frappe._dict( + { + 'supplier': po.supplier, + 'from_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=-10)), + 'to_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=10)) + } + )) + po.reload() + + po_data = [row for row in data if row.get('purchase_order') == po.name] + + self.assertEqual(len(po_data), 2) + self.assertIn(po_data[0]['rm_item_code'], ['_Test Item', '_Test Item Home Desktop 100']) + self.assertIn(po_data[0]['p_qty'], [9, 18]) + self.assertIn(po_data[0]['transferred_qty'], [1, 2]) self.assertEqual(data[1]['purchase_order'], po.name) self.assertIn(data[1]['rm_item_code'], ['_Test Item', '_Test Item Home Desktop 100']) self.assertIn(data[1]['p_qty'], [9, 18]) - self.assertIn(data[1]['t_qty'], [1, 2]) + self.assertIn(data[1]['transferred_qty'], [1, 2]) + se.cancel() + po.cancel() def transfer_subcontracted_raw_materials(po): rm_item = [ - {'item_code': '_Test Item', 'rm_item_code': '_Test Item', 'item_name': '_Test Item', 'qty': 1, - 'warehouse': '_Test Warehouse - _TC', 'rate': 100, 'amount': 100, 'stock_uom': 'Nos'}, - {'item_code': '_Test Item Home Desktop 100', 'rm_item_code': '_Test Item Home Desktop 100', 'item_name': '_Test Item Home Desktop 100', 'qty': 2, - 'warehouse': '_Test Warehouse - _TC', 'rate': 100, 'amount': 200, 'stock_uom': 'Nos'}] + { + 'name': po.supplied_items[0].name, + 'item_code': '_Test Item Home Desktop 100', + 'rm_item_code': '_Test Item Home Desktop 100', + 'item_name': '_Test Item Home Desktop 100', + 'qty': 2, + 'warehouse': '_Test Warehouse - _TC', + 'rate': 100, + 'amount': 200, + 'stock_uom': 'Nos' + }, + { + 'name': po.supplied_items[1].name, + 'item_code': '_Test Item', + 'rm_item_code': '_Test Item', + 'item_name': '_Test Item', + 'qty': 1, + 'warehouse': '_Test Warehouse - _TC', + 'rate': 100, + 'amount': 100, + 'stock_uom': 'Nos' + } + ] rm_item_string = json.dumps(rm_item) - se = frappe.get_doc(make_rm_stock_entry(po, rm_item_string)) - se.from_warehouse = '_Test Warehouse 1 - _TC' - se.to_warehouse = '_Test Warehouse 1 - _TC' + se = frappe.get_doc(make_rm_stock_entry(po.name, rm_item_string)) + se.from_warehouse = '_Test Warehouse - _TC' + se.to_warehouse = '_Test Warehouse - _TC' se.stock_entry_type = 'Send to Subcontractor' se.save() se.submit() + return se From 400205cc8a9632614617af2f21d598491db8cde8 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Sat, 12 Jun 2021 12:30:53 +0530 Subject: [PATCH 51/53] fix: payroll entry employee detail issue (#25968) * fix: payroll entry employee detail issue * fix: review changes --- erpnext/payroll/doctype/payroll_entry/payroll_entry.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/payroll/doctype/payroll_entry/payroll_entry.py b/erpnext/payroll/doctype/payroll_entry/payroll_entry.py index 3953b463f1..7a70679db4 100644 --- a/erpnext/payroll/doctype/payroll_entry/payroll_entry.py +++ b/erpnext/payroll/doctype/payroll_entry/payroll_entry.py @@ -665,6 +665,8 @@ def get_employee_list(filters): emp_list = remove_payrolled_employees(emp_list, filters.start_date, filters.end_date) return emp_list + return [] + @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def employee_query(doctype, txt, searchfield, start, page_len, filters): From cf349aadf9ea7108bb0a95b86da23ffab87d62e5 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Sat, 12 Jun 2021 14:05:12 +0530 Subject: [PATCH 52/53] fix: unable to enter score in Assessment Result details grid (#25945) (#26031) --- .../education/doctype/assessment_result/assessment_result.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/education/doctype/assessment_result/assessment_result.js b/erpnext/education/doctype/assessment_result/assessment_result.js index 617a873b82..c35f607a99 100644 --- a/erpnext/education/doctype/assessment_result/assessment_result.js +++ b/erpnext/education/doctype/assessment_result/assessment_result.js @@ -6,7 +6,8 @@ frappe.ui.form.on('Assessment Result', { if (!frm.doc.__islocal) { frm.trigger('setup_chart'); } - frm.set_df_property('details', 'read_only', 1); + + frm.get_field('details').grid.cannot_add_rows = true; frm.set_query('course', function() { return { From 28cdff10cfe981c6e91b1a9ef897638e7c800af6 Mon Sep 17 00:00:00 2001 From: Anoop <3326959+akurungadam@users.noreply.github.com> Date: Sat, 12 Jun 2021 14:17:04 +0530 Subject: [PATCH 53/53] fix: update linked Customer on Patient update only if Link Customer to Patient is enabled (#25926) --- erpnext/healthcare/doctype/patient/patient.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/erpnext/healthcare/doctype/patient/patient.py b/erpnext/healthcare/doctype/patient/patient.py index 789d452c07..cebcb2068e 100644 --- a/erpnext/healthcare/doctype/patient/patient.py +++ b/erpnext/healthcare/doctype/patient/patient.py @@ -33,21 +33,21 @@ class Patient(Document): self.reload() # self.notify_update() def on_update(self): - if self.customer: - customer = frappe.get_doc('Customer', self.customer) - if self.customer_group: - customer.customer_group = self.customer_group - if self.territory: - customer.territory = self.territory + if frappe.db.get_single_value('Healthcare Settings', 'link_customer_to_patient'): + if self.customer: + customer = frappe.get_doc('Customer', self.customer) + if self.customer_group: + customer.customer_group = self.customer_group + if self.territory: + customer.territory = self.territory - customer.customer_name = self.patient_name - customer.default_price_list = self.default_price_list - customer.default_currency = self.default_currency - customer.language = self.language - customer.ignore_mandatory = True - customer.save(ignore_permissions=True) - else: - if frappe.db.get_single_value('Healthcare Settings', 'link_customer_to_patient'): + customer.customer_name = self.patient_name + customer.default_price_list = self.default_price_list + customer.default_currency = self.default_currency + customer.language = self.language + customer.ignore_mandatory = True + customer.save(ignore_permissions=True) + else: create_customer(self) def set_full_name(self):