From 9a8602f74e8d66bf58ca7962482073b1b33dc144 Mon Sep 17 00:00:00 2001 From: kurogeek Date: Tue, 15 Sep 2026 06:50:55 +0000 Subject: [PATCH] feat: Thai language for every customization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - translations/th.csv: custom field labels, messages, print format and letter head text, the 22 Tax Withholding Category names; overrides the upstream Thai for the standard labels the print formats show - print formats embed Sarabun (public/fonts, OFL) so PDFs render Thai on servers without a Thai font - letter head labels go through _() - withholding row description is translated when stored - in_words: Thai "...บาทถ้วน" wording via num2words when the language is Thai (ThaiSalesInvoice.set_total_in_words); print formats re-derive it in the print language (get_in_words) - fixture `modified` bumped so migrate re-imports the changed documents --- README.md | 8 ++ .../fixtures/letter_head.json | 4 +- .../fixtures/print_format.json | 12 +-- default_thai_company/hooks.py | 1 + default_thai_company/public/fonts/OFL.txt | 93 ++++++++++++++++++ .../public/fonts/Sarabun-Bold.ttf | Bin 0 -> 89804 bytes .../public/fonts/Sarabun-Regular.ttf | Bin 0 -> 90220 bytes default_thai_company/tax_withholding.py | 16 ++- default_thai_company/translations/th.csv | 55 +++++++++++ default_thai_company/utils.py | 24 +++++ 10 files changed, 204 insertions(+), 9 deletions(-) create mode 100644 default_thai_company/public/fonts/OFL.txt create mode 100644 default_thai_company/public/fonts/Sarabun-Bold.ttf create mode 100644 default_thai_company/public/fonts/Sarabun-Regular.ttf create mode 100644 default_thai_company/translations/th.csv diff --git a/README.md b/README.md index 6782b2a..86a0bfa 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,14 @@ bench get-app $URL_OF_THIS_REPO --branch develop bench install-app default_thai_company ``` +### Thai language + +Every string the app adds (custom field labels, messages, print format and letter head +text, Tax Withholding Category names) is translated in `translations/th.csv`; the same +file overrides the upstream Thai for the standard labels the print formats show. The +print formats embed Sarabun (`public/fonts`, OFL) so PDFs render Thai on servers +without a Thai system font. Switch a user or the print language to `th` to use it. + ### Contributing This app uses `pre-commit` for code formatting and linting. Please [install pre-commit](https://pre-commit.com/#installation) and enable it for this repository: diff --git a/default_thai_company/fixtures/letter_head.json b/default_thai_company/fixtures/letter_head.json index d3e1ee3..a829534 100644 --- a/default_thai_company/fixtures/letter_head.json +++ b/default_thai_company/fixtures/letter_head.json @@ -1,7 +1,7 @@ [ { "align": "Left", - "content": "\n{% set company = get_letter_head_company(doc) %}\n{% if company %}\n
\n {% if company.company_logo %}\n \"{{\n {% endif %}\n
\n

{{ company.company_name }}

\n \n {% if company.tax_id %}
Tax ID: {{ company.tax_id }}
{% endif %}\n {% if company.address %}
{{ company.address }}
{% endif %}\n {% if company.phone_no %}
Phone: {{ company.phone_no }}
{% endif %}\n {% if company.email %}
Email: {{ company.email }}
{% endif %}\n
\n
\n
\n{% endif %}\n", + "content": "\n{% set company = get_letter_head_company(doc) %}\n{% if company %}\n
\n {% if company.company_logo %}\n \"{{\n {% endif %}\n
\n

{{ company.company_name }}

\n \n {% if company.tax_id %}
{{ _(\"Tax ID\") }}: {{ company.tax_id }}
{% endif %}\n {% if company.address %}
{{ company.address }}
{% endif %}\n {% if company.phone_no %}
{{ _(\"Phone\") }}: {{ company.phone_no }}
{% endif %}\n {% if company.email %}
{{ _(\"Email\") }}: {{ company.email }}
{% endif %}\n
\n
\n
\n{% endif %}\n", "disabled": 0, "docstatus": 0, "doctype": "Letter Head", @@ -18,7 +18,7 @@ "image_width": 0.0, "is_default": 1, "letter_head_name": "Default Letter Head", - "modified": "2026-09-10 09:51:23.933752", + "modified": "2026-09-15 06:44:37.653888", "name": "Default Letter Head", "source": "HTML" } diff --git a/default_thai_company/fixtures/print_format.json b/default_thai_company/fixtures/print_format.json index e48c70b..c98cccd 100644 --- a/default_thai_company/fixtures/print_format.json +++ b/default_thai_company/fixtures/print_format.json @@ -2,7 +2,7 @@ { "absolute_value": 0, "align_labels_right": 0, - "css": "/* 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}", + "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, @@ -12,13 +12,13 @@ "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{#- 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\"posting_date\", \"due_date\",\n\t\"customer_name\", \"address_display\", \"contact_display\", \"contact_mobile\", \"contact_email\", \"tax_id\",\n\t\"in_words\",\n] -%}\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
\n\t\n\t
\n\t\t
{{ doc.get_formatted(\"posting_date\") }}
\n\t\t{%- if doc.due_date %}\n\t\t
{{ doc.get_formatted(\"due_date\") }}
\n\t\t{%- endif %}\n\t
\n\t

\n\t\t
{{ _(doc.select_print_heading) or (_(doc.print_heading) if doc.print_heading != None else _(doc.doctype)) }}
\n\t\t{{ _(doc.sub_heading) if doc.sub_heading != None else _(doc.name) }}\n\t

\n\t
\n
\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
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings, heading_template) }}\n\t
\n\n\t{% if loop.first %}\n\t
\n\t\t
\n\t\t\t

{{ _(\"Customer\") }}

\n\t\t\t\n\t\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{% if doc.address_display %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.tax_id %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t
{{ _(doc.meta.get_label(\"customer_name\")) }}{{ doc.customer_name or doc.customer }}
{{ _(doc.meta.get_label(\"address_display\")) }}{{ doc.address_display }}
{{ _(doc.meta.get_label(\"tax_id\")) }}{{ doc.tax_id }}
\n\t\t
\n\t\t
\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\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if contact_phone %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_mobile %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_email %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t
{{ _(doc.meta.get_label(\"contact_person\")) }}{{ doc.contact_display or doc.contact_person }}
{{ _(frappe.get_meta(\"Contact\").get_label(\"phone\")) }}{{ contact_phone }}
{{ _(doc.meta.get_label(\"contact_mobile\")) }}{{ doc.contact_mobile }}
{{ _(doc.meta.get_label(\"contact_email\")) }}{{ doc.contact_email }}
\n\t\t\t{% endif %}\n\t\t
\n\t
\n\t{% endif %}\n\n\t{% for section in page %}\n\t
\n\t\t{%- if doc.print_line_breaks and loop.index != 1 -%}
{%- endif -%}\n\t\t{%- if doc.print_section_headings and section.label and section.has_data -%}\n\t\t

{{ _(section.label) }}

\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
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t{%- for column in section.columns -%}{{ render_fields(column.fields, 1) }}{%- endfor -%}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t{%- else -%}\n\t\t{% for column in section.columns %}\n\t\t\t
\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
\n\t\t\t\t\t
{{ doc.in_words }}
\n\t\t\t\t
\n\t\t\t{%- endif -%}\n\t\t\t{{ render_fields(column.fields, no_of_cols) }}\n\t\t\t
\n\t\t{% endfor %}\n\t\t{%- endif -%}\n\t
\n\t{% endfor %}\n\n\t{% if loop.last and bank_account %}\n\t
\n\t\t{%- if doc.print_line_breaks -%}
{%- endif -%}\n\t\t
\n\t\t\t

{{ _(\"Bank Account Details\") }}

\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\n\t\t\t\t\t{% if bank_account.bank_account_no %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.iban %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.branch_code %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.swift_number %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t\n\t\t
\n\t
\n\t{% endif %}\n\n\t{% if loop.last %}\n\t
\n\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\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\t\t\t\t\t
{{ _(\"On behalf of\") }} {{ doc.customer_name or doc.customer }}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"Receiver\") }}{{ _(\"Date\") }}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"On behalf of\") }} {{ doc.company }}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"Issuer\") }}{{ _(\"Date\") }}
\n\t\t\t\t\t\t
\n\t\t
\n\t
\n\t{% endif %}\n\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t\t

\n\t\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n\n\n\n\n\n\n\n\n", + "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{#- 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\"posting_date\", \"due_date\",\n\t\"customer_name\", \"address_display\", \"contact_display\", \"contact_mobile\", \"contact_email\", \"tax_id\",\n\t\"in_words\",\n] -%}\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
\n\t\n\t
\n\t\t
{{ doc.get_formatted(\"posting_date\") }}
\n\t\t{%- if doc.due_date %}\n\t\t
{{ doc.get_formatted(\"due_date\") }}
\n\t\t{%- endif %}\n\t
\n\t

\n\t\t
{{ _(doc.select_print_heading) or (_(doc.print_heading) if doc.print_heading != None else _(doc.doctype)) }}
\n\t\t{{ _(doc.sub_heading) if doc.sub_heading != None else _(doc.name) }}\n\t

\n\t
\n
\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
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings, heading_template) }}\n\t
\n\n\t{% if loop.first %}\n\t
\n\t\t
\n\t\t\t

{{ _(\"Customer\") }}

\n\t\t\t\n\t\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{% if doc.address_display %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.tax_id %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t
{{ _(doc.meta.get_label(\"customer_name\")) }}{{ doc.customer_name or doc.customer }}
{{ _(doc.meta.get_label(\"address_display\")) }}{{ doc.address_display }}
{{ _(doc.meta.get_label(\"tax_id\")) }}{{ doc.tax_id }}
\n\t\t
\n\t\t
\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\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if contact_phone %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_mobile %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_email %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t
{{ _(doc.meta.get_label(\"contact_person\")) }}{{ doc.contact_display or doc.contact_person }}
{{ _(frappe.get_meta(\"Contact\").get_label(\"phone\")) }}{{ contact_phone }}
{{ _(doc.meta.get_label(\"contact_mobile\")) }}{{ doc.contact_mobile }}
{{ _(doc.meta.get_label(\"contact_email\")) }}{{ doc.contact_email }}
\n\t\t\t{% endif %}\n\t\t
\n\t
\n\t{% endif %}\n\n\t{% for section in page %}\n\t
\n\t\t{%- if doc.print_line_breaks and loop.index != 1 -%}
{%- endif -%}\n\t\t{%- if doc.print_section_headings and section.label and section.has_data -%}\n\t\t

{{ _(section.label) }}

\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
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t{%- for column in section.columns -%}{{ render_fields(column.fields, 1) }}{%- endfor -%}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t{%- else -%}\n\t\t{% for column in section.columns %}\n\t\t\t
\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
\n\t\t\t\t\t
{{ get_in_words(doc) }}
\n\t\t\t\t
\n\t\t\t{%- endif -%}\n\t\t\t{{ render_fields(column.fields, no_of_cols) }}\n\t\t\t
\n\t\t{% endfor %}\n\t\t{%- endif -%}\n\t
\n\t{% endfor %}\n\n\t{% if loop.last and bank_account %}\n\t
\n\t\t{%- if doc.print_line_breaks -%}
{%- endif -%}\n\t\t
\n\t\t\t

{{ _(\"Bank Account Details\") }}

\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\n\t\t\t\t\t{% if bank_account.bank_account_no %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.iban %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.branch_code %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.swift_number %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t\n\t\t
\n\t
\n\t{% endif %}\n\n\t{% if loop.last %}\n\t
\n\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\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\t\t\t\t\t
{{ _(\"On behalf of\") }} {{ doc.customer_name or doc.customer }}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"Receiver\") }}{{ _(\"Date\") }}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"On behalf of\") }} {{ doc.company }}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"Issuer\") }}{{ _(\"Date\") }}
\n\t\t\t\t\t\t
\n\t\t
\n\t
\n\t{% endif %}\n\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t\t

\n\t\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t\t

\n\t\t{% endif %}\n\t
\n
\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-14 16:35:32.130720", + "modified": "2026-09-15 06:44:37.653888", "module": "Default Thai Company", "name": "Default Standard Sales Invoice", "page_number": "Hide", @@ -36,7 +36,7 @@ { "absolute_value": 0, "align_labels_right": 0, - "css": "/* 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}", + "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, @@ -46,13 +46,13 @@ "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{#- 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\"posting_date\", \"due_date\",\n\t\"customer_name\", \"address_display\", \"contact_display\", \"contact_mobile\", \"contact_email\", \"tax_id\",\n\t\"in_words\",\n] -%}\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
\n\t\n\t
\n\t\t
{{ doc.get_formatted(\"posting_date\") }}
\n\t\t{%- if doc.due_date %}\n\t\t
{{ doc.get_formatted(\"due_date\") }}
\n\t\t{%- endif %}\n\t
\n\t

\n\t\t
{{ _(doc.select_print_heading) or (_(doc.print_heading) if doc.print_heading != None else _(doc.doctype)) }}
\n\t\t{{ _(doc.sub_heading) if doc.sub_heading != None else _(doc.name) }}\n\t

\n\t
\n
\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
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings, heading_template) }}\n\t
\n\n\t{% if loop.first %}\n\t
\n\t\t
\n\t\t\t

{{ _(\"Customer\") }}

\n\t\t\t\n\t\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{% if doc.address_display %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.tax_id %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t
{{ _(doc.meta.get_label(\"customer_name\")) }}{{ doc.customer_name or doc.customer }}
{{ _(doc.meta.get_label(\"address_display\")) }}{{ doc.address_display }}
{{ _(doc.meta.get_label(\"tax_id\")) }}{{ doc.tax_id }}
\n\t\t
\n\t\t
\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\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if contact_phone %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_mobile %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_email %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t
{{ _(doc.meta.get_label(\"contact_person\")) }}{{ doc.contact_display or doc.contact_person }}
{{ _(frappe.get_meta(\"Contact\").get_label(\"phone\")) }}{{ contact_phone }}
{{ _(doc.meta.get_label(\"contact_mobile\")) }}{{ doc.contact_mobile }}
{{ _(doc.meta.get_label(\"contact_email\")) }}{{ doc.contact_email }}
\n\t\t\t{% endif %}\n\t\t
\n\t
\n\t{% endif %}\n\n\t{% for section in page %}\n\t
\n\t\t{%- if doc.print_line_breaks and loop.index != 1 -%}
{%- endif -%}\n\t\t{%- if doc.print_section_headings and section.label and section.has_data -%}\n\t\t

{{ _(section.label) }}

\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
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t{%- for column in section.columns -%}{{ render_fields(column.fields, 1) }}{%- endfor -%}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t{%- else -%}\n\t\t{% for column in section.columns %}\n\t\t\t
\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
\n\t\t\t\t\t
{{ doc.in_words }}
\n\t\t\t\t
\n\t\t\t{%- endif -%}\n\t\t\t{{ render_fields(column.fields, no_of_cols) }}\n\t\t\t
\n\t\t{% endfor %}\n\t\t{%- endif -%}\n\t
\n\t{% endfor %}\n\n\t{% if loop.last and bank_account %}\n\t
\n\t\t{%- if doc.print_line_breaks -%}
{%- endif -%}\n\t\t
\n\t\t\t

{{ _(\"Bank Account Details\") }}

\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\n\t\t\t\t\t{% if bank_account.bank_account_no %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.iban %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.branch_code %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.swift_number %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t\n\t\t
\n\t
\n\t{% endif %}\n\n\t{% if loop.last %}\n\t
\n\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\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\t\t\t\t\t
{{ _(\"On behalf of\") }} {{ doc.customer_name or doc.customer }}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"Receiver\") }}{{ _(\"Date\") }}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"On behalf of\") }} {{ doc.company }}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"Issuer\") }}{{ _(\"Date\") }}
\n\t\t\t\t\t\t
\n\t\t
\n\t
\n\t{% endif %}\n\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t\t

\n\t\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n\n\n\n\n\n\n\n\n", + "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{#- 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\"posting_date\", \"due_date\",\n\t\"customer_name\", \"address_display\", \"contact_display\", \"contact_mobile\", \"contact_email\", \"tax_id\",\n\t\"in_words\",\n] -%}\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
\n\t\n\t
\n\t\t
{{ doc.get_formatted(\"posting_date\") }}
\n\t\t{%- if doc.due_date %}\n\t\t
{{ doc.get_formatted(\"due_date\") }}
\n\t\t{%- endif %}\n\t
\n\t

\n\t\t
{{ _(doc.select_print_heading) or (_(doc.print_heading) if doc.print_heading != None else _(doc.doctype)) }}
\n\t\t{{ _(doc.sub_heading) if doc.sub_heading != None else _(doc.name) }}\n\t

\n\t
\n
\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
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings, heading_template) }}\n\t
\n\n\t{% if loop.first %}\n\t
\n\t\t
\n\t\t\t

{{ _(\"Customer\") }}

\n\t\t\t\n\t\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{% if doc.address_display %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.tax_id %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t
{{ _(doc.meta.get_label(\"customer_name\")) }}{{ doc.customer_name or doc.customer }}
{{ _(doc.meta.get_label(\"address_display\")) }}{{ doc.address_display }}
{{ _(doc.meta.get_label(\"tax_id\")) }}{{ doc.tax_id }}
\n\t\t
\n\t\t
\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\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if contact_phone %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_mobile %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if doc.contact_email %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t
{{ _(doc.meta.get_label(\"contact_person\")) }}{{ doc.contact_display or doc.contact_person }}
{{ _(frappe.get_meta(\"Contact\").get_label(\"phone\")) }}{{ contact_phone }}
{{ _(doc.meta.get_label(\"contact_mobile\")) }}{{ doc.contact_mobile }}
{{ _(doc.meta.get_label(\"contact_email\")) }}{{ doc.contact_email }}
\n\t\t\t{% endif %}\n\t\t
\n\t
\n\t{% endif %}\n\n\t{% for section in page %}\n\t
\n\t\t{%- if doc.print_line_breaks and loop.index != 1 -%}
{%- endif -%}\n\t\t{%- if doc.print_section_headings and section.label and section.has_data -%}\n\t\t

{{ _(section.label) }}

\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
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t{%- for column in section.columns -%}{{ render_fields(column.fields, 1) }}{%- endfor -%}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t{%- else -%}\n\t\t{% for column in section.columns %}\n\t\t\t
\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
\n\t\t\t\t\t
{{ get_in_words(doc) }}
\n\t\t\t\t
\n\t\t\t{%- endif -%}\n\t\t\t{{ render_fields(column.fields, no_of_cols) }}\n\t\t\t
\n\t\t{% endfor %}\n\t\t{%- endif -%}\n\t
\n\t{% endfor %}\n\n\t{% if loop.last and bank_account %}\n\t
\n\t\t{%- if doc.print_line_breaks -%}
{%- endif -%}\n\t\t
\n\t\t\t

{{ _(\"Bank Account Details\") }}

\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\n\t\t\t\t\t{% if bank_account.bank_account_no %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.iban %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.branch_code %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{% if bank_account.swift_number %}\n\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\n\t\t\t\n\t\t
\n\t
\n\t{% endif %}\n\n\t{% if loop.last %}\n\t
\n\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\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\t\t\t\t\t
{{ _(\"On behalf of\") }} {{ doc.customer_name or doc.customer }}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"Receiver\") }}{{ _(\"Date\") }}
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"On behalf of\") }} {{ doc.company }}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{{ _(\"Issuer\") }}{{ _(\"Date\") }}
\n\t\t\t\t\t\t
\n\t\t
\n\t
\n\t{% endif %}\n\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t\t

\n\t\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t\t

\n\t\t{% endif %}\n\t
\n
\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-14 17:06:33.830672", + "modified": "2026-09-15 06:44:37.653888", "module": "Default Thai Company", "name": "Default Standard Tax Invoice/Receipt", "page_number": "Hide", diff --git a/default_thai_company/hooks.py b/default_thai_company/hooks.py index 1f64eb9..6be69be 100644 --- a/default_thai_company/hooks.py +++ b/default_thai_company/hooks.py @@ -78,6 +78,7 @@ jinja = { "methods": [ "default_thai_company.utils.get_letter_head_company", "default_thai_company.utils.get_company_bank_account", + "default_thai_company.utils.get_in_words", ], } diff --git a/default_thai_company/public/fonts/OFL.txt b/default_thai_company/public/fonts/OFL.txt new file mode 100644 index 0000000..a7d3a12 --- /dev/null +++ b/default_thai_company/public/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2018 The Sarabun Project Authors (https://github.com/cadsondemak/Sarabun) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/default_thai_company/public/fonts/Sarabun-Bold.ttf b/default_thai_company/public/fonts/Sarabun-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7e5d768073a16576b75830c3c0c0011090b50a88 GIT binary patch literal 89804 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
Ptlm-wT=*B8Z`I7NFy z-VYDoBzDOSh(Z4*O?X zr(BFk^CI<-dQd&8euuT-RrR=fSp8l-q8?L!z!T=bs`v1e*@h?3PpaK&kLprSt0yRu z!V~GIRHtjT{wr3NPvlY6EdQ=Pke|xWoUsMPN?5O_s7YAK`&QlW5#=c^JSj!9Oc6~oSzLzS zJ6?fP(u-uRxESy6t&#QO5;J)GD=6ZBaL=oAI8&R<&8(g6Lo_LWEZAFEr>W!jeLg zQbUqL@RE={K)!6BtG+lLI!J9l4Jy#WL&Jyc1tm@^Qj@%`VFh8|f=~{$lbM zv&Sx5cE=rR@9C;uxxjuWoxO1#c;94rF2peENtuc7wm9(@yYNqY;J19n$D=I9urW;n_We$%h$S?L+syQSlW=K&>K#pM} zagB+Vh=j+NE!!O!JY>kY9Nk_@iXvhHEl& z*5U$%)`u44N0`ICtZ91VLyHR2tYL0eI;pH+{B1==nVEoyxVQ*{>)k9@+qS^|Mt*vF zKEcNLh=_QC(KWFP|@~3heywQa>+}Aq1prHA->o(jzXmCN{FzCZPS)W8h zp9Z#19Z&N^$9GELSq3Z1kRwFOP-@THTOZZrwDe+_6shT*UYxDY5KnG|Aknic;|Apy z=Z0qm_(Uc}C1#|Cr?srD@({QZvSpWe6{RL;$S!76SNGvmV${>K+TbO# z$I7v%w-CouV|&@2$ZkgC{o!OhCn0~?DN9%fXIqM95OiuJe}%SnI`S9Te=`1B5Bve% zmrBwVXJ>oqoIVVO?)+<%JMGWNRQq3LjlE6nt$(lHUhkAce#>?+*sz0imV^1QU)S+Z zBaWgz*6}2_j_*7NezzO`JG`Udq(7*Vbv}+JwCm(UemI@mcdz%YTfH7H;yK^xxL7(#Z>Zt{`;)7#tQ zY!C9CM0CR5koeIs8l#E<&v7ym+{|8#jMbWGzzV zWkE^jU^GX z(sR2sCOW>0@X)&fHZ|FpGX)5<3PP+%tqs_%w6)oHp_A;d%fi!DvJ|g3!XG3c*$(E74pTu57p=Ttjg)i=+usgMa8%`=_% z9)q{Hm|#e8`WFE zeM;wy7-#HuoHj|nwerUqqvmb4f|V@Lr2O)47+M*B;oqf~oW2IXin9M!PP2b*p9)?L zm=9DZ87B{9OV4AM3vtPo@N|IQIU(DCZNjpf>`gF`E%k=2Njvv%8_Vz{o@KJFaXp$} zI{rcYKMjA^+hKk>p4!10MtGwgCw&&4hD;_rd@8l?q~E90*%Pjm*$w-SUKJPYW?`yuh0kZ z40sa>&#zDylNG0lNDIQk)WNCU72Q+Y4;`ZUqC!u9!LaxAGpdGkqV<>RC5w5Gjn;$B z$aSAF6?phn@FSK5GDJM@(=JLhu$}8D);dM*6~T~FpWM2p4LGf z-|56-EQ!C4r#^0R_A%(mx9RjxIO!p$JN-VQCpqmW8ILz^!yq9WB!_Hlpy?320rIxZ zn3FaxGBLb3x}-ot1zqmbaVr)@g^dgj8#gIMK^xY?aji!?2R!7Wd7;a-hvb4MAz!=_ zK01hEvcBk552DHtEvC`3LK85e;HwQaH5;Z)ySAq0+G%Ce^YW&bmAB>Rx0U-%xqr!$ z`={vXxazB>Ou4FBPoX0EmfPUIU1s!c9rvw{zZf#<_@}Ycr#{#5)aN?B^Bnly9(amj zbozs;+ThcqR`S>pp6s`d+do&m9#=i|3CA!xzc<|R9K-1NH$Ct)<~qK^B^TP~^^fpm zn`qyqAH^y<{Vo?h+GT&Kv1vM}PG7(^DRJT0iuD>f(OVU^nlgzu(2GZ=s$tb^^)i z-qvDgPem3Nc#Fs|-KM$2(zS>JHF7BWY5YiQ?a+duF!8$5sPRMWt4hAhEP;hf|LJ)p zKV%J4O}CwozOsy3kaH^)60=+EQzyuGW6@vsUL+gp?L*>OAIQP|wV_{s(fE>{y4i$IaS0`gw6D9J2%C!_Bu)nI*7T($6u_3N)FoRTCjw&zco($q3( zQj1#t!C1S!u43Gt#~atjmXc^F9iJ%9Xa<}v{`a)ghLv8 zR$YAgs>N;Zj;^h*S+4djTDasQ`zhI2Up=PAegyjHJWSvbfRkzPFdOFwRfD zHJ7hi(Dnwgxlrw$b>V_Vs~-NgZcNo!`zNgP%{({4Naqw-H1^AB>CR!o?%c#nbe~15 zm8%wvzdWev{<78A>0Ze058vbRLvKA3lMpn@cUW4`zB_e`c6lKTjZ1F&b#^#T(Ve=} zNkAk{8mqwRH)n}HBiW*gYe$%i8Rer+@N;2|F^DMbTVhg92HOw5Imu1Z; z8WNi}$eJ@}^sp(ptP8izeR8YOC%)V#I-dGO$9LjHm}06lhm~b5Ws5lL`2_?wVz-~r zL4LMq+8L)ABNteHLaBN4efpnkc$H-Tl#&>${(9^tJqU0AC+nf>M`Md9#6?f*gs%4! zPI|;yG)7MPeMC>O0oLZRuo3J;4A6iF*kr_X%jn7<5G2MM=Ead#B?7 zD|Bda5}ifL`#06q-Y{d+c6r)o)y(n*$t4-rOj@wa+dgZ_boJ8Yoy(Wr+w#nVSr@M_ zDJmIRdHT|8SNkr#2C|1>KEy$GZ_G3++!rMN%%=SR+@@C5)STYP`Z;M3lOysW5(BI z(9-X)Yj8LTSLS)NRqvD)V;6$?O8O+@8KEA#V{b`#%vX2(KFFfuul2wmAUtFok1?$R zAKr%)QM^}>&zYC?^(&{}b5Glqm-}tLNj_q4efw?skbUyTEvSZexE{}?-?Gk6;>ifv znvSO!O2KaL@EIiDrG(XTf2Yc#E(h>++&8z$}QU^7KX$~I}#m6u<^{hWqV zp471yhCjb?OJ9FK9a~k9>T2J{{f+1G@UwmW-GnE0WCw)zl-Hf!U0xf@tMg%bjd8Pa zETH4}c<4v#h_2sL9(am*bbOaf?;+fOh~6bOv);y5*|mShit6kGRdwM7)$|a-pZC#Y zmal}pVS_sPs?C0dd3cVHLQfVdv%NNNaN3`{?cM5X`xy_JD4x+}VjYaRPhXRu^9XF@ zXct%e<c-Y{2JoUGZ-$i)HmJI(j z0t74f%UK?R+ zvRq|5eCTb^H@fJoKV= zbv)^X(KX`I1mFYc1Sv_QfG(sU-yH58Ciww~)heI6BWyw2!B5uTW8b`TO!cN^GQ$43 z+WW_ySvYy0T~ob|`D7qwdPUl?I%ZPTL{G>HC@xI);-wMKRm|a$*0gjh4ymw3E;63; zY?!fp;ert*L+YXjC(kaOF+X6OuSvx<wwG5G4e^^?Ro4_#G9uMlICx0gU^5yE6Pc4 z#aW$$`JJoYA6@mJyEenc?`02sz6<|~J6`Q^;XB>sa>MU-!}n+dT=WNBd`Mm=pFVlr z>%HPuug6vIgzVKyUHsl~!@r^xxbSbfeNDtDBcDn>i~_HER>_CP(C?+`4gf zWffz`R`}g~`O53ZkG9`9%{n+GGpB0&sA*$b=C-z7*k>b4U2S(6ZD%-!$bX=1{Mym| z*|Kh^beeirJ2qAf&9LHp$S41ypR^9p4R~CC!}jO%*EMX_X%(r)GY_)nGfZ56Kz$V% zI1Jt0#$R{I{|w7NK(~F3zDiEdsOe2~Aq%{%UM#u(G?R}w3`y0wG&*Bu%82omWkLNO zVXx`0Rln(~H7x9LKGjZhJ=N|!L&JWP*kv=fxb)k@`e~$}7K8B_gx_6_q&Gomi_6c3 zll6x=XO2)LZU4>by7NgI;5J5DjD5RleASeq-1xa=myS%FQ!-&z`^;s-iieDg%1oLy zVpvOL+2Z+2CRL3ZKGs(T*?+yTw5lj8wJhbcNv&hEvkNAt=S&)1+n8kdqx6)zD_191 z*VK<4nU|HC?LJmo4Ev*Fx<8UT*v?15NB*deI_*5&8sTjnN})ypON{8tHB@Bhr&=SF zgps$X{CP8%EuU3bTU${!zOKSAFT;|PG+iyUzc&85Rab1OYM*}IoR%@uMvbTS1#P^H z{z6P=%p^V~aCHKA-ES_tY-#zdxPpkWgT^*CB8e!7n^o?2!)2Gb)cNVj z+1Yuz?J-Z*=SxE$MB=nIQCsYPbbKe?q^9*e8GBNaVTkcu{p^p``P{-|GhHA{AW6aE zGxnjg7kS7#9I{RF@4xr-y>6wO_-B)EH_7LcoBWwB_Y*8PpX=gH?4vlL!RpGrhjEF- z@USB)I>Qm&vb=C+MOz7ZBBdfH=hoNNmsenr{I*gGA; zO>bvANI}2#sBV3&be_1mj&UN>((%#(?b#!XBfXW|5tdxrFmz7k$Qgx2(}!Ej!{WxT zOI|u`toN*@i;`w*HDgDP7*jo5g*-8*;o^#td7~;XD2Opx7r#$-kb`1I z&E=Kx;(FN|+x#gY5L4h?O_D{&Q;eYFpZ37hTCC$c&w=0V zj_0*mr$49$82p=LFV88$V@;>8L7@F})$4K9J0ZW|HC^ZTh8w<@*K{5KraPY3bRCcX z-`q_yIk}b8(!;m{Iec-T8DLf7vXsoPqw}&?s&RMZ+cHzWG_F{*A{Wkn6% z&5T=fc~nGM%AV}BtWB4#-jJD5^OyR`^IF>$j31-VO|(lfGy70YJxwt)&soA_J{b7U zbKrM-;PEb|LH`iGYtY9B_GsXr@Suks8Tc;3qdyTN$gg>g#c6d2zg1?&mWGw~LTO}6 zQy{i1R1#WLgTe>&b9&&yxK|7c6} zO&;`oPKL2AL+z*GoBZiSEY#`jFy!8N?mxp~iHl20ipy+iQFRG1F^P#WF$q)b0qC1% z)O#4eIMiTkplohwp?7a}*>Fz|Ab*GV%3)9H$+e7k{1f;f9$y{*w1NK`cz+&W9p8Bl z{B8q(6!i4HJ}3VU9WTo8egx@~tnWwFzDxCXX$C&*CeJQ|o_g+M@+*d%&${?j%H1wL znjA!HngjnUCEATqWGA|uT||#Q^uv1-FM-}4&%HeQFwB@PI4|ydi^AEd^?HmS)Dpna zd|wBj7Wx~e)S>!|6=)mLAHF^be`2(~M{nElCcdpj@3r_-l;%Euif1f`gc!|*7{%D6 zq}W?6T5wcRR?CD*sxC2_1~fYH$M3w$RcVF%#_m6TCYoWMk78^G3gP9!C75dGXSUQg zKIc&d@<9$6$YYp^KEWCzu0pQQp(B_>^qxk#{+%RlJnCKiH2kWQ?o0gtvATXZX-S2DE-LDK%Y)xwmQZm~K|#y>`J``9^p&=V$_P2d zelTnF;8W0=c$A=necKk`O@gFAk$LB3!(xAP=@(F%B+mEkux^G-bTCm*EKKjFkm7r%ybRO2Xkc7DPzBwe^D$`=MfVjND zx|S}jw?F4qp@vn;SVL1c^*`E6I>T1n+dklwiDf0=_|9|Sce~>$&Nb){DxAnN|0cBSkRZyep}-St_;`snnmkD>o6UbA%k9@f)j z*hvRs2XE|;F(blo$^>t2RW42Y+u%2iQ%7|JCZA!8s^f+mZaDqMSuE1c_Gr!4`?`x| z&>+LR7=uWD2Ac*g+3L^rs){)ReNHc`$iL)Xv#e-POhtN5KITNxkcg@@`@!7DEy=ab ze{as}h)_CFTL`hg3l9auPRdZGOpcwW8lseQ7Isr~w% zY=h>iF0bBaB<~5W9AiS?VaRpc)o^Uy7nK{n+f-C&oYJInwCbItmAf5Rm7Sjub6)A9 zl`9urR+KQKbp8^1&HAdbW2@w6#%YytMwK&UNX~UvTyfp>A-Pwse*3_Ix#yoh_c)zV zL1e@|BOHPBr3>^S-i2^qK`?qO7j_)3*JkJxs@ya|Q|8u!SxXAfFE5-BsP%U=qk)jA-0wr(ZK8 zn!_6MW-Te2S&>^8)-0pyYAQcq=LG`b#EWJSxRve_tjons(mY#)`(eDbOVa zx*T=tl1j%j`n01RR6${J0mb{6d3`6x@+QqZF|Yjmf~B(xr-UnQf~lpxe!|GgvEwSn zq-IvEo_NWPxfv;$!>dkjlY?-gR@N|k+O!MNZ&FksnS{2?&R)|O-biyA1`S&^>u3!N zU0Cz5;DG}pGOIIMiFzGw}F2zMRIfF3~3|!fS|1&F^GWC~TtXrmq6^E2sGmEoITE?{1=QTzYT1Tbk@pxfog3mODbQ;n+NXYa%MDL!f{yPr zzOhZ`i6q~!|Lh$X_t$j#h-)6&;3C0h_3GwE_{;*{XU}~O0ialAr6AQnB3m!(e*8ME&sG(HDUs9ehW2{ z9i_~hVlECXN*q*}oj)`uDJe02XhG%3=Jt8hXAeq^iONe^b^dt2!GqG`;&al|(!yjnRH@Ky4X7RPm_S)iB@TKt}*`CK&M3Uulv_a>a3BZ!f zR+f1%`cYp)^rI45r0MAOta^BR%RtW`du8Meb<-??mNL(Qh4sSY_UwTf4B|NI3CWg&M(Otl3hf7$h>&2UIN|} zZ|Lvp=y-|`b^OyFc$xz`p58O+T|Ma<=Py2dTflyIl0>Q;wH(IiDrG-q-3P^mP(0DEjMr$_*QK>w5iNnu{iu zJ9~VxF#^^^gniW)nD5p5+g_(jL>@z9yt)pdT#15fdpj_-2y#SlgR7e~ffpQO5V20cG z*;ZrBCh$Da@iY%~{BHW6lwI^R4|IHo2cE`2$KzEPwmZ_{1;~cHIK6;g(T=p@rR}c! z&R@Fp{QDlCdD&$%?I*grPS{_5ndzltD83DKoK6g-1_zs7MEluddQC?j*ga-TOhRZ( zK}}NEv<(+S5$y%KRg6A7>7(O!d*DeQ9p7;d{1fhY z$mgWrM{D9)+TG<&&$g`df7Sy}W3J=(5FTS0gM`jLJ>I*CfzSIV-UI(grrVe2%Bw5$ z>{nKT9PKha>wB-E?-4gV>8s;Ag*%?~)$va_@rcQ&T_=7Y;jxQ~ca-q^G8y;=D4LY% z`g^H(sEt)FGC|R13Ld1enD&wStN3^pS?s=%M68yEXW+al;^EsXjS(?(TC!7;3swgR`_&UMY+bb+DI^L3&O8w&lnNQ=n zMY0Seeei9UYVIE+*x^E>f5gh#BNfv;YdBjSvu-vH}pp8ESicz{CZ7rNg>2v6H( zV;?kcMXz$_DJE%ChcyL)pW^$aoU|4ouaZqYXc4}!^$*+@=w87DF zxkKUyCC10nGt4BkHxKRk(<8Meq zBWP$urd)<^yc{4-Vd-f_1rgr*p&O!pea~jLW=UD5NiC=-wW6eQOnQE$S~$Wl$P$}q zZ5r{?-Z>+(J0TOE@TqHHQv;~?ie-T`C#7l{z7cGZIj65yaUXn;t2Ulqm0K;pw1=SG z!JvN+@m>~=9-mDcf_4Xx{Y)U;&m{JcW4w~xd#d`!F02AWb^Q0 zmSLcjKENF|0I*nllzi5pAD%d;DI878s(I3A* zjCXd6&0bddkF2j-W~ym3QzK$B(*5!ZalSc0?y9V`@6Plq#qLViTb@wkXxCUw#-CoM z$V8kEV(--Y7#-oZT9J35t7+mQFiSrP7^SYL%vE$G4SDGofZfI6ven#YA z|M0lx0PmO$D}y5=!@>Y++=5p7Me>@`>Isz*qkIFR#!bt~%qTF2C$?oQ+#EDCZpPr5 z%Rd5bR21l)vY8=U7M(sjWuq=d+mYv%4PERZ-5)2k#Kh0Lz>*N?6IN3+xTqi_Vz7Ti zEJ@c;J8Sj|ZV&QREN-x0A+O9U3#%J%uFQ*@kXto5cTh$_q&cxZZ8l4o)v!Eh{CIm* zCp~K7EO=HCH{814Rp&`R&#oJ$TT1Itjtl1nBV^$TX_vcjwg@ojc9GNo&-?EC! zOG_CVe|AerD^0g#Muqs~r^t7mh60vmGc$v|zzfLBp>Ht#=7`5c7DtBY>mjUyeH0&& znPvINX8S*LJ_-uV8djQJ5F1XygvY9JBXaB(nN@H?#tayioi*&z*x2xJ0N8b-N_o~MmXZ=JLkviSv>t|%B8t=mdvW~4i65?EFLx}W$1tu6&)H8RWq`* z$*0Bp$_2AmkFL0v>=DD~mz{ZuPhrNO!of*z2Zcn2%ZjYR!mPTflWXnIm5ew=Mo5Gh zV~gWkd}mgl<&8zg835?B+H7W5rJrjVGSUj_<(=Xtq{*!;KTawcoHL?2 z?Yx153X2C18S3X3lCeA{wXUM9#izyVnuV3~O3b15H^@u@GCMljOg?L8Ufkf~p@U79 z;a6EAWnt!^!u<50WY7WE=3$Hau2qYdAc ztLDJd(u)ctByaBjV`odw04p61^Sr!0{BHP^hKW;jzndH1=XYzShK2?Q4Ngzbj7>-% zq*_gdiT{VU?*Ndbs2c9-nVs1%yOYyS&N=Mlw6n8$Hs>5Kam#Uu3*2!8k8t28(UWi- z2O>#6)DsXD1rZPt5J3j@8{Ro>3^o5|7>CQtKRc2BRMrJ0Qjg4=KI6Iv0rM zsARQdu55`r(=MZ5O-p7PF;Ol8i1ijlG>7oOc=!_VUOmx4j2u_K-~kV|8`7gLJ0LRJ zDHc7&@fq(56qhQf^vwD*^sifIm%OgZ}bZdJOzB#_EUX5P*r2 znMN?06pcfPbRgd-;?Ug??G@P?#U^WopuR4Uj{B-40-f5H=cX50Gt=7I{xG;0F|w2d zeX|sc#_pg8t63FclOm8a)nyVsUyAE6nG)4CoXkwbWw*N)|G<1J(}3V5Jk&=JRk#zP zGBy%p#JW;ljA6KAIgV+GqEuGUqPny>2wGAAZ!&1p@=_7D(;1l|gM4qzz`&ZeTqM7` zvFxq9JsUTi8gaYBR8O(3(7qh3<)1VY>haXsopo}lP_|bllE`Edkqq>rY-4-A@x!Jr z26fOdS2p0>*3Gk20gDv$AQfO+k@{tS$NY9v((DL$?FwrJFD{ph#gOpWg!^KVCMCM* ze@c&k6Wjj~BN)Gw)I($~v}F^~OTff}=1kC1N>{nSl>>J!W(mF6%}&UsrGi8PLWb>f z=$74sl3ssRHX3YbZ>Tj2Od*ZH)}s1E&iy9KvXiC?lSF4%smRXFvx_apdRa6Z^akVQ zUZqOr5qXs4nor~6We%nu^Evn`r5xJ<0sn$@3IFl`ZTuBQ{KG8zf^4KNyNrIT^0T3D ztT0G*_8^V@l`Qswc)5?p-m4_VpB?+xyiUGK1v6B-?SDYy-U885rdZq^{Npq}I5hu{ zTYsRZ-mj=gxPpoLI%REDC>Y=y45_})L;!CsQp(jjB`Ey3{imnXN_QaQ@kjVUoz@Ug zdWJ{IwV#~^)FW1BrAjWtCkrSGHUB?pu*3ndo_)*i@)Z3A79??Hv{<^L zWL)DFyA2TS247!GOHWO?GYSK2#H7=k0`}X7&}gfDGEyaya~jISc2yg%Lsn}mYq`iu zeNfcRQP|g&Y_;jC1Ab>6W;vchQ74sGNc56)imW!eJQj{fB&ZgNsuz`fnN+2fiP6O& z{Ue!{mQ0w$I&;+fUpk{vcb8QvvXl?ZD5~Y+8c#q}_eaoT$Z@VL+ zc6fYdyO(eB3A6&Yx!R~O*kj0{*W1@gs;k9fh!8%b)9|1^F^m^>n9ID&(wvac0v6_O z{{hX(5^8^)rh(@~By-FqiX>BaR&-0JinJoDXpF?44SVWOEarIJ!-L;G7(Wtl`WWce zSR2Dy83!gm^kgUU$?CO?AD6~r;T1E4eIvEiLf&`gfITISSbgbaHj|3S`?4)i}9^a-%csbcRErP=qsBU0z*dZ3|3}X8YZv25PuCTl*cWme5LePQtJD zq|;t&qT&bsoD7To?m&VW+*(=WlkNBTVW;?X|w~#>(E_%2T@^ zt_&E^uc()BtHLA_Z0O815KQUx9D{>xKn-x_-B`)|7SLTeB*o+#dZL+2eKV*Jrc*wB13I&*J?JS@%Oq71XA76r$sOR_!G#IN!YuVGw^pL{7?G9w zl_6AfNl~k9Dk|#0!;IaF2RH}8a#O0SvyCr@Y5Z~8o^ASYX@^8#ICG@0C6c#RRaI8X z6H2oy>~ur|!BDhpSXy0^+ScV;>Vq(}fz|W$<_>4ptcZA>A(_-rrzi_DE!PyR>-1f$ z=nl4O5;Jk?H9X^o23vv`+rntOXmM^)!mR-C@tBnX7+7@$#7h=20J%!&37BY*gP};A zi$TU#vCEcVUS$?j#GH<>%qVxdxB(h$Th|_keCG)i<-YCx3R?O7^xORYx-Vc@&EW>dIRfnDo3x$*pokttEz~1#Q zXLb{kOfH$a5D|c};X|?u`-^}dKorcNv<#u`tIW8IWzf=g%B6vq89(k`7*55aDUH?r zs2wK~QI|ZQ`{l^d4^e=dFVa)0HjtPyP%Ka9@|}s;YIo@iicRs%=7# zUyMXXZMm+-*ziC-7VEU0^Z}eZ&j?b11G?G7#5k&&V(6FQ1r8v3yk zWO^E4)?lye;(EafSQ)~KS2SXJ+uF6;iY?fbN;OdnMUY^cRo{@$Hy~cI@ou#^ofh={ z?QHd!R!qIEuuuI{>n)`Z*?Q`RwY!S-wx{Y_sM%t@9N%L9s(Q^Xr-l3~b<=XiB;G>| zCqi_BPmh@%!C+l^$)gBXj>YjX*pZ6{5YW#^>%>)8k7t4b*vKysotZh4dWKat@tE@R z%jlIrI_dQ%xzzi2-Gv_WEs+**r0W74KdCO_Gu6fMef*16b&=npUR$aR=m~gT0C;Jc zJyJL}#mZI$B_b>ZQ_0GPykO>-t4+oQ7+IHs%7gF^cN7Z;Jk+S^RZ%L#mdpU zyEkmu4W|>?T2ua5$YYivk70JM*4&=Ww*Nz|mf|HikQbe;eSNJ>rl?TdWsVyr1l4*4yYgL2*Jrn*y=?2VEH!JMeJ8%(}3`X(=V% z%{FrTk$SpI*9fmT8}&4+{Z3D{K*r4p{Q4TNl29LR4j#bt$d%d!`eWu9K2q4x6?wtlLvmpE@$RW}_(7=dH6l0#cz+rdEvDrJltv z7e{|o2ecC@6e83Xlbn-lU!~JItm9l$%4Q4tY;t=AkB1x|86CEh*)DXak~aH`;hawb z`Z&aA+6!ZI80N@qn=p+J)2Jc!3*s1%M)v&*r!o0Vgf*Oa?n@oCPkf%KW0!t$i1N(Q$ zb7;8=j$TYZIF3>n29!ABWDgTt*lV9_d&s}}>+>*BV`GyP2nB_pVTF9CBdC_c2 zZ7kwJw%g?jsuHQGKP|)lh9UXUM@hra>2|0TYOiIXcOOIh?~S3%m^a9H|6bs*hbA#;kl|kd`?DoAH*#;|jMW zQWUD(wtmC5B8V-SY_4r?c*FL|^o(AN`kzi(*Tk9vqIEvAgamrna!YBW96 zx+OcMlF8|>s9nW3wTLq{2(KoKZW%Di#J+y$THpojpUlW*3m$l|FhOncU??-RFfq1a z1l{hgO9cC8MmnfrEPo1MH%8ZT_S1fzFgquU;sx5R#6L2;y3C`Ejgd%GQ$%YvYc*!G z20gG`2YI+L6l%mNV$o_XI8iUIs222!UKq2jWRBT~8!IYdV4jSHONYj{=qbmrum+fn z_Gx%1uB9)nYm#A8bg(=K~Sn$Yk zZP-Be0^A~*q}o%btg2Ki!wVFLy96`P{)YhDTF&$IOs&1drVGY`c#-)0VpqluLpLbn zmk2PHs;4V-8y65LST7b;Rn|F__G-SZF6wf{JpGaO`6@UAR#g3Mr9`5{=}{0T*fF9A zcE}d7D77N9O;{bYIYQB}ufv_MSD4hAIxFSllDp}zl#<2rBIz-WF&3Z zKDbwh72sOGnx0YG60og>Yid!Jo!uv_!ItC_FgU!!s*zhaPTuwLUzXb#Jm}{NJmNPD zk4sna_=Sl;IE`6+{cw@RhdUQ1fdzm!ioW6`x)t*TUh{#Yj~`)to9Q@JERl;u$5Qi# zefxIqgw)>I*^X1?ckjIOyEwHSy!`TmI6+wmPQfJ56X26viG7Umu@eyPN^Ux5?-#z7 z-a~!6gX9kkpS*Yp#FvGQ`PGBcF~B@7=BlgnSWJ{J#7)Ychxwyxdr z)zeV}mG6su@#c<1W6&87r%s;O^x7#MP*xq#{2x%33)?1PbG-s9Y)~TX_+oB=lb4I8 z^-`YYq1{@4?M%3-Z{4WX(lMS*gvT{LK_Y9n z&+W);?Wjxy(k|abcgKj$fX?WCLaI1(p<^pvA0P=_$G^x&8Cw{8t^}T*Gi75Lvr?!% zy(zWno~;#Yju?bFN6Wf!d_!w}XJ2(&c<)(z=ctywaT1CjDbx#b6z@qX$X=m)24pE>=pC)Rd%?xr4o5MZO@@WHty zOuYR7ZBNFYU(3>#ojR2EJP@t6Zf#B_QO=!9c&gMAVt4Y=a69zR&X z&~)OLR=#HAS5)FANAtP}P$<7Cb<*8CUheK{$aZ#Q)5`NkfIcTT0)3kH4eWa8Y%%H^ zZEqVMZp(u!9Gr_(m_<9_#7uf0!HN3Xo{5Qp{>g~}w?E)=2LkRJ&pl($f%EsCac*Ya z?9}@8Q*&!+9?BOMPzUVKhrXs<>T8za!Pzrn{qIkpo_J>$HG-9YXdg4=-3n*5${}yD zTQ7A8?Edc`_`KU{N=n_zk-Cn-AO3=RU@CP>yTxVF`W^1h#(m$w1tGAf&7sXuj&l{? zenLO9Tsk6i${LIitv+fp`l2qgDI;~L#zIX4umm2P>Hdn-9H`X=tWICO->Ng~Rep=3 zDQ?dRYnr@`eHeZ`?_PlOa51jX&yNPqX zMx)bdbOwV?S1{oIN>8)1RVc`s((U<_Ia4icaW(fKm(xIJbo?pcbOZtpI*2apmjOQC z2C&ey0bLwq4Q97EJ+}r;j8_!UKprHX?Ko$ks(y_^YtD~ObPY44u?Nuj#^HhgnyktS zTSKCm_V%eKF=e7r>?Q=`m>y0F-T}K^`3RyrvHQF7aAt4^>`~{VkC&dA;n`O5L3jq6 zO4xih;wNY`{ft_Ari6U^=x+;4&rFbS8-7OO=3w@aG0&hp5-mM*z&XVy)A=AHn@Dx!3Jp7EyJcDukyuur3j=UFIkbq4*7NlyYPH89aUG&3~_QD&S3m|_b zobPL;_tdasss(4Y9k(kFb_{O`w*QKh<8siU{OLB6E-bRkyFIzi+wY}bg~PI)bxqCG z`3dyRMSoA^V1vP?Q@hOerqt%cc-sP7@40Nf@nh<>e#RlzQUrxY3H_-{Vv)r4R!=OT z(>jATy)G&-%X@t3c9+FdH`KBcuxhK`rBu6&7FWz^s@2yjTn0Yq6q*OGI6iUnFNe%_01Uzc=FdcV4)XY_mxerhXc4Kl{~Jp?oLMXa~^9 z36`KZ#Pfx{YmU#P9Wng1qV@xyMucZqf>rj34T!$8=r4t}jHbl_mKN-K?kZ|n|4orr zq?d+n#HR=C=2}Bnw!X`#HrWSS@mx%2vFNOBx7Fr$+g8$1(3-YpYO3P8XhSZdk5$!V ztgy+kyf}sXncHG z@)-S};PusH>(fY|Yt5q{(rEnZ)6h8k?%{N_|{{$JJ-f z6$L4t_xUZ+RGHk6YuJ!VZD`1CNH&kQwvOTi{Q#HyI=KzXrB_>- zb8WDh4FoebCa`wdB`ttnZCX~gS2+CKa9+2=HtX@n=hDfka7W4%u9OH|@r17~9T-by zCW9UO`-2)eJ_%c{L3d?#4kWhNtPAn_3BS81)G(~maHFsrvN0MO3B~5?+czaB3M>*h zKdn!GK%P#{vnv)$_LhhP=8IsZTb?w+-Z*Rp!7~ANWq?`02(K`YCvz8GcKMYK%jk34 z$25ASiFB8lYiq6GRp|`JJi#~wE!HZsw=terJEwJmdhoKb$xM&S zXmyx1{0Mm1HK)4P*4N)#;**5iYY))X15z9stmx24Uugh&3h<^{2_(H2a)q-)ql zo)XsG`K3GJ$hH=hsIh$BKXdBkUl?uD+hV*f<$gm?)IGJevr*e&=;=#&y$MsTsXf+Z zvVH_M8--e}kX0ec_VwF$amjLlus`{=fPjzsCt7!)$Hx_m1!<98sp<0@_kNH5( z*l8Kq@t!i^V)`UB8lV+uEX_^%pNtP#y7*AyScra9gx0x)+v&T-V3SQ%X_O~Ga1G0` zTo%Fmi||VsR5$LdQtR+~gi^+>JTAs41wgEQzcgH(1k zdE;@n!YSYmc6ar8tsA}`tUEoM3a@KvJ}EiH9A>Wo)u$+zo&~t@-Z26Jx4=IVVPx61&*f-esnx=>!9Tf zbPkxFGYZ<0lvEV42XRa$Qlq``36H40I^gzPaJI^A73}Pto>bZ^z15?WlA7AAS2Y_H zo2qyf_Hf(_4rp>n3RKk)X`M-CD)P1Zh31{7@wf-=o{gK!5O<)*oEKUW^2C^+62)Ae z*cTZYAcq!VaJUL^z<#zc$Aw-BYq+>yU`Us`1i(+DgqsB5$G@=!4jl3!qNogG&2*)b zu7RFExxTLHbWKI0E#0bCk#Uzd*&5AF2kK@UogK9tt4dTWsTNh(Y8tC2rCPBZEVZ0_ zvAluw_7&l}^w)c8UE?jzoJ_#Cg%ciMDziRQe^R}{pf%UjR8>wVJG+xt)(FIE)m_Y2 z7$aaRB3Jl;xQ{p;Y%t6mnU$Jr!FG@B_mwuC&T7@^Y&dTU;t4+jdk^-G%BT82m)>$kXO-Vx2 zHm%l%6LpPEtFzg3S{sxFaoS);iOT}^DlLn)QLTWiSfXVGgv;f=axAPI0>=Zpnx+eV z3TBB^u!KsQy7YdIh5A|c`W$<$EP}oIifIx8`riw-LVU&u%y&4J(wdr267*Ks?RtaV zZh(Wa%6^Jl0=Ec5&rl&w+zYYKjuWd|Y8hw0bMy*MLT414v4es@8Ms~(*h6n7f6VyH zL7&2MoDR5wNyjh&j8QmpNGU+yayo359jUnW@)@Zl+-dt66Eg(L6u{LH83pLdvn~LHkhs#A?-Q zAx&*`(N*#Q4(m>UBcNU1fX*#)%;MMP27UQZpxrG|$WFW;>SR* zJm&RSNgJ+Z+v&%}_Q82W#0@BmzP>u|+1=f#bXQmU2Ii9L#(7O>9r`l)EbbT5I6ta% zfWNkqAD26ndJr!-0dmZPW@7P<}RrHL=(smQZz3_VBIrLpPi?(Q2SwBRbKSVxW=XB@5K<9MX)90T1baUpp z0|%bV(BGKg8wK+XJuEEMa|+Jhi9aOi+|Bft^f$J`rBKf!gptMvgmM%Iv4n$&ST91_ zPY0`I@Ze}$b8}md*=hoTWY*Q1tmYjZowqe{6E0UsLvy?>Lr{cO3F#s^lH|Pro}6oCNhUYA%>C4syT&HB&!$ zxe4g84#u9p5@#KM9DEFqGHMH-Lyv=J!Pv3~q6;)ykwse^2jP44E&6-Q@kUa5acZuzSt0ss_J12IKCk`p^&1x1jyRU<)UtpmVVT9&{1RqIBnE@97n> z@L$z1j?<+Zpsq)u79(3Hw}SkknjO@ks@=}7;^7?+piUQl4(&@4>(Do$zF#x-N$9R$ zYVJNBehfy8?!e$zgn<0@a_LN6P%B**t5`sLpdS!_rST)^+E(E5BtVa`u+lh@jVsHb z`EeckDt!M8ZqH+(eQXJHtk;mwtb~Tf*GA;fZ_%S*`GS!}N{5S!)4y%kO&>lyZN47= zM%;&)ANT}lwDKE>GRL>r=-)p)Jbm4D(`fSAnd`2bDg6l6o1h*&T@PCeQ$C#u_tVn% zrDfroah)Ob6bgcT!f~cSiZC&zL(`S{Ly*Wv{_&50VAx>nLr)Qx()s9II0w9C;8sIH z-zHb?2Lk6t#>Ww>zF3&z7RFN#TIS*F3O~RD!C{N7am1wC*pTVO&O22WZ+Vk9s50`K zs4VNmMCO7XN`sy^lVe7R>hrt>HFoDBfmG6~kcnD@0hr{atQReN8esczrtlB44*eN4 zDFb60SZ&Lp7uK=%jfXG@U9be~%C+CW?#$(O=JPvpxgGh`bR;sJO5@+@?7%=a+uxt{ zBw)&uOnNHdJ(CN52O=}6)J%l=oq>!v^MEG-GxLPklf?AzAQYSzK=(-!tw3hH=a&8t zzC)!k6^b-u-Ba;cgwMc>;y{G>e<>|FFKn>|yby%PQ`WY03tj)Mroa+H%fhf7^JS-5yj_1tar) zBXh8(J^ID%>qa}03b9xTo|Lc!8Q|{+pJXAlJ-x?*wY%8y9=25iWmWv9$J$2Jx}Hfl zOj_^`fMk7F%V_V@tcM{P8EaTvAP-r5l4MfV&P(~dsov)9vlYqYi_3c)NgRQY!XHtuZ^{gv+0=B#aHesCIue|EXKrM4wx=WPPw?8?`BT>|Y`ku&Jd*);!Ek5A z;^Q}5QAI|o51xVR!)xKM!Z~wCu-0j%b#06z-7%JG!yN{5A$@|JdN@`;w{hcKeQa1= zJmYRZoEhg1lub-lUATSwg;kRiWdS#P(jC;nS;EN*-joolov8=(SPO)=!M|`fgzcJP zh=N1^0t7jBrIh)NvAkqZ6VdJJ5lK=~vq7CQ#na7aj|fvji%F7FdDIcH^!ypyf9V|O zPy6@ujW)a7;YhNrmoM6ILE!4O3)fHaG8s-)=UR;?tQIZ)U0g|8tH{N_oYjebBmUxU zOa~J1Pmt~8ER2v4w+hzCm{`RyI)XCKOyWVMXVh5G>cM)qN|vDV0dqQ?RBN^BWIAmg zaJh#}*;G=c(WsKCtZB#{AFZn!jm1WT!O>W~R-H;FO(P!9h$)#&;g3?8m>w3eM)dUG zJ$2)W#6&1Gkw}c!(d}d}+=1QzzVHEbG#`TP0Y+|y`@p0?kK{%EU|S3u9^~ka+5W!z z1yjjk^Rokeu@OZ^)$L9+sv6to1~;#->1+r7C_P_3KT}bkEeA`4#ToT!>@G`ST{EmR zn+pfP=O1EF692?)OETxhK_7wnazBh2pv|-G3x*C*K>;p2ePKw*$ADp9Cg3L}TmXJ_ zbck--9fwt^5J`s8s%v+3?$SmQTY68HAr18+Ny7fYKT1#PX>xg>SufbzpcM-B4X0g@ z3WtZMMjEtYp|)Xk8uPNg@J)0dz@P-kczisE;#ly(UofkLkqDb>EXeOJues`GaFv?h zDz5JCHq}cE)pjX)p3UCUvREKd%RobuRG6r&X8E=OXs(9Y0ycn%EgtT5HorRF-#`9pU+5gPiMq<`=eM_4{qVZ=hi59YX>KwY z?&VSM9Jo>l8?X=VrhZrE`!>b}EZYdjrvwcg+8byUg)RcPurysl2zN~-V2TqW9A;#u zW+OTNN$aY{d#g?warLPTva}|Ys{F={RaamA&Hmcfgm&DQ?W)fk#uqfIMyaAX3Gvms zvQQ^B)K$U!0j@Ue4`qqM>MNbX^0=H&CweR*tFq^>zn}?zrk{hKU}7rz_tf@|Hx&)a zd1aI0Z%^lQ9rGQH`3HQxekd1KRX7|d7t3%tzzLAT>;#aZQy9TyCM+kf+`4s&`o{Ej z_*sK`rnjQ~bJ;(T?#1W-ke#b9EWSiq3iZ&i&@LdWV4v%Kpsy)0tO%b@zy!kt(F_e8 zHkqKQVarwABoC8)nX1z_ZJDmGe{#!d{4{kk;_$n2r+%xwf?7NsJvcp2eS{utxNm+s zo}_-4ifsp3AcOMvK>1p_)h$?=0jNtV!JyL>F~bcE3FMw0vaEl7?bg06({u3iDAdGFrl&Mvfh^TO8M-MC<&5rS1$f^36w!GjqA zMF4z092icQg+0LfwWYd2LNkK#0)2&gR_NR_ZyV z%P-`jp?nLb{W4#I32KQiVHOP_v&t0R&5B$J;)m~aVxCMjmCubxN*Gdd%eA~8uQ9YH zj2nWgVEtz25aAd%#N#eO`T++O`~ev78Q!7EgDa$uK}UNpxQ%!8=*%5=@NWP7 zck#LAXl+i=oW1hOY_p&NP2uy+aamEsBYubOz#4j~)oDX82zpP@j(Ff_gWZqv;EIK*Z*qEtMH%B_bTZ{ zPFx0_|Ax_r6dyS;5fQ}et0ax+UvwET&M@X8B_H{}7r*!3`1kI`zkl|l&`*9Gdg!6h zkADJN%sEi60?PXUzM)qs36|QJKd^KtHPRu48P?k%E#gZ5!2W^GHL2AmoF-eIG}Wq& zMs+Qy7?=l}h_gr?x)f@`^8zRh|7$|Op=@-zwCw=wBnG&_%s}eMayS!|wosX{g=*P4 zB}bccf201A8Lr=bsPR`HW%|>Xq5Ofiv(AFg_w8$g@4;$An#m}R4Ia1IqDYQ1=yMPS z`!%Yz>#3i2Q6G7!k8wRE`J|AmtW2JPJP<7#alNRl>*r5(F>t4$JS!Q1^00?3lvpM& z!^27%yh0D4KZ1gXUZ+$?k6hdNlZ+2z4VPVYQv?M!8i3#!vXkCjX#07G*5M2 zd!&>7hG}yjO?#}j(;SFp7XA>8_2Z_eMD&Nj`|fLm|L;I$B;c`;G^1aE`~zt&rRPO3 zB7+2levX$p@UV>sM2q|r-eo#c`nb#JksI`=y)|WsyDUzb-bCh4^c?kPyI`?Y7Ia7& zx?w|sG~j&jm?uCB%!fZ9t#IBB$Y+QJj0M_pq02%|3A@>iA;`BS4N0fTCDWV9_Gjw5 zR7xn{A@BKC1y=vj~h2E4D1wb?2$q_kj!fZnj2UfepjG|7Zz zyGu8$>0Y;MdUIsZKi|D+>-e@{yJf1`32Q*;{&39a$(yH|_s#e9%`AJlKUFl*xSVm8r!h19?*r3RZW6@8R{Vh3rEO2&;xp3nHb0g3H_70y&rwBo_u-H z#4&#S3Z2gm`6eKr0K7gC0`YBvE(E{r5MupTq@Lf*LY9 z1u@4f*Y@`A>)?`TaxUh#U4F^=dw+Un@4AC6BsV=9^Tz;0pi41cHi?eHgEEM*@psNR zz`@8odM8t|t@t3h zWnyy6mdS}N=)A=^y09aY>A;CP6Fu$pk_ssK~r{AKATlH-0x+px|96 zekVm}l9VjIO?FbhrhbjTD|`g+aLbGQm@mncC~=WT79khpH5ax*46i}ZB|t6XGE;w6p2L(4PplaeB6ENN_I98J4oq_B zE{*#%?$ioAiYjR-v~;8al3qKy=IFL{*Nz28;|`g6(9t-sws%9+W6R5|wbQ}&@v3M` z>skGim-M!s)$gCy)S9-%Ym>J5Xf|RwIPv9^cHFsc=!&_v?M)mqXK;4cH}orAVXMwz z@lEEhwHWv(_x7IN0y&1y>rhG}O5Ia>pKK7qMR);oyl?1ikOwB(x0EPjqv_#p9$)I~ zVBi3k0POywP-2e^1}AU>wmSfGEUU;)N65P++p#Uv-JF`~>72fn%WK~16bx0@TSL@2 zuopAzu@2Sm%PT#>@qDGhYjs3s>l+q~lkF`d1I>H-Ipw|UGQ&Fuj83x0Z_f;y`m8q3 z;)9XxLt1r*I|G^%=Es{LhQ)p0sRwf>+Vp6Gr6T+fNqE_l>yc$=C?7&qk-5z8KmHT> z=S4ZgH-W-6=vBZmg6)?@AOBJ-gag~DXmoL-6~{Wa@2xe{?q0c1mqT)$5PsjIs7?v(H66AIe6(dbuXmRBKVGE)Sae z#$eQNc>G?iO;anXwMLw2w=-SW>5SJo%(gna#;P-F?P+)1eS<}-mem*(N~2yU5DFA# zj0?TzhWr?C!M0*>^IpY?tF1dUpRPcOjqHTnx6I7kvamq^9>1us@1pUsi~IU69_yT6 zJK${-TSRq+XhSyA0MpTSZ{_sO3kx?-Grz|cG#L&0 z14hqGzgwxbImk!0&%j)JdS*LyDf7O2>YD1wv9Uk5yIeA1H@2rcfv1Z!auQ&N`V=a0 zpn91F;E0FlVay^wA$fN1z4B13;Y_#F?Mph58sNcmJXlRx zw{^OQybose7*=?PcGBoW8+ygg9&DL*&U|=`pV4KNFb3>8TV90#dM8(7=u~1QI=!X|EmR zX+TE{wosSs3!p_BE6o^vQb~8h6>PUPE;I`*YK^AeXj3KpwrI6Q?t|0B9mDm3tCzSD z?a-+;QmI;D)7B_$TAN>6t2E2SQjN&c;)?PD9C>Bs(^qW3*_k zq>fK2^?Eh=vQ1~|*4A>}3cXSdMkGYINH=jE`98?DRqLVr@P3_6tuuj}zpj!)UX4G1 zue)@$E)9IwOwL2Blxt{y2A!)J?W8UtuYsj2muM1|*$V&M4w?cQopzoe6704oAqYQz&$HsF#5Jb4-3Q zBRQgsat*+;m4zja+Xf7D{Ea)cwKA3SGIH#cT7^WX1ZR7k_nAV1 z@E2adIAJ56e|p+^1O1$AA^ha4_&JApPQH2r>{ng@+8u&3jp;p!4D<{vAqH!@@%QO< zN`+ppxC@d}r&o|}3}0!Y>wW^tiqK`P*gLO)uUCEraGnKu&5Ru2gq4=_#(G=G`wlWV z{2tz2Sd~K@;gN;3$80q&o zgK+6+Bi+qS7KlopZ3miSe!%T}3{6XAE^g-{e=PIJ5}#n=;&$5#^q6Uti;aUG73+h{%j zoR~!QikyluSl-X%-F+-$Vq06DN3llb9R4x+e#x$KueTwTI)Nf^GzsK3A*{2nZG zXaftzHO|T$U8&5;Ga`rMQNj@(AadZ_TM8Cp9Jm5hMIK(60=57}1gx83KGT0JUO~Ci zq%t^dvQXUNg5y44;`1CZG)ZJgG0}yOgT>`sR`7v$Z5j5(z}SGLjMj@ow6dRx&IReS z3#;H@!(aG(eStFis6uNEfQ$;;3K8Oq06&l$U^pRfKGDRmCRj$G{R;<(BZUWO`A}^C z9BzJ)OJ|U7WPv>`?D+n((e*9lgI6=};_z;Q=?5@cl+<JZac zS3>z#M^j3-;%km?^VQ4!Xyx|^dhyEdsarb2Da(lq0KiGMj9FNValqeT*P%5v7&}+; z^{SHpERoa*;OrMog;wCxnA~EKusYyaQ5E@=s-{XP5Yz~TYPs5?m#S;3#nqQCfxlFD z2>KIf5u_c=pU|I}V}NMOBlh`Qh0}9t8Am6st#a|*CXrqumQ`shoP3{Y_sY6|St%f8 z4yV7ms&dtC+?V>ZB5RCEb|jezu|)ss&XQPN!c0t>|(G4RjS?ms;TcdNUOV@OEp1!wOZt+@D{u11HEIv`;BW;1$`qd?WBHVBmFG~*&$gUN^P5W!RM=W7#QQ-h+mYKO3U2nU{PL@pli8d zPdJvPCG(;4MmM&+I<~PDr0UhITs4td*b}}B^09uSz0_UgE^Hu1#K{F8!t-L#YcXyh zF7U(#4-J;KN&g^{ zfX684A0Q_rMg1clW><6Y9K@3H+GzDd!-)i}jPfBVDj(rMYDxDXse|NKiEhr-P!<>^ zq^sP(n7~q{0mQmd?$ms8EC|kL39+z3JTQl-AAtuP4zZ=-T%F&NHrLzTv6x5cs74zH z&W7g@dI%<7Snd<#R||JST{wmn!C6_?u~qekPGhr<7A4$weZ$TqKrp?(Ess;HSvt45&`b- zL2kkr#nyRjl{{9z!85`@#n6RA&Zvf4ZnpbO7N1txIbZ&cv_>eELi8f;FWXK|S`|*@ zG#Oo9tENF#wZ5g7ekHA;+vU!}nSdi*A8r>KM^@=tLb0^I^D8F51StB%m3B|i?g$!c zdrm5+7zE+44F*Ar!e_Crz)vibi=e(3(3H=)gNX|##p^ggQ_$2LV0-0bhGteKvDs1? z$66pzI9hu213$T`O$ru-Y*r}&l)YZF%bSa2vcZti4IcoT&18c}*U_UA#Vjh|Vbm-HoJf0=f@zpMjQ!DIUP}S-|4qNk1(D zV$q@9Yb4;Tm`*E%T)x5SG+4cvU^3+m8XS&~VKfut#C>f2X^u+2O0I|aQ`I08^m<3o z5$>x5^J~iPHHyX?KTl^AgK3mpd=hy10MLqtiSzHnbjHq;We`a}kx+@b71);K@->EG z$3)0zcDxTn!stslx9&L4R~6E#EPRi<+QiZ+FT0f0F<`CEQ0>=abB|&A@+dP%-2d}aQa0kP*-nvoCzU1@ex~`pSe9!P8p{{U{l&d5tlP4 zl?gQJx3T{y_9LbH^s68TKH~lj)^v?beVPi!w4IHqUJ&J09TKxj^O2o>$F2HNw3cOaK1sai~6t4?{VVO`Pk%a&)d(;a`AUXrU z#_>lvKXduTu(6HB%j#Fv@K+*6QfBh&g=@KGOe{H)?L}bJ=iBKS9E?(UkYFuHKvj0b zpn_GuF&AGBhE7Y~Byx$Y&c5u1CQegJ;})I0oG)}sbq?e@VUx$ zqlr*nAaynD50c+9@Q2o(vF)sw(@4sIs^sD(D9cqW3!jpAY+2MR_l#vcWjm)foK?AY zC|=hlkU6ubA5&Nnu6tlT20Y|Q8XUSbY$*jt-y(SJ+zuAHwGH|A_6LuUz!hGD@6gFB$8gYge1yUW=_b zyk(XF;m~c+%lY@oWlb%;ZyD>m|EH-ZrMo5uNDt>I41e_)>C)UouVe$B^Hknu~ z!>I(0<@S@(bD$DZK>I09*oYcgy+xZnPCIflJtFPtCuqyhQpa+GD&+O{+U#-Kl#}ie zYxk{aSF#``4;MZLp8iBT-RkI`$BF0(z8p+h+`VAa#D2m&@|C~A%&kzM?k5iuM(*uP z&;P(azYU&`bFW)^{#w~jasC1ao^!aDFFk()=ZEoaq%dB1u<-C|8`&j#y-Ee?Hs+#& z2>|%>QTq!IQE%bAr54?b*}T;LrOYJtA@!ZYcc9#A+!y)0WkpQBV#EI-f!OMgI=s5@Czp` z7f4cTsJm(S=yOW|n`mi~cs9h^6<0v}kF-c&_0`#3Q3d?u>yu{{E4e%1R?_u&%$u-2 za@Sq%z~R#RHZHzF!%yp{$J7@tZrQh&jAQSninY01ux7T8t!wd(fV+~dYsPH8;gsk$&yDqrkN1ofbsLfj1E1=Pe0n0UA8OaCFto>ERNzOtEZ|cP z`C)-x8ZHzTUxD(QfJZsxzm}do4$t-he{#r=iq9w;JhK6B!ahXi8O%}fJe7ForlY@^ z6K38AP5X6tLj3Y`FWpOD?}@Z6Zd!bU`z&Zcz+NynWq#lruD1Ywu4N$A3ccKC>5|x& z_(J{`Z2Z`Rf*}6RByyM#|Nl%JBO%6#>>&oo4(NZ!OWWYxsYE&0&zG`=~` zQ1^+_twcY>nbVW_$|htb*2CJ+dVGZhy9WsHOT($~5nSikB!a64p8W%^Mo0+V12OR+ zkuy*hPSz8p!tdF4Vve2|z=^ya@_t&n67cv>()ZxI0s z5%o*SLbM^Ay4h<#d$mAR0t+F7B;~Xd37kk9oAwak#a8n7>U$s1=s!uL@ZIs!amwPX zgS;kKKTtq25mqz{J8+p4f@=a&8j=N)4c!23`3VX9-ZKyrp^{FIvse0WkU{Kokel`Y zb{d0kj+c&87J8Yeg1vsnBm`@-=t+=)pO$_^)S}htcZ3dbD@?*c64U6W^oDp{&b^JR~zD z8zdzp6Pp}x#qaUopD7>l`@(sgpAhYAO0icbdo{r|4QZIX0&uw*(l-FN@4)p|Hr)hm z^g7(%2BgOp;gY4R6DhWHCu?jS*Xns6dMA{x+k`1=9EL>>kDe!1{EI=k>X z@fPf>dJFIY*$Byma)4hB`cMS=M+E$sitmTv9VAjqm^dxVSNse$gPJu+tOL3)CHy!2 z49+=&7_&CW!=$wU*8@a|EC3H~Au^ngi4M5-lVmbiXgbc-!Te{C+zrozgbvOxu;Km$_VPd(hX|nei1Rt; z6Nige&eOz8qyuO*4&_||ymSRI$zJjO%D+LM-5v8wpfWKWD z+T%lLr)$9%`CZsk1_@mUeV`iP!0GSMzrF_V9)*3Wj{?je63{Y*!;roLl!c$dHISZR z(*j(dfOHn5-$S|x(oQyQgDZSf*a`{s+`=J9w?e}C*Fbs<(k+m{4W)qdt_R*f15%tI zs9mKAo~0pe!&i8|w=}^sa55-hIF=GTy8_Z2BtInFr%q;5623i15rqwfZPYiY>!_bm z1QnxhT70rlQ;<+kQm;~7lzH)f>KBXegH~UX3gUv8x}UnOz=3({D9iyrgn8RWDnNy) z@Zu|rk5jO=06z-$A3no252NjR0-x;tdEyG<2IA`wmFrRBS>hGw5C245Btlx$jmFU- zh@SK)dKUcJgJg!xlb4c*$y>=s$alz(Ib4p2qvb?6IZiicoU@*@owJ{FG3OBHX3ia) z`#6tsp5?s4d5f#!TDd9iR_;FT1>A$&>$$gczr%f!`(7DQCMZ*t*~>y@*|N^E(XzE= zTg T~Kzg?E13X%bqBEq3k^#!K>xjc`;rSua`H;JBhc0cP{Tz-fiHw_jBIsy!ZG7 zU%*%Kt^98OIDb9=D*lc9qx|plAK^d4|2_Y0{=dq3<&tuJxw|}8ep>mt<(HNpF2A+> zuJZfKAFrsXsI9P9Ojn#;aYMzgE6XcomBvbMWuh`)Ib3i(+7tNtnA3Pf;}cS6u2=od^276iKl`vn&Z4he1++#$G6@TlM&!N+hov#i=! z?X6B!w^W~2eQx!o)i+i@Q2j*p3)Qbyzf&WqG1vHOQZ;QggEg}?n`%z0Ik)C;&8;00Sl=|1TN(u2|)rAMXT zmp&qWM*3Uno6-+tq^w5PFPoNqL3UL3rtAYbDX)>&%I)%yd|19;ezE+J{AT$B@+alL zmcJ%{S57G^VLESC_!TKdn_{oxe8o}4ql#x0Zz=w%6e*p`h%%?_R*oyzD|adPD{oZ3 zsC-=|QfXCARYa9jb*sizUr=48x>5DG>Uq`gRd1{QrRJ#>YO~s}PO00}gX&rJCiRW# zqw4RgA5lM}{%x(S)>u1VySa96?L)Qy)HpS>n*ExKHHS1eYwplIpm{>e)rz!Q?RM>% z+RtmR(B7bZQ&*!)=vs8=>n_(F(cPxITlZ_-Yr1!Jl)h50(3|yseM;Y^AJot4H|dY) zZ`0qce?b3){ssN3`gaUoL&DHv7&n||IM;Bg;jrOW!~KTe8s0Q~U?hz-##*D@7&2y! zqsFzyt;T)E3yiNB-!)REm}%Oy-*m|IxanQ9%-mu=V*c3DX*pt*SzD}^TK{F6w>@ER zvft<^cN}!Q?cC~o%eB?@j{9~`jc134^6vHi+~@V}_1)tq{nP$K{$~S~fm~pJ;DMkd zxDdR%j$7AXcckw1P%3nB=;5$Ad};X2NIr5~v^?4$JsPWtxnn2AE{z?Iy&mt5?~fme z-yDBD{z`(EXiCf`E>Ap?_-)dfoJ{UdUX}cQ@`IEpl}qhNeLnSMnn+isWododnGU5h z>9%x#dNRE}y(4`zLuA%w4rX4jZ>xVio6BCGeY^p7zBfFQv*xbPz1i5`cvq9QDbzIB zw72QDrWc$3)vRhBZa&z2Tl4+Rue69-^ex_&wwC#peJxkCJk;_|E7>Y*^|$6*M_bpo z?r7cLdTHyC*4taZ)B1c{O;#yQJOT9%(@M$)bZ_duy!+PfySpFle!lyi9(_-! zXRzm_o_#%6^c?MZytlTut#`C{Q}6A)&-ebe_uW2GpS^Ew-=@BM`tALh{=xo}`uFvJ zq5tOoyZRsKf3p9@{x=7R0mXoOAUiNT@W7yAFf@2*@XaCj(2k)ihQ2@a=+KKpZw`Gt z92xE&-aLH6@arSI5%WlJq-|t&G zvy;T6cd}`+e{%igj>$_W@1FeilxV7Ds()&FYSYxsQ!h@-rst<`pMGzqd`3GnJoEXP z2WD$#r)Lk&-ZT5#xyrfN+`hT{=iZq&&*$fd=jZ1)&+nbTbpGb~C+6Q<<6X0M&1q|n zthsf~9c#Y7=117-!>ND~fKLn&TzZUH{>7oKMYW(aK`#1d2!1p7i2j1PC*gjQea?Zk z^EK=}_M13^y@wdx#246m9z6dVdtVMKBj0E5D_~rIioLIba{j^I3qW@hv-j1+<*>(@ zska8^2KNvg0&&4dn79=^!`>sJ2F~7No|ABY0ejB@-`FeIdoJi#kFxh=pd-D;-t!1O z2k)WAWtJ0eP8)k)LG;7?fO%d;L^uzy_X5Jtd5^uXMnS9-7aI}?p+JpcI-4d7k2I1zB3gFY&?0_!tS;H zb=$TC)~#8;bKBPS8@8-DCBS~?Vy}Z6HtycMW=EYr7!0PHTe^&C_JxmqQ>=&mbM*gp zcIDxbRaO3;Q|T9ybQ&7a!Ie@+ZM6w+sj4J03bnjyx(OYc?$Fa9OC|MEsZOO{sHHZ+8w%mwkX9|^|HU|dg<2&L96dHv_tx#NS7l{H%78VwUIz)&>>ZqBOUQzL;nQ}dz z55dgFaJsQjs0DEpRLWC9wH_4XO<+)qHzM@bj>X64gQ{sfW*V%Hx21E2fO5NUL_-I_1sZZ6)^NspYy<8azYo)!%^JD*a4Q87m=1kjFO_fzi z&8UWoW43Q&ugVCnHlZXyx)Jw44gV)qQ&o{a2)R&gMctI{kw$p~Z9|mTQNK!4YJhSb zYn;9DR|5U0MH4iJ&?{7PD4hb$BHDzYS_HK@G|wWlg6pI*jBSx9WUxZ48U({j-xr*j+P7s(!`40R) z05uK$KhjlEw+=z2O)t`Kq!pu+1r_~8+ITZ9w6yf*eP)-8)oLACOj+ANUZWTByb)K^ z7r|!n?)%O#2&BN9|jMddD`Vf7XK0>SUMqn=* zqP@vhtI1LKkV~GrSKX&xM`Yqhl%y05(+J`-qgX4#3TYplVDT~fIPFXOQCdBvY|1Ey zvXmpA^0bEbr?s#h7pI}FLmc*gtl$o$^)yZgsS<5a4`BcCM%qLZbO>$6+HMQZVmO-) zQ{Prs;=GR+vClF|pP<9(2s)CEqJm1%q16% zh%XJztB2GK9gXiF)u};E^)PLt1v-Yd`XtWMIG#R@ljuH5C(vi;L^=sx z=O1up=gBxB_Z0ePI+aeN(-FZvL;aG@q|ee>xYMyNrnBiBI+s32=h69UmOhX5=ojc; z5g(|~zp1Ts0bNL6LKL)07r`5TnJ&go(Y*RADXhmYp|7Yl>Q{6r5q*^|!-{vFzDAd; z8eKtOr*F_VvFpE%lOwNGN7HxcD!Q7kp=)tw-a7RfT}Ri`4Rj-YR~ioQrN-%Qx`*zi`*8Zs$<|sw`14dZw}YNi$I{dE3_VM~r03{) zdI8^${I$9WvG3#5ciQh+N_wr8M$Ne~mX*mz_3Y@pM3nEcl z5Xae-cjMjpE$T3QPvtj=e0>++Q{98#hSRv-p$^Ypx@^0P}v94Ry1?ob4h59`> zZRLIHi#YG({rmy`Ag^NV4C9aB{F=RZi1$VW!C{v@PH>WO@CA?XDE6Z7gSf)S_~X1U z@5gD*aF%oI<1C>yh&HU{b$kGi@qxS^Comnv8~9+}h_94R@FBbzd%(Bwp?nyBf)D2- z_((pA3p~kFh@|eOcE`-}t@xGM9(b?*c0`rl$pKGuiD$UXTX`1yp=}GV-x_$M7n4f9~Mpu+REad^~@ePrxY}C-O;rGM|D-*-Fe~-=*G- zxonTR1iz@gSly;h!F%`Um)!gEseBsV|1VcZsH5=CVn05e&rrMYnd&NaHDV}d;TO&s zb-TJlU8Am5*Qx8(BBFBN!@I&SB6{{! zzJM>}FY%Z8BEFa}LHzV2bv|E;*y#%OTlKQK0lxMu%(wSc=OMCluDT2!_$%J0T6z7g*~k5td&i&-bA@AFOkJ-(T5;s4-Uv1{@+zMbztZ0HC4L%x&m;=B1C zzL)RgAMua*e*OtRzz_06{4hVlkMd(Uuk}oPLG!=(aejh-rhcJ*rXJ-d`RDu#ehR07 zKF!bYvzV7Zj%WCj>ZgcHJ)s`s=lFSkfq%un=HKv({1Q%Mc$t64|INSWSFp?fRsIA2 zkzeE2`A^tK{1^T!zY$Y0ig7H4Sk1t&X0`12Y2T!ol%%$#uB3@5wViCv0IvvPPm1|SYx#>!9OnhvWb3wk-T&f#xv<&Ul{cbqf(!>*60xi*0h<7 zs%*z~``0X?=Gr~`PZnyXtD7F!zq^m)y9r*q&RV;u0U(<ed4rmw@RyB0x$6N(oD&niVW; z^F5oOT5D6sFs6;|IxL?>2WB(3e_h9w=9G$X0N?h9sqYS}~^BVQQH3uAr@ zGa1bH2Pe8Pnh^7uFy^ytBD&$M32j8yW+VRQw)lOUi{+pe)XQ~ibE#I?77T1@S4Ipv z{)ng}pRl&*CZ;$qDCbA4Lp9m{LzmnSqpo%EP`z$DR$&njI1e%TjK;(9Gh#~_jT7=3 z58N6uY+CS1x15mlOKTiKPveMG=%fwaZqn&32o?o#K83dPDFg9&t!TLd(iGN=<+&xK-*1@S|vTw zK&j28F&fwFFD;?!Iz2OO?~@sr>FxvXleEfy27CKNDEh4l)U`w?#KK919lR)2J18iq>){EjJ~DJcpuPlU*AW3yB2dcf zX+-X*(LpvPcJBz;Q5hyBb*eqyo3!a!A}Lwx3AKbt<~ncN^T!&fCK+aNdoXLV2hX z)az32uPla$P8JKgq7J3#dkYlvD;wcKh&j$Kt#RyK5Q5z_Q>ZQ>=7?~P2dRy9BmKCo9C$S7_fa;J0A!y=r|LqJ!! zaZ^&8>Z%pqTmjw{;9cR(72w_M$_fBPYen@pcq`Dtc-4Cgj6RAcWsg?|>mJF$u45n-Nu+0O-wljtg+dN89 zFZ6KSurYO^H!Spqh2F5C=OhguPBPJl$$Ah)_3`d^2JYQl*9WG{+gjJl>sUurrNWqI zQgFeeS8FdRxEQ*&pA=khl8&htt1=!D^`g0?$Ty<(0eQ7PAdlpSjehKOu7A2*YSw}x zrh`UAW3YG?(PBlEpAf?{P8WBX4DIT2*Ot51PD?*e$}`Eqsjw1O=Kx5fP}|;946CIc zzgY{-cp0~+Qmz#wqX%>Cbjq3!>S!;;qV9~aZ`9?AS4V2panJy+ak$&B* zxdYv-4DXDId+*-SVv$5=D@|ub>ltaNw6l6v(9Rl$ z78|#o#L>gYb5`g((Q}5X+Q78DeqzKp*u=5Gmz3gUcX3LJQ{BZfhPPyloOx&` za&RXj9oM5B*XfRHW3j#`kaz-#k=7H)J%Lzf%so^g@6AGz|{|s literal 0 HcmV?d00001 diff --git a/default_thai_company/tax_withholding.py b/default_thai_company/tax_withholding.py index e5c5774..a287e49 100644 --- a/default_thai_company/tax_withholding.py +++ b/default_thai_company/tax_withholding.py @@ -10,6 +10,8 @@ from erpnext.accounts.doctype.tax_withholding_category.tax_withholding_category from frappe import _ from frappe.utils import cint, flt +from default_thai_company.utils import money_in_words + # Liability: tax we withhold from suppliers and remit on P.N.D.3/53 (linked on every category). # Asset: tax customers withhold from us, creditable against corporate income tax. LIABILITY_ACCOUNT = "Withholding Tax Payable" @@ -158,6 +160,17 @@ class ThaiSalesInvoice(SalesInvoice): self.precision("amount_after_withholding"), ) + def set_total_in_words(self): + """SellingController's version, with Thai wording when the saving user's + language is Thai. Print formats re-derive the text per print language + (`get_in_words`).""" + base_amount = abs( + self.base_grand_total if self.is_rounded_total_disabled() else self.base_rounded_total + ) + self.base_in_words = money_in_words(base_amount, self.company_currency) + amount = abs(self.grand_total if self.is_rounded_total_disabled() else self.rounded_total) + self.in_words = money_in_words(amount, self.currency) + class ThaiPaymentEntry(PaymentEntry): def build_gl_map(self): @@ -333,7 +346,8 @@ def get_customer_withholding(doc): total += withholding_on(details_by_category[category], base_taxable, base_taxable, precision) if len(details_by_category) == 1: - description = next(iter(details_by_category.values())).description + # category_name; translations/th.csv carries the fixture categories + description = _(next(iter(details_by_category.values())).description) else: description = _("Withholding tax deducted by customer") return flt(total, precision), description diff --git a/default_thai_company/translations/th.csv b/default_thai_company/translations/th.csv new file mode 100644 index 0000000..a50b695 --- /dev/null +++ b/default_thai_company/translations/th.csv @@ -0,0 +1,55 @@ +Net Payable After Withholding Tax,ยอดชำระสุทธิหลังหักภาษี ณ ที่จ่าย +Withholding Tax,ภาษีหัก ณ ที่จ่าย +Tax Withholding Category,ประเภทภาษีหัก ณ ที่จ่าย +Withholding tax deducted by customer,ภาษีหัก ณ ที่จ่ายที่ลูกค้าหักไว้ +Tax Withholding Category {0} has no account for Company {1},ประเภทภาษีหัก ณ ที่จ่าย {0} ไม่มีบัญชีสำหรับบริษัท {1} +Account {0} not found for Company {1},ไม่พบบัญชี {0} สำหรับบริษัท {1} +Please set Tax Withholding Category on {0} {1} or on this Payment Entry,กรุณาระบุประเภทภาษีหัก ณ ที่จ่ายใน {0} {1} หรือในรายการชำระเงินนี้ +Tax ID,เลขประจำตัวผู้เสียภาษี +Tax Id,เลขประจำตัวผู้เสียภาษี +Signatures,ลายเซ็น +On behalf of,ในนาม +Receiver,ผู้รับ +Issuer,ผู้ออก +Tax Invoice,ใบกำกับภาษี +Tax Invoice/Receipt,ใบกำกับภาษี/ใบเสร็จรับเงิน +"Commission, brokerage, agency fees - Sec. 40(2), juristic payee (P.N.D.53)",ค่านายหน้า ค่าตัวแทน - มาตรา 40(2) ผู้รับเป็นนิติบุคคล (ภ.ง.ด.53) +"Royalties, goodwill, copyright, other rights - Sec. 40(3), juristic payee (P.N.D.53)",ค่าแห่งกู๊ดวิลล์ ค่าลิขสิทธิ์ หรือสิทธิอย่างอื่น - มาตรา 40(3) ผู้รับเป็นนิติบุคคล (ภ.ง.ด.53) +"Interest - Sec. 40(4)(a), juristic payee excl. banks/finance companies (P.N.D.53)",ดอกเบี้ย - มาตรา 40(4)(ก) ผู้รับเป็นนิติบุคคล ยกเว้นธนาคาร/บริษัทเงินทุน (ภ.ง.ด.53) +"Interest - Sec. 40(4)(a), individual payee, Sec. 50(2) (P.N.D.2)",ดอกเบี้ย - มาตรา 40(4)(ก) ผู้รับเป็นบุคคลธรรมดา มาตรา 50(2) (ภ.ง.ด.2) +"Dividends, share of profits - Sec. 40(4)(b) (P.N.D.2 / P.N.D.53)",เงินปันผล เงินส่วนแบ่งของกำไร - มาตรา 40(4)(ข) (ภ.ง.ด.2 / ภ.ง.ด.53) +"Rent of property, hire-purchase of movable property - Sec. 40(5) (P.N.D.3 / P.N.D.53)",ค่าเช่าทรัพย์สิน ค่าเช่าซื้อสังหาริมทรัพย์ - มาตรา 40(5) (ภ.ง.ด.3 / ภ.ง.ด.53) +Rent of ships under the Merchant Marine Promotion Act - Sec. 40(5) (P.N.D.53),ค่าเช่าเรือตามกฎหมายว่าด้วยการส่งเสริมการพาณิชยนาวี - มาตรา 40(5) (ภ.ง.ด.53) +"Law, medicine, engineering, architecture, accounting, fine arts - Sec. 40(6) (P.N.D.3 / P.N.D.53)",วิชาชีพอิสระ กฎหมาย การประกอบโรคศิลปะ วิศวกรรม สถาปัตยกรรม การบัญชี ประณีตศิลปกรรม - มาตรา 40(6) (ภ.ง.ด.3 / ภ.ง.ด.53) +"Contract work, contractor supplies essential materials - Sec. 40(7) (P.N.D.3 / P.N.D.53)",ค่ารับเหมาที่ผู้รับเหมาต้องลงทุนจัดหาสัมภาระในส่วนสำคัญ - มาตรา 40(7) (ภ.ง.ด.3 / ภ.ง.ด.53) +"Hire of work, service fees - Sec. 40(8) (P.N.D.3 / P.N.D.53)",ค่าจ้างทำของ ค่าบริการ - มาตรา 40(8) (ภ.ง.ด.3 / ภ.ง.ด.53) +"Rewards, discounts, sales promotion benefits - Sec. 40(8) (P.N.D.3 / P.N.D.53)",รางวัล ส่วนลด หรือประโยชน์ใด ๆ เนื่องจากการส่งเสริมการขาย - มาตรา 40(8) (ภ.ง.ด.3 / ภ.ง.ด.53) +Advertising fees - Sec. 40(8) (P.N.D.3 / P.N.D.53),ค่าโฆษณา - มาตรา 40(8) (ภ.ง.ด.3 / ภ.ง.ด.53) +"Transport of goods or passengers, excl. public transport - Sec. 40(8) (P.N.D.3 / P.N.D.53)",ค่าขนส่งสินค้าหรือผู้โดยสาร ยกเว้นการขนส่งสาธารณะ - มาตรา 40(8) (ภ.ง.ด.3 / ภ.ง.ด.53) +Non-life insurance premiums - Sec. 40(8) (P.N.D.53),ค่าเบี้ยประกันวินาศภัย - มาตรา 40(8) (ภ.ง.ด.53) +"Prizes from contests, competitions, lucky draws - Sec. 40(8) (P.N.D.3 / P.N.D.53)",รางวัลจากการประกวด การแข่งขัน การชิงโชค - มาตรา 40(8) (ภ.ง.ด.3 / ภ.ง.ด.53) +Public entertainers resident in Thailand - Sec. 40(8) (P.N.D.3),นักแสดงสาธารณะที่มีภูมิลำเนาในประเทศไทย - มาตรา 40(8) (ภ.ง.ด.3) +"Rubber, cassava, jute, rice, maize, sugarcane, coffee beans, oil palm - Sec. 40(8) (P.N.D.3 / P.N.D.53)",ยางแผ่น มันสำปะหลัง ปอ ข้าว ข้าวโพด อ้อย เมล็ดกาแฟ ปาล์มน้ำมัน - มาตรา 40(8) (ภ.ง.ด.3 / ภ.ง.ด.53) +Aquatic animals bought from non-registered sellers - Sec. 40(8) (P.N.D.3 / P.N.D.53),สัตว์น้ำที่ซื้อจากผู้ขายที่ไม่ได้จดทะเบียนภาษีมูลค่าเพิ่ม - มาตรา 40(8) (ภ.ง.ด.3 / ภ.ง.ด.53) +"Sale of immovable property, juristic seller - Sec. 69 Ter (remitted at the Land Office)",การขายอสังหาริมทรัพย์ ผู้ขายเป็นนิติบุคคล - มาตรา 69 ตรี (นำส่ง ณ สำนักงานที่ดิน) +Sec. 40(2)-(6) income paid to non-resident individuals - Sec. 50(2) (P.N.D.3),เงินได้ตามมาตรา 40(2)-(6) จ่ายให้บุคคลธรรมดาที่มิได้เป็นผู้อยู่ในประเทศไทย - มาตรา 50(2) (ภ.ง.ด.3) +"Sec. 40(2)-(6) income excl. dividends to foreign companies not doing business in Thailand - Sec. 70, pre-DTA (P.N.D.54)",เงินได้ตามมาตรา 40(2)-(6) ยกเว้นเงินปันผล จ่ายให้บริษัทต่างประเทศที่มิได้ประกอบกิจการในประเทศไทย - มาตรา 70 ก่อนใช้อนุสัญญาภาษีซ้อน (ภ.ง.ด.54) +"Dividends to foreign companies not doing business in Thailand - Sec. 70, pre-DTA (P.N.D.54)",เงินปันผลจ่ายให้บริษัทต่างประเทศที่มิได้ประกอบกิจการในประเทศไทย - มาตรา 70 ก่อนใช้อนุสัญญาภาษีซ้อน (ภ.ง.ด.54) +Sales Invoice,ใบแจ้งหนี้ +Sales Order,ใบสั่งขาย +Posting Date,วันที่ +Payment Due Date,วันครบกำหนดชำระ +Contact Person,ผู้ติดต่อ +Mobile No,โทรศัพท์มือถือ +Contact Email,อีเมล +Description,รายละเอียด +Rate,ราคาต่อหน่วย +Amount,จำนวนเงิน +Total,รวม +Total (Without Tax),รวมก่อนภาษี +Net Total,ยอดรวมสุทธิ +Total Taxes and Charges,รวมภาษีและค่าธรรมเนียม +Grand Total,ยอดรวมทั้งสิ้น +Rounded Total,ยอดรวมปัดเศษ +Terms and Conditions Details,รายละเอียดข้อตกลงและเงื่อนไข +Page {0} of {1},หน้า {0} จาก {1} diff --git a/default_thai_company/utils.py b/default_thai_company/utils.py index 4b9952b..9179c6d 100644 --- a/default_thai_company/utils.py +++ b/default_thai_company/utils.py @@ -1,6 +1,30 @@ import frappe +import frappe.utils from erpnext import get_default_company from frappe.contacts.doctype.address.address import get_default_address, render_address +from num2words import num2words + + +def money_in_words(amount, currency): + """Amount in words for the active language. + + frappe.utils.money_in_words renders " only." in every + language; Thai documents write "บาทถ้วน" or "บาทสตางค์". + Currencies num2words cannot spell in Thai keep frappe's wording. + """ + if frappe.local.lang == "th": + try: + return num2words(amount, lang="th", to="currency", currency=currency) + except NotImplementedError: + pass + return frappe.utils.money_in_words(amount, currency) + + +def get_in_words(doc): + """`in_words` for print formats: re-derived in the print language instead + of the language of whoever saved the document.""" + amount = abs(doc.grand_total if doc.is_rounded_total_disabled() else doc.rounded_total) + return money_in_words(amount, doc.currency) def get_letter_head_company(doc=None):