ERPNext takes an Additional Discount off the items' net amounts and, for a discount on Grand Total, splits it between net and taxes: each charge is booked at tax_amount_after_discount_amount and Total Taxes and Charges sums those. The print showed the discount as entered and the pre-discount tax_amount, so on a Grand Total discount the VAT line disagreed with the invoice. The totals includes now print the discount's net share (sum of item.distributed_discount_amount), Net Total, and each charge after discount, so the lines add up to Grand Total whichever total the discount applies on and with inclusive or exclusive tax. A discount that is not distributed (cash / non-trade) stays after the charges.
104 lines
39 KiB
JSON
104 lines
39 KiB
JSON
[
|
|
{
|
|
"absolute_value": 0,
|
|
"align_labels_right": 0,
|
|
"css": "/* Thai text needs a font with Thai glyphs; wkhtmltopdf only sees the server's fonts and a\n headless server rarely has one, so ship Sarabun (OFL, see public/fonts/OFL.txt) with the app.\n Asset URLs are made absolute for the PDF renderer by frappe.utils.scrub_urls. */\n@font-face {\n\tfont-family: \"Sarabun\";\n\tfont-weight: 400;\n\tsrc: url(\"/assets/default_thai_company/fonts/Sarabun-Regular.ttf\");\n}\n@font-face {\n\tfont-family: \"Sarabun\";\n\tfont-weight: 700;\n\tsrc: url(\"/assets/default_thai_company/fonts/Sarabun-Bold.ttf\");\n}\n.print-format {\n\tfont-family: Sarabun, Inter, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n/* Print Style \"Redesign\" gives .letter-head a 30px margin; tighten it. */\n.print-format .letter-head {\n\tmargin-bottom: 5px;\n}\n\n/* One vertical rhythm for every label/value line. \"Redesign\" stacks field rows with\n margin-top: 15px (doubled where Total/Taxes nest a layout .row) while the custom\n Customer / Bank tables and the heading dates had none; use line-height 1.8 everywhere\n and no row margins instead. */\n.print-format .row:not(.section-break) {\n\tmargin-top: 0 !important;\n\tline-height: 1.8;\n}\n.print-format .heading-dates,\n.print-format .customer-details td,\n.print-format .bank-account-details td {\n\tline-height: 1.8;\n}\n\n/* standard.css gives .table 20px top/bottom margins; keep the item table close to its neighbours. */\n.print-format [data-fieldname=\"items\"] > .table {\n\tmargin-top: 5px;\n\tmargin-bottom: 5px;\n}",
|
|
"custom_format": 1,
|
|
"default_print_language": null,
|
|
"disabled": 0,
|
|
"doc_type": "Sales Invoice",
|
|
"docstatus": 0,
|
|
"doctype": "Print Format",
|
|
"font": null,
|
|
"font_size": 14,
|
|
"format_data": null,
|
|
"html": "{%- from \"templates/print_formats/standard_macros.html\" import add_header, render_field with context -%}\n{%- set bank_account = get_company_bank_account(doc.company) -%}\n{#- ERPNext hides taxes marked \"Is this Tax included in Basic Rate?\" unless Accounts Settings\n enables \"Show Inclusive Tax in Print\"; always show them here so the tax line and\n \"Total (Without Tax)\" appear on invoices with inclusive tax. -#}\n{%- if doc.get(\"taxes\", {\"included_in_print_rate\": 1}) -%}\n\t{%- set ignored = doc.flags.update({\"show_inclusive_tax_in_print\": 1}) -%}\n{%- endif -%}\n{#- App copies of ERPNext's totals includes, printing the posted figures: \"total\" is the net before\n the Additional Discount; \"taxes\" prints the discount's net share, Net Total and each charge after\n discount, so the lines add up to Grand Total whichever total the discount applies on. -#}\n{%- set ignored = doc.print_templates.update({\"total\": \"default_thai_company/templates/print_formats/includes/total.html\"}) -%}\n{%- if doc.print_templates.get(\"taxes\") -%}\n\t{%- set ignored = doc.print_templates.update({\"taxes\": \"default_thai_company/templates/print_formats/includes/taxes.html\"}) -%}\n{%- endif -%}\n{#- Standard layout prints every non-empty field; drop the ones this invoice does not need.\n posting_date / due_date are printed in the heading, customer fields in the Customer section,\n in_words in the left column of the Totals section. -#}\n{%- set hidden_fields = [\n\t\"total_qty\", \"update_billed_amount_in_delivery_note\", \"amount_eligible_for_commission\", \"company_tax_id\",\n\t\"disable_rounded_total\",\n\t\"posting_date\", \"due_date\",\n\t\"customer_name\", \"address_display\", \"contact_display\", \"contact_mobile\", \"contact_email\", \"tax_id\",\n\t\"in_words\",\n] -%}\n{#- rounded_total keeps a value even when rounding is disabled, so the standard layout would print it. -#}\n{%- if doc.is_rounded_total_disabled() -%}{%- set ignored = hidden_fields.append(\"rounded_total\") -%}{%- endif -%}\n{#- add_header renders this string via frappe.render_template with {\"doc\": doc}, so it is kept\n unrendered with {% raw %}. Same markup as the stock heading plus a right-aligned date block. -#}\n{%- set heading_template -%}\n{% raw %}\n<div class=\"print-heading\">\n\t<style>\n\t\t.print-heading .heading-dates { float: right; text-align: right; margin-top: 4px; white-space: nowrap; }\n\t\t.print-heading .heading-dates label { display: inline; font-weight: 700; margin: 0 4px 0 0; }\n\t\t.print-heading .heading-clear { clear: both; }\n\t</style>\n\t<div class=\"heading-dates\">\n\t\t<div><label>{{ _(doc.meta.get_label(\"posting_date\")) }}:</label> {{ doc.get_formatted(\"posting_date\") }}</div>\n\t\t{%- if doc.due_date %}\n\t\t<div><label>{{ _(doc.meta.get_label(\"due_date\")) }}:</label> {{ doc.get_formatted(\"due_date\") }}</div>\n\t\t{%- endif %}\n\t</div>\n\t<h2>\n\t\t<div>{{ _(doc.select_print_heading) or (_(doc.print_heading) if doc.print_heading != None else _(doc.doctype)) }}</div>\n\t\t<small class=\"sub-heading\">{{ _(doc.sub_heading) if doc.sub_heading != None else _(doc.name) }}</small>\n\t</h2>\n\t<div class=\"heading-clear\"></div>\n</div>\n{% endraw %}\n{%- endset -%}\n{#- Standard layout prints every non-empty child column; keep the item table to the essentials -#}\n{%- set item_columns = [\n\t{\"fieldname\": \"item_code\"},\n\t{\"fieldname\": \"description\"},\n\t{\"fieldname\": \"qty\"},\n\t{\"fieldname\": \"rate\"},\n\t{\"fieldname\": \"amount\"},\n] -%}\n\n{%- macro render_fields(fields, no_of_cols) -%}\n\t{%- for df in fields -%}\n\t\t{%- if df.fieldname not in hidden_fields -%}\n\t\t\t{%- if df.fieldname == \"items\" -%}\n\t\t\t\t{%- set df = df.as_dict() -%}\n\t\t\t\t{%- set ignored = df.update({\"visible_columns\": item_columns}) -%}\n\t\t\t{%- endif -%}\n\t\t\t{{ render_field(df, doc, no_of_cols) }}\n\t\t{%- endif -%}\n\t{%- endfor -%}\n{%- endmacro -%}\n\n{% for page in layout %}\n<div class=\"page-break\">\n\t<div {% if print_settings.repeat_header_footer %} id=\"header-html\" class=\"hidden-pdf\" {% endif %}>\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings, heading_template) }}\n\t</div>\n\n\t{% if loop.first %}\n\t<div class=\"row section-break\" data-label=\"{{ _(\"Customer\") }}\">\n\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t<h4>{{ _(\"Customer\") }}</h4>\n\t\t\t<style>\n\t\t\t\t.customer-details { width: 100%; }\n\t\t\t\t.customer-details td { padding: 0 !important; border: 0; vertical-align: top; }\n\t\t\t\t.customer-details td.text-muted { width: 40%; padding-right: 1em !important; white-space: nowrap; }\n\t\t\t</style>\n\t\t</div>\n\t\t<div class=\"col-xs-6 column-break\">\n\t\t\t<table class=\"customer-details\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"customer_name\")) }}</td><td>{{ doc.customer_name or doc.customer }}</td></tr>\n\t\t\t\t\t{% if doc.address_display %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"address_display\")) }}</td><td>{{ doc.address_display }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.tax_id %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"tax_id\")) }}</td><td>{{ doc.tax_id }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t\t<div class=\"col-xs-6 column-break\">\n\t\t\t{% if doc.contact_person %}\n\t\t\t{#- Sales Invoice carries the contact's mobile and email but not its phone; read that from the Contact. -#}\n\t\t\t{%- set contact_phone = frappe.db.get_value(\"Contact\", doc.contact_person, \"phone\") -%}\n\t\t\t<table class=\"customer-details\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_person\")) }}</td><td>{{ doc.contact_display or doc.contact_person }}</td></tr>\n\t\t\t\t\t{% if contact_phone %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(frappe.get_meta(\"Contact\").get_label(\"phone\")) }}</td><td>{{ contact_phone }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_mobile %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_mobile\")) }}</td><td>{{ doc.contact_mobile }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_email %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_email\")) }}</td><td>{{ doc.contact_email }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t{% endif %}\n\t\t</div>\n\t</div>\n\t{% endif %}\n\n\t{% for section in page %}\n\t<div class=\"row section-break\" data-label=\"{{ section.label or '' | e }}\">\n\t\t{%- if doc.print_line_breaks and loop.index != 1 -%}<hr>{%- endif -%}\n\t\t{%- if doc.print_section_headings and section.label and section.has_data -%}\n\t\t<h4 class='col-sm-12'>{{ _(section.label) }}</h4>\n\t\t{%- endif -%}\n\t\t{%- set no_of_cols = section.columns|len -%}\n\t\t{%- set section_fieldnames = [] -%}\n\t\t{%- for column in section.columns -%}\n\t\t\t{%- for df in column.fields -%}{%- set ignored = section_fieldnames.append(df.fieldname) -%}{%- endfor -%}\n\t\t{%- endfor -%}\n\t\t{%- if \"total\" in section_fieldnames -%}\n\t\t{#- \"total\" sits in a 3-column section, so its label/value grid does not line up with the\n\t\t Taxes and Totals sections below it. Render it in the same right-half 6/6 grid they use. -#}\n\t\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"col-xs-6\"></div>\n\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t{%- for column in section.columns -%}{{ render_fields(column.fields, 1) }}{%- endfor -%}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{%- else -%}\n\t\t{% for column in section.columns %}\n\t\t\t<div class=\"col-xs-{{ (12 / no_of_cols)|int }} column-break\">\n\t\t\t{%- if loop.first and \"in_words\" in section_fieldnames and doc.in_words -%}\n\t\t\t{#- The Totals section's left column is empty in print; put the amount in words there,\n\t\t\t on the same line as Grand Total, instead of under Rounded Total on the right. -#}\n\t\t\t\t<div class=\"row data-field\" data-fieldname=\"in_words\" data-fieldtype=\"Data\">\n\t\t\t\t\t<div class=\"col-xs-12 value\"><label style=\"display: inline\">{{ _(doc.meta.get_label(\"in_words\")) }}:</label> {{ get_in_words(doc) }}</div>\n\t\t\t\t</div>\n\t\t\t{%- endif -%}\n\t\t\t{{ render_fields(column.fields, no_of_cols) }}\n\t\t\t</div>\n\t\t{% endfor %}\n\t\t{%- endif -%}\n\t</div>\n\t{% endfor %}\n\n\t{% if loop.last and bank_account %}\n\t<div class=\"row section-break\" data-label=\"{{ _(\"Bank Account Details\") }}\">\n\t\t{%- if doc.print_line_breaks -%}<hr>{%- endif -%}\n\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t<h4>{{ _(\"Bank Account Details\") }}</h4>\n\t\t\t<style>\n\t\t\t\t.bank-account-details { width: 100%; }\n\t\t\t\t.bank-account-details td { padding: 0 !important; border: 0; }\n\t\t\t</style>\n\t\t\t<table class=\"bank-account-details\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><td class=\"text-muted\" style=\"width: 30%; padding-right: 1em !important\">{{ _(\"Bank\") }}</td><td>{{ bank_account.bank }}</td></tr>\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(\"Account Name\") }}</td><td>{{ bank_account.account_name }}</td></tr>\n\t\t\t\t\t{% if bank_account.bank_account_no %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(\"Bank Account No\") }}</td><td>{{ bank_account.bank_account_no }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.iban %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(\"IBAN\") }}</td><td>{{ bank_account.iban }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.branch_code %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(\"Branch Code\") }}</td><td>{{ bank_account.branch_code }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.swift_number %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(\"SWIFT number\") }}</td><td>{{ bank_account.swift_number }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t</div>\n\t{% endif %}\n\n\t{% if loop.last %}\n\t<div class=\"row section-break\" data-label=\"{{ _(\"Signatures\") }}\">\n\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t<style>\n\t\t\t\t.signatures { width: 100%; border-collapse: collapse; margin-top: 20px; }\n\t\t\t\t.signatures td { width: 50%; border: 0; padding: 6px 0 !important; vertical-align: top; }\n\t\t\t\t.signatures .signature-lines { margin-top: 60px; }\n\t\t\t\t.signatures .signature-lines span { display: inline-block; width: 120px; border-bottom: 1px solid #000; margin-right: 12px; }\n\t\t\t\t.signatures .signature-labels span { display: inline-block; width: 120px; margin-right: 12px; }\n\t\t\t</style>\n\t\t\t<table class=\"signatures\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div>{{ _(\"On behalf of\") }} {{ doc.customer_name or doc.customer }}</div>\n\t\t\t\t\t\t\t<div class=\"signature-lines\"><span></span><span></span></div>\n\t\t\t\t\t\t\t<div class=\"signature-labels\"><span>{{ _(\"Receiver\") }}</span><span>{{ _(\"Date\") }}</span></div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div>{{ _(\"On behalf of\") }} {{ doc.company }}</div>\n\t\t\t\t\t\t\t<div class=\"signature-lines\"><span></span><span></span></div>\n\t\t\t\t\t\t\t<div class=\"signature-labels\"><span>{{ _(\"Issuer\") }}</span><span>{{ _(\"Date\") }}</span></div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t</div>\n\t{% endif %}\n\n\t<div {% if print_settings.repeat_header_footer %} id=\"footer-html\" class=\"visible-pdf\" {% endif %}>\n\t\t{% if not no_letterhead and footer %}\n\t\t<div class=\"letter-head-footer\">\n\t\t\t{{ footer }}\n\t\t</div>\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t\t<p class=\"text-center small page-number visible-pdf\">\n\t\t\t\t{{ _(\"Page {0} of {1}\").format('<span class=\"page\"></span>', '<span class=\"topage\"></span>') }}\n\t\t\t</p>\n\t\t{% endif %}\n\t</div>\n</div>\n{% endfor %}\n\n\n\n\n\n\n\n\n",
|
|
"line_breaks": 0,
|
|
"margin_bottom": 15.0,
|
|
"margin_left": 15.0,
|
|
"margin_right": 15.0,
|
|
"margin_top": 15.0,
|
|
"modified": "2026-09-15 07:10:28.117714",
|
|
"module": "Default Thai Company",
|
|
"name": "Default Standard Sales Invoice",
|
|
"page_number": "Hide",
|
|
"pdf_generator": "wkhtmltopdf",
|
|
"print_format_builder": 0,
|
|
"print_format_builder_beta": 0,
|
|
"print_format_for": "DocType",
|
|
"print_format_type": "Jinja",
|
|
"raw_commands": null,
|
|
"raw_printing": 0,
|
|
"report": null,
|
|
"show_section_headings": 0,
|
|
"standard": "No"
|
|
},
|
|
{
|
|
"absolute_value": 0,
|
|
"align_labels_right": 0,
|
|
"css": "/* Thai text needs a font with Thai glyphs; wkhtmltopdf only sees the server's fonts and a\n headless server rarely has one, so ship Sarabun (OFL, see public/fonts/OFL.txt) with the app.\n Asset URLs are made absolute for the PDF renderer by frappe.utils.scrub_urls. */\n@font-face {\n\tfont-family: \"Sarabun\";\n\tfont-weight: 400;\n\tsrc: url(\"/assets/default_thai_company/fonts/Sarabun-Regular.ttf\");\n}\n@font-face {\n\tfont-family: \"Sarabun\";\n\tfont-weight: 700;\n\tsrc: url(\"/assets/default_thai_company/fonts/Sarabun-Bold.ttf\");\n}\n.print-format {\n\tfont-family: Sarabun, Inter, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n/* Print Style \"Redesign\" gives .letter-head a 30px margin; tighten it. */\n.print-format .letter-head {\n\tmargin-bottom: 5px;\n}\n\n/* One vertical rhythm for every label/value line. \"Redesign\" stacks field rows with\n margin-top: 15px (doubled where Total/Taxes nest a layout .row) while the custom\n Customer table and the heading dates had none; use line-height 1.8 everywhere\n and no row margins instead. */\n.print-format .row:not(.section-break) {\n\tmargin-top: 0 !important;\n\tline-height: 1.8;\n}\n.print-format .heading-dates,\n.print-format .customer-details td {\n\tline-height: 1.8;\n}\n\n/* standard.css gives .table 20px top/bottom margins; keep the item table close to its neighbours. */\n.print-format [data-fieldname=\"items\"] > .table {\n\tmargin-top: 5px;\n\tmargin-bottom: 5px;\n}",
|
|
"custom_format": 1,
|
|
"default_print_language": null,
|
|
"disabled": 0,
|
|
"doc_type": "Sales Invoice",
|
|
"docstatus": 0,
|
|
"doctype": "Print Format",
|
|
"font": null,
|
|
"font_size": 14,
|
|
"format_data": null,
|
|
"html": "{%- from \"templates/print_formats/standard_macros.html\" import add_header, render_field with context -%}\n{#- ERPNext hides taxes marked \"Is this Tax included in Basic Rate?\" unless Accounts Settings\n enables \"Show Inclusive Tax in Print\"; always show them here so the tax line and\n \"Total (Without Tax)\" appear on invoices with inclusive tax. -#}\n{%- if doc.get(\"taxes\", {\"included_in_print_rate\": 1}) -%}\n\t{%- set ignored = doc.flags.update({\"show_inclusive_tax_in_print\": 1}) -%}\n{%- endif -%}\n{#- App copies of ERPNext's totals includes, printing the posted figures: \"total\" is the net before\n the Additional Discount; \"taxes\" prints the discount's net share, Net Total and each charge after\n discount, so the lines add up to Grand Total whichever total the discount applies on. -#}\n{%- set ignored = doc.print_templates.update({\"total\": \"default_thai_company/templates/print_formats/includes/total.html\"}) -%}\n{%- if doc.print_templates.get(\"taxes\") -%}\n\t{%- set ignored = doc.print_templates.update({\"taxes\": \"default_thai_company/templates/print_formats/includes/taxes.html\"}) -%}\n{%- endif -%}\n{#- Standard layout prints every non-empty field; drop the ones this invoice does not need.\n posting_date / due_date are printed in the heading, customer fields in the Customer section,\n in_words in the left column of the Totals section. -#}\n{%- set hidden_fields = [\n\t\"total_qty\", \"update_billed_amount_in_delivery_note\", \"amount_eligible_for_commission\", \"company_tax_id\",\n\t\"disable_rounded_total\",\n\t\"posting_date\", \"due_date\",\n\t\"customer_name\", \"address_display\", \"contact_display\", \"contact_mobile\", \"contact_email\", \"tax_id\",\n\t\"in_words\",\n] -%}\n{#- rounded_total keeps a value even when rounding is disabled, so the standard layout would print it. -#}\n{%- if doc.is_rounded_total_disabled() -%}{%- set ignored = hidden_fields.append(\"rounded_total\") -%}{%- endif -%}\n{#- add_header renders this string via frappe.render_template with {\"doc\": doc}, so it is kept\n unrendered with {% raw %}. Same markup as the stock heading plus a right-aligned date block. -#}\n{%- set heading_template -%}\n{% raw %}\n<div class=\"print-heading\">\n\t<style>\n\t\t.print-heading .heading-dates { float: right; text-align: right; margin-top: 4px; white-space: nowrap; }\n\t\t.print-heading .heading-dates label { display: inline; font-weight: 700; margin: 0 4px 0 0; }\n\t\t.print-heading .heading-clear { clear: both; }\n\t</style>\n\t<div class=\"heading-dates\">\n\t\t<div><label>{{ _(doc.meta.get_label(\"posting_date\")) }}:</label> {{ doc.get_formatted(\"posting_date\") }}</div>\n\t\t{%- if doc.due_date %}\n\t\t<div><label>{{ _(doc.meta.get_label(\"due_date\")) }}:</label> {{ doc.get_formatted(\"due_date\") }}</div>\n\t\t{%- endif %}\n\t</div>\n\t<h2>\n\t\t<div>{{ _(doc.select_print_heading) or (_(doc.print_heading) if doc.print_heading != None else _(\"Tax Invoice/Receipt\")) }}</div>\n\t\t<small class=\"sub-heading\">{{ _(doc.sub_heading) if doc.sub_heading != None else _(doc.name) }}</small>\n\t</h2>\n\t<div class=\"heading-clear\"></div>\n</div>\n{% endraw %}\n{%- endset -%}\n{#- Standard layout prints every non-empty child column; keep the item table to the essentials -#}\n{%- set item_columns = [\n\t{\"fieldname\": \"item_code\"},\n\t{\"fieldname\": \"description\"},\n\t{\"fieldname\": \"qty\"},\n\t{\"fieldname\": \"rate\"},\n\t{\"fieldname\": \"amount\"},\n] -%}\n\n{%- macro render_fields(fields, no_of_cols) -%}\n\t{%- for df in fields -%}\n\t\t{%- if df.fieldname not in hidden_fields -%}\n\t\t\t{%- if df.fieldname == \"items\" -%}\n\t\t\t\t{%- set df = df.as_dict() -%}\n\t\t\t\t{%- set ignored = df.update({\"visible_columns\": item_columns}) -%}\n\t\t\t{%- endif -%}\n\t\t\t{{ render_field(df, doc, no_of_cols) }}\n\t\t{%- endif -%}\n\t{%- endfor -%}\n{%- endmacro -%}\n\n{% for page in layout %}\n<div class=\"page-break\">\n\t<div {% if print_settings.repeat_header_footer %} id=\"header-html\" class=\"hidden-pdf\" {% endif %}>\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings, heading_template) }}\n\t</div>\n\n\t{% if loop.first %}\n\t<div class=\"row section-break\" data-label=\"{{ _(\"Customer\") }}\">\n\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t<h4>{{ _(\"Customer\") }}</h4>\n\t\t\t<style>\n\t\t\t\t.customer-details { width: 100%; }\n\t\t\t\t.customer-details td { padding: 0 !important; border: 0; vertical-align: top; }\n\t\t\t\t.customer-details td.text-muted { width: 40%; padding-right: 1em !important; white-space: nowrap; }\n\t\t\t</style>\n\t\t</div>\n\t\t<div class=\"col-xs-6 column-break\">\n\t\t\t<table class=\"customer-details\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"customer_name\")) }}</td><td>{{ doc.customer_name or doc.customer }}</td></tr>\n\t\t\t\t\t{% if doc.address_display %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"address_display\")) }}</td><td>{{ doc.address_display }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.tax_id %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"tax_id\")) }}</td><td>{{ doc.tax_id }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t\t<div class=\"col-xs-6 column-break\">\n\t\t\t{% if doc.contact_person %}\n\t\t\t{#- Sales Invoice carries the contact's mobile and email but not its phone; read that from the Contact. -#}\n\t\t\t{%- set contact_phone = frappe.db.get_value(\"Contact\", doc.contact_person, \"phone\") -%}\n\t\t\t<table class=\"customer-details\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_person\")) }}</td><td>{{ doc.contact_display or doc.contact_person }}</td></tr>\n\t\t\t\t\t{% if contact_phone %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(frappe.get_meta(\"Contact\").get_label(\"phone\")) }}</td><td>{{ contact_phone }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_mobile %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_mobile\")) }}</td><td>{{ doc.contact_mobile }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_email %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_email\")) }}</td><td>{{ doc.contact_email }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t{% endif %}\n\t\t</div>\n\t</div>\n\t{% endif %}\n\n\t{% for section in page %}\n\t<div class=\"row section-break\" data-label=\"{{ section.label or '' | e }}\">\n\t\t{%- if doc.print_line_breaks and loop.index != 1 -%}<hr>{%- endif -%}\n\t\t{%- if doc.print_section_headings and section.label and section.has_data -%}\n\t\t<h4 class='col-sm-12'>{{ _(section.label) }}</h4>\n\t\t{%- endif -%}\n\t\t{%- set no_of_cols = section.columns|len -%}\n\t\t{%- set section_fieldnames = [] -%}\n\t\t{%- for column in section.columns -%}\n\t\t\t{%- for df in column.fields -%}{%- set ignored = section_fieldnames.append(df.fieldname) -%}{%- endfor -%}\n\t\t{%- endfor -%}\n\t\t{%- if \"total\" in section_fieldnames -%}\n\t\t{#- \"total\" sits in a 3-column section, so its label/value grid does not line up with the\n\t\t Taxes and Totals sections below it. Render it in the same right-half 6/6 grid they use. -#}\n\t\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"col-xs-6\"></div>\n\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t{%- for column in section.columns -%}{{ render_fields(column.fields, 1) }}{%- endfor -%}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{%- else -%}\n\t\t{% for column in section.columns %}\n\t\t\t<div class=\"col-xs-{{ (12 / no_of_cols)|int }} column-break\">\n\t\t\t{%- if loop.first and \"in_words\" in section_fieldnames and doc.in_words -%}\n\t\t\t{#- The Totals section's left column is empty in print; put the amount in words there,\n\t\t\t on the same line as Grand Total, instead of under Rounded Total on the right. -#}\n\t\t\t\t<div class=\"row data-field\" data-fieldname=\"in_words\" data-fieldtype=\"Data\">\n\t\t\t\t\t<div class=\"col-xs-12 value\"><label style=\"display: inline\">{{ _(doc.meta.get_label(\"in_words\")) }}:</label> {{ get_in_words(doc) }}</div>\n\t\t\t\t</div>\n\t\t\t{%- endif -%}\n\t\t\t{{ render_fields(column.fields, no_of_cols) }}\n\t\t\t</div>\n\t\t{% endfor %}\n\t\t{%- endif -%}\n\t</div>\n\t{% endfor %}\n\n\t{% if loop.last %}\n\t<div class=\"row section-break\" data-label=\"{{ _(\"Signatures\") }}\">\n\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t<style>\n\t\t\t\t.signatures { width: 100%; border-collapse: collapse; margin-top: 20px; }\n\t\t\t\t.signatures td { width: 50%; border: 0; padding: 6px 0 !important; vertical-align: top; }\n\t\t\t\t.signatures .signature-lines { margin-top: 60px; }\n\t\t\t\t.signatures .signature-lines span { display: inline-block; width: 120px; border-bottom: 1px solid #000; margin-right: 12px; }\n\t\t\t\t.signatures .signature-labels span { display: inline-block; width: 120px; margin-right: 12px; }\n\t\t\t</style>\n\t\t\t<table class=\"signatures\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div>{{ _(\"On behalf of\") }} {{ doc.customer_name or doc.customer }}</div>\n\t\t\t\t\t\t\t<div class=\"signature-lines\"><span></span><span></span></div>\n\t\t\t\t\t\t\t<div class=\"signature-labels\"><span>{{ _(\"Receiver\") }}</span><span>{{ _(\"Date\") }}</span></div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div>{{ _(\"On behalf of\") }} {{ doc.company }}</div>\n\t\t\t\t\t\t\t<div class=\"signature-lines\"><span></span><span></span></div>\n\t\t\t\t\t\t\t<div class=\"signature-labels\"><span>{{ _(\"Issuer\") }}</span><span>{{ _(\"Date\") }}</span></div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t</div>\n\t{% endif %}\n\n\t<div {% if print_settings.repeat_header_footer %} id=\"footer-html\" class=\"visible-pdf\" {% endif %}>\n\t\t{% if not no_letterhead and footer %}\n\t\t<div class=\"letter-head-footer\">\n\t\t\t{{ footer }}\n\t\t</div>\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t\t<p class=\"text-center small page-number visible-pdf\">\n\t\t\t\t{{ _(\"Page {0} of {1}\").format('<span class=\"page\"></span>', '<span class=\"topage\"></span>') }}\n\t\t\t</p>\n\t\t{% endif %}\n\t</div>\n</div>\n{% endfor %}\n\n\n\n\n\n\n\n\n",
|
|
"line_breaks": 0,
|
|
"margin_bottom": 15.0,
|
|
"margin_left": 15.0,
|
|
"margin_right": 15.0,
|
|
"margin_top": 15.0,
|
|
"modified": "2026-09-15 07:10:28.117714",
|
|
"module": "Default Thai Company",
|
|
"name": "Default Standard Tax Invoice/Receipt",
|
|
"page_number": "Hide",
|
|
"pdf_generator": "wkhtmltopdf",
|
|
"print_format_builder": 0,
|
|
"print_format_builder_beta": 0,
|
|
"print_format_for": "DocType",
|
|
"print_format_type": "Jinja",
|
|
"raw_commands": null,
|
|
"raw_printing": 0,
|
|
"report": null,
|
|
"show_section_headings": 0,
|
|
"standard": "No"
|
|
},
|
|
{
|
|
"absolute_value": 0,
|
|
"align_labels_right": 0,
|
|
"css": "/* Thai text needs a font with Thai glyphs; wkhtmltopdf only sees the server's fonts and a\n headless server rarely has one, so ship Sarabun (OFL, see public/fonts/OFL.txt) with the app.\n Asset URLs are made absolute for the PDF renderer by frappe.utils.scrub_urls. */\n@font-face {\n\tfont-family: \"Sarabun\";\n\tfont-weight: 400;\n\tsrc: url(\"/assets/default_thai_company/fonts/Sarabun-Regular.ttf\");\n}\n@font-face {\n\tfont-family: \"Sarabun\";\n\tfont-weight: 700;\n\tsrc: url(\"/assets/default_thai_company/fonts/Sarabun-Bold.ttf\");\n}\n.print-format {\n\tfont-family: Sarabun, Inter, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n/* Print Style \"Redesign\" gives .letter-head a 30px margin; tighten it. */\n.print-format .letter-head {\n\tmargin-bottom: 5px;\n}\n\n/* One vertical rhythm for every label/value line. \"Redesign\" stacks field rows with\n margin-top: 15px (doubled where Total/Taxes nest a layout .row) while the custom\n Customer table and the heading dates had none; use line-height 1.8 everywhere\n and no row margins instead. */\n.print-format .row:not(.section-break) {\n\tmargin-top: 0 !important;\n\tline-height: 1.8;\n}\n.print-format .heading-dates,\n.print-format .customer-details td {\n\tline-height: 1.8;\n}\n\n/* standard.css gives .table 20px top/bottom margins; keep the item table close to its neighbours. */\n.print-format [data-fieldname=\"items\"] > .table {\n\tmargin-top: 5px;\n\tmargin-bottom: 5px;\n}",
|
|
"custom_format": 1,
|
|
"default_print_language": null,
|
|
"disabled": 0,
|
|
"doc_type": "Quotation",
|
|
"docstatus": 0,
|
|
"doctype": "Print Format",
|
|
"font": null,
|
|
"font_size": 14,
|
|
"format_data": null,
|
|
"html": "{%- from \"templates/print_formats/standard_macros.html\" import add_header, render_field with context -%}\n{#- ERPNext hides taxes marked \"Is this Tax included in Basic Rate?\" unless Accounts Settings\n enables \"Show Inclusive Tax in Print\"; always show them here so the tax line and\n \"Total (Without Tax)\" appear on quotations with inclusive tax. -#}\n{%- if doc.get(\"taxes\", {\"included_in_print_rate\": 1}) -%}\n\t{%- set ignored = doc.flags.update({\"show_inclusive_tax_in_print\": 1}) -%}\n{%- endif -%}\n{#- Lead has no Tax ID; only a Customer party carries one. -#}\n{%- set tax_id = frappe.db.get_value(\"Customer\", doc.party_name, \"tax_id\") if doc.quotation_to == \"Customer\" else None -%}\n{#- Standard layout prints every non-empty field; drop the ones this quotation does not need.\n transaction_date / valid_till are printed in the heading, customer fields in the Customer section,\n in_words in the left column of the Totals section, the company address in the letter head. -#}\n{%- set hidden_fields = [\n\t\"total_qty\", \"company_address\", \"company_address_display\", \"has_unit_price_items\",\n\t\"disable_rounded_total\",\n\t\"transaction_date\", \"valid_till\",\n\t\"customer_name\", \"address_display\", \"contact_display\", \"contact_mobile\", \"contact_email\",\n\t\"in_words\",\n] -%}\n{#- rounded_total keeps a value even when rounding is disabled, so the standard layout would print it. -#}\n{%- if doc.is_rounded_total_disabled() -%}{%- set ignored = hidden_fields.append(\"rounded_total\") -%}{%- endif -%}\n{#- add_header renders this string via frappe.render_template with {\"doc\": doc}, so it is kept\n unrendered with {% raw %}. Same markup as the stock heading plus a right-aligned date block. -#}\n{%- set heading_template -%}\n{% raw %}\n<div class=\"print-heading\">\n\t<style>\n\t\t.print-heading .heading-dates { float: right; text-align: right; margin-top: 4px; white-space: nowrap; }\n\t\t.print-heading .heading-dates label { display: inline; font-weight: 700; margin: 0 4px 0 0; }\n\t\t.print-heading .heading-clear { clear: both; }\n\t</style>\n\t<div class=\"heading-dates\">\n\t\t<div><label>{{ _(doc.meta.get_label(\"transaction_date\")) }}:</label> {{ doc.get_formatted(\"transaction_date\") }}</div>\n\t\t{%- if doc.valid_till %}\n\t\t<div><label>{{ _(doc.meta.get_label(\"valid_till\")) }}:</label> {{ doc.get_formatted(\"valid_till\") }}</div>\n\t\t{%- endif %}\n\t</div>\n\t<h2>\n\t\t<div>{{ _(doc.select_print_heading) or (_(doc.print_heading) if doc.print_heading != None else _(doc.doctype)) }}</div>\n\t\t<small class=\"sub-heading\">{{ _(doc.sub_heading) if doc.sub_heading != None else _(doc.name) }}</small>\n\t</h2>\n\t<div class=\"heading-clear\"></div>\n</div>\n{% endraw %}\n{%- endset -%}\n{#- Standard layout prints every non-empty child column; keep the item table to the essentials -#}\n{%- set item_columns = [\n\t{\"fieldname\": \"item_code\"},\n\t{\"fieldname\": \"description\"},\n\t{\"fieldname\": \"qty\"},\n\t{\"fieldname\": \"rate\"},\n\t{\"fieldname\": \"amount\"},\n] -%}\n\n{%- macro render_fields(fields, no_of_cols) -%}\n\t{%- for df in fields -%}\n\t\t{%- if df.fieldname not in hidden_fields -%}\n\t\t\t{%- if df.fieldname == \"items\" -%}\n\t\t\t\t{%- set df = df.as_dict() -%}\n\t\t\t\t{%- set ignored = df.update({\"visible_columns\": item_columns}) -%}\n\t\t\t{%- endif -%}\n\t\t\t{{ render_field(df, doc, no_of_cols) }}\n\t\t{%- endif -%}\n\t{%- endfor -%}\n{%- endmacro -%}\n\n{% for page in layout %}\n<div class=\"page-break\">\n\t<div {% if print_settings.repeat_header_footer %} id=\"header-html\" class=\"hidden-pdf\" {% endif %}>\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings, heading_template) }}\n\t</div>\n\n\t{% if loop.first %}\n\t<div class=\"row section-break\" data-label=\"{{ _(\"Customer\") }}\">\n\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t<h4>{{ _(\"Customer\") }}</h4>\n\t\t\t<style>\n\t\t\t\t.customer-details { width: 100%; }\n\t\t\t\t.customer-details td { padding: 0 !important; border: 0; vertical-align: top; }\n\t\t\t\t.customer-details td.text-muted { width: 40%; padding-right: 1em !important; white-space: nowrap; }\n\t\t\t</style>\n\t\t</div>\n\t\t<div class=\"col-xs-6 column-break\">\n\t\t\t<table class=\"customer-details\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"customer_name\")) }}</td><td>{{ doc.customer_name or doc.party_name }}</td></tr>\n\t\t\t\t\t{% if doc.address_display %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"address_display\")) }}</td><td>{{ doc.address_display }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if tax_id %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(\"Tax ID\") }}</td><td>{{ tax_id }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t\t<div class=\"col-xs-6 column-break\">\n\t\t\t{% if doc.contact_person %}\n\t\t\t{#- Quotation carries the contact's mobile and email but not its phone; read that from the Contact. -#}\n\t\t\t{%- set contact_phone = frappe.db.get_value(\"Contact\", doc.contact_person, \"phone\") -%}\n\t\t\t<table class=\"customer-details\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_person\")) }}</td><td>{{ doc.contact_display or doc.contact_person }}</td></tr>\n\t\t\t\t\t{% if contact_phone %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(frappe.get_meta(\"Contact\").get_label(\"phone\")) }}</td><td>{{ contact_phone }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_mobile %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_mobile\")) }}</td><td>{{ doc.contact_mobile }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_email %}\n\t\t\t\t\t<tr><td class=\"text-muted\">{{ _(doc.meta.get_label(\"contact_email\")) }}</td><td>{{ doc.contact_email }}</td></tr>\n\t\t\t\t\t{% endif %}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t{% endif %}\n\t\t</div>\n\t</div>\n\t{% endif %}\n\n\t{% for section in page %}\n\t<div class=\"row section-break\" data-label=\"{{ section.label or '' | e }}\">\n\t\t{%- if doc.print_line_breaks and loop.index != 1 -%}<hr>{%- endif -%}\n\t\t{%- if doc.print_section_headings and section.label and section.has_data -%}\n\t\t<h4 class='col-sm-12'>{{ _(section.label) }}</h4>\n\t\t{%- endif -%}\n\t\t{%- set no_of_cols = section.columns|len -%}\n\t\t{%- set section_fieldnames = [] -%}\n\t\t{%- for column in section.columns -%}\n\t\t\t{%- for df in column.fields -%}{%- set ignored = section_fieldnames.append(df.fieldname) -%}{%- endfor -%}\n\t\t{%- endfor -%}\n\t\t{%- if \"total\" in section_fieldnames -%}\n\t\t{#- \"total\" sits in a 2-column section, so its label/value grid does not line up with the\n\t\t Taxes and Totals sections below it. Render it in the same right-half 6/6 grid they use. -#}\n\t\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"col-xs-6\"></div>\n\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t{%- for column in section.columns -%}{{ render_fields(column.fields, 1) }}{%- endfor -%}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{%- else -%}\n\t\t{% for column in section.columns %}\n\t\t\t<div class=\"col-xs-{{ (12 / no_of_cols)|int }} column-break\">\n\t\t\t{%- if loop.first and \"in_words\" in section_fieldnames and doc.in_words -%}\n\t\t\t{#- The Totals section's left column is empty in print; put the amount in words there,\n\t\t\t on the same line as Grand Total, instead of under Rounded Total on the right. -#}\n\t\t\t\t<div class=\"row data-field\" data-fieldname=\"in_words\" data-fieldtype=\"Data\">\n\t\t\t\t\t<div class=\"col-xs-12 value\"><label style=\"display: inline\">{{ _(doc.meta.get_label(\"in_words\")) }}:</label> {{ get_in_words(doc) }}</div>\n\t\t\t\t</div>\n\t\t\t{%- endif -%}\n\t\t\t{{ render_fields(column.fields, no_of_cols) }}\n\t\t\t</div>\n\t\t{% endfor %}\n\t\t{%- endif -%}\n\t</div>\n\t{% endfor %}\n\n\t{% if loop.last %}\n\t<div class=\"row section-break\" data-label=\"{{ _(\"Signatures\") }}\">\n\t\t<div class=\"col-xs-12 column-break\">\n\t\t\t<style>\n\t\t\t\t.signatures { width: 100%; border-collapse: collapse; margin-top: 20px; }\n\t\t\t\t.signatures td { width: 50%; border: 0; padding: 6px 0 !important; vertical-align: top; }\n\t\t\t\t.signatures .signature-lines { margin-top: 60px; }\n\t\t\t\t.signatures .signature-lines span { display: inline-block; width: 120px; border-bottom: 1px solid #000; margin-right: 12px; }\n\t\t\t\t.signatures .signature-labels span { display: inline-block; width: 120px; margin-right: 12px; }\n\t\t\t</style>\n\t\t\t<table class=\"signatures\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div>{{ _(\"On behalf of\") }} {{ doc.customer_name or doc.party_name }}</div>\n\t\t\t\t\t\t\t<div class=\"signature-lines\"><span></span><span></span></div>\n\t\t\t\t\t\t\t<div class=\"signature-labels\"><span>{{ _(\"Accepted By\") }}</span><span>{{ _(\"Date\") }}</span></div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div>{{ _(\"On behalf of\") }} {{ doc.company }}</div>\n\t\t\t\t\t\t\t<div class=\"signature-lines\"><span></span><span></span></div>\n\t\t\t\t\t\t\t<div class=\"signature-labels\"><span>{{ _(\"Quoted By\") }}</span><span>{{ _(\"Date\") }}</span></div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t</div>\n\t{% endif %}\n\n\t<div {% if print_settings.repeat_header_footer %} id=\"footer-html\" class=\"visible-pdf\" {% endif %}>\n\t\t{% if not no_letterhead and footer %}\n\t\t<div class=\"letter-head-footer\">\n\t\t\t{{ footer }}\n\t\t</div>\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t\t<p class=\"text-center small page-number visible-pdf\">\n\t\t\t\t{{ _(\"Page {0} of {1}\").format('<span class=\"page\"></span>', '<span class=\"topage\"></span>') }}\n\t\t\t</p>\n\t\t{% endif %}\n\t</div>\n</div>\n{% endfor %}\n",
|
|
"line_breaks": 0,
|
|
"margin_bottom": 15.0,
|
|
"margin_left": 15.0,
|
|
"margin_right": 15.0,
|
|
"margin_top": 15.0,
|
|
"modified": "2026-09-16 00:00:00.000000",
|
|
"module": "Default Thai Company",
|
|
"name": "Default Standard Quotation",
|
|
"page_number": "Hide",
|
|
"pdf_generator": "wkhtmltopdf",
|
|
"print_format_builder": 0,
|
|
"print_format_builder_beta": 0,
|
|
"print_format_for": "DocType",
|
|
"print_format_type": "Jinja",
|
|
"raw_commands": null,
|
|
"raw_printing": 0,
|
|
"report": null,
|
|
"show_section_headings": 0,
|
|
"standard": "No"
|
|
}
|
|
] |