Merge pull request #33835 from ruthra-kumar/skip_validation_on_migration
fix(patch): validation error on cost center allocation migration
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
index 12c0b7a..154fdc0 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
@@ -69,6 +69,10 @@
def get_jv_entries(self):
condition = self.get_conditions()
+
+ if self.get("cost_center"):
+ condition += f" and t2.cost_center = '{self.cost_center}' "
+
dr_or_cr = (
"credit_in_account_currency"
if erpnext.get_party_account_type(self.party_type) == "Receivable"
diff --git a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py
index 2ba90b4..00e3934 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py
+++ b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py
@@ -747,6 +747,73 @@
self.assertEqual(len(pr.get("invoices")), 0)
self.assertEqual(len(pr.get("payments")), 0)
+ def test_cost_center_filter_on_vouchers(self):
+ """
+ Test Cost Center filter is applied on Invoices, Payment Entries and Journals
+ """
+ transaction_date = nowdate()
+ rate = 100
+
+ # 'Main - PR' Cost Center
+ si1 = self.create_sales_invoice(
+ qty=1, rate=rate, posting_date=transaction_date, do_not_submit=True
+ )
+ si1.cost_center = self.main_cc.name
+ si1.submit()
+
+ pe1 = self.create_payment_entry(posting_date=transaction_date, amount=rate)
+ pe1.cost_center = self.main_cc.name
+ pe1 = pe1.save().submit()
+
+ je1 = self.create_journal_entry(self.bank, self.debit_to, 100, transaction_date)
+ je1.accounts[0].cost_center = self.main_cc.name
+ je1.accounts[1].cost_center = self.main_cc.name
+ je1.accounts[1].party_type = "Customer"
+ je1.accounts[1].party = self.customer
+ je1 = je1.save().submit()
+
+ # 'Sub - PR' Cost Center
+ si2 = self.create_sales_invoice(
+ qty=1, rate=rate, posting_date=transaction_date, do_not_submit=True
+ )
+ si2.cost_center = self.sub_cc.name
+ si2.submit()
+
+ pe2 = self.create_payment_entry(posting_date=transaction_date, amount=rate)
+ pe2.cost_center = self.sub_cc.name
+ pe2 = pe2.save().submit()
+
+ je2 = self.create_journal_entry(self.bank, self.debit_to, 100, transaction_date)
+ je2.accounts[0].cost_center = self.sub_cc.name
+ je2.accounts[1].cost_center = self.sub_cc.name
+ je2.accounts[1].party_type = "Customer"
+ je2.accounts[1].party = self.customer
+ je2 = je2.save().submit()
+
+ pr = self.create_payment_reconciliation()
+ pr.cost_center = self.main_cc.name
+
+ pr.get_unreconciled_entries()
+
+ # check PR tool output
+ self.assertEqual(len(pr.get("invoices")), 1)
+ self.assertEqual(pr.get("invoices")[0].get("invoice_number"), si1.name)
+ self.assertEqual(len(pr.get("payments")), 2)
+ payment_vouchers = [x.get("reference_name") for x in pr.get("payments")]
+ self.assertCountEqual(payment_vouchers, [pe1.name, je1.name])
+
+ # Change cost center
+ pr.cost_center = self.sub_cc.name
+
+ pr.get_unreconciled_entries()
+
+ # check PR tool output
+ self.assertEqual(len(pr.get("invoices")), 1)
+ self.assertEqual(pr.get("invoices")[0].get("invoice_number"), si2.name)
+ self.assertEqual(len(pr.get("payments")), 2)
+ payment_vouchers = [x.get("reference_name") for x in pr.get("payments")]
+ self.assertCountEqual(payment_vouchers, [je2.name, pe2.name])
+
def make_customer(customer_name, currency=None):
if not frappe.db.exists("Customer", customer_name):
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index baeed03..b6eb3ed 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -211,7 +211,13 @@
else:
party_details.update(get_company_address(company))
- if doctype and doctype in ["Delivery Note", "Sales Invoice", "Sales Order", "Quotation"]:
+ if doctype and doctype in [
+ "Delivery Note",
+ "Sales Invoice",
+ "Sales Order",
+ "Quotation",
+ "POS Invoice",
+ ]:
if party_details.company_address:
party_details.update(
get_fetch_values(doctype, "company_address", party_details.company_address)
diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js
index d37b7bb..51dcd64 100755
--- a/erpnext/public/js/utils.js
+++ b/erpnext/public/js/utils.js
@@ -491,7 +491,20 @@
const child_meta = frappe.get_meta(`${frm.doc.doctype} Item`);
const get_precision = (fieldname) => child_meta.fields.find(f => f.fieldname == fieldname).precision;
- this.data = [];
+ this.data = frm.doc[opts.child_docname].map((d) => {
+ return {
+ "docname": d.name,
+ "name": d.name,
+ "item_code": d.item_code,
+ "delivery_date": d.delivery_date,
+ "schedule_date": d.schedule_date,
+ "conversion_factor": d.conversion_factor,
+ "qty": d.qty,
+ "rate": d.rate,
+ "uom": d.uom
+ }
+ });
+
const fields = [{
fieldtype:'Data',
fieldname:"docname",
@@ -588,7 +601,7 @@
})
}
- const dialog = new frappe.ui.Dialog({
+ new frappe.ui.Dialog({
title: __("Update Items"),
fields: [
{
@@ -624,24 +637,7 @@
refresh_field("items");
},
primary_action_label: __('Update')
- });
-
- frm.doc[opts.child_docname].forEach(d => {
- dialog.fields_dict.trans_items.df.data.push({
- "docname": d.name,
- "name": d.name,
- "item_code": d.item_code,
- "delivery_date": d.delivery_date,
- "schedule_date": d.schedule_date,
- "conversion_factor": d.conversion_factor,
- "qty": d.qty,
- "rate": d.rate,
- "uom": d.uom
- });
- this.data = dialog.fields_dict.trans_items.df.data;
- dialog.fields_dict.trans_items.grid.refresh();
- })
- dialog.show();
+ }).show();
}
erpnext.utils.map_current_doc = function(opts) {
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index 9321c2c..2a9f091 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -221,7 +221,7 @@
def item_query(doctype, txt, searchfield, start, page_len, filters):
from frappe.desk.reportview import get_match_cond
- from_doctype = cstr(filters.get("doctype"))
+ from_doctype = cstr(filters.get("from"))
if not from_doctype or not frappe.db.exists("DocType", from_doctype):
return []
diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js
index aab2fc9..7ca1264 100644
--- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js
+++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js
@@ -11,6 +11,7 @@
"Partial Material Transferred": "purple",
"Material Transferred": "blue",
"Closed": "red",
+ "Cancelled": "red",
};
return [__(doc.status), status_colors[doc.status], "status,=," + doc.status];
},
diff --git a/erpnext/templates/pages/order.py b/erpnext/templates/pages/order.py
index e1e12bd..185ec66 100644
--- a/erpnext/templates/pages/order.py
+++ b/erpnext/templates/pages/order.py
@@ -38,22 +38,27 @@
if not frappe.has_website_permission(context.doc):
frappe.throw(_("Not Permitted"), frappe.PermissionError)
- # check for the loyalty program of the customer
- customer_loyalty_program = frappe.db.get_value(
- "Customer", context.doc.customer, "loyalty_program"
- )
- if customer_loyalty_program:
- from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
- get_loyalty_program_details_with_points,
+ context.available_loyalty_points = 0.0
+ if context.doc.get("customer"):
+ # check for the loyalty program of the customer
+ customer_loyalty_program = frappe.db.get_value(
+ "Customer", context.doc.customer, "loyalty_program"
)
- loyalty_program_details = get_loyalty_program_details_with_points(
- context.doc.customer, customer_loyalty_program
- )
- context.available_loyalty_points = int(loyalty_program_details.get("loyalty_points"))
+ if customer_loyalty_program:
+ from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
+ get_loyalty_program_details_with_points,
+ )
- # show Make Purchase Invoice button based on permission
- context.show_make_pi_button = frappe.has_permission("Purchase Invoice", "create")
+ loyalty_program_details = get_loyalty_program_details_with_points(
+ context.doc.customer, customer_loyalty_program
+ )
+ context.available_loyalty_points = int(loyalty_program_details.get("loyalty_points"))
+
+ context.show_make_pi_button = False
+ if context.doc.get("supplier"):
+ # show Make Purchase Invoice button based on permission
+ context.show_make_pi_button = frappe.has_permission("Purchase Invoice", "create")
def get_attachments(dt, dn):
diff --git a/erpnext/translations/zh.csv b/erpnext/translations/zh.csv
index 173320d..2337bcb 100644
--- a/erpnext/translations/zh.csv
+++ b/erpnext/translations/zh.csv
@@ -3537,7 +3537,6 @@
Rules for applying different promotional schemes.,适用不同促销计划的规则。,
Shift,转移,
Show {0},显示{0},
-"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",命名系列中不允许使用除"-", "#", "।", "/", "{{" 和 "}}"之外的特殊字符 {0},
Target Details,目标细节,
{0} already has a Parent Procedure {1}.,{0}已有父程序{1}。,
API,应用程序界面,
diff --git a/erpnext/translations/zh_tw.csv b/erpnext/translations/zh_tw.csv
index 313908f..1b7e186 100644
--- a/erpnext/translations/zh_tw.csv
+++ b/erpnext/translations/zh_tw.csv
@@ -3311,7 +3311,6 @@
Rules for applying different promotional schemes.,適用不同促銷計劃的規則。,
Shift,轉移,
Show {0},顯示{0},
-"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",命名系列中不允許使用除 "-", "#", "।", "/", "{{" 和 "}}"之外的特殊字符 {0},
Target Details,目標細節,
API,API,
Annual,年刊,