diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index fa7a05caaf3..31d21bc1fe6 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -282,6 +282,8 @@ class SalesInvoice(SellingController):
def before_print(self, settings=None):
from frappe.contacts.doctype.address.address import get_address_display_list
+ super().before_print(settings)
+
company_details = frappe.get_value(
"Company", self.company, ["company_logo", "website", "phone_no", "email"], as_dict=True
)
@@ -298,6 +300,14 @@ class SalesInvoice(SellingController):
]
if not all(required_fields):
+ if not frappe.has_permission("Company", "write", throw=False):
+ frappe.msgprint(
+ _(
+ "Some required Company details are missing. You don't have permission to update them. Please contact your System Manager."
+ )
+ )
+ return
+
frappe.publish_realtime(
"sales_invoice_before_print",
{
diff --git a/erpnext/accounts/print_format/print_format_sales_invoice/print_format_sales_invoice.html b/erpnext/accounts/print_format/print_format_sales_invoice/print_format_sales_invoice.html
deleted file mode 100644
index ae0a0dbb77a..00000000000
--- a/erpnext/accounts/print_format/print_format_sales_invoice/print_format_sales_invoice.html
+++ /dev/null
@@ -1,330 +0,0 @@
-{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None,
-print_heading_template=None) -%}
-{% if letter_head and not no_letterhead %}
-
-
-
-
-
-
-
-
-
-
- Customer Name:
- Bill to:
-
-
- {{ doc.customer_name }}
-
- {% if doc.customer_address %}
- {% set customer_address = frappe.get_doc("Address", doc.customer_address) %}
- {{ customer_address.address_line1 or "" }}
- {% if customer_address.address_line2 %}{{ customer_address.address_line2 }} {% endif %}
- {{ customer_address.city or "" }} {{ customer_address.state or "" }} {{ customer_address.pincode or "" }} {{ customer_address.country or "" }}
- {% endif %}
-
-
-
- |
-
-
-
-
-
-
- {{ frappe.utils.format_date(doc.posting_date) }}
-
-
-
- {{ frappe.utils.format_date(doc.due_date) }}
-
- |
-
-
-
-
- {% set item_naming_by = frappe.db.get_single_value("Stock Settings", "item_naming_by") %}
-
-
-
- | {{ _("No") }} |
- {{ _("Item") }} |
- {% if item_naming_by != "Item Code" %}
- {{ _("Item Code") }} |
- {% endif %}
- {{ _("Quantity") }} |
- {{ _("Rate") }} |
- {{ _("Amount") }} |
-
-
-
- {% for item in doc.items %}
-
- | {{ loop.index }} |
-
-
-
- {% if item.image %}
-
-
- |
- {% endif %}
-
- {{ item.item_name }}
- |
-
-
- |
- {% if item_naming_by != "Item Code" %}
- {{ item.item_code }} |
- {% endif %}
-
- {{ item.get_formatted("qty", 0) }} {{ item.uom }} |
- {{ item.get_formatted("net_rate", doc) }} |
- {{ item.get_formatted("net_amount", doc) }} |
-
- {% endfor %}
-
-
-
-
-
-
- | {{ _("Sub Total:") }} |
- {{ doc.get_formatted("total", doc) }} |
-
-
- {%- if doc.apply_discount_on == "Net Total" -%}
-
- |
- {{ _("Discount") }} ({{ doc.additional_discount_percentage }}%):
- |
- {{ doc.get_formatted("discount_amount", doc) }} |
-
- {%- endif -%}
- {%- for tax in doc.taxes -%}
- {%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}
-
- | {{ tax.get_formatted("description") }} ({{ tax.get_formatted("rate") }}%): |
- {{ tax.get_formatted("tax_amount") }} |
-
- {%- endif -%}
- {%- endfor -%}
- {%- if doc.apply_discount_on == "Grand Total" -%}
-
- |
- {{ _("Discount") }} ({{ doc.additional_discount_percentage }}%):
- |
- {{ doc.get_formatted("discount_amount", doc) }} |
-
- {%- endif -%}
-
-
-
-
-
-
- |
-
- {{ _("In Words: ") }}{{ doc.in_words }}
-
- |
- {{ _("Grand Total:") }} |
-
-
- {{ doc.get_formatted("grand_total", doc) }}
-
- |
-
-
-
-
-
-
- {% if doc.terms %}
-
-
{{ _("Terms and Conditions") }}
- {{ doc.terms}}
-
- {% endif %}
-
-
-{% endfor %}
diff --git a/erpnext/accounts/print_format/print_format_sales_invoice/print_format_sales_invoice.json b/erpnext/accounts/print_format/print_format_sales_invoice/print_format_sales_invoice.json
deleted file mode 100644
index 9952485cc28..00000000000
--- a/erpnext/accounts/print_format/print_format_sales_invoice/print_format_sales_invoice.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "absolute_value": 0,
- "align_labels_right": 0,
- "creation": "2025-09-15 16:31:00.732539",
- "custom_format": 0,
- "default_print_language": "en",
- "disabled": 0,
- "doc_type": "Sales Invoice",
- "docstatus": 0,
- "doctype": "Print Format",
- "font_size": 14,
- "idx": 0,
- "line_breaks": 0,
- "margin_bottom": 15.0,
- "margin_left": 15.0,
- "margin_right": 15.0,
- "margin_top": 15.0,
- "modified": "2025-09-15 16:31:00.732539",
- "modified_by": "Administrator",
- "module": "Accounts",
- "name": "Print Format Sales Invoice",
- "owner": "Administrator",
- "page_number": "Hide",
- "pdf_generator": "wkhtmltopdf",
- "print_format_builder": 0,
- "print_format_builder_beta": 0,
- "print_format_for": "DocType",
- "print_format_type": "Jinja",
- "raw_printing": 0,
- "show_section_headings": 0,
- "standard": "Yes"
-}
diff --git a/erpnext/accounts/print_format/sales_invoice_print_format/sales_invoice_print_format.html b/erpnext/accounts/print_format/sales_invoice_print_format/sales_invoice_print_format.html
deleted file mode 100644
index e11d8c97d69..00000000000
--- a/erpnext/accounts/print_format/sales_invoice_print_format/sales_invoice_print_format.html
+++ /dev/null
@@ -1,328 +0,0 @@
-{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None,
-print_heading_template=None) -%}
-{% if letter_head and not no_letterhead %}
-
-
-
-
-
-
-
- |
- {{ _("Customer Name") }}: {{doc.customer_name }}
- |
-
- {{ _("Payment Due Date") }}: {{
- frappe.utils.format_date(doc.due_date) }}
- |
-
-
- | {{ _("Invoice Number") }}: {{ doc.name }} |
-
- {{ _("Invoice Date") }}: {{
- frappe.utils.format_date(doc.posting_date) }}
- |
-
-
- {{ _("Bill From") }}:
- {% if doc.customer_address %}
- {% set customer_address = frappe.get_doc("Address", doc.customer_address) %}
- {{ doc.customer_name }}
- {{ customer_address.address_line1 or "" }}
- {% if customer_address.address_line2 %}{{ customer_address.address_line2 }} {% endif %}
- {{ customer_address.city or "" }} {{ customer_address.state or "" }} {{ customer_address.pincode or "" }} {{ customer_address.country or "" }}
- {% endif %}
- |
- {{ _("Bill To") }}:
- {% if doc.company_address %}
- {% set company_address_display = frappe.get_doc("Address", doc.company_address) %}
- {{ doc.company }}
- {{ company_address_display.address_line1 or "" }}
- {% if company_address_display.address_line2 %}{{ company_address_display.address_line2 }} {% endif %}
- {{ company_address_display.city or "" }} {{ company_address_display.state or "" }} {{ company_address_display.pincode or "" }} {{ company_address_display.country or "" }}
- {% endif %}
- |
-
-
-
-
- {% set item_naming_by = frappe.db.get_single_value("Stock Settings", "item_naming_by") %}
-
-
-
- {% for item in doc.items %}
-
- | {{ loop.index }} |
- {{ item.item_name }} |
- {% if item_naming_by != "Item Code" %}
- {{ item.item_code }} |
- {% endif %}
- {{ item.get_formatted("qty", 0) }} {{ item.uom }} |
- {{ item.get_formatted("net_rate", doc) }} |
-
- {{ item.get_formatted("net_amount", doc) }}
- |
-
- {% endfor %}
-
-
-
-
-
- |
- {{ _("Total in words") }}
- {{ doc.in_words }}
- |
-
-
- |
-
-
-
- | {{ _("Sub Total:") }} |
- {{ doc.get_formatted("total", doc) }} |
-
- {%- if doc.apply_discount_on == "Net Total" -%}
-
- |
- {{ _("Discount") }} ({{ doc.additional_discount_percentage }}%):
- |
- {{ doc.get_formatted("discount_amount", doc) }} |
-
- {%- endif -%}
- {%- for tax in doc.taxes -%}
- {%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}
-
- | {{ tax.get_formatted("description") }} ({{ tax.get_formatted("rate") }}%): |
- {{ tax.get_formatted("tax_amount") }} |
-
- {%- endif -%}
- {%- endfor -%}
- {%- if doc.apply_discount_on == "Grand Total" -%}
-
- |
- {{ _("Discount") }} ({{ doc.additional_discount_percentage }}%):
- |
- {{ doc.get_formatted("discount_amount", doc) }} |
-
- {%- endif -%}
-
- | {{ _("Grand Total:") }} |
- {{ doc.get_formatted("grand_total", doc) }} |
-
-
- |
-
-
-
-
- {% if doc.terms %}
-
-
{{ _("Terms and Conditions") }}
- {{ doc.terms}}
-
- {% endif %}
-
-
-{% endfor %}
diff --git a/erpnext/accounts/print_format/sales_invoice_print_format/sales_invoice_print_format.json b/erpnext/accounts/print_format/sales_invoice_print_format/sales_invoice_print_format.json
deleted file mode 100644
index 39f299ea206..00000000000
--- a/erpnext/accounts/print_format/sales_invoice_print_format/sales_invoice_print_format.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "absolute_value": 0,
- "align_labels_right": 0,
- "creation": "2025-08-28 04:03:36.284420",
- "custom_format": 0,
- "default_print_language": "en",
- "disabled": 0,
- "doc_type": "Sales Invoice",
- "docstatus": 0,
- "doctype": "Print Format",
- "font_size": 14,
- "idx": 0,
- "line_breaks": 0,
- "margin_bottom": 15.0,
- "margin_left": 15.0,
- "margin_right": 15.0,
- "margin_top": 15.0,
- "modified": "2025-10-08 22:18:52.241069",
- "modified_by": "Administrator",
- "module": "Accounts",
- "name": "Sales Invoice Print Format",
- "owner": "Administrator",
- "page_number": "Hide",
- "pdf_generator": "wkhtmltopdf",
- "print_format_builder": 0,
- "print_format_builder_beta": 0,
- "print_format_for": "DocType",
- "print_format_type": "Jinja",
- "raw_printing": 0,
- "show_section_headings": 0,
- "standard": "Yes"
-}
diff --git a/erpnext/accounts/print_format/print_format_sales_invoice/__init__.py b/erpnext/accounts/print_format/sales_invoice_standard/__init__.py
similarity index 100%
rename from erpnext/accounts/print_format/print_format_sales_invoice/__init__.py
rename to erpnext/accounts/print_format/sales_invoice_standard/__init__.py
diff --git a/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json b/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json
new file mode 100644
index 00000000000..b9feabd9f73
--- /dev/null
+++ b/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json
@@ -0,0 +1,33 @@
+{
+ "absolute_value": 0,
+ "align_labels_right": 0,
+ "creation": "2025-10-10 02:08:36.763108",
+ "custom_format": 1,
+ "default_print_language": "en",
+ "disabled": 0,
+ "doc_type": "Sales Invoice",
+ "docstatus": 0,
+ "doctype": "Print Format",
+ "font_size": 14,
+ "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t
{{ _(\"CANCELLED\") }}
\n\t\t\n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
\n\t\t\t
{{ _(\"DRAFT\") }}
\n\t\t\n\t{%- endif -%}\n\n\t\n\t
\n\t\t
\n\t\t\t\n\t\t\t\t| \n\t\t\t\t\t{{ _(\"Customer Name\") }}: {{doc.customer_name }}\n\t\t\t\t | \n\t\t\t\t\n\t\t\t\t\t{{ _(\"Payment Due Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.due_date) }}\n\t\t\t\t | \n\t\t\t
\n\t\t\t\n\t\t\t\t| {{ _(\"Invoice Number\") }}: {{ doc.name }} | \n\t\t\t\t\n\t\t\t\t\t{{ _(\"Invoice Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.posting_date) }}\n\t\t\t\t | \n\t\t\t
\n\t\t\t\n\t\t\t\t{{ _(\"Bill From\") }}: \n\t\t\t\t\t{% if doc.customer_address %}\n\t\t\t\t\t\t{% set customer_address = frappe.get_doc(\"Address\", doc.customer_address) %}\n\t\t\t\t\t\t{{ doc.customer_name }} \n\t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }} \n\t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }} {% endif %}\n\t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }} \n\t\t\t\t\t{% endif %}\n\t\t\t\t | \n\t\t\t\t{{ _(\"Bill To\") }}: \n\t\t\t\t\t{% if doc.company_address %}\n\t\t\t\t\t\t{% set company_address_display = frappe.get_doc(\"Address\", doc.company_address) %}\n\t\t\t\t\t\t{{ doc.company }} \n\t\t\t\t\t\t{{ company_address_display.address_line1 or \"\" }} \n\t\t\t\t\t\t{% if company_address_display.address_line2 %}{{ company_address_display.address_line2 }} {% endif %}\n\t\t\t\t\t\t{{ company_address_display.city or \"\" }} {{ company_address_display.state or \"\" }} {{ company_address_display.pincode or \"\" }} {{ company_address_display.country or \"\" }} \n\t\t\t\t\t{% endif %}\n\t\t\t\t | \n\t\t\t
\n\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t| {{ loop.index }} | \n\t\t\t\t\t{{ item.item_name }} | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ item.item_code }} | \n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_rate\", doc) }} | \n\t\t\t\t\t\n\t\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }}\n\t\t\t\t\t | \n\t\t\t\t
\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
\n\n\t\t\n\t\t
\n\t\t\t| \n\t\t\t\t {{ _(\"Total in words\") }} \n\t\t\t\t{{ doc.in_words }} \n\t\t\t | \n\t\t\t\n\t\t\t\t \n\t\t\t | \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t| {{ _(\"Sub Total:\") }} | \n\t\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }} | \n\t\t\t\t\t \n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t| \n\t\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \n\t\t\t\t\t\t \n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t| {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%): | \n\t\t\t\t\t\t\t\t{{ tax.get_formatted(\"tax_amount\") }} | \n\t\t\t\t\t\t\t \n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t| \n\t\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \n\t\t\t\t\t\t \n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t| {{ _(\"Grand Total:\") }} | \n\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }} | \n\t\t\t\t\t \n\t\t\t\t \n\t\t\t | \n\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n",
+ "idx": 0,
+ "line_breaks": 0,
+ "margin_bottom": 15.0,
+ "margin_left": 15.0,
+ "margin_right": 15.0,
+ "margin_top": 15.0,
+ "modified": "2025-10-10 12:56:58.584363",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Sales Invoice Standard",
+ "owner": "Administrator",
+ "page_number": "Hide",
+ "pdf_generator": "wkhtmltopdf",
+ "print_format_builder": 0,
+ "print_format_builder_beta": 0,
+ "print_format_for": "DocType",
+ "print_format_type": "Jinja",
+ "raw_printing": 0,
+ "show_section_headings": 0,
+ "standard": "Yes"
+}
diff --git a/erpnext/accounts/print_format/sales_invoice_print_format/__init__.py b/erpnext/accounts/print_format/sales_invoice_with_item_image/__init__.py
similarity index 100%
rename from erpnext/accounts/print_format/sales_invoice_print_format/__init__.py
rename to erpnext/accounts/print_format/sales_invoice_with_item_image/__init__.py
diff --git a/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json b/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json
new file mode 100644
index 00000000000..bec00d26119
--- /dev/null
+++ b/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json
@@ -0,0 +1,33 @@
+{
+ "absolute_value": 0,
+ "align_labels_right": 0,
+ "creation": "2025-10-10 02:16:45.078776",
+ "custom_format": 1,
+ "default_print_language": "en",
+ "disabled": 0,
+ "doc_type": "Sales Invoice",
+ "docstatus": 0,
+ "doctype": "Print Format",
+ "font_size": 14,
+ "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t
{{ _(\"CANCELLED\") }}
\n\t\t\n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
\n\t\t\t
{{ _(\"DRAFT\") }}
\n\t\t\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t Customer Name: \n\t\t\t\t\t\t Bill to: \n\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t {{ doc.customer_name }} \n\t\t\t\t\t\t \n\t\t\t\t\t\t\t{% if doc.customer_address %}\n\t\t\t\t\t\t\t\t{% set customer_address = frappe.get_doc(\"Address\", doc.customer_address) %}\n\t\t\t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }} \n\t\t\t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }} {% endif %}\n\t\t\t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }} \n\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t \n\n\t\t\t\t\t \n\t\t\t\t | \n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t Invoice Number: \n\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t {{ doc.name }} \n\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t Invoice Date: \n\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t {{ frappe.utils.format_date(doc.posting_date) }} \n\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t Payment Due Date: \n\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t {{ frappe.utils.format_date(doc.due_date) }} \n\t\t\t\t\t \n\t\t\t\t | \n\t\t\t
\n\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t| {{ _(\"No\") }} | \n\t\t\t\t\t{{ _(\"Item\") }} | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ _(\"Item Code\") }} | \n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{{ _(\"Quantity\") }} | \n\t\t\t\t\t{{ _(\"Rate\") }} | \n\t\t\t\t\t{{ _(\"Amount\") }} | \n\t\t\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t| {{ loop.index }} | \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t \n\t\t\t\t\t\t \n\t\t\t\t\t | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ item.item_code }} | \n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_rate\", doc) }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }} | \n\t\t\t\t
\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t| {{ _(\"Sub Total:\") }} | \n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }} | \n\t\t\t\t
\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t| \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \n\t\t\t\t\t
\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t| {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%): | \n\t\t\t\t\t\t\t{{ tax.get_formatted(\"tax_amount\") }} | \n\t\t\t\t\t\t
\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t| \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \n\t\t\t\t\t
\n\t\t\t\t{%- endif -%}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t| \n\t\t\t\t\t\t \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t \n\t\t\t\t\t | \n\t\t\t\t\t{{ _(\"Grand Total:\") }} | \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t | \n\t\t\t\t
\n\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n",
+ "idx": 0,
+ "line_breaks": 0,
+ "margin_bottom": 15.0,
+ "margin_left": 15.0,
+ "margin_right": 15.0,
+ "margin_top": 15.0,
+ "modified": "2025-10-10 02:16:45.078776",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Sales Invoice with Item Image",
+ "owner": "Administrator",
+ "page_number": "Hide",
+ "pdf_generator": "wkhtmltopdf",
+ "print_format_builder": 0,
+ "print_format_builder_beta": 0,
+ "print_format_for": "DocType",
+ "print_format_type": "Jinja",
+ "raw_printing": 0,
+ "show_section_headings": 0,
+ "standard": "Yes"
+}