496 lines
12 KiB
Python
496 lines
12 KiB
Python
# 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)
|