Invoice print format updated and Sales Order print format added.

This commit is contained in:
Ty Reynolds
2026-01-15 08:38:20 -05:00
parent eee74501cd
commit bb60e17770
5 changed files with 232 additions and 28 deletions

View File

@@ -1,5 +1,5 @@
<style>
/* 💡 Reserve space in PRINT/PDF so table does not overlap window address */
/* Reserve space in PRINT/PDF so table does not overlap window address */
@media print {
.window-address-space {
padding-top: 1in;
@@ -24,7 +24,7 @@
</p>
</td>
<td style="text-align: right; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">
<strong>Invoice</strong><br>
<strong>Invoice </strong>
<span>{{ doc.name }}</span><br>
Date: {{ frappe.utils.formatdate(doc.posting_date, "MM-dd-yyyy") }}
</td>
@@ -89,7 +89,7 @@
<!-- Items Table -->
<table style="width: 100%; border-collapse: collapse; margin-bottom: 10px;">
<table style="width: 100%; border-collapse: collapse; margin-bottom:0;">
<thead>
<tr style="background-color: #f5f5f5;">
<th style="border: 1px solid #ccc; padding: 6px;">Item</th>
@@ -112,29 +112,59 @@
</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>
<!-- Totals (boxed, tight to items table) -->
<table style="width:40%; margin-left:auto; border-collapse:collapse; font-size:14px; margin-top:0;">
<tbody>
<tr>
<td style="width:220px; padding:6px 8px; text-align:right;">
<strong>Subtotal</strong>
</td>
<td style="padding:6px 12px; text-align:right; border:1px solid #ccc;">
{{ doc.total }}
</td>
</tr>
{% for tax in doc.taxes %}
<tr>
<td style="padding:6px 8px; text-align:right;">
<strong>{{ tax.account_head }} ({{ tax.rate }}%)</strong>
</td>
<td style="padding:6px 12px; text-align:right; border:1px solid #ccc;">
{{ tax.tax_amount }}
</td>
</tr>
{% endfor %}
<tr>
<td style="padding:6px 8px; text-align:right;">
<strong>Total</strong>
</td>
<td style="padding:6px 12px; text-align:right; border:1px solid #ccc;">
{{ doc.grand_total }}
</td>
</tr>
<tr>
<td style="padding:6px 8px; text-align:right;">
<strong>Paid</strong>
</td>
<td style="padding:6px 12px; text-align:right; border:1px solid #ccc;">
{{ doc.total_advance }}
</td>
</tr>
<tr>
<td style="padding:6px 8px; text-align:right;">
<strong>Balance Due</strong>
</td>
<td style="padding:6px 12px; text-align:right; border:1px solid #ccc;">
{{ doc.outstanding_amount }}
</td>
</tr>
</tbody>
</table>
</div> <!-- end print space wrapper -->

View File

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

View File

@@ -0,0 +1,166 @@
<style>
@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-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-size: 14px;">
<strong>Sales Order</strong><br>
<span>{{ doc.name }}</span><br>
Date: {{ frappe.utils.formatdate(doc.transaction_date, "MM-dd-yyyy") }}
</td>
</tr>
</table>
<!-- Delivery 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-size:15px; line-height:1.4;">
{% if doc.delivery_date %}
<strong>Delivery Date:</strong>
{{ frappe.utils.formatdate(doc.delivery_date, "MM-dd-yyyy") }}<br>
{% endif %}
<strong>Terms:</strong> {{ doc.payment_terms_template or "Net 30" }}
</td>
</tr>
</table>
<!-- WINDOW ADDRESS -->
<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>
<div class="window-address-space">
{% if doc.custom_subscription_data or doc.custom_invoice_notes %}
<table style="width:100%; margin-bottom:6px;">
<tr>
<td style="font-size:14px; line-height:1.3;">
{% if doc.custom_subscription_data %}
<div style="font-weight:bold;">
{{ doc.custom_subscription_data }}
</div>
{% endif %}
{% if doc.custom_invoice_notes %}
<div style="white-space:pre-line;">
{{ doc.custom_invoice_notes }}
</div>
{% endif %}
</td>
</tr>
</table>
{% endif %}
<!-- Items -->
<table style="width:100%; border-collapse:collapse; margin-bottom:0;">
<thead>
<tr style="background:#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>
<!-- Totals -->
<table style="width:73%; margin-left:auto; border-collapse:collapse; font-size:14px; margin-top:0px;">
<tbody>
<tr>
<td style="padding:6px 8px; text-align:right;">
<strong>Subtotal</strong>
</td>
<td style="padding:6px 12px; text-align:right; border:1px solid #ccc;">
{{ doc.total }}
</td>
</tr>
{% for tax in doc.taxes %}
<tr>
<td style="padding:6px 8px; text-align:right;">
<strong>{{ tax.account_head }} ({{ tax.rate }}%)</strong>
</td>
<td style="padding:6px 12px; text-align:right; border:1px solid #ccc;">
{{ tax.tax_amount }}
</td>
</tr>
{% endfor %}
<tr>
<td style="padding:6px 8px; text-align:right;">
<strong>Total</strong>
</td>
<td style="padding:6px 12px; text-align:right; border:1px solid #ccc;">
<strong>{{ doc.grand_total }}</strong>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Footer -->
<div style="margin-top:23px; font-size:10px; color:#777; text-align:center;">
<p style="white-space:pre-line; margin:0;">
This Sales Order is not an invoice.
Pricing and availability subject to confirmation.
Thank you for your business.
</p>
</div>
</div>

View File

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

View File

@@ -40,7 +40,7 @@ frappe.ui.form.on("Customer", {
// Defaults
frm.set_value("territory", "United States");
// Add Owner fields to Quick Entry
// Add Company fields to Quick Entry
frm.add_custom_field({
fieldname: "company_name",
label: "Company Name",
@@ -50,7 +50,7 @@ frappe.ui.form.on("Customer", {
});
},
// ZIP auto-fill (kept from previous step)
// ZIP auto-fill
pincode(frm) {
if (!frm.is_quick_entry) return;