Merge branch 'hotfix'
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 24cc8ea..049a8a0 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@
from erpnext.hooks import regional_overrides
from frappe.utils import getdate
-__version__ = '11.1.8'
+__version__ = '11.1.9'
def get_default_company(user=None):
'''Get default company for user'''
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index abd201f..895ca07 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -24,7 +24,6 @@
from erpnext.accounts.doctype.loyalty_program.loyalty_program import \
get_loyalty_program_details_with_points, get_loyalty_details, validate_loyalty_points
from erpnext.accounts.deferred_revenue import validate_service_stop_date
-from erpnext.controllers.accounts_controller import on_submit_regional, on_cancel_regional
from erpnext.healthcare.utils import manage_invoice_submit_cancel
@@ -199,8 +198,6 @@
if "Healthcare" in active_domains:
manage_invoice_submit_cancel(self, "on_submit")
- on_submit_regional(self)
-
def validate_pos_paid_amount(self):
if len(self.payments) == 0 and self.is_pos:
frappe.throw(_("At least one mode of payment is required for POS invoice."))
@@ -256,8 +253,6 @@
if "Healthcare" in active_domains:
manage_invoice_submit_cancel(self, "on_cancel")
- on_cancel_regional(self)
-
def update_status_updater_args(self):
if cint(self.update_stock):
self.status_updater.extend([{
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 5a765aa..34bbe7b 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -1138,11 +1138,3 @@
@erpnext.allow_regional
def validate_regional(doc):
pass
-
-@erpnext.allow_regional
-def on_submit_regional(doc):
- pass
-
-@erpnext.allow_regional
-def on_cancel_regional(doc):
- pass
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index e98ca4b..ccdd412 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -202,7 +202,8 @@
"validate": "erpnext.portal.doctype.products_settings.products_settings.home_page_is_products"
},
"Sales Invoice": {
- "on_submit": "erpnext.regional.france.utils.create_transaction_log",
+ "on_submit": ["erpnext.regional.france.utils.create_transaction_log", "erpnext.regional.italy.utils.sales_invoice_on_submit"],
+ "on_cancel": "erpnext.regional.italy.utils.sales_invoice_on_cancel",
"on_trash": "erpnext.regional.check_deletion_permission"
},
"Payment Entry": {
@@ -305,7 +306,5 @@
'Italy': {
'erpnext.controllers.taxes_and_totals.update_itemised_tax_data': 'erpnext.regional.italy.utils.update_itemised_tax_data',
'erpnext.controllers.accounts_controller.validate_regional': 'erpnext.regional.italy.utils.sales_invoice_validate',
- 'erpnext.controllers.accounts_controller.on_submit_regional': 'erpnext.regional.italy.utils.sales_invoice_on_submit',
- 'erpnext.controllers.accounts_controller.on_cancel_regional': 'erpnext.regional.italy.utils.sales_invoice_on_cancel'
}
}
diff --git a/erpnext/patches/v11_0/make_italian_localization_fields.py b/erpnext/patches/v11_0/make_italian_localization_fields.py
index cb65f23..fa77149 100644
--- a/erpnext/patches/v11_0/make_italian_localization_fields.py
+++ b/erpnext/patches/v11_0/make_italian_localization_fields.py
@@ -8,21 +8,21 @@
def execute():
+ company = frappe.get_all('Company', filters = {'country': 'Italy'})
+ if not company:
+ return
- company = frappe.get_all('Company', filters = {'country': 'Italy'})
- if not company:
- return
+ frappe.reload_doc('regional', 'report', 'electronic_invoice_register')
+ make_custom_fields()
+ setup_report()
- make_custom_fields()
- setup_report()
+ # Set state codes
+ condition = ""
+ for state, code in state_codes.items():
+ condition += " when '{0}' then '{1}'".format(frappe.db.escape(state), frappe.db.escape(code))
- # Set state codes
- condition = ""
- for state, code in state_codes.items():
- condition += " when '{0}' then '{1}'".format(frappe.db.escape(state), frappe.db.escape(code))
-
- if condition:
- frappe.db.sql("""
- UPDATE tabAddress set state_code = (case state {condition} end)
- WHERE country in ('Italy', 'Italia', 'Italian Republic', 'Repubblica Italiana')
- """.format(condition=condition))
+ if condition:
+ frappe.db.sql("""
+ UPDATE tabAddress set state_code = (case state {condition} end)
+ WHERE country in ('Italy', 'Italia', 'Italian Republic', 'Repubblica Italiana')
+ """.format(condition=condition))
diff --git a/erpnext/regional/italy/setup.py b/erpnext/regional/italy/setup.py
index 3e9d7a2..a9de2d1 100644
--- a/erpnext/regional/italy/setup.py
+++ b/erpnext/regional/italy/setup.py
@@ -10,12 +10,12 @@
from erpnext.regional.italy import fiscal_regimes, tax_exemption_reasons, mode_of_payment_codes, vat_collectability_options
def setup(company=None, patch=True):
- make_custom_fields()
- setup_report()
+ make_custom_fields()
+ setup_report()
def make_custom_fields(update=True):
- invoice_item_fields = [
- dict(fieldname='tax_rate', label='Tax Rate',
+ invoice_item_fields = [
+ dict(fieldname='tax_rate', label='Tax Rate',
fieldtype='Float', insert_after='description',
print_hide=1, hidden=1, read_only=1),
dict(fieldname='tax_amount', label='Tax Amount',
@@ -24,135 +24,135 @@
dict(fieldname='total_amount', label='Total Amount',
fieldtype='Currency', insert_after='tax_amount',
print_hide=1, hidden=1, read_only=1, options="currency")
- ]
+ ]
- custom_fields = {
- 'Company': [
- dict(fieldname='sb_e_invoicing', label='E-Invoicing',
- fieldtype='Section Break', insert_after='date_of_establishment', print_hide=1),
- dict(fieldname='fiscal_regime', label='Fiscal Regime',
- fieldtype='Select', insert_after='sb_e_invoicing', print_hide=1,
- options="\n".join(map(lambda x: x.decode('utf-8'), fiscal_regimes))),
- dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='fiscal_regime', print_hide=1,
- description=_("Applicable if the company is an Individual or a Proprietorship")),
- dict(fieldname='vat_collectability', label='VAT Collectability',
- fieldtype='Select', insert_after='fiscal_code', print_hide=1,
- options="\n".join(map(lambda x: x.decode('utf-8'), vat_collectability_options))),
- dict(fieldname='cb_e_invoicing1', fieldtype='Column Break', insert_after='vat_collectability', print_hide=1),
- dict(fieldname='registrar_office_province', label='Province of the Registrar Office',
- fieldtype='Data', insert_after='cb_e_invoicing1', print_hide=1, length=2),
- dict(fieldname='registration_number', label='Registration Number',
- fieldtype='Data', insert_after='registrar_office_province', print_hide=1, length=20),
- dict(fieldname='share_capital_amount', label='Share Capital',
- fieldtype='Currency', insert_after='registration_number', print_hide=1,
- description=_('Applicable if the company is SpA, SApA or SRL')),
- dict(fieldname='no_of_members', label='No of Members',
- fieldtype='Select', insert_after='share_capital_amount', print_hide=1,
- options="\nSU-Socio Unico\nSM-Piu Soci", description=_("Applicable if the company is a limited liability company")),
- dict(fieldname='liquidation_state', label='Liquidation State',
- fieldtype='Select', insert_after='no_of_members', print_hide=1,
- options="\nLS-In Liquidazione\nLN-Non in Liquidazione")
- ],
- 'Sales Taxes and Charges': [
- dict(fieldname='tax_exemption_reason', label='Tax Exemption Reason',
- fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
- depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0',
- options="\n" + "\n".join(map(lambda x: x.decode('utf-8'), tax_exemption_reasons))),
- dict(fieldname='tax_exemption_law', label='Tax Exempt Under',
- fieldtype='Text', insert_after='tax_exemption_reason', print_hide=1,
- depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0')
- ],
- 'Customer': [
- dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='tax_id', print_hide=1),
- dict(fieldname='recipient_code', label='Recipient Code',
- fieldtype='Data', insert_after='fiscal_code', print_hide=1, default="0000000"),
- dict(fieldname='pec', label='Recipient PEC',
- fieldtype='Data', insert_after='fiscal_code', print_hide=1),
- dict(fieldname='is_public_administration', label='Is Public Administration',
- fieldtype='Check', insert_after='is_internal_customer', print_hide=1,
- description=_("Set this if the customer is a Public Administration company."),
- depends_on='eval:doc.customer_type=="Company"'),
- dict(fieldname='first_name', label='First Name', fieldtype='Data',
- insert_after='salutation', print_hide=1, depends_on='eval:doc.customer_type!="Company"'),
- dict(fieldname='last_name', label='Last Name', fieldtype='Data',
- insert_after='first_name', print_hide=1, depends_on='eval:doc.customer_type!="Company"')
- ],
- 'Mode of Payment': [
- dict(fieldname='mode_of_payment_code', label='Code',
- fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
- options="\n".join(map(lambda x: x.decode('utf-8'), mode_of_payment_codes)))
- ],
- 'Payment Schedule': [
- dict(fieldname='mode_of_payment_code', label='Code',
- fieldtype='Select', insert_after='mode_of_payment', print_hide=1,
- options="\n".join(map(lambda x: x.decode('utf-8'), mode_of_payment_codes)),
- fetch_from="mode_of_payment.mode_of_payment_code", read_only=1),
- dict(fieldname='bank_account', label='Bank Account',
- fieldtype='Link', insert_after='mode_of_payment_code', print_hide=1,
- options="Bank Account"),
- dict(fieldname='bank_account_name', label='Bank Account Name',
- fieldtype='Data', insert_after='bank_account', print_hide=1,
- fetch_from="bank_account.account_name", read_only=1),
- dict(fieldname='bank_account_no', label='Bank Account No',
- fieldtype='Data', insert_after='bank_account_name', print_hide=1,
- fetch_from="bank_account.bank_account_no", read_only=1),
- dict(fieldname='bank_account_iban', label='IBAN',
- fieldtype='Data', insert_after='bank_account_name', print_hide=1,
- fetch_from="bank_account.iban", read_only=1),
- ],
- "Sales Invoice": [
- dict(fieldname='vat_collectability', label='VAT Collectability',
- fieldtype='Select', insert_after='taxes_and_charges', print_hide=1,
- options="\n".join(map(lambda x: x.decode('utf-8'), vat_collectability_options)),
- fetch_from="company.vat_collectability"),
- dict(fieldname='sb_e_invoicing_reference', label='E-Invoicing',
- fieldtype='Section Break', insert_after='pos_total_qty', print_hide=1),
- dict(fieldname='company_tax_id', label='Company Tax ID',
- fieldtype='Data', insert_after='sb_e_invoicing_reference', print_hide=1, read_only=1,
- fetch_from="company.tax_id"),
- dict(fieldname='company_fiscal_code', label='Company Fiscal Code',
- fieldtype='Data', insert_after='company_tax_id', print_hide=1, read_only=1,
- fetch_from="company.fiscal_code"),
- dict(fieldname='company_fiscal_regime', label='Company Fiscal Regime',
- fieldtype='Data', insert_after='company_fiscal_code', print_hide=1, read_only=1,
- fetch_from="company.fiscal_regime"),
- dict(fieldname='cb_e_invoicing_reference', fieldtype='Column Break',
- insert_after='company_fiscal_regime', print_hide=1),
- dict(fieldname='customer_fiscal_code', label='Customer Fiscal Code',
- fieldtype='Data', insert_after='cb_e_invoicing_reference', read_only=1,
- fetch_from="customer.fiscal_code"),
- ],
- 'Purchase Invoice Item': invoice_item_fields,
+ custom_fields = {
+ 'Company': [
+ dict(fieldname='sb_e_invoicing', label='E-Invoicing',
+ fieldtype='Section Break', insert_after='date_of_establishment', print_hide=1),
+ dict(fieldname='fiscal_regime', label='Fiscal Regime',
+ fieldtype='Select', insert_after='sb_e_invoicing', print_hide=1,
+ options="\n".join(map(lambda x: x.decode('utf-8'), fiscal_regimes))),
+ dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='fiscal_regime', print_hide=1,
+ description=_("Applicable if the company is an Individual or a Proprietorship")),
+ dict(fieldname='vat_collectability', label='VAT Collectability',
+ fieldtype='Select', insert_after='fiscal_code', print_hide=1,
+ options="\n".join(map(lambda x: x.decode('utf-8'), vat_collectability_options))),
+ dict(fieldname='cb_e_invoicing1', fieldtype='Column Break', insert_after='vat_collectability', print_hide=1),
+ dict(fieldname='registrar_office_province', label='Province of the Registrar Office',
+ fieldtype='Data', insert_after='cb_e_invoicing1', print_hide=1, length=2),
+ dict(fieldname='registration_number', label='Registration Number',
+ fieldtype='Data', insert_after='registrar_office_province', print_hide=1, length=20),
+ dict(fieldname='share_capital_amount', label='Share Capital',
+ fieldtype='Currency', insert_after='registration_number', print_hide=1,
+ description=_('Applicable if the company is SpA, SApA or SRL')),
+ dict(fieldname='no_of_members', label='No of Members',
+ fieldtype='Select', insert_after='share_capital_amount', print_hide=1,
+ options="\nSU-Socio Unico\nSM-Piu Soci", description=_("Applicable if the company is a limited liability company")),
+ dict(fieldname='liquidation_state', label='Liquidation State',
+ fieldtype='Select', insert_after='no_of_members', print_hide=1,
+ options="\nLS-In Liquidazione\nLN-Non in Liquidazione")
+ ],
+ 'Sales Taxes and Charges': [
+ dict(fieldname='tax_exemption_reason', label='Tax Exemption Reason',
+ fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
+ depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0',
+ options="\n" + "\n".join(map(lambda x: x.decode('utf-8'), tax_exemption_reasons))),
+ dict(fieldname='tax_exemption_law', label='Tax Exempt Under',
+ fieldtype='Text', insert_after='tax_exemption_reason', print_hide=1,
+ depends_on='eval:doc.charge_type!="Actual" && doc.rate==0.0')
+ ],
+ 'Customer': [
+ dict(fieldname='fiscal_code', label='Fiscal Code', fieldtype='Data', insert_after='tax_id', print_hide=1),
+ dict(fieldname='recipient_code', label='Recipient Code',
+ fieldtype='Data', insert_after='fiscal_code', print_hide=1, default="0000000"),
+ dict(fieldname='pec', label='Recipient PEC',
+ fieldtype='Data', insert_after='fiscal_code', print_hide=1),
+ dict(fieldname='is_public_administration', label='Is Public Administration',
+ fieldtype='Check', insert_after='is_internal_customer', print_hide=1,
+ description=_("Set this if the customer is a Public Administration company."),
+ depends_on='eval:doc.customer_type=="Company"'),
+ dict(fieldname='first_name', label='First Name', fieldtype='Data',
+ insert_after='salutation', print_hide=1, depends_on='eval:doc.customer_type!="Company"'),
+ dict(fieldname='last_name', label='Last Name', fieldtype='Data',
+ insert_after='first_name', print_hide=1, depends_on='eval:doc.customer_type!="Company"')
+ ],
+ 'Mode of Payment': [
+ dict(fieldname='mode_of_payment_code', label='Code',
+ fieldtype='Select', insert_after='included_in_print_rate', print_hide=1,
+ options="\n".join(map(lambda x: x.decode('utf-8'), mode_of_payment_codes)))
+ ],
+ 'Payment Schedule': [
+ dict(fieldname='mode_of_payment_code', label='Code',
+ fieldtype='Select', insert_after='mode_of_payment', print_hide=1,
+ options="\n".join(map(lambda x: x.decode('utf-8'), mode_of_payment_codes)),
+ fetch_from="mode_of_payment.mode_of_payment_code", read_only=1),
+ dict(fieldname='bank_account', label='Bank Account',
+ fieldtype='Link', insert_after='mode_of_payment_code', print_hide=1,
+ options="Bank Account"),
+ dict(fieldname='bank_account_name', label='Bank Account Name',
+ fieldtype='Data', insert_after='bank_account', print_hide=1,
+ fetch_from="bank_account.account_name", read_only=1),
+ dict(fieldname='bank_account_no', label='Bank Account No',
+ fieldtype='Data', insert_after='bank_account_name', print_hide=1,
+ fetch_from="bank_account.bank_account_no", read_only=1),
+ dict(fieldname='bank_account_iban', label='IBAN',
+ fieldtype='Data', insert_after='bank_account_name', print_hide=1,
+ fetch_from="bank_account.iban", read_only=1),
+ ],
+ "Sales Invoice": [
+ dict(fieldname='vat_collectability', label='VAT Collectability',
+ fieldtype='Select', insert_after='taxes_and_charges', print_hide=1,
+ options="\n".join(map(lambda x: x.decode('utf-8'), vat_collectability_options)),
+ fetch_from="company.vat_collectability"),
+ dict(fieldname='sb_e_invoicing_reference', label='E-Invoicing',
+ fieldtype='Section Break', insert_after='pos_total_qty', print_hide=1),
+ dict(fieldname='company_tax_id', label='Company Tax ID',
+ fieldtype='Data', insert_after='sb_e_invoicing_reference', print_hide=1, read_only=1,
+ fetch_from="company.tax_id"),
+ dict(fieldname='company_fiscal_code', label='Company Fiscal Code',
+ fieldtype='Data', insert_after='company_tax_id', print_hide=1, read_only=1,
+ fetch_from="company.fiscal_code"),
+ dict(fieldname='company_fiscal_regime', label='Company Fiscal Regime',
+ fieldtype='Data', insert_after='company_fiscal_code', print_hide=1, read_only=1,
+ fetch_from="company.fiscal_regime"),
+ dict(fieldname='cb_e_invoicing_reference', fieldtype='Column Break',
+ insert_after='company_fiscal_regime', print_hide=1),
+ dict(fieldname='customer_fiscal_code', label='Customer Fiscal Code',
+ fieldtype='Data', insert_after='cb_e_invoicing_reference', read_only=1,
+ fetch_from="customer.fiscal_code"),
+ ],
+ 'Purchase Invoice Item': invoice_item_fields,
'Sales Order Item': invoice_item_fields,
'Delivery Note Item': invoice_item_fields,
- 'Sales Invoice Item': invoice_item_fields,
+ 'Sales Invoice Item': invoice_item_fields,
'Quotation Item': invoice_item_fields,
'Purchase Order Item': invoice_item_fields,
'Purchase Receipt Item': invoice_item_fields,
'Supplier Quotation Item': invoice_item_fields,
- 'Address': [
- dict(fieldname='country_code', label='Country Code',
- fieldtype='Data', insert_after='country', print_hide=1, read_only=1,
- fetch_from="country.code"),
- dict(fieldname='state_code', label='State Code',
- fieldtype='Data', insert_after='state', print_hide=1)
- ]
- }
+ 'Address': [
+ dict(fieldname='country_code', label='Country Code',
+ fieldtype='Data', insert_after='country', print_hide=1, read_only=1,
+ fetch_from="country.code"),
+ dict(fieldname='state_code', label='State Code',
+ fieldtype='Data', insert_after='state', print_hide=1)
+ ]
+ }
- create_custom_fields(custom_fields, ignore_validate = frappe.flags.in_patch, update=update)
+ create_custom_fields(custom_fields, ignore_validate = frappe.flags.in_patch, update=update)
def setup_report():
- report_name = 'Electronic Invoice Register'
+ report_name = 'Electronic Invoice Register'
- frappe.db.sql(""" update `tabReport` set disabled = 0 where
- name = %s """, report_name)
+ frappe.db.sql(""" update `tabReport` set disabled = 0 where
+ name = %s """, report_name)
- if not frappe.db.get_value('Custom Role', dict(report=report_name)):
- frappe.get_doc(dict(
- doctype='Custom Role',
- report=report_name,
- roles= [
- dict(role='Accounts User'),
- dict(role='Accounts Manager')
- ]
- )).insert()
+ if not frappe.db.get_value('Custom Role', dict(report=report_name)):
+ frappe.get_doc(dict(
+ doctype='Custom Role',
+ report=report_name,
+ roles= [
+ dict(role='Accounts User'),
+ dict(role='Accounts Manager')
+ ]
+ )).insert()
diff --git a/erpnext/regional/italy/utils.py b/erpnext/regional/italy/utils.py
index 51aa93a..c86ad78 100644
--- a/erpnext/regional/italy/utils.py
+++ b/erpnext/regional/italy/utils.py
@@ -183,6 +183,9 @@
#Preflight for successful e-invoice export.
def sales_invoice_validate(doc):
#Validate company
+ if doc.doctype != 'Sales Invoice':
+ return
+
if not doc.company_address:
frappe.throw(_("Please set an Address on the Company '%s'" % doc.company), title=_("E-Invoicing Information Missing"))
else:
@@ -219,8 +222,12 @@
#Ensure payment details are valid for e-invoice.
-def sales_invoice_on_submit(doc):
+def sales_invoice_on_submit(doc, method):
#Validate payment details
+ if get_company_country(doc.company) not in ['Italy',
+ 'Italia', 'Italian Republic', 'Repubblica Italiana']:
+ return
+
if not len(doc.payment_schedule):
frappe.throw(_("Please set the Payment Schedule"), title=_("E-Invoicing Information Missing"))
else:
@@ -244,10 +251,17 @@
save_file(xml_filename, invoice_xml, dt=doc.doctype, dn=doc.name, is_private=True)
#Delete e-invoice attachment on cancel.
-def sales_invoice_on_cancel(doc):
+def sales_invoice_on_cancel(doc, method):
+ if get_company_country(doc.company) not in ['Italy',
+ 'Italia', 'Italian Republic', 'Repubblica Italiana']:
+ return
+
for attachment in get_e_invoice_attachments(doc):
remove_file(attachment.name, attached_to_doctype=doc.doctype, attached_to_name=doc.name)
+def get_company_country(company):
+ return frappe.get_cached_value('Company', company, 'country')
+
def get_e_invoice_attachments(invoice):
out = []
attachments = get_attachments(invoice.doctype, invoice.name)
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 2b0ed38..cb4afef 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -85,7 +85,7 @@
// stop
frm.add_custom_button(__('Stop'),
- () => frm.events.update_status(frm, 'Stop'));
+ () => frm.events.update_status(frm, 'Stopped'));
}
}