| # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors |
| # License: GNU General Public License v3. See license.txt |
| # coding=utf-8 |
| |
| |
| import frappe |
| from frappe import _ |
| from frappe.custom.doctype.custom_field.custom_field import create_custom_fields |
| from frappe.permissions import add_permission, update_permission_property |
| |
| from erpnext.regional.italy import ( |
| fiscal_regimes, |
| mode_of_payment_codes, |
| tax_exemption_reasons, |
| vat_collectability_options, |
| ) |
| |
| |
| def setup(company=None, patch=True): |
| make_custom_fields() |
| setup_report() |
| add_permissions() |
| |
| |
| def make_custom_fields(update=True): |
| 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", |
| fieldtype="Currency", |
| insert_after="tax_rate", |
| print_hide=1, |
| hidden=1, |
| read_only=1, |
| options="currency", |
| ), |
| dict( |
| fieldname="total_amount", |
| label="Total Amount", |
| fieldtype="Currency", |
| insert_after="tax_amount", |
| print_hide=1, |
| hidden=1, |
| read_only=1, |
| options="currency", |
| ), |
| ] |
| |
| customer_po_fields = [ |
| dict( |
| fieldname="customer_po_details", |
| label="Customer PO", |
| fieldtype="Section Break", |
| insert_after="image", |
| ), |
| dict( |
| fieldname="customer_po_no", |
| label="Customer PO No", |
| fieldtype="Data", |
| insert_after="customer_po_details", |
| fetch_from="sales_order.po_no", |
| print_hide=1, |
| allow_on_submit=1, |
| fetch_if_empty=1, |
| read_only=1, |
| no_copy=1, |
| ), |
| dict( |
| fieldname="customer_po_clm_brk", |
| label="", |
| fieldtype="Column Break", |
| insert_after="customer_po_no", |
| print_hide=1, |
| read_only=1, |
| ), |
| dict( |
| fieldname="customer_po_date", |
| label="Customer PO Date", |
| fieldtype="Date", |
| insert_after="customer_po_clm_brk", |
| fetch_from="sales_order.po_date", |
| print_hide=1, |
| allow_on_submit=1, |
| fetch_if_empty=1, |
| read_only=1, |
| no_copy=1, |
| ), |
| ] |
| |
| 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: frappe.safe_decode(x, encoding="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: frappe.safe_decode(x, encoding="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: frappe.safe_decode(x, encoding="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: frappe.safe_decode(x, encoding="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: frappe.safe_decode(x, encoding="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 Name", |
| fieldtype="Data", |
| insert_after="bank_account", |
| print_hide=1, |
| fetch_from="bank_account.bank", |
| 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, |
| ), |
| dict( |
| fieldname="bank_account_swift_number", |
| label="Swift Code (BIC)", |
| fieldtype="Data", |
| insert_after="bank_account_iban", |
| print_hide=1, |
| fetch_from="bank_account.swift_number", |
| 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: frappe.safe_decode(x, encoding="utf-8"), vat_collectability_options) |
| ), |
| fetch_from="company.vat_collectability", |
| ), |
| dict( |
| fieldname="sb_e_invoicing_reference", |
| label="E-Invoicing", |
| fieldtype="Section Break", |
| insert_after="against_income_account", |
| print_hide=1, |
| ), |
| dict( |
| fieldname="company_fiscal_code", |
| label="Company Fiscal Code", |
| fieldtype="Data", |
| insert_after="sb_e_invoicing_reference", |
| 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", |
| ), |
| dict( |
| fieldname="type_of_document", |
| label="Type of Document", |
| fieldtype="Select", |
| insert_after="customer_fiscal_code", |
| options="\nTD01\nTD02\nTD03\nTD04\nTD05\nTD06\nTD16\nTD17\nTD18\nTD19\nTD20\nTD21\nTD22\nTD23\nTD24\nTD25\nTD26\nTD27", |
| ), |
| ], |
| "Purchase Invoice Item": invoice_item_fields, |
| "Sales Order Item": invoice_item_fields, |
| "Delivery Note Item": invoice_item_fields, |
| "Sales Invoice Item": invoice_item_fields + customer_po_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=0, |
| fetch_from="country.code", |
| ), |
| dict( |
| fieldname="state_code", |
| label="State Code", |
| fieldtype="Data", |
| insert_after="state", |
| print_hide=1, |
| ), |
| ], |
| "Purchase Invoice": [ |
| dict( |
| fieldname="document_type", |
| label="Document Type", |
| fieldtype="Data", |
| insert_after="company", |
| print_hide=1, |
| read_only=1, |
| ), |
| dict( |
| fieldname="destination_code", |
| label="Destination Code", |
| fieldtype="Data", |
| insert_after="company", |
| print_hide=1, |
| read_only=1, |
| ), |
| dict( |
| fieldname="imported_grand_total", |
| label="Imported Grand Total", |
| fieldtype="Data", |
| insert_after="update_auto_repeat_reference", |
| print_hide=1, |
| read_only=1, |
| ), |
| ], |
| "Purchase Taxes and Charges": [ |
| dict( |
| fieldname="tax_rate", |
| label="Tax Rate", |
| fieldtype="Data", |
| insert_after="parenttype", |
| print_hide=1, |
| read_only=0, |
| ) |
| ], |
| "Supplier": [ |
| dict( |
| fieldname="fiscal_code", |
| label="Fiscal Code", |
| fieldtype="Data", |
| insert_after="tax_id", |
| print_hide=1, |
| read_only=1, |
| ), |
| dict( |
| fieldname="fiscal_regime", |
| label="Fiscal Regime", |
| fieldtype="Select", |
| insert_after="fiscal_code", |
| print_hide=1, |
| read_only=1, |
| options="\nRF01\nRF02\nRF04\nRF05\nRF06\nRF07\nRF08\nRF09\nRF10\nRF11\nRF12\nRF13\nRF14\nRF15\nRF16\nRF17\nRF18\nRF19", |
| ), |
| ], |
| } |
| |
| create_custom_fields(custom_fields, ignore_validate=frappe.flags.in_patch, update=update) |
| |
| |
| def setup_report(): |
| report_name = "Electronic Invoice Register" |
| frappe.db.set_value("Report", report_name, "disabled", 0) |
| |
| 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() |
| |
| |
| def add_permissions(): |
| doctype = "Import Supplier Invoice" |
| add_permission(doctype, "All", 0) |
| |
| for role in ("Accounts Manager", "Accounts User", "Purchase User", "Auditor"): |
| add_permission(doctype, role, 0) |
| update_permission_property(doctype, role, 0, "print", 1) |
| update_permission_property(doctype, role, 0, "report", 1) |
| |
| if role in ("Accounts Manager", "Accounts User"): |
| update_permission_property(doctype, role, 0, "write", 1) |
| update_permission_property(doctype, role, 0, "create", 1) |
| |
| update_permission_property(doctype, "Accounts Manager", 0, "delete", 1) |
| add_permission(doctype, "Accounts Manager", 1) |
| update_permission_property(doctype, "Accounts Manager", 1, "write", 1) |
| update_permission_property(doctype, "Accounts Manager", 1, "create", 1) |