Refactor API endpoints and update invoice generation
- Updated API calls in equipment.php, equipment_manage.php, and equipments_mass_update.php to use v2 endpoints. - Changed payload decoding from decode_payload to json_decode for consistency. - Enhanced invoice generation in factuur.php and webhook files to use a new email template and PDF structure. - Added new email and PDF templates for invoices to improve formatting and readability. - Improved marketing folder handling in marketing.php with better payload management. - Updated CSS for marketing to enhance UI interactions. - Added JavaScript checks for browser compatibility in softwaretool.php. - Adjusted user permissions in settingsprofiles.php to reflect new features.
This commit is contained in:
138
assets/mail/email_template_invoice.php
Normal file
138
assets/mail/email_template_invoice.php
Normal file
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
$message = '
|
||||
<!DOCTYPE html>
|
||||
<html lang="' . strtolower($language) . '">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>' . htmlspecialchars($lbl_invoice) . ' - Total Safety Solutions</title>
|
||||
</head>
|
||||
<body style="font-family: Arial, Helvetica, sans-serif; color: #000000; font-size: 14px; line-height: 1.6; margin: 0; padding: 0; background-color: #f4f4f4;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color: #f4f4f4;">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 0;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="background-color: #ffffff; max-width: 600px;">
|
||||
|
||||
<!-- Content -->
|
||||
<tr>
|
||||
<td style="padding: 30px 40px;">
|
||||
|
||||
<!-- Invoice Title -->
|
||||
<h1 style="font-size: 24px; font-weight: bold; color: #2c5f5d; margin: 0 0 25px 0;">' . htmlspecialchars($lbl_invoice) . '</h1>
|
||||
|
||||
<!-- Company Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 25px;">
|
||||
<tr>
|
||||
<td width="50%" style="vertical-align: top; font-size: 13px; line-height: 1.5;">
|
||||
<strong style="color: #2c5f5d; font-size: 14px;">Total Safety Solutions B.V.</strong><br>
|
||||
Laarakkerweg 8<br>
|
||||
5061 JR OISTERWIJK<br>
|
||||
Nederland
|
||||
</td>
|
||||
<td width="50%" style="vertical-align: top; text-align: right;">
|
||||
<!-- Contact details if needed -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- Invoice Details -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 25px; font-size: 13px;">
|
||||
<tr>
|
||||
<td width="50%" style="vertical-align: top; padding-right: 10px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding: 3px 0;"><strong>Invoice Date:</strong></td>
|
||||
<td style="padding: 3px 0;">' . htmlspecialchars(date('d-m-Y', strtotime($invoice_date))) . '</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 3px 0;"><strong>Invoice Number:</strong></td>
|
||||
<td style="padding: 3px 0;">' . htmlspecialchars($order_id) . '</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td width="50%" style="vertical-align: top; padding-left: 10px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding: 3px 0;"><strong>Reference:</strong></td>
|
||||
<td style="padding: 3px 0;">Online order</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 3px 0;"><strong>Order number:</strong></td>
|
||||
<td style="padding: 3px 0;">' . htmlspecialchars($order_id) . '</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- Items Table -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="8" border="0" width="100%" style="margin-bottom: 20px; border-bottom: 2px solid #999999;">
|
||||
<thead>
|
||||
<tr style="background-color: #f8f8f8;">
|
||||
<th style="text-align: left; font-weight: bold; font-size: 12px; padding: 10px 8px; border-bottom: 1px solid #999999;">Item code</th>
|
||||
<th style="text-align: left; font-weight: bold; font-size: 12px; padding: 10px 8px; border-bottom: 1px solid #999999;">Description</th>
|
||||
<th style="text-align: center; font-weight: bold; font-size: 12px; padding: 10px 8px; border-bottom: 1px solid #999999;">Quantity</th>
|
||||
<th style="text-align: right; font-weight: bold; font-size: 12px; padding: 10px 8px; border-bottom: 1px solid #999999;">Price</th>
|
||||
<th style="text-align: right; font-weight: bold; font-size: 12px; padding: 10px 8px; border-bottom: 1px solid #999999;">Total</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
foreach ($items as $item) {
|
||||
$line_total = $item['price'] * $item['quantity'];
|
||||
$message .= '<tr>
|
||||
<td style="padding: 10px 8px; border-bottom: 1px solid #dddddd; font-size: 13px;">SOFTWARE</td>
|
||||
<td style="padding: 10px 8px; border-bottom: 1px solid #dddddd; font-size: 13px;">' . htmlspecialchars($item['name']);
|
||||
|
||||
if ($item['serial_number'] !== 'N/A') {
|
||||
$message .= '<br><span style="font-size: 12px; color: #666666;">Serial: ' . htmlspecialchars($item['serial_number']) . '</span>';
|
||||
}
|
||||
if ($item['license_key'] !== 'Pending') {
|
||||
$message .= '<br><span style="font-size: 12px; color: #666666;">License: ' . htmlspecialchars($item['license_key']) . '</span>';
|
||||
}
|
||||
|
||||
$message .= '</td>
|
||||
<td style="text-align: center; padding: 10px 8px; border-bottom: 1px solid #dddddd; font-size: 13px;">' . htmlspecialchars($item['quantity']) . '</td>
|
||||
<td style="text-align: right; padding: 10px 8px; border-bottom: 1px solid #dddddd; font-size: 13px;">€ ' . number_format($item['price'], 2) . '</td>
|
||||
<td style="text-align: right; padding: 10px 8px; border-bottom: 1px solid #dddddd; font-size: 13px;">€ ' . number_format($line_total, 2) . '</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
$message .= '</tbody>
|
||||
</table>
|
||||
|
||||
<!-- Totals -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="5" border="0" width="250" align="right" style="margin-top: 10px; font-size: 13px;">
|
||||
<tr>
|
||||
<td style="text-align: left; padding: 5px 0;">' . htmlspecialchars($lbl_subtotal) . '</td>
|
||||
<td style="text-align: right; padding: 5px 0;">€ ' . number_format($subtotal, 2) . '</td>
|
||||
</tr>';
|
||||
|
||||
if ($tax_amount > 0) {
|
||||
$message .= '<tr>
|
||||
<td style="text-align: left; padding: 5px 0;">' . htmlspecialchars($lbl_tax) . '</td>
|
||||
<td style="text-align: right; padding: 5px 0;">€ ' . number_format($tax_amount, 2) . '</td>
|
||||
</tr>';
|
||||
} else {
|
||||
$message .= '<tr>
|
||||
<td style="text-align: left; padding: 5px 0;">VAT</td>
|
||||
<td style="text-align: right; padding: 5px 0;">included</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
$message .= '<tr style="border-top: 2px solid #000000;">
|
||||
<td style="text-align: left; padding: 8px 0 5px 0;"><strong>' . htmlspecialchars($lbl_total) . '</strong></td>
|
||||
<td style="text-align: right; padding: 8px 0 5px 0;"><strong>€ ' . number_format($payment_amount, 2) . '</strong></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>';
|
||||
306
assets/mail/pdf_template_invoice.php
Normal file
306
assets/mail/pdf_template_invoice.php
Normal file
@@ -0,0 +1,306 @@
|
||||
<?php
|
||||
|
||||
$pdf = '<!DOCTYPE html>
|
||||
<html lang="' . strtolower($language) . '">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>' . htmlspecialchars($lbl_invoice) . ' - Total Safety Solutions</title>
|
||||
<style>
|
||||
@page {margin: 220px 50px; }
|
||||
|
||||
body {
|
||||
font-family: "DejaVu Sans", Arial, sans-serif;
|
||||
color: #000;
|
||||
font-size: 11px;
|
||||
line-height: 1.4;
|
||||
margin: 10px auto;
|
||||
padding: 0;
|
||||
width:90%;
|
||||
}
|
||||
|
||||
#header {
|
||||
position: fixed;
|
||||
left: -52px;
|
||||
top: -220px;
|
||||
right: -50px;
|
||||
height: 200px;
|
||||
text-align: center;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
#header img {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#footer {
|
||||
position: fixed;
|
||||
left: -50px;
|
||||
bottom: -250px;
|
||||
right: -50px;
|
||||
height: 150px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
#footer img {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.invoice-title {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
color: #2c5f5d;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.company-header {
|
||||
display: table;
|
||||
width: 100%;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.company-info, .contact-details {
|
||||
display: table-cell;
|
||||
vertical-align: top;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.company-info h3 {
|
||||
font-weight: bold;
|
||||
margin: 0 0 5px 0;
|
||||
color: #2c5f5d;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.company-info p, .contact-details p {
|
||||
margin: 0;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.contact-details {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.contact-details h3 {
|
||||
font-weight: bold;
|
||||
margin: 0 0 5px 0;
|
||||
color: #2c5f5d;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.invoice-details {
|
||||
display: table;
|
||||
width: 100%;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.invoice-left, .invoice-right {
|
||||
display: table-cell;
|
||||
vertical-align: top;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.invoice-right {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.detail-row {
|
||||
margin-bottom: 2px;
|
||||
display: table;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.detail-label {
|
||||
display: table-cell;
|
||||
font-weight: normal;
|
||||
width: 140px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.detail-value {
|
||||
display: table-cell;
|
||||
}
|
||||
|
||||
.detail-value {
|
||||
display: table-cell;
|
||||
}
|
||||
|
||||
.items-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-bottom: 30px;
|
||||
border-bottom: 1px solid #999;
|
||||
}
|
||||
|
||||
.items-table th {
|
||||
padding: 8px 6px;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.items-table td {
|
||||
padding: 6px;
|
||||
border-bottom: 1px solid #999;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.items-table .qty-col {
|
||||
text-align: center;
|
||||
width: 70px;
|
||||
}
|
||||
|
||||
.items-table .price-col, .items-table .total-col {
|
||||
text-align: right;
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.items-table th.qty-col {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.items-table th.price-col, .items-table th.total-col {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.totals-section {
|
||||
float: right;
|
||||
width: 250px;
|
||||
margin-top: 20px;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.total-row {
|
||||
display: table;
|
||||
width: 100%;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.total-label {
|
||||
display: table-cell;
|
||||
text-align: left;
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
.total-amount {
|
||||
display: table-cell;
|
||||
text-align: right;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.final-total {
|
||||
border-top: 1px solid #000;
|
||||
padding-top: 5px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.final-total .total-amount {
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="header">
|
||||
<img src="https://'.$portalURL.'/assets/images/TSS_invoice_header.png" alt="Invoice header">
|
||||
</div>
|
||||
<div id="footer">
|
||||
<img src="https://'.$portalURL.'/assets/images/TSS_invoice_footer.png" alt="Invoice footer">
|
||||
</div>
|
||||
|
||||
<div class="invoice-title">' . htmlspecialchars($lbl_invoice) . '</div>
|
||||
|
||||
<div class="company-header">
|
||||
<div class="company-info">
|
||||
<h3>Total Safety Solutions B.V.</h3>
|
||||
<p>Laarakkerweg 8</p>
|
||||
<p>5061 JR OISTERWIJK</p>
|
||||
<p>Nederland</p>
|
||||
</div>
|
||||
<div class="contact-details">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="invoice-details">
|
||||
<div class="invoice-left">
|
||||
<div class="detail-row">
|
||||
<div class="detail-label">Invoice Date</div>
|
||||
<div class="detail-value">: ' . htmlspecialchars(date('d-m-Y', strtotime($invoice_date))) . '</div>
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
<div class="detail-label">Invoice Number</div>
|
||||
<div class="detail-value">: ' . htmlspecialchars($order_id) . '</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="invoice-right">
|
||||
<div class="detail-row">
|
||||
<div class="detail-label">Reference</div>
|
||||
<div class="detail-value">: Online order</div>
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
<div class="detail-label">Order number</div>
|
||||
<div class="detail-value">: ' . htmlspecialchars($order_id) . '</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="items-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Item code</th>
|
||||
<th>Description</th>
|
||||
<th class="qty-col">Quantity</th>
|
||||
<th class="price-col">Price</th>
|
||||
<th class="total-col">Total</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
foreach ($items as $item) {
|
||||
$line_total = $item['price'] * $item['quantity'];
|
||||
$pdf .= '<tr>
|
||||
<td>SOFTWARE</td>
|
||||
<td>' . htmlspecialchars($item['name']);
|
||||
|
||||
if ($item['serial_number'] !== 'N/A') {
|
||||
$pdf .= '<br><small>Serial: ' . htmlspecialchars($item['serial_number']) . '</small>';
|
||||
}
|
||||
if ($item['license_key'] !== 'Pending') {
|
||||
$pdf .= '<br><small>License: ' . htmlspecialchars($item['license_key']) . '</small>';
|
||||
}
|
||||
|
||||
$pdf .= '</td>
|
||||
<td class="qty-col">' . htmlspecialchars($item['quantity']) . ' </td>
|
||||
<td class="price-col">€ ' . number_format($item['price'], 2) . '</td>
|
||||
<td class="total-col">€ ' . number_format($line_total, 2) . '</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
$pdf .= '</tbody>
|
||||
</table>
|
||||
|
||||
<div class="totals-section">
|
||||
<div class="total-row">
|
||||
<div class="total-label">' . htmlspecialchars($lbl_subtotal) . '</div>
|
||||
<div class="total-amount">€ ' . number_format($subtotal, 2) . '</div>
|
||||
</div>';
|
||||
|
||||
if ($tax_amount > 0) {
|
||||
$pdf .= '<div class="total-row">
|
||||
<div class="total-label">' . htmlspecialchars($lbl_tax) . '</div>
|
||||
<div class="total-amount">€ ' . number_format($tax_amount, 2) . '</div>
|
||||
</div>';
|
||||
} else {
|
||||
$pdf .= '<div class="total-row">
|
||||
<div class="total-label">VAT</div>
|
||||
<div class="total-amount">included</div>
|
||||
</div>';
|
||||
}
|
||||
|
||||
$pdf .= '<div class="total-row final-total">
|
||||
<div class="total-label">' . htmlspecialchars($lbl_total) . '</div>
|
||||
<div class="total-amount">€ ' . number_format($payment_amount, 2) . '</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>';
|
||||
Reference in New Issue
Block a user