diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html index 3920d4cf09..b9680dfb3b 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html +++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html @@ -15,7 +15,7 @@

{{ _("STATEMENTS OF ACCOUNTS") }}

-
{{ _("Customer: ") }} {{filters.party[0] }}
+
{{ _("Customer: ") }} {{filters.party_name[0] }}
{{ _("Date: ") }} {{ frappe.format(filters.from_date, 'Date')}} diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py index a48c0272ff..a482931a8e 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py +++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py @@ -24,7 +24,7 @@ from erpnext.accounts.report.general_ledger.general_ledger import execute as get class ProcessStatementOfAccounts(Document): def validate(self): if not self.subject: - self.subject = "Statement Of Accounts for {{ customer.name }}" + self.subject = "Statement Of Accounts for {{ customer.customer_name }}" if not self.body: self.body = "Hello {{ customer.name }},
PFA your Statement Of Accounts from {{ doc.from_date }} to {{ doc.to_date }}." @@ -87,6 +87,7 @@ def get_report_pdf(doc, consolidated=True): "account": [doc.account] if doc.account else None, "party_type": "Customer", "party": [entry.customer], + "party_name": [entry.customer_name] if entry.customer_name else None, "presentation_currency": presentation_currency, "group_by": doc.group_by, "currency": doc.currency, @@ -156,7 +157,7 @@ def get_customers_based_on_territory_or_customer_group(customer_collection, coll ] return frappe.get_list( "Customer", - fields=["name", "email_id"], + fields=["name", "customer_name", "email_id"], filters=[[fields_dict[customer_collection], "IN", selected]], ) @@ -179,7 +180,7 @@ def get_customers_based_on_sales_person(sales_person): if sales_person_records.get("Customer"): return frappe.get_list( "Customer", - fields=["name", "email_id"], + fields=["name", "customer_name", "email_id"], filters=[["name", "in", list(sales_person_records["Customer"])]], ) else: @@ -228,7 +229,7 @@ def fetch_customers(customer_collection, collection_name, primary_mandatory): if customer_collection == "Sales Partner": customers = frappe.get_list( "Customer", - fields=["name", "email_id"], + fields=["name", "customer_name", "email_id"], filters=[["default_sales_partner", "=", collection_name]], ) else: @@ -245,7 +246,12 @@ def fetch_customers(customer_collection, collection_name, primary_mandatory): continue customer_list.append( - {"name": customer.name, "primary_email": primary_email, "billing_email": billing_email} + { + "name": customer.name, + "customer_name": customer.customer_name, + "primary_email": primary_email, + "billing_email": billing_email, + } ) return customer_list diff --git a/erpnext/accounts/doctype/process_statement_of_accounts_customer/process_statement_of_accounts_customer.json b/erpnext/accounts/doctype/process_statement_of_accounts_customer/process_statement_of_accounts_customer.json index dd04dc1b3c..8bffd6a93b 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts_customer/process_statement_of_accounts_customer.json +++ b/erpnext/accounts/doctype/process_statement_of_accounts_customer/process_statement_of_accounts_customer.json @@ -1,12 +1,12 @@ { "actions": [], - "allow_workflow": 1, "creation": "2020-08-03 16:35:21.852178", "doctype": "DocType", "editable_grid": 1, "engine": "InnoDB", "field_order": [ "customer", + "customer_name", "billing_email", "primary_email" ], @@ -30,11 +30,18 @@ "fieldtype": "Read Only", "in_list_view": 1, "label": "Billing Email" + }, + { + "fetch_from": "customer.customer_name", + "fieldname": "customer_name", + "fieldtype": "Data", + "label": "Customer Name", + "read_only": 1 } ], "istable": 1, "links": [], - "modified": "2020-08-03 22:55:38.875601", + "modified": "2023-03-13 00:12:34.508086", "modified_by": "Administrator", "module": "Accounts", "name": "Process Statement Of Accounts Customer", @@ -43,5 +50,6 @@ "quick_entry": 1, "sort_field": "modified", "sort_order": "DESC", + "states": [], "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 2f4e45e618..2a8ff40413 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -32,9 +32,6 @@ "cost_center", "dimension_col_break", "project", - "column_break_27", - "campaign", - "source", "currency_and_price_list", "currency", "conversion_rate", @@ -203,7 +200,9 @@ "more_information", "status", "inter_company_invoice_reference", + "campaign", "represents_company", + "source", "customer_group", "col_break23", "is_internal_customer", @@ -2083,10 +2082,6 @@ "fieldname": "company_addr_col_break", "fieldtype": "Column Break" }, - { - "fieldname": "column_break_27", - "fieldtype": "Column Break" - }, { "fieldname": "column_break_52", "fieldtype": "Column Break" @@ -2143,11 +2138,10 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2023-01-28 19:45:47.538163", + "modified": "2023-03-13 11:43:15.883055", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", - "name_case": "Title Case", "naming_rule": "By \"Naming Series\" field", "owner": "Administrator", "permissions": [ diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 0ffd9463e6..6051c9915d 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -266,16 +266,16 @@ class TestSalesInvoice(unittest.TestCase): "_Test Account Education Cess - _TC": [3, 1618, 0.06, 32.36], "_Test Account S&H Education Cess - _TC": [1.5, 1619.5, 0.03, 32.39], "_Test Account CST - _TC": [32.5, 1652, 0.65, 33.04], - "_Test Account VAT - _TC": [156.5, 1808.5, 3.13, 36.17], - "_Test Account Discount - _TC": [-181.0, 1627.5, -3.62, 32.55], + "_Test Account VAT - _TC": [156.0, 1808.0, 3.12, 36.16], + "_Test Account Discount - _TC": [-181.0, 1627.0, -3.62, 32.54], } for d in si.get("taxes"): for i, k in enumerate(expected_values["keys"]): self.assertEqual(d.get(k), expected_values[d.account_head][i]) - self.assertEqual(si.base_grand_total, 1627.5) - self.assertEqual(si.grand_total, 32.55) + self.assertEqual(si.base_grand_total, 1627.0) + self.assertEqual(si.grand_total, 32.54) def test_sales_invoice_with_discount_and_inclusive_tax(self): si = create_sales_invoice(qty=100, rate=50, do_not_save=True) @@ -401,10 +401,10 @@ class TestSalesInvoice(unittest.TestCase): "_Test Account S&H Education Cess - _TC": [1.4, 1.30, 1297.67], "_Test Account CST - _TC": [27.88, 25.95, 1323.62], "_Test Account VAT - _TC": [156.25, 145.43, 1469.05], - "_Test Account Customs Duty - _TC": [125, 116.35, 1585.40], - "_Test Account Shipping Charges - _TC": [100, 100, 1685.40], - "_Test Account Discount - _TC": [-180.33, -168.54, 1516.86], - "_Test Account Service Tax - _TC": [-18.03, -16.85, 1500.01], + "_Test Account Customs Duty - _TC": [125, 116.34, 1585.39], + "_Test Account Shipping Charges - _TC": [100, 100, 1685.39], + "_Test Account Discount - _TC": [-180.33, -168.54, 1516.85], + "_Test Account Service Tax - _TC": [-18.03, -16.85, 1500.00], } for d in si.get("taxes"): @@ -413,7 +413,7 @@ class TestSalesInvoice(unittest.TestCase): self.assertEqual(si.base_grand_total, 1500) self.assertEqual(si.grand_total, 1500) - self.assertEqual(si.rounding_adjustment, -0.01) + self.assertEqual(si.rounding_adjustment, 0.0) def test_discount_amount_gl_entry(self): frappe.db.set_value("Company", "_Test Company", "round_off_account", "Round Off - _TC") @@ -454,7 +454,7 @@ class TestSalesInvoice(unittest.TestCase): [test_records[3]["taxes"][2]["account_head"], 0.0, 1.30], [test_records[3]["taxes"][3]["account_head"], 0.0, 25.95], [test_records[3]["taxes"][4]["account_head"], 0.0, 145.43], - [test_records[3]["taxes"][5]["account_head"], 0.0, 116.35], + [test_records[3]["taxes"][5]["account_head"], 0.0, 116.34], [test_records[3]["taxes"][6]["account_head"], 0.0, 100], [test_records[3]["taxes"][7]["account_head"], 168.54, 0.0], ["_Test Account Service Tax - _TC", 16.85, 0.0], @@ -1614,7 +1614,7 @@ class TestSalesInvoice(unittest.TestCase): "_Test Account Education Cess - _TC": [1.4, 1.4, 1.4], "_Test Account S&H Education Cess - _TC": [0.7, 0.7, 0.7], "_Test Account CST - _TC": [17.19, 17.19, 17.19], - "_Test Account VAT - _TC": [78.13, 78.13, 78.13], + "_Test Account VAT - _TC": [78.12, 78.12, 78.12], "_Test Account Discount - _TC": [-95.49, -95.49, -95.49], } @@ -1623,9 +1623,9 @@ class TestSalesInvoice(unittest.TestCase): if expected_values.get(d.account_head): self.assertEqual(d.get(k), expected_values[d.account_head][i]) - self.assertEqual(si.total_taxes_and_charges, 234.43) - self.assertEqual(si.base_grand_total, 859.43) - self.assertEqual(si.grand_total, 859.43) + self.assertEqual(si.total_taxes_and_charges, 234.42) + self.assertEqual(si.base_grand_total, 859.42) + self.assertEqual(si.grand_total, 859.42) def test_multi_currency_gle(self): si = create_sales_invoice( @@ -1985,17 +1985,17 @@ class TestSalesInvoice(unittest.TestCase): ) si.save() si.submit() - self.assertEqual(si.net_total, 19453.13) + self.assertEqual(si.net_total, 19453.12) self.assertEqual(si.grand_total, 24900) self.assertEqual(si.total_taxes_and_charges, 5446.88) - self.assertEqual(si.rounding_adjustment, -0.01) + self.assertEqual(si.rounding_adjustment, 0.0) expected_values = dict( (d[0], d) for d in [ [si.debit_to, 24900, 0.0], ["_Test Account Service Tax - _TC", 0.0, 5446.88], - ["Sales - _TC", 0.0, 19453.13], + ["Sales - _TC", 0.0, 19453.12], ["Round Off - _TC", 0.01, 0.0], ] ) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 01cfb58dec..b217f00065 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -32,6 +32,16 @@ from erpnext import get_company_currency from erpnext.accounts.utils import get_fiscal_year from erpnext.exceptions import InvalidAccountCurrency, PartyDisabled, PartyFrozen +PURCHASE_TRANSACTION_TYPES = {"Purchase Order", "Purchase Receipt", "Purchase Invoice"} +SALES_TRANSACTION_TYPES = { + "Quotation", + "Sales Order", + "Delivery Note", + "Sales Invoice", + "POS Invoice", +} +TRANSACTION_TYPES = PURCHASE_TRANSACTION_TYPES | SALES_TRANSACTION_TYPES + class DuplicatePartyAccountError(frappe.ValidationError): pass @@ -124,12 +134,6 @@ def _get_party_details( set_other_values(party_details, party, party_type) set_price_list(party_details, party, party_type, price_list, pos_profile) - party_details["tax_category"] = get_address_tax_category( - party.get("tax_category"), - party_address, - shipping_address if party_type != "Supplier" else party_address, - ) - tax_template = set_taxes( party.name, party_type, @@ -211,20 +215,10 @@ def set_address_details( else: party_details.update(get_company_address(company)) - 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) - ) - get_regional_address_details(party_details, doctype, company) + if doctype in SALES_TRANSACTION_TYPES and party_details.company_address: + party_details.update(get_fetch_values(doctype, "company_address", party_details.company_address)) - elif doctype and doctype in ["Purchase Invoice", "Purchase Order", "Purchase Receipt"]: + if doctype in PURCHASE_TRANSACTION_TYPES: if shipping_address: party_details.update( shipping_address=shipping_address, @@ -250,9 +244,21 @@ def set_address_details( **get_fetch_values(doctype, "shipping_address", party_details.billing_address) ) + party_address, shipping_address = ( + party_details.get(billing_address_field), + party_details.shipping_address_name, + ) + + party_details["tax_category"] = get_address_tax_category( + party.get("tax_category"), + party_address, + shipping_address if party_type != "Supplier" else party_address, + ) + + if doctype in TRANSACTION_TYPES: get_regional_address_details(party_details, doctype, company) - return party_details.get(billing_address_field), party_details.shipping_address_name + return party_address, shipping_address @erpnext.allow_regional diff --git a/erpnext/projects/doctype/timesheet/timesheet.js b/erpnext/projects/doctype/timesheet/timesheet.js index a376bf46a5..d1d07a79d6 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.js +++ b/erpnext/projects/doctype/timesheet/timesheet.js @@ -5,6 +5,8 @@ frappe.ui.form.on("Timesheet", { setup: function(frm) { frappe.require("/assets/erpnext/js/projects/timer.js"); + frm.ignore_doctypes_on_cancel_all = ['Sales Invoice']; + frm.fields_dict.employee.get_query = function() { return { filters:{ diff --git a/erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py b/erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py index 17e3155e28..766e40e319 100644 --- a/erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py +++ b/erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py @@ -46,6 +46,9 @@ def get_data(filters): # task has no end date, hence no delay task.delay = 0 + task.status = _(task.status) + task.priority = _(task.priority) + # Sort by descending order of delay tasks.sort(key=lambda x: x["delay"], reverse=True) return tasks @@ -73,7 +76,7 @@ def get_chart_data(data): on_track = on_track + 1 charts = { "data": { - "labels": ["On Track", "Delayed"], + "labels": [_("On Track"), _("Delayed")], "datasets": [{"name": "Delayed", "values": [on_track, delay]}], }, "type": "percentage", diff --git a/erpnext/translations/fr.csv b/erpnext/translations/fr.csv index 8367afd331..bace129213 100644 --- a/erpnext/translations/fr.csv +++ b/erpnext/translations/fr.csv @@ -2801,7 +2801,7 @@ Stock Ledger Entries and GL Entries are reposted for the selected Purchase Recei Stock Levels,Niveaux du Stocks, Stock Liabilities,Passif du Stock, Stock Options,Options du Stock, -Stock Qty,Qté en Stock, +Stock Qty,Qté en unité de stock, Stock Received But Not Billed,Stock Reçus Mais Non Facturés, Stock Reports,Rapports de stock, Stock Summary,Résumé du Stock,