diff --git a/di/digital_invoicing/print_format/__init__.py b/di/digital_invoicing/print_format/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/di/digital_invoicing/print_format/di_sales_tax_invoice/__init__.py b/di/digital_invoicing/print_format/di_sales_tax_invoice/__init__.py old mode 100644 new mode 100755 diff --git a/di/digital_invoicing/print_format/di_sales_tax_invoice/di_sales_tax_invoice.json b/di/digital_invoicing/print_format/di_sales_tax_invoice/di_sales_tax_invoice.json old mode 100644 new mode 100755 index ab6fc88..957d430 --- a/di/digital_invoicing/print_format/di_sales_tax_invoice/di_sales_tax_invoice.json +++ b/di/digital_invoicing/print_format/di_sales_tax_invoice/di_sales_tax_invoice.json @@ -10,14 +10,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 0, - "html": "{% set company = frappe.get_doc(\"Company\", doc.company) %}\r\n{% set di_settings = frappe.db.get_value(\"DI Settings\", {\"company\": doc.company}, [\"ntn_cnic\", \"strn_no\", \"province\", \"address\"], as_dict=1) %}\r\n{% set customer = frappe.get_doc(\"Customer\", doc.customer) if doc.customer else None %}\r\n\r\n
\r\n\t
\r\n\t\t

{{ company.company_name }}

\r\n\t\t

{{ di_settings.address or company.get(\"address\") or \"\" }}

\r\n\t\t

Sales Tax Invoice

\r\n\t
\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t{% if di_settings.strn_no %}{% endif %}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
Seller Details
Business Name:{{ company.company_name }}
NTN/CNIC:{{ di_settings.ntn_cnic or company.get(\"tax_id\") or \"\" }}
STRN:{{ di_settings.strn_no }}
Province:{{ di_settings.province or \"\" }}
Address:{{ di_settings.address or \"\" }}
\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
Buyer Details
Business Name:{{ doc.customer_name or \"\" }}
NTN/CNIC:{{ customer.ntn_cnic if customer else \"\" }}
Registration:{{ customer.registration_type if customer else \"\" }}
Province:{{ customer.province if customer else \"\" }}
Address:{{ customer.di_address if customer else \"\" }}
\r\n\t\t\t
\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t{% if doc.di_integration_id %}\r\n\t\t\t\r\n\t\t\t{% endif %}\r\n\t\t\r\n\t
Invoice No:{{ doc.name }}Date:{{ doc.posting_date }}FBR Invoice No:{{ doc.di_integration_id }}
\r\n\r\n\t\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t{% for item in doc.items %}\r\n\t\t\t{% set st = namespace(rate=0, amount=0, found=false) %}\r\n\t\t\t{% set ft = namespace(amount=0) %}\r\n\t\t\t{% for tax in doc.taxes %}\r\n\t\t\t\t{% set item_tax = json.loads(tax.item_wise_tax_detail or \"{}\").get(item.item_code) %}\r\n\t\t\t\t{% if item_tax is iterable and item_tax is not string %}\r\n\t\t\t\t\t{% if tax.di_tax_type == \"Further Tax\" %}\r\n\t\t\t\t\t\t{% set ft.amount = item_tax[1] if item_tax|length > 1 else 0 %}\r\n\t\t\t\t\t{% elif tax.di_tax_type == \"Sales Tax\" %}\r\n\t\t\t\t\t\t{% set st.rate = item_tax[0] if item_tax|length > 0 else 0 %}\r\n\t\t\t\t\t\t{% set st.amount = item_tax[1] if item_tax|length > 1 else 0 %}\r\n\t\t\t\t\t\t{% set st.found = true %}\r\n\t\t\t\t\t{% endif %}\r\n\t\t\t\t{% endif %}\r\n\t\t\t{% endfor %}\r\n\t\t\t{% if not st.found and doc.taxes %}\r\n\t\t\t\t{% set fallback = json.loads(doc.taxes[0].item_wise_tax_detail or \"{}\").get(item.item_code) %}\r\n\t\t\t\t{% if fallback is iterable and fallback is not string %}\r\n\t\t\t\t\t{% set st.rate = fallback[0] if fallback|length > 0 else 0 %}\r\n\t\t\t\t\t{% set st.amount = fallback[1] if fallback|length > 1 else 0 %}\r\n\t\t\t\t{% endif %}\r\n\t\t\t{% endif %}\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t{% endfor %}\r\n\t\t\r\n\t
#HS CodeDescriptionSale TypeQtyUOMValue (Excl. ST)ST RateSales TaxFurther TaxFEDTotal
{{ item.idx }}{{ item.di_hs_code or \"\" }}{{ item.item_name }}{{ item.di_sale_type or \"\" }}{{ item.qty }}{{ item.di_hs_uom or item.uom or \"\" }}{{ frappe.utils.fmt_money(item.net_amount, currency=doc.currency) }}{{ st.rate }}%{{ frappe.utils.fmt_money(st.amount, currency=doc.currency) }}{{ frappe.utils.fmt_money(ft.amount, currency=doc.currency) }}{{ frappe.utils.fmt_money(item.di_fed_payable or 0, currency=doc.currency) }}{{ frappe.utils.fmt_money(item.amount, currency=doc.currency) }}
\r\n\r\n\t\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t{% for tax in doc.taxes %}\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t{% endfor %}\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t
Net Total:{{ frappe.utils.fmt_money(doc.net_total, currency=doc.currency) }}
{{ tax.description }}:{{ frappe.utils.fmt_money(tax.tax_amount, currency=doc.currency) }}
Grand Total:{{ frappe.utils.fmt_money(doc.grand_total, currency=doc.currency) }}
\r\n\r\n\t\r\n\t{% if doc.is_di_posted and doc.di_integration_id %}\r\n\t{% set di_qr = generate_qr_code(doc.di_integration_id) %}\r\n\t
\r\n\t\t{% if di_qr %}\r\n\t\t
\r\n\t\t\t\"FBR\r\n\t\t
\r\n\t\t{% endif %}\r\n\t\t
\r\n\t\t\t{% set fbr_logo = get_fbr_logo_data_uri() %}\r\n\t\t\t{% if fbr_logo %}\r\n\t\t\t\"FBR\r\n\t\t\t{% endif %}\r\n\t\t\t

FBR Invoice Number: {{ doc.di_integration_id }}

\r\n\t\t\t

Date & Time: {{ doc.di_posting_datetime }}

\r\n\t\t\t

\r\n\t\t\t\tThis invoice has been reported to FBR through Digital Invoicing System.\r\n\t\t\t\tVerify this invoice at https://e.fbr.gov.pk\r\n\t\t\t

\r\n\t\t
\r\n\t
\r\n\t{% endif %}\r\n
\r\n", + "html": "{% set company = frappe.get_doc(\"Company\", doc.company) %}\r\n{% set di_settings = frappe.db.get_value(\"DI Settings\", {\"company\": doc.company}, [\"ntn_cnic\", \"strn_no\", \"province\", \"address\"], as_dict=1) %}\r\n{% set customer = frappe.get_doc(\"Customer\", doc.customer) if doc.customer else None %}\r\n\r\n
\r\n\t
\r\n\t\t

{{ company.company_name }}

\r\n\t\t

{{ di_settings.address or company.get(\"address\") or \"\" }}

\r\n\t\t

Sales Tax Invoice

\r\n\t
\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t{% if di_settings.strn_no %}{% endif %}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
Seller Details
Business Name:{{ company.company_name }}
NTN/CNIC:{{ di_settings.ntn_cnic or company.get(\"tax_id\") or \"\" }}
STRN:{{ di_settings.strn_no }}
Province:{{ di_settings.province or \"\" }}
Address:{{ di_settings.address or \"\" }}
\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
Buyer Details
Business Name:{{ doc.customer_name or \"\" }}
NTN/CNIC:{{ customer.ntn_cnic if customer else \"\" }}
Registration:{{ customer.registration_type if customer else \"\" }}
Province:{{ customer.province if customer else \"\" }}
Address:{{ customer.di_address if customer else \"\" }}
\r\n\t\t\t
\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t{% if doc.di_integration_id %}\r\n\t\t\t\r\n\t\t\t{% endif %}\r\n\t\t\r\n\t
Invoice No:{{ doc.name }}Date:{{ doc.posting_date }}FBR Invoice No:{{ doc.di_integration_id }}
\r\n\r\n\t\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t{% for item in doc.items %}\r\n\t\t\t{% set st = namespace(rate=0, amount=0, found=false) %}\r\n\t\t\t{% set ft = namespace(amount=0) %}\r\n\t\t\t{% for tax in doc.taxes %}\r\n\t\t\t\t{% set item_tax = json.loads(tax.item_wise_tax_detail or \"{}\").get(item.item_code) %}\r\n\t\t\t\t{% if item_tax is iterable and item_tax is not string %}\r\n\t\t\t\t\t{% if tax.di_tax_type == \"Further Tax\" %}\r\n\t\t\t\t\t\t{% set ft.amount = item_tax[1] if item_tax|length > 1 else 0 %}\r\n\t\t\t\t\t{% elif tax.di_tax_type == \"Sales Tax\" %}\r\n\t\t\t\t\t\t{% set st.rate = item_tax[0] if item_tax|length > 0 else 0 %}\r\n\t\t\t\t\t\t{% set st.amount = item_tax[1] if item_tax|length > 1 else 0 %}\r\n\t\t\t\t\t\t{% set st.found = true %}\r\n\t\t\t\t\t{% endif %}\r\n\t\t\t\t{% endif %}\r\n\t\t\t{% endfor %}\r\n\t\t\t{% if not st.found and doc.taxes %}\r\n\t\t\t\t{% set fallback = json.loads(doc.taxes[0].item_wise_tax_detail or \"{}\").get(item.item_code) %}\r\n\t\t\t\t{% if fallback is iterable and fallback is not string %}\r\n\t\t\t\t\t{% set st.rate = fallback[0] if fallback|length > 0 else 0 %}\r\n\t\t\t\t\t{% set st.amount = fallback[1] if fallback|length > 1 else 0 %}\r\n\t\t\t\t{% endif %}\r\n\t\t\t{% endif %}\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t{% endfor %}\r\n\t\t\r\n\t
#HS CodeDescriptionSale TypeQtyUOMValue (Excl. ST)ST RateSales TaxFurther TaxFEDTotal
{{ item.idx }}{{ item.di_hs_code or \"\" }}{{ item.item_name }}{{ item.di_sale_type or \"\" }}{{ item.qty }}{{ item.di_hs_uom or item.uom or \"\" }}{{ frappe.utils.fmt_money(item.net_amount, currency=doc.currency) }}{{ st.rate }}%{{ frappe.utils.fmt_money(st.amount, currency=doc.currency) }}{{ frappe.utils.fmt_money(ft.amount, currency=doc.currency) }}{{ frappe.utils.fmt_money(item.di_fed_payable or 0, currency=doc.currency) }}{{ frappe.utils.fmt_money(item.amount, currency=doc.currency) }}
\r\n\r\n\t\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t{% for tax in doc.taxes %}\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t{% endfor %}\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t
Net Total:{{ frappe.utils.fmt_money(doc.net_total, currency=doc.currency) }}
{{ tax.description }}:{{ frappe.utils.fmt_money(tax.tax_amount, currency=doc.currency) }}
Grand Total:{{ frappe.utils.fmt_money(doc.grand_total, currency=doc.currency) }}
\r\n\t\r\n\t{% if doc.is_di_posted and doc.di_integration_id %}\r\n\t{% set di_qr = generate_qr_code(doc.di_integration_id) %}\r\n\t
\r\n\t\t{% if di_qr %}\r\n\t\t
\r\n\t\t\t\"FBR\r\n\t\t
\r\n\t\t{% endif %}\r\n\t\t
\r\n\t\t\t\"FBR\r\n\t\t\t

FBR Invoice Number: {{ doc.di_integration_id }}

\r\n\t\t\t

Date & Time: {{ doc.di_posting_datetime }}

\r\n\t\t\t

\r\n\t\t\t\tThis invoice has been reported to FBR through Digital Invoicing System.\r\n\t\t\t\tVerify this invoice at https://e.fbr.gov.pk\r\n\t\t\t

\r\n\t\t
\r\n\t
\r\n\t{% endif %}\r\n
\r\n", "idx": 0, "line_breaks": 0, "margin_bottom": 0.0, "margin_left": 0.0, "margin_right": 0.0, "margin_top": 0.0, - "modified": "2026-06-08 12:56:25.394656", + "modified": "2026-06-08 21:39:53.332233", "modified_by": "Administrator", "module": "Digital Invoicing", "name": "DI Sales Tax Invoice", @@ -30,4 +30,4 @@ "raw_printing": 0, "show_section_headings": 0, "standard": "Yes" -} \ No newline at end of file +} diff --git a/di/hooks.py b/di/hooks.py index 6aecc3d..8dfeba7 100755 --- a/di/hooks.py +++ b/di/hooks.py @@ -81,7 +81,6 @@ jinja = { "methods": [ "di.integrations.qr_code.generate_qr_code", - "di.integrations.qr_code.get_fbr_logo_data_uri", ] } diff --git a/di/integrations/qr_code.py b/di/integrations/qr_code.py index 1ce93e4..8526909 100755 --- a/di/integrations/qr_code.py +++ b/di/integrations/qr_code.py @@ -42,26 +42,3 @@ def generate_qr_code(invoice_number): encoded = base64.b64encode(buffer.getvalue()).decode("utf-8") return f"data:image/png;base64,{encoded}" - - -def get_fbr_logo_data_uri(): - """Return the FBR DI logo as a base64 data URI. - - Looks for the logo file in the app's public directory. - """ - import os - - logo_path = os.path.join( - os.path.dirname(os.path.dirname(__file__)), - "public", - "images", - "fbr_di_logo.png", - ) - - if not os.path.exists(logo_path): - return "" - - with open(logo_path, "rb") as f: - encoded = base64.b64encode(f.read()).decode("utf-8") - - return f"data:image/png;base64,{encoded}" diff --git a/di/public/images/fbrlogo.png b/di/public/images/fbrlogo.png new file mode 100755 index 0000000..1b7d4cc Binary files /dev/null and b/di/public/images/fbrlogo.png differ