1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-10 05:02:36 +01:00

Merge pull request #9416 from turbo124/v5-develop

v5.8.39
This commit is contained in:
David Bomba 2024-04-01 18:25:11 +11:00 committed by GitHub
commit 1ed9d329a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 3482 additions and 43 deletions

View File

@ -1 +1 @@
5.8.38
5.8.39

View File

@ -168,7 +168,6 @@ class BaseRule implements RuleInterface
/* We should only apply taxes for configured states */
if(!array_key_exists($this->client->country->iso_3166_2, $this->region_codes)) {
nlog('Automatic tax calculations not supported for this country - defaulting to company country');
nlog("With new logic, we should never see this");
}
/** Harvest the client_region */

View File

@ -134,6 +134,7 @@ class BaseExport
protected array $invoice_report_keys = [
'name' => 'client.name',
"currency" => "client.currency_id",
"invoice_number" => "invoice.number",
"amount" => "invoice.amount",
"balance" => "invoice.balance",
@ -174,6 +175,8 @@ class BaseExport
];
protected array $recurring_invoice_report_keys = [
'name' => 'client.name',
"currency" => "client.currency_id",
"invoice_number" => "recurring_invoice.number",
"amount" => "recurring_invoice.amount",
"balance" => "recurring_invoice.balance",
@ -298,6 +301,8 @@ class BaseExport
];
protected array $quote_report_keys = [
'name' => 'client.name',
"currency" => "client.currency_id",
'custom_value1' => 'quote.custom_value1',
'custom_value2' => 'quote.custom_value2',
'custom_value3' => 'quote.custom_value3',
@ -336,6 +341,8 @@ class BaseExport
];
protected array $credit_report_keys = [
'name' => 'client.name',
"currency" => "client.currency_id",
"credit_number" => "credit.number",
"amount" => "credit.amount",
"balance" => "credit.balance",
@ -368,6 +375,7 @@ class BaseExport
];
protected array $payment_report_keys = [
'name' => 'client.name',
"date" => "payment.date",
"amount" => "payment.amount",
"refunded" => "payment.refunded",
@ -385,7 +393,6 @@ class BaseExport
"custom_value4" => "payment.custom_value4",
"user" => "payment.user_id",
"assigned_user" => "payment.assigned_user_id",
];
protected array $expense_report_keys = [

View File

@ -138,9 +138,9 @@ class TaskExport extends BaseExport
{
$entity = [];
$transformed_entity = $this->entity_transformer->transform($task);
nlog($this->input['report_keys']);
foreach (array_values($this->input['report_keys']) as $key) {
nlog($key);
$parts = explode('.', $key);
if (is_array($parts) && $parts[0] == 'task' && array_key_exists($parts[1], $transformed_entity)) {

View File

@ -87,7 +87,7 @@ class InvitationController extends Controller
->firstOrFail();
if ($invitation->trashed() || $invitation->{$entity}->is_deleted) {
return $this->render('generic.not_available', ['account' => $invitation->company->account, 'company' => $invitation->company]);
return $this->render('generic.not_available', ['passed_account' => $invitation->company->account, 'passed_company' => $invitation->company]);
}
if ($invitation->contact->trashed()) {
@ -138,11 +138,10 @@ class InvitationController extends Controller
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent]);
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent])->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
}
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]);
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})])->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
}
private function fireEntityViewedEvent($invitation, $entity_string)

View File

@ -26,7 +26,7 @@ class SubscriptionPurchaseController extends Controller
App::setLocale($subscription->company->locale());
if ($subscription->trashed()) {
return $this->render('generic.not_available', ['account' => $subscription->company->account, 'company' => $subscription->company]);
return $this->render('generic.not_available', ['passed_account' => $subscription->company->account, 'passed_company' => $subscription->company]);
}
/* Make sure the contact is logged into the correct company for this subscription */

View File

@ -914,7 +914,7 @@ class QuoteController extends BaseController
$contact = $invitation->contact;
$quote = $invitation->quote;
$file = $quote->service()->getEInvoice($contact);
$file = $quote->service()->getEQuote($contact);
$file_name = $quote->getFileName("xml");
$headers = ['Content-Type' => 'application/xml'];

View File

@ -59,6 +59,7 @@ class ShowChartRequest extends Request
}
if (! isset($input['end_date'])) {
// $input['end_date'] = now()->lastOfMonth()->format('Y-m-d');
$input['end_date'] = now()->format('Y-m-d');
}

View File

@ -11,11 +11,12 @@
namespace App\Jobs\Cron;
use App\Libraries\MultiDB;
use App\Models\Company;
use App\Models\Invoice;
use App\Libraries\MultiDB;
use Illuminate\Support\Facades\Auth;
use App\Utils\Traits\SubscriptionHooker;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Auth;
class SubscriptionCron
{
@ -97,4 +98,61 @@ class SubscriptionCron
}
}
}
//Requires the crons to be updated and set to hourly @ 00:01
private function timezoneAware()
{
$grouped_company_ids =
Invoice::select('company_id')
->where('is_deleted', 0)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('balance', '>', 0)
->where('is_proforma', 0)
->whereDate('due_date', '<=', now()->addDay()->startOfDay())
->whereNull('deleted_at')
->whereNotNull('subscription_id')
->groupBy('company_id')
->cursor()
->each(function ($company_id){
$company = Company::find($company_id);
$timezone_now = now()->setTimezone($company->timezone()->name);
//Capture companies within the window of 00:00 and 00:30
if($timezone_now->gt($timezone_now->copy()->startOfDay()) && $timezone_now->lt($timezone_now->copy()->startOfDay()->addMinutes(30))) {
Invoice::query()
->where('company_id', $company->id)
->whereNull('deleted_at')
->where('is_deleted', 0)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('is_proforma', 0)
->whereNotNull('subscription_id')
->where('balance', '>', 0)
->whereDate('due_date', '<=', now()->setTimezone($company->timezone()->name)->addDay()->startOfDay())
->cursor()
->each(function (Invoice $invoice) {
$subscription = $invoice->subscription;
$body = [
'context' => 'plan_expired',
'client' => $invoice->client->hashed_id,
'invoice' => $invoice->hashed_id,
'subscription' => $subscription->hashed_id,
];
$this->sendLoad($subscription, $body);
//This will send the notification daily.
//We'll need to handle this by performing some action on the invoice to either archive it or delete it?
});
}
});
}
}

View File

@ -359,6 +359,17 @@ class ProcessPostmarkWebhook implements ShouldQueue
$postmark = new PostmarkClient($postmark_secret);
$messageDetail = $postmark->getOutboundMessageDetails($message_id);
try {
$messageDetail = $postmark->getOutboundMessageDetails($message_id);
} catch(\Exception $e) {
$postmark_secret = config('services.postmark-outlook.token');
$postmark = new PostmarkClient($postmark_secret);
$messageDetail = $postmark->getOutboundMessageDetails($message_id);
}
return $messageDetail;
}
@ -391,7 +402,17 @@ class ProcessPostmarkWebhook implements ShouldQueue
$postmark_secret = !empty($this->company->settings->postmark_secret) ? $this->company->settings->postmark_secret : config('services.postmark.token');
$postmark = new PostmarkClient($postmark_secret);
$messageDetail = $postmark->getOutboundMessageDetails($this->request['MessageID']);
try {
$messageDetail = $postmark->getOutboundMessageDetails($this->request['MessageID']);
}
catch(\Exception $e){
$postmark_secret = config('services.postmark-outlook.token');
$postmark = new PostmarkClient($postmark_secret);
$messageDetail = $postmark->getOutboundMessageDetails($this->request['MessageID']);
}
$recipients = collect($messageDetail['recipients'])->flatten()->implode(',');
$subject = $messageDetail->subject ?? '';

View File

@ -1525,10 +1525,11 @@ class Import implements ShouldQueue
}
}
// throw new Exception("Resource invoice/quote document not available.");
}
$entity = false;
if (array_key_exists('expense_id', $resource) && $resource['expense_id'] && array_key_exists('expenses', $this->ids)) {
$expense_id = $this->transformId('expenses', $resource['expense_id']);
$entity = Expense::query()->where('id', $expense_id)->withTrashed()->first();

View File

@ -108,7 +108,7 @@ class PdfSlot extends Component
}
public function downloadEInvoice()
public function downloadEDocument()
{
$file_name = $this->entity->numberFormatter().'.xml';

View File

@ -790,19 +790,24 @@ class BaseDriver extends AbstractPaymentDriver
'client' => $this->client->present()->name(),
]);
return sprintf('%s: %s', ctrans('texts.invoices'), \implode(', ', collect($this->payment_hash->invoices())->pluck('invoice_number')->toArray()));
// return sprintf('%s: %s', ctrans('texts.invoices'), \implode(', ', collect($this->payment_hash->invoices())->pluck('invoice_number')->toArray()));
}
/**
* Stub for disconnecting from the gateway.
*
* @return void
* @return bool
*/
public function disconnect()
{
return true;
}
/**
* Stub for checking authentication.
*
* @return bool
*/
public function auth(): bool
{
return true;

View File

@ -165,8 +165,10 @@ class StripePaymentDriver extends BaseDriver
}
if ($this->client
&& isset($this->client->country)
&& in_array($this->client->country->iso_3166_3, ['AUS', 'DNK', 'DEU', 'ITA', 'LUX', 'NOR', 'SVN', 'GBR', 'AUT', 'EST', 'GRC', 'JPN', 'MYS', 'PRT', 'ESP', 'USA', 'BEL', 'FIN', 'HKG', 'LVA', 'NLD', 'SGP', 'SWE', 'CAN', 'FRA', 'IRL', 'LTU', 'NZL', 'SVK', 'CHE'])) {
&& $this->client->currency()
&& in_array($this->client->currency()->code, ['CNY', 'AUD', 'CAD', 'EUR', 'GBP', 'HKD', 'JPY', 'SGD', 'MYR', 'NZD', 'USD'])) {
// && isset($this->client->country)
// && in_array($this->client->country->iso_3166_3, ['AUS', 'DNK', 'DEU', 'ITA', 'LUX', 'NOR', 'SVN', 'GBR', 'AUT', 'EST', 'GRC', 'JPN', 'MYS', 'PRT', 'ESP', 'USA', 'BEL', 'FIN', 'HKG', 'LVA', 'NLD', 'SGP', 'SWE', 'CAN', 'FRA', 'IRL', 'LTU', 'NZL', 'SVK', 'CHE'])) {
$types[] = GatewayType::ALIPAY;
}

View File

@ -271,7 +271,7 @@ class TemplateService
{
$this->data = $this->preProcessDataBlocks($data);
// nlog($this->data);
// nlog(json_encode($this->data));
return $this;
}

View File

@ -17,8 +17,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
'app_version' => env('APP_VERSION', '5.8.38'),
'app_tag' => env('APP_TAG', '5.8.38'),
'app_version' => env('APP_VERSION', '5.8.39'),
'app_tag' => env('APP_TAG', '5.8.39'),
'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', false),

View File

@ -5265,6 +5265,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'enable_rappen_rounding_help' => 'Arrondir les totaux au 5 le plus proche',
'duration_words' => 'Durée en mots',
'upcoming_recurring_invoices' => 'Factures récurrentes à venir',
'show_table_footer' => 'Afficher le pied du tableau',
'show_table_footer_help' => 'Afficher les totaux dans le pied du tableau',
'total_invoices' => 'Total factures',
);

View File

@ -10,9 +10,9 @@
</div>
</button>
@if($entity_type == 'invoice' && $settings->enable_e_invoice)
<button wire:loading.attr="disabled" wire:click="downloadEInvoice" class="bg-primary text-white px-4 py-4 lg:px-2 lg:py-2 rounded" type="button">
<button wire:loading.attr="disabled" wire:click="downloadEDocument" class="bg-primary text-white px-4 py-4 lg:px-2 lg:py-2 rounded" type="button">
<span>{{ ctrans('texts.download_e_invoice') }}</span>
<div wire:loading wire:target="downloadEInvoice">
<div wire:loading wire:target="downloadEDocument">
<svg class="animate-spin h-5 w-5 text-blue" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
@ -21,9 +21,9 @@
</button>
@endif
@if($entity_type == 'credit' && $settings->enable_e_invoice)
<button wire:loading.attr="disabled" wire:click="downloadECreit" class="bg-primary text-white px-4 py-4 lg:px-2 lg:py-2 rounded" type="button">
<button wire:loading.attr="disabled" wire:click="downloadEDocument" class="bg-primary text-white px-4 py-4 lg:px-2 lg:py-2 rounded" type="button">
<span>{{ ctrans('texts.download_e_credit') }}</span>
<div wire:loading wire:target="downloadECredit">
<div wire:loading wire:target="downloadEDocument">
<svg class="animate-spin h-5 w-5 text-blue" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
@ -32,9 +32,9 @@
</button>
@endif
@if($entity_type == 'quote' && $settings->enable_e_invoice)
<button wire:loading.attr="disabled" wire:click="downloadEQuote" class="bg-primary text-white px-4 py-4 lg:px-2 lg:py-2 rounded" type="button">
<button wire:loading.attr="disabled" wire:click="downloadEDocument" class="bg-primary text-white px-4 py-4 lg:px-2 lg:py-2 rounded" type="button">
<span>{{ ctrans('texts.download_e_quote') }}</span>
<div wire:loading wire:target="downloadEQuote">
<div wire:loading wire:target="downloadEDocument">
<svg class="animate-spin h-5 w-5 text-blue" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>

View File

@ -7,15 +7,15 @@
<div class="m-auto md:w-1/2 lg:w-1/2">
<div class="flex flex-col items-center">
@if($account && !$account->isPaid())
@if($passed_account && !$passed_account->isPaid())
<div>
<img src="{{ asset('images/invoiceninja-black-logo-2.png') }}"
class="border-b border-gray-100 h-18 pb-4" alt="Invoice Ninja logo">
</div>
@elseif(isset($company) && !is_null($company))
@elseif(isset($passed_company) && !is_null($passed_company))
<div>
<img src="{{ $company->present()->logo() }}"
class="mx-auto border-b border-gray-100 h-18 pb-4" alt="{{ $company->present()->name() }} logo">
<img src="{{ $passed_company->present()->logo() }}"
class="mx-auto border-b border-gray-100 h-18 pb-4" alt="{{ $passed_company->present()->name() }} logo">
</div>
@endif
<h1 class="text-center text-3xl mt-10">{{ ctrans("texts.entity_removed_title") }}</h1>

View File

@ -14,7 +14,7 @@
<div class="mb-4">
<p class="text-sm leading-6 font-medium text-gray-500">{{ $entity_type }} {{ $entity->number }}:</p>
@if($variables && $entity->terms)
<h5 data-ref="entity-terms"{!! $entity->parseHtmlVariables('terms', $variables) !!}</h5>
<h5 data-ref="entity-terms">{!! $entity->parseHtmlVariables('terms', $variables) !!}</h5>
@elseif($entity->terms)
<h5 data-ref="entity-terms" class="text-sm leading-5 text-gray-900">{!! $entity->terms !!}</h5>
@else

View File

@ -0,0 +1,219 @@
<!DOCTYPE html>
<!-- Delivery Note - TemplateID #TD12 -->
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@import url($font_url);
body {
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size !important;
}
table {
margin-top: 2rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
}
.table-header>tr>th {
border-bottom: solid 1px #efefef;
}
.table-body>tr>td {
border-bottom: solid 1px #efefef;
}
th {
text-align: left;
padding-left: 6px;
padding-right: 6px;
padding-top: 6px;
padding-bottom: 6px;
}
td {
padding-left: 6px;
padding-right: 6px;
padding-top: 1rem;
padding-bottom: 1rem;
}
.item-row {
border-bottom: 1px #000 dotted;
}
.totals-row-label {
text-align: right;
white-space: nowrap;
}
.totals-row-value {
text-align: right;
white-space: nowrap;
}
.table-totals {
display: grid;
grid-template-columns: 2fr 1fr;
}
.centered {
text-align: center;
}
.doc-title {
font-size: 32px;
}
p {
margin: 0;
padding: 0;
}
span {
padding-right: 5px;
width: 100%;
}
div .label {
text-align: right;
padding-right: 10px;
}
div .value {
text-align: left;
padding-left: 5px;
}
.two-col-grid {
display: grid;
grid-template-columns: 1fr 1fr;
}
.client-details {
margin-bottom: 0.3rem;
}
.container {
padding-top: 2rem;
}
.bottom-margin {
padding-bottom: 2rem;
}
.section-title {
font-style: italic;
color: #454545
}
.primary-color-highlight {
color: $primary_color;
}
.secondary-color-highlight {
color: $secondary_color;
}
</style>
</head>
<body>
<ninja>
<table width="100%" cellspacing="0" cellpadding="0" class="" border="0">
<tr>
<td align="left" class="doc-title">Delivery Note</td>
<td align="right">{{ img('$company.logo') }}</td>
</tr>
</table>
</ninja>
<table width="100%" cellspacing="0" cellpadding="0" class="" border="0">
<tr>
<td align="left" class="">
<div class="">
<div class="client-details">
<p class="section-title">Bill To:</p>
</div>
<div class="client-details">
<p class="primary-color-highlight">$client.name</p>
</div>
<div class="client-details">
<p style="line-height:1.4;">$client.shipping_address</p>
</div>
</div>
</td>
<td align="left">
<div class="">
<div class="client-details">
<p class="section-title">Ship To:</p>
</div>
<div class="client-details">
<p class="primary-color-highlight">$client.name</p>
</div>
<div class="client-details">
<p style="line-height:1.4;">$client.shipping_address</p>
</div>
</div>
</td>
</tr>
</table>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<tr>
<td align="left" class="">
<div class="">
<p>Order # $invoice.po_number</p>
</div>
</td>
<td align="left">
<div class="">
<p>Order Date: $invoice.date</p>
</div>
</td>
</tr>
</table>
<ninja>
{% set invoice = invoices|first %}
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="table-header">
<tr class="table-header primary-color-highlight">
<th class="">Item #</th>
<th class="" width="50%">Description</th>
<th class="centered">Quantity</th>
<th class="totals-row-label centered">Delivered</th>
<th class="totals-row-label centered">Backorder</th>
</tr>
</thead>
<tbody class="table-body">
{% for item in invoice.line_items|filter(item => item.type_id == 1) %}
<tr class="item-row">
<td class="">{{ item.product_key }}</td>
<td class="">{{ item.notes }}</td>
<td class="centered">{{ item.quantity }}</td>
<td class="totals-row-label centered">{{ item.quantity }}</td>
<td class="totals-row-label centered">{{ item.quantity - item.quantity }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</ninja>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<div class="container">
<p class="bottom-margin primary-color-highlight">Notes:</p>
$invoice.public_notes
</div>
</table>
</body>
</html>

View File

@ -0,0 +1,243 @@
<!DOCTYPE html>
<!-- Delivery Note Design - TemplateID #TD4 -->
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@import url($font_url);
body {
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size !important;
}
table {
margin-top: 1rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
}
.table-header>tr>th {
border-bottom: solid 1px #efefef;
}
.table-body>tr>td {
border-bottom: solid 1px #efefef;
}
th {
text-align: left;
padding-left: 6px;
padding-right: 6px;
padding-top: 6px;
padding-bottom: 6px;
}
td {
padding-left: 6px;
padding-right: 6px;
padding-top: 1rem;
padding-bottom: 1rem;
}
.item-row {
border-bottom: 1px #000 dotted;
}
.totals-row-label {
text-align: right;
white-space: nowrap;
}
.totals-row-value {
text-align: right;
white-space: nowrap;
}
.table-totals {
display: grid;
grid-template-columns: 2fr 1fr;
}
.centered {
text-align: center;
}
.doc-title {
font-size: 32px;
}
p {
margin: 0;
padding: 0;
}
span {
padding-right: 5px;
width: 100%;
}
div .label {
text-align: right;
padding-right: 10px;
}
div .value {
text-align: left;
padding-left: 5px;
}
.two-col-grid {
display: grid;
grid-template-columns: 1fr 1fr;
}
.three-col-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
column-gap: 0.4rem;
}
.client-details {}
.container {
padding-top: 2rem;
}
.bottom-margin {
padding-bottom: 2rem;
}
.section-title {
font-style: italic;
color: #454545;
margin-bottom: 0.3rem;
}
.primary-color-highlight {
color: $primary_color;
}
.secondary-color-highlight {
color: $secondary_color;
}
.order-details {
white-space: nowrap;
line-height: 1.4;
}
.align-left {
text-align: left;
line-height: 1.4;
}
dt {
margin-right: 7px;
}
dd {
margin-left: 3px;
}
.company-logo {
max-width: $company_logo_size;
}
</style>
</head>
<body>
<table width="100%" cellspacing="0" cellpadding="0" class="" border="0">
<tr>
<td align="left" class="doc-title">$delivery_note_label</td>
<td align="right"><img src="$company.logo" class="company-logo"></td>
</tr>
</table>
<table width="100%" height="100%" cellspacing="0" cellpadding="0" class="" border="0">
<tr>
<td style="">
<div class="three-col-grid">
<div class="" style="margin-left:0; margin-right:auto;">
<div class="client-details">
<p class="section-title">$to_label:</p>
</div>
<div id="client-details"></div>
</div>
<div class="" style="margin-left:auto; margin-right:auto;">
<div class="client-details">
<p class="section-title">$ship_to_label:</p>
</div>
<div id="shipping-details"></div>
</div>
<div style="margin-right:0; margin-left: auto;">
<div class="client-details">
<p class="section-title" style="padding-right:10px;">$details_label:</p>
</div>
<div class="two-col-grid">
<dt class="order-details primary-color-highlight">$order_number_label #</dt>
<ninja>
{%set invoice = invoices|first|e %}
<dd class="align-left primary-color-highlight">{% if invoice.po_number %} {{
invoice.po_number }} {% else %} {{ invoice.number}} {% endif %}</dd>
</ninja>
<dt class="order-details">$date_label</dt>
<dd class="align-left">$invoice.date</dd>
<dt class="order-details">$client_label #</dt>
<dd class="align-left">$client.number</dd>
<!-- <dt class="order-details">Dispatch Date </dt>
<dd class="align-left">$date</dd>
<dt class="order-details">Delivery Method </dt>
<dd class="align-left">UPS</dd> -->
</div>
</div>
</td>
</tr>
</table>
<ninja>
{% set invoice = invoices|first %}
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="table-header">
<tr class="table-header primary-color-highlight">
<th class="">$item_label #</th>
<th class="" width="50%">$description_label</th>
<th class="centered">$quantity_label</th>
<!-- <th class="totals-row-label centered">Delivered</th>
<th class="totals-row-label centered">Backorder</th> -->
</tr>
</thead>
<tbody class="table-body">
{% for item in invoice.line_items|filter(item => item.type_id == 1) %}
<tr class="item-row">
<td class="">{{ item.product_key }}</td>
<td class="">{{ item.notes }}</td>
<td class="centered">{{ item.quantity }}</td>
<!-- <td class="totals-row-label centered">{{ item.quantity }}</td>
<td class="totals-row-label centered">{{ item.quantity - item.quantity }}</td> -->
</tr>
{% endfor %}
</tbody>
</table>
</ninja>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<div class="container">
<p class="bottom-margin primary-color-highlight">$notes_label:</p>
$invoice.public_notes
</div>
</table>
</body>
</html>

View File

@ -0,0 +1,267 @@
<!DOCTYPE html>
<!-- Delivery Note 2 - TemplateID #TD5 -->
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@import url($font_url);
@page {
padding-top: 0;
padding-bottom: 0;
margin-top: 0;
margin-bottom: 0;
size: $page_size $page_layout;
}
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size !important;
}
table {
margin-bottom: 0rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
}
.table-header>tr>th {
border-bottom: solid 1px #efefef;
}
.table-body>tr>td {
border-bottom: solid 1px #efefef;
}
th {
text-align: left;
padding-left: 6px;
padding-right: 6px;
padding-top: 6px;
padding-bottom: 6px;
}
td {
padding-left: 6px;
padding-right: 6px;
padding-top: 1rem;
padding-bottom: 1rem;
}
.item-row {
border-bottom: 1px #000 dotted;
}
.totals-row-label {
text-align: right;
white-space: nowrap;
}
.totals-row-value {
text-align: right;
white-space: nowrap;
}
.table-totals {
display: grid;
grid-template-columns: 2fr 1fr;
}
.centered {
text-align: center;
}
.doc-title {
font-size: 32px;
}
p {
margin: 0;
padding: 0;
}
span {
padding-right: 5px;
width: 100%;
}
div .label {
text-align: right;
padding-right: 10px;
}
div .value {
text-align: left;
padding-left: 5px;
}
.two-col-grid {
display: grid;
grid-template-columns: 1fr 1fr;
}
.client-details {
margin-bottom: 0.3rem;
}
.container {
padding-top: 2rem;
}
.bottom-margin {
padding-bottom: 0.5rem;
}
.bottom-border {
border-bottom: 0.5px dashed $primary_color;
}
.top-border {
border-top: 0.5px dashed $primary_color;
}
.section-title {
font-style: italic;
color: #454545
}
.primary-color-highlight {
color: $primary_color;
}
.secondary-color-highlight {
color: $secondary_color;
}
.header-table {
margin-top: 0 !important;
padding-top: 0 !important;
}
#footer {
position: fixed;
bottom: 0;
border-top: 1px solid #000;
width: 82%;
min-height: 100px;
padding-top: 0.5rem;
margin-top: 40px;
}
</style>
</head>
<body>
<table style="min-width:100%">
<thead>
</thead>
<tbody>
<tr>
<td>
<table width="100%" cellspacing="0" cellpadding="0" class="" border="0">
<tr>
<td align="left" class="doc-title">$delivery_note_label</td>
<td align="right"><img src="$company.logo" class="company-logo"></td>
</tr>
</table>
<table width="100%" height="100%" cellspacing="0" cellpadding="0" class="" border="0">
<tr>
<td align="left" class="">
<div class="" style="">
<div class="client-details">
<p class="section-title">$to_label:</p>
</div>
<div id="client-details"></div>
</div>
</td>
<td align="left">
<div class="" style="height:100%">
<div class="client-details">
<p class="section-title">$ship_to_label:</p>
</div>
<div id="shipping-details"></div>
</div>
</td>
</tr>
</table>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<tr>
<td align="left" class="">
<div>
<p class="bottom-border"># $invoice.po_number</p>
</div>
</td>
<td align="left">
<div class="">
<p class="bottom-border">$date_label: $invoice.date</p>
</div>
</td>
</tr>
</table>
<ninja>
{% set invoice = invoices|first %}
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="table-header">
<tr class="table-header primary-color-highlight">
<th class="">$item_label #</th>
<th class="" width="50%">$description_label</th>
<th class="centered">$quantity_label</th>
<!-- <th class="totals-row-label centered">Delivered</th>
<th class="totals-row-label centered">Backorder</th> -->
</tr>
</thead>
<tbody class="table-body">
{% for item in invoice.line_items|filter(item => item.type_id == 1) %}
<tr class="item-row">
<td class="">{{ item.product_key }}</td>
<td class="">{{ item.notes }}</td>
<td class="centered">{{ item.quantity }}</td>
<!-- <td class="totals-row-label centered">{{ item.quantity }}</td>
<td class="totals-row-label centered">{{ item.quantity - item.quantity }}</td> -->
</tr>
{% endfor %}
</tbody>
</table>
</ninja>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<div class="container">
<p class="bottom-margin primary-color-highlight">$notes_label:</p>
$invoice.public_notes
</div>
</table>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>
<div style="border: 0px solid #000; height:100px;">
</div>
</td>
</tr>
</tfoot>
</table>
<div id="footer" style="border: 0px solid red; width: 95%;">
<div style="width: 100%; padding:10px;" class="two-col-grid top-border">
<div id="company-details" style="margin-left:0; margin-right:auto;"></div>
<div id="company-address" style="margin-right:0; margin-left:auto;"></div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,444 @@
<!DOCTYPE html>
<!-- Payment Receipt- TemplateID #TP6 -->
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@import url($font_url);
.company-logo {
max-width: $company_logo_size;
}
</style>
</head>
<body>
<table class="Wrapper" align="center"
style="border:0;border-collapse:collapse;margin:0 auto!important;padding:0;max-width:600px;min-width:600px;width:600px">
<tbody>
<tr>
<td style="border:0;border-collapse:collapse;margin:0;padding:0">
<table class="Divider--kill" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0">
<tbody>
<tr>
<td height="20"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<div style="border-bottom-left-radius:5px;border-bottom-right-radius:5px">
<table dir="ltr" class=" Header" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td class="Header-left Target"
style="background-color:$primary_color;border:0;border-collapse:collapse;margin:0;padding:0;font-size:0;line-height:0px;background-size:100% 100%;border-top-left-radius:5px; border-top-right-radius:5px;"
align="center" height="156" valign="middle" width="">
<img src="$company.logo" class="company-logo">
</td>
</tr>
</tbody>
</table>
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff;margin-top:1rem;">
<tbody>
<tr>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="Content" align="center"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#32325d;font-size:24px;line-height:32px">
<span class="il">$receipt_label</span> $from_label <span
dir="ltr">$company.name</span>
</td>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td height="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td height="4"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="Content" align="center"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#8898aa;font-size:15px;line-height:18px">
<span class="il">$receipt_label</span> #$number
</td>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<ninja>
{%set payment = payments|first %}
{%if payment.transaction_reference %}
<tr>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="Content" align="center"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#8898aa;font-size:15px;line-height:18px">
<span class="il">Reference:</span> {{ payment.transaction_reference }}
</td>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
{% endif %}
</ninja>
</tbody>
</table>
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td height="24"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff;width:100%">
<tbody>
<tr>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="Content"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px">
<table style="border:0;border-collapse:collapse;margin:0;padding:0;width:100%">
<tbody>
<tr>
<td class="DataBlocks-item" valign="top"
style="border:0;border-collapse:collapse;margin:0;padding:0">
<table
style="border:0;border-collapse:collapse;margin:0;padding:0">
<tbody>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#8898aa;font-size:12px;line-height:16px;white-space:nowrap;font-weight:bold;text-transform:uppercase;">
$amount_paid_label
</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;white-space:nowrap">
$amount
</td>
</tr>
</tbody>
</table>
</td>
<td class="DataBlocks-spacer" width="20"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="DataBlocks-item" valign="top"
style="border:0;border-collapse:collapse;margin:0;padding:0">
<table
style="border:0;border-collapse:collapse;margin:0;padding:0">
<tbody>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#8898aa;font-size:12px;line-height:16px;white-space:nowrap;font-weight:bold;text-transform:uppercase">
$date_label
</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;white-space:nowrap">
$payment.date
</td>
</tr>
</tbody>
</table>
</td>
<td class="DataBlocks-spacer" width="20"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="DataBlocks-item" valign="top"
style="border:0;border-collapse:collapse;margin:0;padding:0">
<table
style="border:0;border-collapse:collapse;margin:0;padding:0">
<tbody>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#8898aa;font-size:12px;line-height:16px;white-space:nowrap;font-weight:bold;text-transform:uppercase">
$method_label
</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;white-space:nowrap">
<span>
<ninja>
{% set payment = payments|first %}
{% if payment %}
{{ payment.method }}
{% endif %}
</ninja>
</span>
<span></span>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td height="32"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table class=""
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="Content"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#8898aa;font-size:12px;line-height:16px;font-weight:bold;text-transform:uppercase">
Summary
</td>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="12"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td class="Spacer--kill" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="Content"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px">
<table
style="border:0;border-collapse:collapse;margin:0;padding:0;width:100%;background-color:#f6f9fc;border-radius:4px">
<tbody>
<tr>
<td colspan="3" height="4"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td class="" width="20"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="Table-content"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:432px">
<table class="Table-rows" width="432"
style="border:0;border-collapse:collapse;margin:0;padding:0">
<tbody>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<ninja>
{% set totalPrice = 0 %}
{% for payment in payments %}
{% for pivot in payment.paymentables|filter(pivot =>
pivot.is_credit == '0') %}
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#8898aa;font-size:12px;line-height:16px;font-weight:bold;text-transform:uppercase">
{{ pivot.date }}
</td>
<td width="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px">
<div>
$invoice_label #{{ pivot.invoice }}
<span class="Content"
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;color:#8898aa;font-size:14px;line-height:14px">
</span>
</div>
</td>
<td width="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td align="right" valign="top"
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px">
{{ pivot.amount }}
</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td bgcolor="e6ebf1" colspan="3" height="1"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
{% set totalPrice = totalPrice + pivot.amount_raw %}
{% endfor %}
{% endfor %}
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;font-weight:bold">
$amount_paid_label
</td>
<td width="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td align="right" valign="top"
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;font-weight:bold">
${{ totalPrice|number_format(2, '.', ',') }}
<td>
</ninja>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
</td>
<td class="" width="20"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="4"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
</td>
<td class="Spacer--kill" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table class="" width="100%" style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td height="44"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</body>
</html>

View File

@ -0,0 +1,166 @@
<!DOCTYPE html>
<!-- Payment Receipt- TemaplateID #TP7 -->
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@import url($font_url);
@page {
padding-top: 0;
padding-bottom: 0;
margin-top: 0;
margin-bottom: 0;
size: A5 landscape;
/* size: 210mm 75mm; */
border: 0px solid #000;
}
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size !important;
}
.centered {
text-align: center;
}
p {
margin: 0;
padding: 0;
}
.two-col-grid {
display: grid;
grid-template-columns: 1fr 1fr;
}
.four-col-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
}
.key-value-grid {
display: grid;
grid-template-columns: 1fr 4fr;
}
.primary-color-highlight {
color: $primary_color;
}
.secondary-color-highlight {
color: $secondary_color;
}
.company-logo {
max-width: $company_logo_size;
max-height: 100px;
vertical-align: middle;
}
.border {
border: 1px solid #000;
}
.zero {
margin: 0;
padding: 0;
}
.pull-left {
margin-left: 0;
margin-right: auto;
}
.pull-right {
margin-left: auto;
margin-right: 0;
}
.italic {
font-style: italic;
}
.bottom-border {
border-bottom: 1px solid $primary_color;
}
</style>
</head>
<body>
<div class="two-col-grid" style="">
<ninja>
<div class="pull-left">
<h1 class="primary-color-highlight" style="margin-top:0;">$receipt_label {%if payments|length ==
1%}#$number{% endif %}</h2>
</div>
</ninja>
<div class="pull-right"><img src="$company.logo" class="company-logo"></div>
</div>
<div class="two-col-grid">
<div class="pull-left">
<h4 class="italic" style="margin-bottom:0.5rem;">$to_label</h3>
<p style="margin-bottom:0.5rem;">$client.name</p>
<ninja>
{% set payment = payments|first %}
{% if payment.client.vat_number %}
<p>$vat_number_label: $vat_number</p>
{% endif %}
</ninja>
</div>
<div class="pull-right">
<!-- <h3 class="secondary-color-highlight zero italic">$to_label</h3>
<p>$company.name</p> -->
</div>
</div>
<div class="" style="margin-top:20px;">
<div class="four-col-grid" style="padding:2px; margin-bottom:2px;">
<div style="">$number_label</div>
<div style="">$date_label</div>
<div style="">$method_label</div>
<div style="">$amount_label</div>
</div>
<ninja>
{% if payments|e %}
{% for payment in payments %}
<div class="four-col-grid bottom-border" style="padding:2px;">
<div>
<p class="primary-color-highlight">#{{ payment.number }}</p>
</div>
<div>
<p>{{ payment.date }}</p>
</div>
<div>
<p>{{ payment.method }}</p>
</div>
<div>
<p>{{ payment.amount }}</p>
</div>
</div>
{% endfor %}
{% endif %}
</ninja>
</div>
<div class="two-col-grid"
style="margin-top: 1rem; position:absolute; bottom: 0; width:100%; margin-right:0rem !important; padding-right:0rem;">
<div id="company-details" class="pull-left" style="padding-bottom:1rem;">
<!-- <h3>$company.name</h3> -->
</div>
<div class="pull-right" style="padding-right:1rem;">
<p>$public_notes</p>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,185 @@
<!DOCTYPE html>
<!-- Refund - TemplateID #TR8 -->
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@import url($font_url);
@page {
padding-top: 0;
padding-bottom: 0;
margin-top: 0;
margin-bottom: 0;
size: A5 landscape;
/* size: 210mm 75mm; */
border: 0px solid #000;
}
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size !important;
}
.centered {
text-align: center;
}
p {
margin: 0;
padding: 0;
}
.two-col-grid {
display: grid;
grid-template-columns: 1fr 1fr;
}
.four-col-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
}
.key-value-grid {
display: grid;
grid-template-columns: 1fr 4fr;
}
.primary-color-highlight {
color: $primary_color;
}
.secondary-color-highlight {
color: $secondary_color;
}
.company-logo {
max-width: $company_logo_size;
max-height: 100px;
vertical-align: middle;
}
.border {
border: 1px solid #000;
}
.zero {
margin: 0;
padding: 0;
}
.pull-left {
margin-left: 0;
margin-right: auto;
}
.pull-right {
margin-left: auto;
margin-right: 0;
}
.italic {
font-style: italic;
}
.bottom-border {
border-bottom: 1px solid $primary_color;
}
</style>
</head>
<body>
<div class="two-col-grid" style="">
<div class="pull-left">
<ninja>
<h1 class="primary-color-highlight" style="margin-top:0; margin-bottom:0rem;">$refund_label {% if
payments|length == 1%}#$number {% endif %}</h2>
</ninja>
</div>
<div class="pull-right"><img src="$company.logo" class="company-logo"></div>
</div>
<div class="two-col-grid">
<div class="pull-left">
<h4 class="italic" style="margin-bottom:0.5rem;">$to_label</h3>
<p style="margin-bottom:0.5rem;">$client.name</p>
<ninja>
{% set payment = payments|first %}
{% if payment.client.vat_number %}
<p>$vat_number_label: $vat_number</p>
{% endif %}
</ninja>
</div>
<div class="pull-right">
<!-- <h3 class="secondary-color-highlight zero italic">$to_label</h3>
<p>$company.name</p> -->
</div>
</div>
<div class="" style="margin-top:20px;">
<ninja>
{% if payments|e %}
{% set totalInvoices = 0 %}
{% set totalRefunds = 0 %}
{% for payment in payments %}
{% for pivot in payment.paymentables|filter((pivot) => (pivot.is_credit == '0'
and pivot.refunded_raw > 0)) %}
<div class="two-col-grid bottom-border" style="padding:2px; padding:5px;">
<div style="display:flex;">
<p class="primary-color-highlight">$invoice_label #{{ pivot.invoice }}</p>
<p class="primary-color-highlight" style="padding-left:1rem;"> ({{ pivot.amount }})</p>
</div>
<div style="display:flex;">
<p style="">{{ pivot.refunded }}</p>
<p style="padding-left:1rem;">($refund_label)</p>
</div>
<div>
</div>
<div>
</div>
</div>
{% set totalInvoices = totalInvoices + pivot.amount_raw %}
{% set totalRefunds = totalRefunds + pivot.refunded_raw %}
{% endfor %}
{% endfor %}
<div class="four-col-grid bottom-border" style="padding:2px; padding:5px;">
<div style="display:flex; margin-top:1rem">
<p class="primary-color-highlight">$invoices_label:</p>
</div>
<div style="display:flex; margin-top:1rem;">
<p style="">{{ totalInvoices|format_currency(currency_code) }}</p>
</div>
<div style="display:flex; margin-top:1rem">
<p class="primary-color-highlight">$refund_label:</p>
</div>
<div style="display:flex; margin-top:1rem;">
<p style="">{{ totalRefunds|format_currency(currency_code) }}</p>
</div>
</div>
{% endif %}
</ninja>
</div>
<div class="two-col-grid"
style="margin-top: 1rem; position:absolute; bottom: 0; width:100%; margin-right:0rem !important; padding-right:0rem;">
<div id="company-details" class="pull-left" style="padding-bottom:1rem;">
<!-- <h3>$company.name</h3> -->
</div>
<div class="pull-right" style="padding-right:1rem;">
<p>$public_notes</p>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,528 @@
<!DOCTYPE html>
<!-- Refund Receipt - TemplateID #TR9 -->
<html>
<head>
<title>$refund_label #$number</title>
</head>
<body>
<ninja>
{%set payment = payments|first %}
{%set pivot = payment.paymentables|filter(pivot => pivot.refunded_raw > 0)|first %}
<table align="center" bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="600"
style="border-top-left-radius:16px;border-top-right-radius:16px;margin:0 auto;min-width:600px">
<tbody>
<tr>
<td style="border:0;margin:0;padding:0">
<table border="0" cellpadding="0" cellspacing="0" width="600" style="min-width:600px">
<tbody>
<tr>
<td align="center" height="0"
style="border:0;margin:0;padding:0;color:#ffffff;display:none!important;font-size:1px;line-height:1px;max-height:0;max-width:0;opacity:0;overflow:hidden">
<span style="color:#ffffff;text-decoration:none;">$refund_label{{ pivot.refunded
}}
$date_label {{ pivot.updated_at }}</span>
</td>
</tr>
</tbody>
</table>
<div
style="background-color:$primary_color;padding-top:20px; padding-bottom:20px; border-radius:5px;">
<table dir="ltr" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td style="background-color:$primary_color;border:0;border-collapse:collapse;margin:0;padding:0;font-size:0;line-height:0px;background-size:100% 100%;"
align="center" valign="center" width="600" height="152">
{{ img('$company.logo','') }}
</td>
</tr>
</tbody>
</table>
</div>
<table border="0" cellpadding="0" cellspacing="0" width="600" style="min-width:600px">
<tr>
<td height="10"></td>
</tr>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="600" style="min-width:600px">
<tbody>
<tr>
<td align="center"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#32325d;font-size:24px;line-height:32px">
$refund_label #$number
</td>
</tr>
<tr>
<td colspan="3" height="12"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
<ninja>
{%set payment = payments|first %}
{%if payment.transaction_reference %}
<table class="" width="100%"
style="border:0;border-collapse:collapse;margin:0;padding:0;background-color:#ffffff">
<tbody>
<tr>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td class="Content" align="center"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#8898aa;font-size:15px;line-height:18px">
<span class="il">$reference_label:</span> {{ payment.transaction_reference
}}
</td>
<td class="" width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
{% endif %}
</ninja>
<table border="0" cellpadding="0" cellspacing="0" width="600" style="min-width:600px">
<tbody>
<tr>
<td align="center"
style="border:0;border-collapse:collapse;margin:0;padding:0;width:472px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#8898aa;font-size:15px;line-height:18px">
<span></span>
</td>
</tr>
<tr>
<td colspan="3" height="12"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td height="20"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px;max-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td
style="border:0;margin:0;padding:0;color:#687385;font-family:-apple-system,'SF Pro Display','SF Pro Text','Helvetica',sans-serif;font-size:12px;font-weight:bold;line-height:16px;text-transform:uppercase">
</td>
<td width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td valign="top" style="border:0;border-collapse:collapse;margin:0;padding:0">
<table style="border:0;border-collapse:collapse;margin:0;padding:0">
<tbody>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#8898aa;font-size:12px;line-height:16px;white-space:nowrap;font-weight:bold;text-transform:uppercase">
$refunded_label
</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;white-space:nowrap">
{{ payment.refunded }}
</td>
</tr>
</tbody>
</table>
</td>
<td width="20"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td valign="top" style="border:0;border-collapse:collapse;margin:0;padding:0">
<table style="border:0;border-collapse:collapse;margin:0;padding:0">
<tbody>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#8898aa;font-size:12px;line-height:16px;white-space:nowrap;font-weight:bold;text-transform:uppercase">
$refund_label $date_label
</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;white-space:nowrap">
{{ payment.updated_at}}
</td>
</tr>
</tbody>
</table>
</td>
<td width="20"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td valign="top" style="border:0;border-collapse:collapse;margin:0;padding:0">
<table style="border:0;border-collapse:collapse;margin:0;padding:0">
<tbody>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#8898aa;font-size:12px;line-height:16px;white-space:nowrap;font-weight:bold;text-transform:uppercase">
$method_label
</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;white-space:nowrap">
{% if payment.method %}
<span>
{{ payment.method }}
</span>
{% else %}
<span
style="width:100%; min-width:100%; display:block; text-align:center;">
-
</span>
{% endif %}
</td>
</tr>
</tbody>
</table>
</td>
<td width="64"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="600" style="min-width:600px">
<tbody>
<tr>
<td colspan="3" height="24"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px;max-height:1px">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px;max-height:1px"
width="48">
<div>&nbsp;</div>
</td>
<td bgcolor="#e6ebf1" height="1"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px;max-height:1px">
<div>&nbsp;</div>
</td>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px;max-height:1px"
width="48">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td colspan="3" height="24"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px;max-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="600" style="min-width:600px">
<tbody>
<tr>
<td colspan="3" height="24"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px" width="48">
<div>&nbsp;</div>
</td>
<td style="border:0;margin:0;padding:0">
<table bgcolor="#f6f9fc" border="0" cellpadding="0" cellspacing="0"
style="border-radius:8px" width="100%">
<tbody>
<tr>
<td style="border:0;margin:0;padding:0">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td colspan="3" height="12"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px"
width="16">
<div>&nbsp;</div>
</td>
<td
style="border:0;margin:0;padding:0;color:#414552;font-family:-apple-system,'SF Pro Display','SF Pro Text','Helvetica',sans-serif;font-size:16px;line-height:24px">
<table
style="padding-left:5px;padding-right:5px"
width="100%">
<tbody>
<tr>
<td></td>
</tr>
{% set totalInvoices = 0 %}
{% set totalRefunds = 0 %}
{% for pivot in
payment.paymentables|filter((pivot) =>
(pivot.is_credit == '0'
and pivot.refunded_raw > 0)) %}
<tr>
<td
style="white-space:nowrap;border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;width:100%">
Invoice: #{{ pivot.invoice }}
({{ pivot.amount }})
</td>
<td width="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td align="right" width="50"
valign="top"
style="white-space:nowrap;border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px">
$refunded_label {{
pivot.refunded }}
</td>
</tr>
{% set totalInvoices = totalInvoices +
pivot.amount_raw %}
{% set totalRefunds = totalRefunds +
pivot.refunded_raw %}
{% endfor %}
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td bgcolor="e6ebf1" colspan="3"
height="1"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;width:100%">
$total_label $invoices_label
</td>
<td width="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td align="right" valign="top"
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px">
{{
totalInvoices|format_currency(currency_code)
}}
</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;width:100%">
$total_label $refunded_label
</td>
<td width="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td align="right" valign="top"
style="border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px">
{{ payment.refunded }}
</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
<tr>
<td colspan="3" height="6"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
</tr>
</tbody>
</table>
</td>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px"
width="16">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td colspan="3" height="12"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px" width="48">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td colspan="3" height="24"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
{% if payment.refund_activity %}
<table border="0" cellpadding="0" cellspacing="0" width="600" style="min-width:600px">
<tbody>
<tr>
<td colspan="3" height="8"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px" width="48">
<div>&nbsp;</div>
</td>
<td
style="border:0;margin:0;padding:0;color:#687385;font-family:-apple-system,'SF Pro Display','SF Pro Text','Helvetica',sans-serif;font-weight:400;font-size:12px;line-height:16px;text-transform:uppercase">
<span style="border:0;margin:0;padding:0;font-weight:bold">
History
</span>
</td>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px" width="48">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td colspan="3" height="8"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="600" style="min-width:600px">
<tbody>
<tr>
<td colspan="3" height="24"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px" width="48">
<div>&nbsp;</div>
</td>
<td style="border:0;margin:0;padding:0">
<table bgcolor="#f6f9fc" border="0" cellpadding="0" cellspacing="0"
style="border-radius:8px" width="100%">
<tbody>
<tr>
<td style="border:0;margin:0;padding:0">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td colspan="3" height="12"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px"
width="16">
<div>&nbsp;</div>
</td>
<td
style="border:0;margin:0;padding:0;color:#414552;font-family:-apple-system,'SF Pro Display','SF Pro Text','Helvetica',sans-serif;font-size:16px;line-height:24px">
<table
style="padding-left:5px;padding-right:5px"
width="100%">
<tbody>
<tr>
<td></td>
</tr>
{% for activity in
payment.refund_activity %}
<tr>
<td
style="white-space:nowrap;border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px;width:100%">
{{ activity }}
</td>
<td width="8"
style="border:0;border-collapse:collapse;margin:0;padding:0;color:#ffffff;font-size:1px;line-height:1px">
&nbsp;</td>
<td align="right" width="50"
valign="top"
style="white-space:nowrap;border:0;border-collapse:collapse;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;vertical-align:middle;color:#525f7f;font-size:15px;line-height:24px">
</td>
</tr>
{% endfor %}
</tbody>
</table>
</td>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px"
width="16">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td colspan="3" height="12"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
<td style="border:0;margin:0;padding:0;font-size:1px;line-height:1px" width="48">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td colspan="3" height="24"
style="border:0;margin:0;padding:0;font-size:1px;line-height:1px">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
{% endif %}
</td>
</tr>
</tbody>
</table>
</ninja>
</body>
</html>

View File

@ -0,0 +1,95 @@
<!DOCTYPE html>
<!-- Project - TemplateID #TP11 -->
<html>
<head>
<style>
html {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;
}
table {
margin-top: 2rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
}
.table-header>tr>th {
border-bottom: solid 1px #efefef;
}
.table-body>tr>td {
border-bottom: solid 1px #efefef;
}
th {
text-align: left;
padding-left: 6px;
padding-right: 6px;
padding-top: 6px;
padding-bottom: 6px;
}
td {
padding-left: 6px;
padding-right: 6px;
padding-top: 1rem;
padding-bottom: 1rem;
white-space: nowrap;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
}
li {
padding: 3px;
}
</style>
</head>
<body>
<ninja>
{% if projects|e %}
{% for project in projects %}
<h1>{{ project.name }}</h1>
<h3>Due: {{ project.due_date }}</h3>
<h6>{{ project.current_hours }} / {{ project.budgeted_hours }}: (Hours / Budgeted Hours @ {{ project.task_rate }}) - Report generated on {{ "now"|date('Y-m-d') }}</h6>
<table>
<thead>
<tr>
<th>Date</th>
<th>Description</th>
<th>Duration</th>
</tr>
</thead>
<tbody>
{% for task in project.tasks %}
{% for log in task.time_log%}
<tr>
<td>{{ log.start_date }}</td>
<td>
<div>
<ul>
<li>{{ log.description }}</li>
<li>{{ task.user.name }}</li>
</ul>
</div>
</td>
<td>{{ log.duration|date('h:i:s')}}</td>
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
{% endfor %}
{% endif %}
</ninja>
</body>
</html>

View File

@ -0,0 +1,170 @@
<!DOCTYPE html>
<!-- Examples of how to use generic invoice ninja stacks that can be configured in the UI (Settings > Invoice Design) -->
<html>
<head>
<style>
:root {
--primary-color: $primary_color;
--secondary-color: $secondary_color;
--line-height: 1.6;
}
html {
width: 210mm;
height: 200mm;
}
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size !important;
zoom: 80%;
}
@page {
margin-left: $global_margin;
margin-right: $global_margin;
margin-top: 5;
margin-bottom: 5;
size: $page_size $page_layout;
}
p {
margin: 0;
padding: 0;
}
table tr td,
table tr,
th {
font-size: 18 !important;
}
[data-ref="table"] {
margin-top: 1rem;
margin-bottom: 5px;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
}
[data-ref="table"]>thead {
text-align: left;
}
[data-ref="table"]>thead>tr>th {
font-size: 1.1rem;
padding-bottom: 1.5rem;
padding-left: 1rem;
}
[data-ref="table"]>tbody>tr>td {
border-top: 1px solid #d8d8d8;
border-bottom: 1px solid #d8d8d8;
padding: 1rem 1rem;
}
[data-ref="table"]>tbody>tr>td:first-child {
color: var(--primary-color);
}
[data-ref="table"]>thead>tr>th:last-child,
[data-ref="table"]>tbody>tr>td:last-child {
text-align: right;
}
[data-ref="table"]>thead>tr>th:last-child {
padding-right: 1rem;
}
[data-ref="table"]>tbody>tr:nth-child(odd) {
background-color: #f5f5f5;
}
#client-details {
display: flex;
flex-direction: column;
line-height: var(--line-height);
padding-right: 30px;
}
</style>
</head>
<body>
<div style="text-align:center;">
<h1> Standard Invoice Ninja Blocks </h1>
<img class="company-logo" src="$company.logo" alt="$company.name logo">
</div>
<div style="display:flex; padding:2rem;">
<div style="padding:1rem; border:1px solid #000;">
<p>Client Details</p>
<div id="client-details"></div>
</div>
<div style="padding:1rem; border:1px solid #000;">
<p>Company Details</p>
<div id="company-details"></div>
</div>
<div style="padding:1rem; border:1px solid #000;">
<p>Company Address</p>
<div id="company-address"></div>
</div>
</div>
<div style="display:flex; padding:2rem;">
<div style="padding:1rem; border:1px solid #000;">
<p>Vendor Details</p>
<div id="vendor-details"></div>
</div>
<div style="padding:1rem; border:1px solid #000;">
<p>Shipping Address</p>
<div id="shipping-details"></div>
</div>
</div>
<ninja>
{% set invoice = invoices|first %}
{% set total = 0 %}
<table cellspacing="0" data-ref="table">
<thead>
<tr>
<th>Item</th>
<th>Notes</th>
<th>Cost</th>
</tr>
</thead>
<tbody>
{% for item in invoice.line_items|filter(item => item.type_id == 1) %}
<tr>
<td>{{ item.product_key }}</td>
<td>{{ item.notes }}</td>
<td>{{ item.cost_raw|format_currency('GBP') }}</td>
</tr>
{% set total = total + item.cost_raw %}
{% endfor %}
<tr>
<td></td>
<td>Total</td>
<td>{{ total|format_currency(currency_code) }}</td>
</tr>
</tbody>
</table>
</ninja>
</body>
</html>

View File

@ -0,0 +1,90 @@
<!doctype html>
<!-- A plain sample of a twig table -->
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
table {
margin-top: 2rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
}
.table-header>tr>th {
border-bottom: solid 1px #efefef;
}
.table-body>tr>td {
border-bottom: solid 1px #efefef;
}
th {
text-align: left;
padding-left: 6px;
padding-right: 6px;
padding-top: 6px;
padding-bottom: 6px;
}
td {
padding-left: 6px;
padding-right: 6px;
padding-top: 1rem;
padding-bottom: 1rem;
}
.item-row {
border-bottom: 1px #000 dotted;
}
.totals-row-label {
text-align: right;
white-space: nowrap;
}
.totals-row-value {
text-align: right;
white-space: nowrap;
}
.table-totals {
display: grid;
grid-template-columns: 2fr 1fr;
}
.centered {
text-align: center;
}
</style>
</head>
<body>
<ninja>
{% set invoice = invoices|first %}
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="table-header">
<tr class="table-header">
<th class="">Item #</th>
<th class="" width="50%">Description</th>
<th class="centered">Quantity</th>
<th class="totals-row-label centered">Delivered</th>
</tr>
</thead>
<tbody class="table-body">
{% for item in invoice.line_items|filter(item => item.type_id == 1) %}
<tr class="item-row">
<td class="">{{ item.product_key }}</td>
<td class="">{{ item.notes }}</td>
<td class="centered">{{ item.quantity }}</td>
<td class="totals-row-label centered">{{ item.quantity }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</ninja>
</body>
</html>

View File

@ -0,0 +1,13 @@
<!-- This is the most basic starting point of a twig template -->
<html>
<head>
</head>
<body>
<ninja>
<!-- Inside of the ninja tags you can place any Twig Content -->
</ninja>
</body>
</html>
<!-- You can read more about twig and the options available here: https://twig.symfony.com/ -->

View File

@ -0,0 +1,249 @@
<!DOCTYPE html>
<!-- Plain Statement - TemplateID #TS1 -->
<html>
<head>
<style>
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size !important;
zoom: 80%;
}
@page {
margin: 0 !important; //removes top and bottom default headers
size: $page_size $page_layout;
}
p {
margin: 0;
padding: 0;
line-height: 1.5;
white-space: nowrap;
}
table {
margin-top: 2rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
}
th {
text-align: center;
padding-left: 6px;
padding-right: 6px;
padding-top: 6px;
padding-bottom: 6px;
}
td {
text-align: center;
padding-left: 6px;
padding-right: 6px;
padding-top: 6px;
padding-bottom: 6px;
}
.item-row {
border-bottom: 1px #000 dotted;
}
.totals-row-label {
text-align: right;
white-space: nowrap;
}
.totals-row-value {
text-align: right;
white-space: nowrap;
}
.table-totals {
display: grid;
grid-template-columns: 2fr 1fr;
}
.entity-container {
margin-left: auto;
margin-right: auto;
border: 0px solid #000;
}
.entity-container h2 {
text-align: center;
}
span {
padding-right: 5px;
width: 100%;
}
.label {
text-align: right;
padding: 0;
margin-right: 1rem;
}
.value {
text-align: left;
padding: 0;
}
.two-col-grid {
display: grid;
grid-template-columns: 1fr 1fr;
}
#statement-details {
margin: auto;
}
#client-details {
margin-left: auto;
margin-right: auto;
}
#company-details {
margin-left: auto;
margin-right: auto;
}
</style>
</head>
<body>
<!-- Header -->
<div class="two-col-grid">
<div id="client-details"></div>
<div id="company-details"></div>
</div>
<!-- Details -->
<div class="two-col-grid">
<div>
</div>
<div id="statement-details">
<h2>Statement</h2>
<p>$start_date - $end_date</p>
</div>
</div>
<ninja>
{% if invoices|e %}
<div class="entity-container">
<h2>Invoices<h2>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="">
<tr class="">
<th class="">Invoice #</th>
<th class="">Invoice Date</th>
<th class="">Invoice Due Date</th>
<th class="">Total</th>
<th class="">Balance</th>
</tr>
</thead>
<tbody>
{% for invoice in invoices %}
<tr class="item-row">
<td class="">{{ invoice.number }}</td>
<td class="">{{ invoice.date }}</td>
<td class="">{{ invoice.due_date }}</td>
<td class="">{{ invoice.amount }}</td>
<td class="">{{ invoice.balance }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</ninja>
<ninja>
{% if payments|e %}
<div class="entity-container">
<h2>Payments<h2>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="">
<tr class="">
<th class="">Invoice #</th>
<th class="">Payment Date</th>
<th class="">Method</th>
<th class="">Amount</th>
</tr>
</thead>
<tbody>
{% for payment in payments %}
<tr class="item-row">
<td class="">{{ payment.number }}</td>
<td class="">{{ payment.date }}</td>
{%if payment.is_credit %}
<td class="">Credit {{ payment.number }}</td>
{%else%}
<td class="">{{ payment.method }}</td>
{%endif%}
<td class="">{{ payment.amount }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</ninja>
<ninja>
{% if credits|e %}
<div class="entity-container">
<h2>Credits<h2>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="">
<tr class="">
<th class="">Credit #</th>
<th class="">Credit Date</th>
<th class="">Total</th>
<th class="">Balance</th>
</tr>
</thead>
<tbody>
{% for credit in credits %}
<tr class="item-row">
<td class="">{{ credit.number }}</td>
<td class="">{{ credit.date }}</td>
<td class="">{{ credit.amount }}</td>
<td class="">{{ credit.balance }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</ninja>
<ninja>
{% if aging %}
<div class="entity-container">
<h2>Aging<h2>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="">
<tr class="">
{% for key, age in aging %}
<th class="">{{ key }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
<tr class="item-row">
{% for key, age in aging %}
<td>{{ age }}</td>
{% endfor %}
</tr>
</tbody>
</table>
</div>
{% endif %}
</ninja>
</body>
</html>

View File

@ -0,0 +1,325 @@
<!DOCTYPE html>
<!-- Color Statement - TemplateID #TS2 -->
<html>
<head>
<style>
@page {
margin: 50 0 50 0 !important;
}
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size !important;
zoom: 80%;
}
img {
display: block;
margin-left: auto;
margin-right: auto;
}
h2 {
color: $primary_color;
margin-bottom: 0.5rem;
}
table {
padding-top: 1rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
border: 0px solid #000;
}
th {
text-align: center;
xpadding-left: 6px;
xpadding-right: 6px;
xpadding-top: 6px;
xpadding-bottom: 6px;
}
td {
text-align: center;
xpadding-left: 6px;
xpadding-right: 6px;
xpadding-top: 6px;
xpadding-bottom: 6px;
}
tr {}
tr.border-bottom td {
height: 2rem;
border-bottom: 1px dashed $primary_color;
}
#logo-container {
width: 100%;
margin-top: 0;
}
#client-wrapper {
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
border: 0px solid #000;
}
#client-details {
line-height: 0.5;
border: 0px solid #000;
}
#company-details {
line-height: 0.5 !important;
}
#company-address {
line-height: 0.5 !important;
}
#company-wrapper {
margin-left: auto;
margin-right: 0;
}
#statement-details {
margin-left: auto;
margin-right: 0;
}
#entity-container {
padding-left: 2rem;
padding-right: 2rem;
break-inside: avoid-region;
}
#entity-container h2 {
text-align: center;
}
#date-range {
padding: 0;
margin-top: 0;
border: 0px solid #000;
}
.two-col-grid {
display: grid;
grid-template-columns: 1fr 1fr;
border: 0px solid #000;
}
.body-margin {
margin-left: 2rem;
margin-right: 2rem;
}
.aging-table {
border: 1px dashed $primary_color;
}
</style>
</head>
<body>
<div id="logo-container">
<img src="$company.logo">
</div>
<div class="two-col-grid body-margin">
<div id="client-details"></div>
<div id="company-wrapper">
<div id="company-details"></div>
<div id="company-address"></div>
</div>
</div>
<div class="two-col-grid body-margin">
<div></div>
<div id="statement-details">
<h2>$statement_label</h2>
<p id="date-range">$start_date - $end_date</p>
</div>
</div>
<ninja>
{% if invoices|e %}
<div id="entity-container">
<h2>{{ t('invoices') }}<h2>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="">
<tr class="">
<th class="">{{ t('invoice') }} #</th>
<th class="">{{ t('invoice_date') }}</th>
<th class="">{{ t('invoice_due_date') }}</th>
<th class="">{{ t('total') }}</th>
<th class="">{{ t('balance') }}</th>
</tr>
</thead>
<tbody>
{% for invoice in invoices %}
<tr class="item-row border-bottom">
<td class="">{{ invoice.number }}</td>
<td class="">{{ invoice.date }}</td>
<td class="">{{ invoice.due_date }}</td>
<td class="">{{ invoice.amount }}</td>
<td class="">{{ invoice.balance }}</td>
</tr>
{% endfor %}
{% set sum_balance = invoices|sum('balance_raw') %}
{% if sum_balance > 0 %}
<tr class="item-row border-bottom">
<td></td>
<td></td>
<td></td>
<td><b>$balance_label</b></td>
<td><b>{{ sum_balance|format_currency(currency_code) }}</b> </td>
</tr>
{% endif %}
</tbody>
</table>
</div>
{% endif %}
</ninja>
<ninja>
{% if invoices|e and show_payments %}
<div id="entity-container">
<h2>{{ t('payments') }}<h2>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="">
<tr class="">
<th class="">{{ t('invoice') }} #</th>
<th class="">{{ t('payment_date') }}</th>
<th></th>
<th class="">{{ t('method') }}</th>
<th class="">{{ t('amount') }}</th>
</tr>
</thead>
<tbody>
{% set net_refunds = 0 %}
{% set total_payments = 0%}
{% for invoice in invoices %}
{% if invoice.payments|e %}
{% set parent_payment = invoice.payments|first %}
{% for payment in invoice.payments %}
{% set currency_code = payment.currency %}
{% for pivot in payment.paymentables %}
<tr class="item-row border-bottom">
<td class="">{{ pivot.invoice }}</td>
<td class="">{{ pivot.created_at }}</td>
<td></td>
{%if pivot.is_credit %}
<td class="">$credit_label {{ pivot.number }}</td>
{%else%}
<td class="">{{ payment.method }}</td>
{%endif%}
<td class="">{{ pivot.amount }} </td>
</tr>
{% if pivot.refunded_raw > 0 %}
<tr class="item-row border-bottom">
<td>{{ pivot.invoice }}</td>
<td>{{ pivot.updated_at }}</td>
<td></td>
<td>$refund_label</td>
<td>({{ pivot.refunded }})</td>
</tr>
{% set net_refunds = net_refunds + pivot.refunded_raw %}
{% endif %}
{% set total_payments = total_payments + pivot.amount_raw %}
{% endfor %}
{% endfor %}
{% endif %}
{% endfor %}
<tr class="item-row border-bottom">
<td>{{ currency_code }}</td>
<td></td>
<td></td>
<td><b>$payments_label</b></td>
<td><b>{{ total_payments|format_currency(currency_code) }}</b></td>
</tr>
{% if net_refunds > 0 %}
<tr class="item-row border-bottom">
<td></td>
<td></td>
<td></td>
<td><b>$refunded_label</b></td>
<td><b>({{ net_refunds|format_currency(currency_code) }})</b></td>
</tr>
<tr class="item-row border-bottom">
<td></td>
<td></td>
<td></td>
<td><b>$net_label</b></td>
<td><b>{{ (total_payments-net_refunds)|format_currency(currency_code) }}</b> </td>
</tr>
{% endif %}
</tbody>
</table>
</div>
{% endif %}
</ninja>
<ninja>
{% if credits|e and show_credits %}
<div id="entity-container">
<h2>{{ t('credits') }}<h2>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="">
<tr class="">
<th class="">{{ t('credit') }} #</th>
<th class="">{{ t('credit_date') }}</th>
<th class="">{{ t('total') }}</th>
<th class="">{{ t('balance') }}</th>
</tr>
</thead>
<tbody>
{% for credit in credits %}
<tr class="item-row border-bottom">
<td class="">{{ credit.number }}</td>
<td class="">{{ credit.date }}</td>
<td class="">{{ credit.amount }}</td>
<td class="">{{ credit.balance }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</ninja>
<ninja>
{% if aging and show_aging %}
<div id="entity-container" style="break-inside: avoid;">
<h2>{{ t('aging') }}<h2>
<table width="100%" cellspacing="0" cellpadding="0" class="">
<thead class="">
<tr class="item-row border-bottom">
{% for key, age in aging %}
<th class="">{{ key }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
<tr class="item-row">
{% for key, age in aging %}
<td class="aging-table">{{ age }}</td>
{% endfor %}
</tr>
</tbody>
</table>
</div>
{% endif %}
</ninja>
</body>
</html>

View File

@ -0,0 +1,288 @@
<!DOCTYPE html>
<!-- Vertial Statement - TemplateID #TS3 -->
<html>
<head>
<style>
body,
html {
height: 100%;
margin: 0;
margin-bottom: 2rem;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: $font_name, Helvetica, sans-serif;
font-size: $font_size;
zoom: 80%;
}
@page {
margin-top: 2rem;
margin-bottom: 2rem;
}
table tr td,
table tr,
th {
font-size: $font_size !important;
}
table {
padding-top: 1rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
border: 0px solid #000;
padding-right: 1rem;
break-inside: auto;
}
th {
text-align: center;
padding: 0.5rem;
background-color: #7e7d80;
color: #fff;
font-size: 26px !important;
font-weight: bold;
}
td {
text-align: center;
border-right: 1px solid #000;
border-bottom: 1px solid #000;
height: 2rem;
}
[data-ref="table"]>tbody>tr>td:first-child {
border-left: 1px solid #000;
}
[data-ref="table"]>tbody>tr>td:last-child {
border-right: 1px solid #000;
}
tr {
break-inside: avoid;
}
/* tr.border-bottom td{
height: 2rem;
border-bottom: 0px dashed $primary_color;
} */
.container {
display: flex;
height: 100%;
}
.vertical-first {
flex: 3%;
border-left: 6px solid #000;
}
.vertical-second {
flex: 97%;
margin-left: 2rem;
}
[data-ref="table"]>tbody>tr:nth-child(odd) {
background-color: #ebebeb;
}
.centered-text {
text-align: right;
/* Center text within the transformed div */
margin: 0;
/* Reset margin to ensure full centering */
color: $primary_color;
font-size: 54px !important;
letter-spacing: 10px;
text-transform: uppercase;
font-weight: bolder;
}
.date-text {
text-align: right;
/* Center text within the transformed div */
margin: 0;
/* Reset margin to ensure full centering */
padding-top: 3rem;
font-size: 48px !important;
letter-spacing: 5px;
text-transform: uppercase;
font-weight: bold;
}
.vertical-text {
background-color: #f0f0f0;
/* Change background color as desired */
writing-mode: vertical-lr;
/* Set vertical writing mode */
text-orientation: mixed;
/* Ensure text orientation */
transform: rotate(-180deg);
/* Rotate text to be upright */
padding: 20px;
justify-content: center;
/* Center content horizontally */
align-items: center;
/* Center content vertically */
}
.two-col-grid {
display: grid;
grid-template-columns: 1fr 1fr;
border: 0px solid #000;
}
.company-logo {
max-width: $company_logo_size;
text-align: right;
float: right;
margin-right: 0;
max-height: 200px;
text-align: right;
}
#logo-container {
display: inline-block;
max-height: 200px;
border: 0px solid #000;
}
#company-wrapper {
margin-left: auto;
margin-right: 0;
border: 0px solid #000;
margin-top: 1rem;
}
#client-details {
line-height: 0.5;
border: 0px solid #000;
font-size: 1.3rem;
}
#company-details {
line-height: 0.5;
font-size: 1.3rem;
}
#company-address {
line-height: 0.5;
font-size: 1.3rem;
}
#date-range {
padding: 0;
margin-top: 2rem;
border: 0px solid #000;
font-size: 1.3rem;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
<div class="vertical-first vertical-text">
<p class="centered-text">$statement_label</p>
</div>
<div class="vertical-second">
<div class="two-col-grid" style="border-bottom: 6px solid #000;" s>
<div>
<h1>$company.name</h1>
</div>
<div id="logo-container">
<img src="$company.logo" class="company-logo">
</div>
</div>
<div class="two-col-grid body-margin">
<div id="client-details"></div>
<div id="company-wrapper">
<div id="company-details"></div>
<div id="company-address"></div>
<p id="date-range">$start_date - $end_date</p>
</div>
</div>
<div style="min-width:100% width:100%; padding-bottom: 1rem; margin-bottom:1rem;">
<ninja>
{% if invoices|e %}
<table width="100%" cellspacing="0" cellpadding="0" class="" data-ref="table">
<thead class="">
<tr class="">
<th class="">$date_label</th>
<th class="">$invoice_label #</th>
<th class="">{{ t('charges') }}</th>
<th class="">{{ t('credits') }}</th>
<th class="">{{ t('line_total') }}</th>
</tr>
</thead>
<tbody>
{% set running_total = 0%}
{% for invoice in invoices %}
<tr class="item-row border-bottom">
<td class="">{{ invoice.date }}</td>
<td class="">{{ invoice.number }}</td>
<td class="">{{ invoice.amount }}</td>
<td class="">{%set running_total = running_total + invoice.amount_raw %}</td>
<td class="">{{ running_total|format_currency(currency_code) }}</td>
</tr>
{% for payment in invoice.payments %}
{% for pivot in payment.paymentables %}
<tr class="item-row border-bottom">
<td class="">{{ invoice.date }}</td>
<td class="">{{ invoice.number }}</td>
<td class="">{%set running_total = running_total - pivot.amount_raw %}</td>
<td class="">{{ pivot.amount }}</td>
<td class="">{{ running_total|format_currency(currency_code) }}</td>
</tr>
{% if pivot.refunded_raw > 0%}
<tr class="item-row border-bottom">
<td class="">{{ invoice.date }}</td>
<td class="">{{ invoice.number }} $refund_label</td>
<td class="">{%set running_total = running_total + pivot.refunded_raw %}</td>
<td class="">({{ pivot.refunded }})</td>
<td class="">{{ running_total|format_currency(currency_code) }}</td>
</tr>
{% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
</tbody>
</table>
{% endif %}
</ninja>
<ninja>
{% if aging and show_aging %}
<div id="entity-container" style="break-inside: avoid;">
<table width="100%" cellspacing="0" cellpadding="0" class="" data-ref="table">
<thead class="">
<tr class="item-row border-bottom">
{% for key, age in aging %}
<th class="">{{ key }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
<tr class="item-row">
{% for key, age in aging %}
<td class="aging-table">{{ age }}</td>
{% endfor %}
</tr>
</tbody>
</table>
</div>
{% endif %}
</ninja>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,72 @@
<!DOCTYPE html>
<!-- Tasks - TemplateID #TT10 -->
<html>
<head>
<style>
html {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;
}
table {
margin-top: 2rem;
min-width: 100%;
table-layout: fixed;
overflow-wrap: break-word;
}
.table-header>tr>th {
border-bottom: solid 1px #efefef;
}
.table-body>tr>td {
border-bottom: solid 1px #efefef;
}
th {
text-align: left;
padding-left: 6px;
padding-right: 6px;
padding-top: 6px;
padding-bottom: 6px;
}
td {
padding-left: 6px;
padding-right: 6px;
padding-top: 1rem;
padding-bottom: 1rem;
white-space: nowrap;
}
</style>
</head>
<body>
<ninja>
{% if tasks %}
<table>
<thead>
<tr>
<th>Date</th>
<th>Description</th>
<th>Duration</th>
</tr>
</thead>
<tbody>
{% for task in tasks %}
{% for log in task.time_log %}
<tr>
<td>{{ log.start_date }}</td>
<td>{{ log.description }}</td>
<td>{{ log.duration|date('H:i:s') }}</td>
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
{% endif %}
</ninja>
</body>
</html>

View File

@ -16,10 +16,7 @@ use App\Http\Controllers\UserController;
use App\Http\Controllers\WePayController;
use Illuminate\Support\Facades\Route;
//Auth::routes(['password.reset' => false]);
Route::get('/', [BaseController::class, 'flutterRoute'])->middleware('guest');
// Route::get('self-update', [SelfUpdateController::class, 'update'])->middleware('guest');
Route::get('setup', [SetupController::class, 'index'])->middleware('guest');
Route::post('setup', [SetupController::class, 'doSetup'])->middleware('guest');
@ -37,15 +34,8 @@ Route::post('password/reset', [ResetPasswordController::class, 'reset'])->middle
Route::get('wepay/signup/{token}', [WePayController::class, 'signup'])->name('wepay.signup');
Route::get('wepay/finished', [WePayController::class, 'finished'])->name('wepay.finished');
/*
* Social authentication
*/
Route::get('auth/{provider}', [LoginController::class, 'redirectToProvider']);
/*
* Inbound routes requiring DB Lookup
*/
Route::middleware('url_db')->group(function () {
Route::get('/user/confirm/{confirmation_code}', [UserController::class, 'confirm']);
Route::post('/user/confirm/{confirmation_code}', [UserController::class, 'confirmWithPassword']);