# 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, tax_exemption_reasons, mode_of_payment_codes, 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)