Invoice print format added.

This commit is contained in:
Ty Reynolds
2026-01-14 10:15:27 -05:00
parent f871334fb4
commit eee74501cd
3 changed files with 177 additions and 1 deletions

View File

@@ -5,7 +5,22 @@ app_description = "Custom ERPNext extensions"
app_email = "dev@nsinnovations.net"
app_license = "MIT"
# Load on every page
app_include_js = [
"/assets/ns_app/js/custom.js"
"/assets/ns_app/js/sales_invoice.js"
]
# Load on Sales Invoice form
doctype_js = {
"Sales Invoice": "public/js/sales_invoice.js"
}
# Fixtures tracked in Git
fixtures = [
{
"dt": "Print Format",
"filters": [
["name", "=", "Sales Invoice - NS"]
]
}
]

View File

@@ -0,0 +1,153 @@
<style>
/* 💡 Reserve space in PRINT/PDF so table does not overlap window address */
@media print {
.window-address-space {
padding-top: 1in;
}
}
</style>
<div style="font-family: Helvetica, Arial, sans-serif; font-size: 12px; color: #333;">
{% set company_doc = frappe.get_doc("Company", company) %}
<!-- Header -->
<table style="width: 100%; border-bottom: 1px solid #ccc; margin-bottom: 10px;">
<tr>
<td>
<h2 style="margin: 0;"><strong>{{ company_doc.company_name }}</strong></h2>
<p style="margin: 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">
1063 Chestnut Level Road, Quarryville PA 17566<br>
{% if company_doc.address %}{{ company_doc.address }}<br>{% endif %}
{% if company_doc.phone_no %}Phone: {{ company_doc.phone_no }}{% endif %}
{% if company_doc.email %} | Email: {{ company_doc.email }}{% endif %}
</p>
</td>
<td style="text-align: right; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">
<strong>Invoice</strong><br>
<span>{{ doc.name }}</span><br>
Date: {{ frappe.utils.formatdate(doc.posting_date, "MM-dd-yyyy") }}
</td>
</tr>
</table>
<!-- Due Date & Terms -->
<table style="width:100%; margin-top: -4px; margin-bottom: 10px;">
<tr>
<td style="width:60%;"></td>
<td style="width:40%; text-align:right; font-family: Helvetica, Arial, sans-serif; font-size: 15px; line-height: 1.4;">
<strong>Due Date:</strong> {{ frappe.utils.formatdate(doc.due_date, "MM-dd-yyyy") }}<br>
<strong>Terms:</strong> {{ doc.payment_terms_template or "Net 30" }}
</td>
</tr>
</table>
<!-- WINDOW ADDRESS (9x4 envelope position) -->
<div style="
position: absolute;
top: 1.5in;
left: 1.125in;
width: 4.5in;
height: 1.25in;
font-size: 15px;
line-height: 1.15em;
overflow: hidden;
">
{{ doc.customer_name }}<br>
{{ doc.address_display or doc.customer_address }}
</div>
<!-- PRINT SPACE WRAPPER -->
<div class="window-address-space">
{% if doc.custom_subscription_data or doc.custom_invoice_notes %}
<table style="width:100%; margin:0 0 6px 0; border-collapse:collapse;">
<tr>
<td style="font-size:14px; padding:0; line-height:1.3;">
{% if doc.custom_subscription_data %}
<div style="margin:0; padding:0; font-weight:bold;">
{{ doc.custom_subscription_data }}
</div>
{% endif %}
{% if doc.custom_invoice_notes %}
<div style="margin:0; padding:0; white-space:pre-line;">
{{ doc.custom_invoice_notes }}
</div>
{% endif %}
</td>
</tr>
</table>
{% endif %}
<!-- Items Table -->
<table style="width: 100%; border-collapse: collapse; margin-bottom: 10px;">
<thead>
<tr style="background-color: #f5f5f5;">
<th style="border: 1px solid #ccc; padding: 6px;">Item</th>
<th style="border: 1px solid #ccc; padding: 6px;">Description</th>
<th style="border: 1px solid #ccc; padding: 6px; text-align: right;">Qty</th>
<th style="border: 1px solid #ccc; padding: 6px; text-align: right;">Rate</th>
<th style="border: 1px solid #ccc; padding: 6px; text-align: right;">Amount</th>
</tr>
</thead>
<tbody>
{% for row in doc.items %}
<tr>
<td style="border: 1px solid #ccc; padding: 6px; font-size: 14px">{{ row.item_code }}</td>
<td style="border: 1px solid #ccc; padding: 6px; font-size: 14px">{{ row.item_name }}</td>
<td style="border: 1px solid #ccc; padding: 6px; font-size: 14px; text-align: right;">{{ row.qty }}</td>
<td style="border: 1px solid #ccc; padding: 6px; font-size: 14px; text-align: right;">{{ row.rate }}</td>
<td style="border: 1px solid #ccc; padding: 6px; font-size: 14px; text-align: right;">{{ row.amount }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div style="font-family: Helvetica, Arial, sans-serif; font-size: 15px; color: #333; margin-top: 10px; width: 40%; margin-left: auto;">
<p style="display:flex; justify-content:space-between;">
<strong>Subtotal:</strong><span>{{ doc.total }}</span>
</p>
{% for tax in doc.taxes %}
<p style="display:flex; justify-content:space-between;">
<strong>{{ tax.account_head }} ({{ tax.rate }}%):</strong>
<span>{{ tax.tax_amount }}</span>
</p>
{% endfor %}
<p style="display:flex; justify-content:space-between;">
<strong>Total:</strong><span>{{ doc.grand_total }}</span>
</p>
<p style="display:flex; justify-content:space-between;">
<strong>Paid:</strong><span>{{ doc.total_advance }}</span>
</p>
<p style="display:flex; justify-content:space-between;">
<strong>Balance Due:</strong><span>{{ doc.outstanding_amount }}</span>
</p>
</div>
</div> <!-- end print space wrapper -->
<!-- Footer -->
<div style="margin-top: 23px; font-size: 10px; color: #777; text-align: center;">
<p style="white-space: pre-line; margin: 0;">
Prompt payment is always appreciated. We accept payments by check or over the phone using a debit or credit card. Automatic payment setup is also available upon request.
Invoices over 30 days may be charged a late payment fee of 1.5% per month with a minimum fee of $5.
Thanks for your business.
</p>
</div>
</div>

View File

@@ -0,0 +1,8 @@
{
"doctype": "Print Format",
"name": "Sales Invoice - NS",
"doc_type": "Sales Invoice",
"print_format_type": "Jinja",
"standard": "Yes",
"disabled": 0
}