Improvements for business design

This commit is contained in:
David Bomba 2025-02-02 13:20:16 +11:00
parent f24fd3f2a0
commit b42799c684
10 changed files with 80 additions and 177 deletions

View File

@ -1353,8 +1353,6 @@ class PdfBuilder
if (is_null($this->service->config->entity->{$_variable}) || empty($this->service->config->entity->{$_variable})) { if (is_null($this->service->config->entity->{$_variable}) || empty($this->service->config->entity->{$_variable})) {
return true; return true;
} }
// nlog("{$_variable} - {$this->service->config->entity->{$_variable}}");
return false; return false;
} }
@ -1377,11 +1375,11 @@ class PdfBuilder
$elements = [ $elements = [
['element' => 'div', 'properties' => ['style' => 'display: flex; flex-direction: column;'], 'elements' => [ ['element' => 'div', 'properties' => ['style' => 'display: flex; flex-direction: column;'], 'elements' => [
['element' => 'div', 'properties' => ['data-ref' => 'total_table-public_notes', 'style' => 'text-align: left;'], 'elements' => [ ['element' => 'div', 'properties' => ['data-ref' => 'total_table-public_notes', 'style' => 'text-align: left;'], 'elements' => [
['element' => 'span', 'content' => strtr(str_replace(["labels", "values"], ["",""], $_variables['values']['$entity.public_notes']), $_variables)] ['element' => 'div', 'content' => strtr(str_replace(["labels", "values"], ["",""], $_variables['values']['$entity.public_notes']), $_variables)]
]], ]],
['element' => 'div', 'content' => '', 'properties' => ['style' => 'text-align: left; display: flex; flex-direction: column; page-break-inside: auto;'], 'elements' => [ ['element' => 'div', 'content' => '', 'properties' => ['style' => 'text-align: left; display: flex; flex-direction: column; page-break-inside: auto;'], 'elements' => [
['element' => 'span', 'content' => '$entity.terms_label: ', 'properties' => ['data-ref' => 'total_table-terms-label', 'style' => "font-weight:bold; text-align: left; margin-top: 1rem; {$show_terms_label}"]], ['element' => 'div', 'content' => '$entity.terms_label: ', 'properties' => ['data-ref' => 'total_table-terms-label', 'style' => "font-weight:bold; text-align: left; margin-top: 1rem; {$show_terms_label}"]],
['element' => 'span', 'content' => strtr(str_replace("labels", "", $_variables['values']['$entity.terms']), $_variables['labels']), 'properties' => ['data-ref' => 'total_table-terms', 'style' => 'text-align: left;']], ['element' => 'div', 'content' => strtr(str_replace("labels", "", $_variables['values']['$entity.terms']), $_variables['labels']), 'properties' => ['data-ref' => 'total_table-terms', 'style' => 'text-align: left;']],
]], ]],
['element' => 'img', 'properties' => ['style' => 'max-width: 50%; height: auto;', 'src' => '$contact.signature', 'id' => 'contact-signature']], ['element' => 'img', 'properties' => ['style' => 'max-width: 50%; height: auto;', 'src' => '$contact.signature', 'id' => 'contact-signature']],
['element' => 'div', 'properties' => ['style' => 'display: flex; align-items: flex-start; page-break-inside: auto;'], 'elements' => [ ['element' => 'div', 'properties' => ['style' => 'display: flex; align-items: flex-start; page-break-inside: auto;'], 'elements' => [
@ -1440,8 +1438,8 @@ class PdfBuilder
foreach ($taxes as $i => $tax) { foreach ($taxes as $i => $tax) {
$elements[1]['elements'][] = ['element' => 'div', 'elements' => [ $elements[1]['elements'][] = ['element' => 'div', 'elements' => [
['element' => 'span', 'content', 'content' => $tax['name'], 'properties' => ['data-ref' => 'totals-table-total_tax_' . $i . '-label']], ['element' => 'p', 'content', 'content' => $tax['name'], 'properties' => ['data-ref' => 'totals-table-total_tax_' . $i . '-label']],
['element' => 'span', 'content', 'content' => $this->service->config->formatMoney($tax['total']), 'properties' => ['data-ref' => 'totals-table-total_tax_' . $i]], ['element' => 'p', 'content', 'content' => $this->service->config->formatMoney($tax['total']), 'properties' => ['data-ref' => 'totals-table-total_tax_' . $i]],
]]; ]];
} }
} elseif ($variable == '$line_taxes') { } elseif ($variable == '$line_taxes') {
@ -1453,8 +1451,8 @@ class PdfBuilder
foreach ($taxes as $i => $tax) { foreach ($taxes as $i => $tax) {
$elements[1]['elements'][] = ['element' => 'div', 'elements' => [ $elements[1]['elements'][] = ['element' => 'div', 'elements' => [
['element' => 'span', 'content', 'content' => $tax['name'], 'properties' => ['data-ref' => 'totals-table-line_tax_' . $i . '-label']], ['element' => 'p', 'content', 'content' => $tax['name'], 'properties' => ['data-ref' => 'totals-table-line_tax_' . $i . '-label']],
['element' => 'span', 'content', 'content' => $this->service->config->formatMoney($tax['total']), 'properties' => ['data-ref' => 'totals-table-line_tax_' . $i]], ['element' => 'p', 'content', 'content' => $this->service->config->formatMoney($tax['total']), 'properties' => ['data-ref' => 'totals-table-line_tax_' . $i]],
]]; ]];
} }
} elseif (Str::startsWith($variable, '$custom_surcharge')) { } elseif (Str::startsWith($variable, '$custom_surcharge')) {
@ -1463,28 +1461,28 @@ class PdfBuilder
$visible = intval(str_replace(['0','.'], '', ($this->service->config->entity->{$_variable} ?? ''))) != 0; $visible = intval(str_replace(['0','.'], '', ($this->service->config->entity->{$_variable} ?? ''))) != 0;
$elements[1]['elements'][] = ['element' => 'div', 'elements' => [ $elements[1]['elements'][] = ['element' => 'div', 'elements' => [
['element' => 'span', 'content' => $variable . '_label', 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1) . '-label']], ['element' => 'p', 'content' => $variable . '_label', 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1) . '-label']],
['element' => 'span', 'content' => $variable, 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1)]], ['element' => 'p', 'content' => $variable, 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1)]],
]]; ]];
} elseif (Str::startsWith($variable, '$custom')) { } elseif (Str::startsWith($variable, '$custom')) {
$field = explode('_', $variable); $field = explode('_', $variable);
$visible = is_object($this->service->company->custom_fields) && property_exists($this->service->company->custom_fields, $field[1]) && !empty($this->service->company->custom_fields->{$field[1]}); $visible = is_object($this->service->company->custom_fields) && property_exists($this->service->company->custom_fields, $field[1]) && !empty($this->service->company->custom_fields->{$field[1]});
$elements[1]['elements'][] = ['element' => 'div', 'elements' => [ $elements[1]['elements'][] = ['element' => 'div', 'elements' => [
['element' => 'span', 'content' => $variable . '_label', 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1) . '-label']], ['element' => 'p', 'content' => $variable . '_label', 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1) . '-label']],
['element' => 'span', 'content' => $variable, 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1)]], ['element' => 'p', 'content' => $variable, 'properties' => ['hidden' => !$visible, 'data-ref' => 'totals_table-' . substr($variable, 1)]],
]]; ]];
} else { } else {
$elements[1]['elements'][] = ['element' => 'div', 'elements' => [ $elements[1]['elements'][] = ['element' => 'div', 'elements' => [
['element' => 'span', 'content' => $variable . '_label', 'properties' => ['data-ref' => 'totals_table-' . substr($variable, 1) . '-label']], ['element' => 'p', 'content' => $variable . '_label', 'properties' => ['data-ref' => 'totals_table-' . substr($variable, 1) . '-label']],
['element' => 'span', 'content' => $variable, 'properties' => ['data-ref' => 'totals_table-' . substr($variable, 1)]], ['element' => 'p', 'content' => $variable, 'properties' => ['data-ref' => 'totals_table-' . substr($variable, 1)]],
]]; ], 'properties' => ['class' => 'totals_table-' . substr($variable, 1)]];
} }
} }
$elements[1]['elements'][] = ['element' => 'div', 'elements' => [ $elements[1]['elements'][] = ['element' => 'div', 'elements' => [
['element' => 'span', 'content' => '',], ['element' => 'p', 'content' => '',],
['element' => 'span', 'content' => ''], ['element' => 'p', 'content' => ''],
]]; ]];
@ -1991,7 +1989,8 @@ class PdfBuilder
'/\*\*.*?\*\*/', // Bold '/\*\*.*?\*\*/', // Bold
'/\*.*?\*/', // Italic '/\*.*?\*/', // Italic
'/__.*?__/', // Bold '/__.*?__/', // Bold
'/_.*?_/', // Italic // '/_.*?_/', // Italic
'/(?<!\w)_([^_]+)_(?!\w)/',
'/`.*?`/', // Inline code '/`.*?`/', // Inline code
'/^\s*>/m', // Blockquotes '/^\s*>/m', // Blockquotes
'/^\s*```/m', // Code blocks '/^\s*```/m', // Code blocks
@ -2027,7 +2026,6 @@ class PdfBuilder
$contains_html = str_contains($child['content'], '<') && str_contains($child['content'], '>'); $contains_html = str_contains($child['content'], '<') && str_contains($child['content'], '>');
if ($contains_html) { if ($contains_html) {
// Encode any HTML elements now so that DOMDocument doesn't throw any errors, // Encode any HTML elements now so that DOMDocument doesn't throw any errors,
// Later we can decode specific elements. // Later we can decode specific elements.

View File

@ -92,7 +92,7 @@ class PdfService
try { try {
$html = $this->getHtml(); $html = $this->getHtml();
nlog($html);
$pdf = $this->resolvePdfEngine($html); $pdf = $this->resolvePdfEngine($html);
$numbered_pdf = $this->pageNumbering($pdf, $this->company); $numbered_pdf = $this->pageNumbering($pdf, $this->company);

View File

@ -227,22 +227,6 @@
text-align: right; text-align: right;
} }
#table-totals
> *
[data-element='product-table-balance-due-label'],
#table-totals
> *
[data-element='product-table-balance-due'] {
font-weight: bold;
font-size: 1.4rem;
}
#table-totals
> *
[data-element='product-table-balance-due'] {
color: var(--primary-color);
}
#table-totals > * > :last-child { #table-totals > * > :last-child {
text-align: right; text-align: right;
padding-right: 1.5rem; padding-right: 1.5rem;
@ -438,47 +422,43 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td> <td>
<div class="client-entity-wrapper"> <div class="client-entity-wrapper">
<div class="client-wrapper-left-side"> <div class="client-wrapper-left-side">
<div> <div>
<h4 class="entity-label" style="margin-top:0px; margin-bottom:10px;">$entity_label</h4> <h4 class="entity-label" style="margin-top:0px; margin-bottom:10px;">$entity_label</h4>
<div id="client-details" cellspacing="0" cellpadding="0" ></div> <div id="client-details" cellspacing="0" cellpadding="0" ></div>
<div id="vendor-details" cellspacing="0" cellpadding="0"></div> <div id="vendor-details" cellspacing="0" cellpadding="0"></div>
</div>
<div>
<h4 class="entity-label" style="opacity: 0; margin-top:0px; margin-bottom:10px;">&</h4>
<div id="shipping-details" cellspacing="0" cellpadding="0"></div>
</div>
</div> </div>
<div>
<h4 class="entity-label" style="opacity: 0; margin-top:0px; margin-bottom:10px;">&</h4> <div class="entity-details-wrapper-right-side">
<div id="shipping-details" cellspacing="0" cellpadding="0"></div> <h4 class="entity-label" style="margin-top:0px; margin-bottom:10px; color:transparent;">$entity_label</h4>
<div class="entity-details-wrapper">
<table id="entity-details" dir="$dir" cellspacing="0" cellpadding="0"></table>
</div>
</div> </div>
</div> </div>
<div class="entity-details-wrapper-right-side"> <table id="product-table" cellspacing="0" data-ref="table"></table>
<h4 class="entity-label" style="margin-top:0px; margin-bottom:10px; color:transparent;">$entity_label</h4> <table id="task-table" cellspacing="0" data-ref="table"></table>
<div class="entity-details-wrapper"> <table id="delivery-note-table" cellspacing="0" data-ref="table"></table>
<table id="entity-details" dir="$dir" cellspacing="0" cellpadding="0"></table> <table id="statement-invoice-table" cellspacing="0" data-ref="table"></table>
</div> <div id="statement-invoice-table-totals" data-ref="statement-totals"></div>
</div> <table id="statement-payment-table" cellspacing="0" data-ref="table"></table>
</div> <div id="statement-payment-table-totals" data-ref="statement-totals"></div>
<table id="statement-credit-table" cellspacing="0" data-ref="table"></table>
<table id="product-table" cellspacing="0" data-ref="table"></table> <div id="statement-credit-table-totals" data-ref="statement-totals"></div>
<table id="statement-aging-table" cellspacing="0" data-ref="table"></table>
<table id="task-table" cellspacing="0" data-ref="table"></table> <div id="statement-aging-table-totals" data-ref="statement-totals"></div>
<div id="table-totals" cellspacing="0">$status_logo</div>
<table id="delivery-note-table" cellspacing="0" data-ref="table"></table> </td>
</tr>
<table id="statement-invoice-table" cellspacing="0" data-ref="table"></table>
<div id="statement-invoice-table-totals" data-ref="statement-totals"></div>
<table id="statement-payment-table" cellspacing="0" data-ref="table"></table>
<div id="statement-payment-table-totals" data-ref="statement-totals"></div>
<table id="statement-credit-table" cellspacing="0" data-ref="table"></table>
<div id="statement-credit-table-totals" data-ref="statement-totals"></div>
<table id="statement-aging-table" cellspacing="0" data-ref="table"></table>
<div id="statement-aging-table-totals" data-ref="statement-totals"></div>
<div id="table-totals" cellspacing="0">$status_logo</div>
</td>
</tr>
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>

View File

@ -41,11 +41,18 @@
.header-container { .header-container {
display: grid; display: grid;
grid-template-columns: 1.8fr 1fr 1fr; grid-template-columns: 1fr auto 1fr;
grid-gap: 20px; align-items: start;
gap: 1rem;
width:100%;
margin-bottom: 2rem; margin-bottom: 2rem;
} }
.company-logo-container {
justify-self: start;
align-self: start;
}
.company-logo { .company-logo {
max-width: $company_logo_size; max-width: $company_logo_size;
} }
@ -55,6 +62,8 @@
} }
#company-details { #company-details {
justify-self: center;
align-self: start;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
color: #AAA9A9; color: #AAA9A9;
@ -62,6 +71,8 @@
} }
#company-address { #company-address {
justify-self: end;
align-self: start;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
color: #b1b1b1; color: #b1b1b1;
@ -173,14 +184,6 @@
background: #f7f7f7; background: #f7f7f7;
} }
[data-element='product-table-balance-due-label'],
[data-element='product-table-balance-due'],
[data-element='task-table-balance-due-label'],
[data-element='task-table-balance-due'] {
color: var(--secondary-color) !important;
font-weight: bold !important;
}
#table-totals > *:last-child { #table-totals > *:last-child {
border-bottom-left-radius: 1rem; border-bottom-left-radius: 1rem;
border-bottom-right-radius: 1rem; border-bottom-right-radius: 1rem;
@ -220,22 +223,6 @@
padding-right: 17px; padding-right: 17px;
} }
#table-totals
> *
[data-element='product-table-balance-due-label'],
#table-totals
> *
[data-element='product-table-balance-due'] {
font-weight: bold;
font-size: 1.2rem;
}
#table-totals
> *
[data-element='product-table-balance-due'] {
color: red;
}
#table-totals > * > :last-child { #table-totals > * > :last-child {
text-align: right; text-align: right;
padding-right: 1rem; padding-right: 1rem;
@ -263,6 +250,7 @@
padding: 1rem; padding: 1rem;
border-top-left-radius: 7px; border-top-left-radius: 7px;
border-bottom-left-radius: 7px; border-bottom-left-radius: 7px;
white-space: nowrap;
} }
[data-ref="totals_table-outstanding"] { [data-ref="totals_table-outstanding"] {
background-color: var(--secondary-color); background-color: var(--secondary-color);
@ -272,6 +260,7 @@
padding: 1rem; padding: 1rem;
border-top-right-radius: 7px; border-top-right-radius: 7px;
border-bottom-right-radius: 7px; border-bottom-right-radius: 7px;
white-space: nowrap;
} }
[data-ref="statement-totals"] { [data-ref="statement-totals"] {
@ -399,13 +388,11 @@
<td> <td>
<div id="body"> <div id="body">
<div class="header-container"> <div class="header-container">
<img <div class="company-logo-container">
src="$company.logo" <img class="company-logo" src="$company.logo" alt="$company.name logo">
class="company-logo" </div>
alt="$company.name logo" <div id="company-details"></div>
/> <div id="company-address"></div>
<div id="company-details"></div>
<div id="company-address"></div>
</div> </div>
<div class="client-and-entity-wrapper"> <div class="client-and-entity-wrapper">
<div id="client-details"><p class="entity-issued-to">$entity_issued_to_label</p></div> <div id="client-details"><p class="entity-issued-to">$entity_issued_to_label</p></div>

View File

@ -62,7 +62,7 @@
} }
#company-details { #company-details {
justify-self: center; justify-self: center;
align-self: start; align-self: start;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -185,7 +185,7 @@
padding-right: 1rem; padding-right: 1rem;
padding-left: 1rem; padding-left: 1rem;
gap: 80px; gap: 80px;
page-break-inside: avoid; page-break-inside: auto;
overflow: visible !important; overflow: visible !important;
} }
@ -209,15 +209,6 @@
margin-bottom: calc(.75rem * var(--tw-space-y-reverse)); margin-bottom: calc(.75rem * var(--tw-space-y-reverse));
} }
#table-totals>* [data-element='product-table-balance-due-label'],
#table-totals>* [data-element='product-table-balance-due'] {
font-weight: bold;
}
#table-totals>* [data-element='product-table-balance-due'] {
color: var(--primary-color);
}
#table-totals>*> :last-child { #table-totals>*> :last-child {
text-align: right; text-align: right;
padding-right: 0.5rem; padding-right: 0.5rem;
@ -388,10 +379,15 @@
<div id="statement-credit-table-totals" data-ref="statement-totals"></div> <div id="statement-credit-table-totals" data-ref="statement-totals"></div>
<table id="statement-aging-table" cellspacing="0" data-ref="table"></table> <table id="statement-aging-table" cellspacing="0" data-ref="table"></table>
<div id="statement-aging-table-totals" data-ref="statement-totals"></div> <div id="statement-aging-table-totals" data-ref="statement-totals"></div>
<div id="table-totals" cellspacing="0">$status_logo</div>
</div> </div>
</td> </td>
</tr> </tr>
<tr>
<td>
<div id="table-totals" cellspacing="0">$status_logo</div>
</td>
</tr>
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>

View File

@ -233,13 +233,6 @@
text-align: right; text-align: right;
} }
#table-totals
> *
[data-element='product-table-balance-due'] {
font-weight: bold;
color: var(--primary-color);
}
#table-totals > * > * { #table-totals > * > * {
padding-left: 0.5rem; padding-left: 0.5rem;
} }

View File

@ -214,21 +214,6 @@
text-align: right; text-align: right;
} }
#table-totals
> *
[data-element='product-table-balance-due-label'],
#table-totals
> *
[data-element='product-table-balance-due'] {
font-weight: bold;
}
#table-totals
> *
[data-element='product-table-balance-due'] {
color: var(--primary-color);
}
#table-totals > * > :last-child { #table-totals > * > :last-child {
text-align: right; text-align: right;
padding-right: 0.5rem; padding-right: 0.5rem;

View File

@ -243,21 +243,6 @@
text-align: right; text-align: right;
} }
#table-totals
> *
[data-element='product-table-balance-due-label'],
#table-totals
> *
[data-element='product-table-balance-due'] {
font-weight: bold;
}
#table-totals
> *
[data-element='product-table-balance-due'] {
color: var(--primary-color);
}
#table-totals > * > :last-child { #table-totals > * > :last-child {
text-align: right; text-align: right;
padding-right: 0rem; padding-right: 0rem;

View File

@ -257,12 +257,6 @@
text-align: right; text-align: right;
} }
#table-totals > * [data-element="product-table-balance-due-label"],
#table-totals > * [data-element="product-table-balance-due"] {
font-weight: bold;
font-size: 1.3rem;
}
[data-ref="total_table-footer"] { [data-ref="total_table-footer"] {
margin-top: 1rem; margin-top: 1rem;
margin-bottom: 1rem; margin-bottom: 1rem;

View File

@ -231,21 +231,6 @@
text-align: right; text-align: right;
} }
#table-totals
> *
[data-element='product-table-balance-due-label'],
#table-totals
> *
[data-element='product-table-balance-due'] {
font-weight: bold;
}
#table-totals
> *
[data-element='product-table-balance-due'] {
color: var(--primary-color);
}
#table-totals > * > :last-child { #table-totals > * > :last-child {
text-align: right; text-align: right;
padding-right: 1rem; padding-right: 1rem;