Files
apps.supersamsev.ru/src/Model/Table/CalcDoorsOrdersTable.php
T

613 lines
27 KiB
PHP
Raw Normal View History

2026-10-21 23:46:31 +03:00
<?php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
use Cake\Routing\Router;
use DBF;
use PHPExcel;
use PHPExcel_Writer_Excel5;
use SMSRU;
//use mPDF;
use Mpdf\Mpdf;
use Cake\Core\Configure;
class CalcDoorsOrdersTable extends Table {
public function initialize(array $config) {
$this->setTable('calc_doors_orders');
}
public function orderEmailNotify($data, $cutConfig, $clientIP, $authUserId = null, $configDoor) {
$result = 'error';
$selectedBranch = (!empty($data['branchId']) && !empty($cutConfig['branches'][$data['branchId']]) ? $cutConfig['branches'][$data['branchId']] : null);
$selectedBranchId = (!empty($data['branchId']) && !empty($cutConfig['branches'][$data['branchId']]) ? $data['branchId'] : null);
if (empty($selectedBranch)) {
foreach($cutConfig['branches'] as $key => $li) {
if (!empty($li['is_default'])) {
$selectedBranch = $li;
$selectedBranchId = $key;
break;
}
}
}
$orderPhone = (!empty($data['orderPhone']) ? htmlentities($data['orderPhone']) : "");
$orderAddress = (!empty($data['orderAddress']) ? htmlentities($data['orderAddress']) : "не указан");
$orderName = (!empty($data['orderName']) ? htmlentities($data['orderName']) : 'не указано');
$orderComment = (!empty($data['orderComment']) ? nl2br(htmlentities($data['orderComment'])) : 'не указан');
$newOrderData = [
'name' => $data['orderName'],
'email' => $data['orderEmail'],
'phone' => $data['orderPhone'],
'address' => $data['orderAddress'],
'comment' => $data['orderComment'],
'price' => (!empty($data['price']) ? $data['price'] : str_replace(" ", "", $data['selectedDoorData']['order_calc_results']['price'])),
'actual_price' => (!empty($data['actualPrice']) ? $data['actualPrice'] : str_replace(" ", "", $data['selectedDoorData']['order_calc_results']['price'])),
'params' => json_encode($data['selectedDoorData']['params']),
'order_calc_results' => json_encode($data['selectedDoorData']['order_calc_results'])
];
if ($selectedBranchId == "printOnly") {
$newOrderData["order_type"] = "print";
} else {
$newOrderData["order_type"] = "order";
$newOrderData["branch_id"] = $selectedBranchId;
}
$orderNum = "";
if(!empty($data['eOId'])) {
$encryptedOrderId = $data['eOId'];
$decryptedData = TableRegistry::getTableLocator()->get('CutOrders')->decryptCustomData($encryptedOrderId, $cutConfig);
if (!empty($decryptedData['orderId'])) {
$order = $this->find('all')->where(['id' => $decryptedData['orderId']])->first();
if (!empty($order)) {
$this->patchEntity($order, $newOrderData);
$orderNum = $order['order_num'];
}
}
}
if (empty($order)) {
$newOrderData['order_num'] = '';
$newOrderData['created'] = date('Y-m-d H:i:s');
$order = $this->newEntity($newOrderData);
$data['eOId'] = false;
}
if ($this->save($order)) {
$orderId = $order->id;
if (empty($encryptedOrderId)) {
$encryptedOrderId = TableRegistry::getTableLocator()->get('CutOrders')->encryptCustomData($orderId, 'orderId', $cutConfig);
if (!empty($encryptedOrderId)) {
$viewOrderUrlBase = '/calc-doors?oid=' . $encryptedOrderId;
}
}
if (empty($order->order_num)) {
$cutSettingsTable = TableRegistry::getTableLocator()->get('CalcDoorsSettings');
$orderNumMonth = date('Y-m-01');
$orderNumDefaultCounters = [
'order' => 0,
'print' => 0
];
$orderNumSetting = $cutSettingsTable->find()->where([
'key' => 'orderNumCounter',
'group' => 'common'
])->first();
if (empty($orderNumSetting)) {
$orderNumDefaultCounters[$newOrderData["order_type"]]++;
$orderNumCounter = 1;
$orderNumSetting = $cutSettingsTable->newEntity();
$orderNumSetting = $cutSettingsTable->patchEntity($orderNumSetting, [
'key' => 'orderNumCounter',
'value' => json_encode([
'month' => $orderNumMonth,
'counters' => $orderNumDefaultCounters
]),
'group' => 'common'
]);
} else {
$orderNumSetting->value = @json_decode($orderNumSetting->value, true);
if ($orderNumSetting->value['month'] != $orderNumMonth) {
$orderNumSetting->value['month'] = $orderNumMonth;
$orderNumDefaultCounters[$newOrderData["order_type"]]++;
$orderNumCounter = 1;
$orderNumSetting->value['counters'] = $orderNumDefaultCounters;
} else {
$orderNumSetting->value['counters'][$newOrderData["order_type"]]++;
$orderNumCounter = $orderNumSetting->value['counters'][$newOrderData["order_type"]];
}
$orderNumSetting->value = json_encode($orderNumSetting->value);
}
$cutSettingsTable->save($orderNumSetting);
$orderNum = $cutConfig['common']['orderNumPrefix']['value'] . date('dmY') . "-" . str_pad($orderNumCounter, $cutConfig['common']['orderNumLength']['value'], "0", STR_PAD_LEFT);
if ($newOrderData["order_type"] == "print") {
$orderNum .= "-P";
}
$order->order_num = $orderNum;
}
if (!empty($viewOrderUrlBase)) {
$viewOrderUrl = '/calc-doors?oid=' . $encryptedOrderId;
$order->view_order_url = $viewOrderUrlBase;
}
$this->save($order);
$orderDate = date('d.m.Y H:i');
$orderSpec['order'] = '<br/>
Номер заказа: ' . ($order->order_type == "order" ? $orderNum : "-"). '<br/>' . '
Дата заказа: ' . $orderDate . '<br/>';
if (($selectedBranchId != "printOnly") && !empty($selectedBranch)) {
$orderSpec['order'] .= 'Контакт-менеджер: ' . $selectedBranch['label'] . '<br/>';
}
$orderSpec['client'] = 'Данные клиента: <br/>
ФИО: ' . $orderName . '<br/>' ;
if (!empty($data['orderEmail'])) {
$orderSpec['client'] .= 'E-mail: ' . htmlentities($data['orderEmail']) . '<br/>';
}
if (!empty($orderPhone)) {
$orderSpec['client'] .= 'Телефон: ' . $orderPhone . '<br/>';
}
if (!empty($orderAddress)) {
$orderSpec['client'] .= 'Адрес доставки: ' . $orderAddress . '<br/>';
}
if (!empty($data['selectedDoorData']['params']['discount'])) {
$orderSpec['client'] .= 'Скидка: ' . min((int) $data['selectedDoorData']['params']['discount'], 100) . '%' . '<br/>';
}
if (!empty($data['orderComment'])) {
$orderSpec['client'] .= 'Комментарий к заказу: ' . nl2br(htmlentities($data['orderComment'])) . '<br/>';
}
$orderSpec['client'] .= '<br/>
ПрофильС: ' . $configDoor['profile'] . " " . $cutConfig["doorsManufacturers"][$configDoor['manufacturer_id']]["label"] . '<br/>' . '
Цвет системы: ' . $configDoor['color'] . '<br/>' . '
Направ.верх: ' . $configDoor['colorNapravlyaushayaVerh'] . '<br/>' . '
Направ.низ: ' . $configDoor['colorNapravlyaushayaNiz'] . '<br/>';
$filename = $orderNum; //. "_" . date('d-m-Y');
$specFilename = $filename. "_specification" . ".pdf";
$tmpSpecFile = $this->generateSpecFile($data, $cutConfig, $orderSpec, $orderNum, $order["order_type"]);
if (empty($data['eOId']) && ($selectedBranchId != "printOnly")) { //new order, send email
$mail = TableRegistry::getTableLocator()->get('CutOrders')->configurePHPMailer($cutConfig);
foreach (explode("\n", $selectedBranch['order_notify_manager_emails']) as $managerEmail) {
$managerEmail = trim($managerEmail);
if (!empty($managerEmail)) {
$mail->addAddress(trim($managerEmail));
}
}
$mail->addAttachment($tmpSpecFile, $specFilename);
$mail->Subject = str_replace("{OrderNum}", $orderNum, $cutConfig['common']['orderNotifySubject']['value']);
$mail->Body = $cutConfig['common']['orderNotifyBodyStart']['value'];
$mail->AltBody = $cutConfig['common']['orderNotifyBodyStart']['value'];
$mail->Body .= '<br/>
Номер заказа: ' . ($order->order_type == "order" ? $orderNum : "-") . '<br/>' . '
Дата заказа: ' . $orderDate . '<br/>';
$mail->AltBody .= '
Номер заказа: ' . ($order->order_type == "order" ? $orderNum : "-") . '
Дата заказа: ' . $orderDate;
if (!empty($selectedBranch)) {
$mail->Body .= 'Контакт-менеджер: ' . $selectedBranch['label'] . '<br/>';
$mail->AltBody .= '
Контакт-менеджер: ' . $selectedBranch['label'];
}
$mail->Body .= '<br/><br/>
ФИО: ' . $orderName . '<br/>' . '
E-mail: ' . (!empty($data['orderEmail']) ? '<a href="mailto:' . htmlentities($data['orderEmail']) . '">' . htmlentities($data['orderEmail']) . '</a>' : 'не указан') . '<br/>' . '
Телефон: ' . (!empty($orderPhone) ? '<a href="tel:' . preg_replace("/[^0-9.]/", "", $orderPhone) . '">' . $orderPhone . '</a>' : 'не указан') . '<br/>' . '
Адрес доставки: ' . (!empty($orderAddress) ? $orderAddress : 'не указан') . '<br/>' . '
' . (!empty($data['selectedDoorData']['params']['discount']) ? 'Скидка: ' . $data['selectedDoorData']['params']['discount'] . '%' . '<br/>' : '') . '
Комментарий: ' . $orderComment . '<br/>';
$mail->AltBody .= '
ФИО: ' . $orderName . '
E-mail: ' . (!empty($data['orderEmail']) ? htmlentities($data['orderEmail']) : 'не указан') . '
Телефон: ' . (!empty($orderPhone) ? $orderPhone : 'не указан') . '
Адрес доставки: ' . (!empty($orderAddress) ? $orderAddress : 'не указан') . '
' . (!empty($data['selectedDoorData']['params']['discount']) ? 'Скидка: ' . $data['selectedDoorData']['params']['discount'] . '%' : '') . '
Комментарий: ' . $orderComment;
$mail->Body .= '<br/>
ПрофильС: ' . $configDoor['profile'] . " " . $cutConfig["doorsManufacturers"][$configDoor['manufacturer_id']]["label"] . '<br/>' . '
Цвет системы: ' . $configDoor['color'] . '<br/>' . '
Направ.верх: ' . $configDoor['color'] . '<br/>' . '
Направ.низ: ' . $configDoor['color'] . '<br/>';
$mail->AltBody .= '<br/>
ПрофильС: ' . $configDoor['profile'] . " " . $cutConfig["doorsManufacturers"][$configDoor['manufacturer_id']]["label"] . '
Цвет системы: ' . $configDoor['color'] . '
Направ.верх: ' . $configDoor['color'] . '
Направ.низ: ' . $configDoor['color'] ;
if (!empty($viewOrderUrl)) {
$mail->Body .= '<br/><br/>
<a href="' . Router::fullBaseUrl() . $viewOrderUrl . '">Ссылка для печати заказа</a>';
$mail->AltBody .= '
Ссылка для печати заказа: ' . Router::fullBaseUrl() . $viewOrderUrl;
}
$order->html_letter = $mail->Body;
$order->text_letter = $mail->AltBody;
$this->save($order);
$mail->send();
}
$result = 'success';
if (!empty($orderNum)) {
$zip = new \ZipArchive;
if ($zip->open(ROOT . '/files/calc_doors_orders/' . $orderNum . '.zip', \ZipArchive::CREATE | \ZipArchive::OVERWRITE) === true) {
$zip->addFile($tmpSpecFile, $specFilename);
$zip->close();
}
}
@unlink($tmpSpecFile);
if (empty($data['eOId'])) { //new order, send sms
if (!empty($selectedBranch['order_notify_manager_sms'])) {
TableRegistry::getTableLocator()->get('CutOrders')->sendSms(explode("\n", $selectedBranch['order_notify_manager_sms']), "Появился новый заказ " . $orderNum, $cutConfig['global']['smsRuApiKey']['value'], $clientIP);
}
}
if ($newOrderData["order_type"] == "order") {
if (!empty($data['eOId'])) { //save order, revert stat
$order->updated_date = date('Y-m-d H:i:s');
$order->updated_by_manager = $authUserId;
$this->save($order);
}
}
}
if (empty($cutConfig['global']['additionalActionsAllowed'])) {
$viewOrderUrl = "";
}
return [
'orderEmailNotifySent' => $result,
'printOrderUrl' => (!empty($viewOrderUrl) ? str_replace("/calc-doors", "/calc-doors-print", $viewOrderUrl): "")
];
}
public function resendOrderEmailNotify($order, $managerEmail, $cutConfig) {
$mail = TableRegistry::getTableLocator()->get('CutOrders')->configurePHPMailer($cutConfig);
$mail->addAddress(trim($managerEmail));
$mail->Subject = str_replace("{OrderNum}", $order->order_num, $cutConfig['common']['orderNotifySubject']['value']);
$mail->Body = (!empty($order->html_letter) ? $order->html_letter : $cutConfig['common']['orderNotifyBodyStart']['value']);
$mail->AltBody = (!empty($order->text_letter) ? $order->text_letter : $cutConfig['common']['orderNotifyBodyStart']['value']);
$zip = @zip_open(ROOT . '/files/calc_doors_orders/' . $order->order_num . '.zip');
if (!empty($zip)) {
while ($zip_entry = zip_read($zip)) {
$mail->addStringAttachment(zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)), zip_entry_name($zip_entry));
}
@zip_close($zip);
}
$mail->send();
}
function generateSpecFile($data, $cutConfig, $orderSpec, $orderNum, $orderType) {
$tmpSpecFile = @tempnam("/tmp", "calc_doors_order_email_spec_pdf");
$html = "<style>
body { font-size: 12px; font-family: arial, sans-serif; }
table { width: 100%; border: 1px solid #000; border-collapse: collapse; }
table th, table td { padding: 5px; border: 1px solid #000; text-align: left; }
table td { padding: 3px 5px; }
table th { font-weight: normal; }
table th.text-center, table td.text-center { text-align: center; }
.borderDiv { font-size: 2px; line-height: 10px; }
.border1DivTop { border-top: 1px solid #000; }
.border1DivBottom { border-bottom: 1px solid #000; }
.border2DivTop { border-top: 1px dashed #000;}
.border2DivBottom { border-bottom: 1px dashed #000;}
.border1divWide { border-top: 2px solid #000; }
.border2divWide { border-top: 2px dashed #000; }
.border1divWide, .border2divWide { font-size: 4px; }
table.table-footer, table.table-header { margin-top: 0; }
table.table-footer td, table.table-header td { font-size: 12px; padding: 5px 0 5px 0; }
table.table-footer td { padding: 3px 0 3px 0; }
table.table-border-less, table.table-border-less td { border: 0 none; }
</style>";
$html .= $orderSpec['order'] . '<br/>';
$html .= $orderSpec['client'] . '<br/>';
$params = $data['selectedDoorData']['params'];
$calc = $data['selectedDoorData']['order_calc_results'];
$html .= "Высота проема: " . $params['height'] . "мм" . "<br/>" .
"Ширина проема: " . $params['width'] . "мм" . "<br/>" .
"Количество дверей: " . $params['doorsCount'] . "шт" . "<br/>";
$configDoor = TableRegistry::getTableLocator()->get('CalcDoors')->find('all')->where([
'id' => $params['doorId']
])->first();
$doorPrices = [];
$manufacturerPrices = [];
$manufacturerLimits = [];
if (!empty($configDoor)) {
$configDoor = $configDoor->toArray();
$doorPrices = @json_decode($configDoor['params'], true);
$configManufacturer = TableRegistry::getTableLocator()->get('CalcDoorsSettings')->find('all')->where([
'group' => 'prices_' . $configDoor['manufacturer_id']
])->all()->toArray();
foreach($configManufacturer as $li) {
$manufacturerPrices[$li['key']] = $li['value'];
}
$configManufacturer = TableRegistry::getTableLocator()->get('CalcDoorsSettings')->find('all')->where([
'group' => 'limits_' . $configDoor['manufacturer_id']
])->all()->toArray();
foreach($configManufacturer as $li) {
$manufacturerLimits[$li['key']] = $li['value'];
}
}
$html .= '<newpage> <table>
<thead><tr><th style="width: 300px;"><b>Наименование</b></th><th><b>Ед.изм</b></th><th><b>Кол-во</b></th><th><b>Цена (руб.)</b></th><th><b>Стоимость (руб.)</b></th></tr></thead><tbody>';
$html .= '
<tr>
<td>Профиль вертикальный С</td>
<td>шт</td>
<td>'.toFixed2($calc['profileVertCount']).'</td>
<td>'.toFixed2Price(($params['height'] > $doorPrices['profileVertHeight']) && !empty($doorPrices['profileVertHigherLimit']) ? $doorPrices['profileVertHigherLimit'] : $doorPrices['profileVertBelowLimit']).'</td>
<td>'.toFixed2Price($calc['profileVertPrice']).'</td>
</tr>
<tr>
<td>Направляющая верхняя</td>
<td>м</td>
<td>'.toFixed2($calc['napravlyaushayaVerhCount']).'</td>
<td>'.toFixed2Price($doorPrices['napravlyaushayaVerh']).'</td>
<td>'.toFixed2Price($calc['napravlyaushayaVerhPrice']).'</td>
</tr>
<tr>
<td>Направляющая нижняя</td>
<td>м</td>
<td>'.toFixed2($calc['napravlyaushayaNizCount']).'</td>
<td>'.toFixed2Price($doorPrices['napravlyaushayaNiz']).'</td>
<td>'.toFixed2Price($calc['napravlyaushayaNizPrice']).'</td>
</tr>
<tr>
<td>Рама горизонт.низ</td>
<td>м</td>
<td>'.toFixed2($calc['ramaGorizontNizCount']).'</td>
<td>'.toFixed2Price($doorPrices['ramaGorizontNiz']).'</td>
<td>'.toFixed2Price($calc['ramaGorizontNizPrice']).'</td>
</tr>
<tr>
<td>Рама горизонт.верх.</td>
<td>м</td>
<td>'.toFixed2($calc['ramaGorizontVerhCount']).'</td>
<td>'.toFixed2Price($doorPrices['ramaGorizontVerh']).'</td>
<td>'.toFixed2Price($calc['ramaGorizontVerhPrice']).'</td>
</tr>
<tr>
<td>Комплект роликов на 1-у дверь</td>
<td>комп</td>
<td>'.$calc['komplektRolikovCount'].'</td>
<td>'.toFixed2Price($manufacturerPrices['komplektRolikov']).'</td>
<td>'.toFixed2Price($calc['komplektRolikovPrice']).'</td>
</tr>
<tr>
<td>Стопор</td>
<td>шт</td>
<td>'.$calc['stoporCount'].'</td>
<td>'.toFixed2Price($manufacturerPrices['stopor']).'</td>
<td>'.toFixed2Price($calc['stoporPrice']).'</td>
</tr>
<tr>
<td>Шлегель</td>
<td>м</td>
<td>'.toFixed2($calc['shlegelCount']).'</td>
<td>'.toFixed2Price($manufacturerPrices['shlegel']).'</td>
<td>'.toFixed2Price($calc['shlegelPrice']).'</td>
</tr>
<tr>
<td>Зажим д\шлегеля</td>
<td>шт</td>
<td>'.$calc['zagimDlyaShlegelyaCount'].'</td>
<td>'.toFixed2Price($manufacturerPrices['zagimDlyaShlegelya']).'</td>
<td>'.toFixed2Price($calc['zagimDlyaShlegelyaPrice']).'</td>
</tr>
<tr>
<td>Уплотнитель ПК-80-0104</td>
<td>м</td>
<td>'.toFixed2($calc['uplotnitelPK80Count']).'</td>
<td>'.toFixed2Price($manufacturerPrices['uplotnitelPK80']).'</td>
<td>'.toFixed2Price($calc['uplotnitelPK80Price']).'</td>
</tr>
<tr>
<td colspan="4"><b>Итого профиля</b></td>
<td><b>'.toFixed2Price($calc['profilePrice']).'</b></td>
</tr>
<tr>
<td>Зеркало серебро</td>
<td>кв.м.</td>
<td>'.toFixed2($calc['zerkaloSerebroCount']).'</td>
<td>'.toFixed2Price($manufacturerPrices['zerkaloSerebro']).'</td>
<td>'.toFixed2Price($calc['zerkaloSerebroPrice']).'</td>
</tr>
<tr>
<td>Пленка безопасности д\зеркал</td>
<td>пог.м.</td>
<td>'.toFixed2($calc['plenkaBezopasnostiZerkalCount']).'</td>
<td>'.toFixed2Price($manufacturerPrices['plenkaBezopasnostiZerkal']).'</td>
<td>'.toFixed2Price($calc['plenkaBezopasnostiZerkalPrice']).'</td>
</tr>
<tr>
<td>Оракал белый</td>
<td>м. кв.</td>
<td>'.toFixed2($calc['plenkaOrakalCount']).'</td>
<td>'.toFixed2Price($manufacturerPrices['plenkaOrakal']).'</td>
<td>'.toFixed2Price($calc['plenkaOrakalPrice']).'</td>
</tr>
<tr>
<td>Стекло</td>
<td>кв.м.</td>
<td>'.toFixed2($calc['StekloCount']).'</td>
<td>'.toFixed2Price($manufacturerPrices['Steklo']).'</td>
<td>'.toFixed2Price($calc['StekloPrice']).'</td>
</tr>
<tr>
<td>ДСП 10мм лист</td>
<td>лист</td>
<td>'.toFixed2($calc['dsp10mmCount']).'</td>
<td>'.toFixed2Price($manufacturerPrices['dsp10mm']).'</td>
<td>'.toFixed2Price($calc['dsp10mmPrice']).'</td>
</tr>
<tr>
<td colspan="4"><b>Итого наполнение</b></td>
<td><b>'.toFixed2Price($calc['napolneniePrice']).'</b></td>
</tr>
<tr>
<td>Сборка 1-ой двери</td>
<td>кв.м.</td>
<td>'.toFixed2($calc['sborkeDveriCount']).'</td>
<td>'.toFixed2Price($manufacturerPrices['sborkeDveri']).'</td>
<td>'.toFixed2Price($calc['sborkeDveriPrice']).'</td>
</tr>
<tr>
<td>Порезка '.$calc['porezkaMaterialaPercent'].'% от стоимости материала</td>
<td>'.$calc['porezkaMaterialaPercent'].'%</td>
<td>'.$calc['porezkaMaterialaCount'].'</td>
<td>'.toFixed2Price($calc['porezkaMaterialaPrice']).'</td>
<td>'.toFixed2Price($calc['porezkaMaterialaTotalPrice']).'</td>
</tr>
<tr>
<td>Сверление отверстий на одну дверь</td>
<td>1 дверь</td>
<td>'.$calc['sverlenieOtverstiyNaDverCount'].'</td>
<td>'.toFixed2Price($manufacturerPrices['sverlenieOtverstiyNaDver']).'</td>
<td>'.toFixed2Price($calc['sverlenieOtverstiyNaDverPrice']).'</td>
</tr>
<tr>
<td>Работа сложная</td>
<td></td>
<td>'.toFixed2($calc['rabotaSlognayaCount']).'</td>
<td>'.toFixed2Price($manufacturerPrices['rabotaSlognaya']).'</td>
<td>'.toFixed2Price($calc['rabotaSlognayaPrice']).'</td>
</tr>
<tr>
<td colspan="4"><b>Итого работа, руб.</b></td>
<td><b>'.toFixed2Price($calc['rabotaPrice']).'</b></td>
</tr>
<tr>
<td colspan="4"><b>Итого, руб.</b></td>
<td class="total-price"><b>'.toFixed2Price($calc['price']).'</b></td>
</tr>
';
$html .= '</tbody></table><br/>';
$mpdf = new \Mpdf\Mpdf(Configure::read('mpdfPageParams'));
$mpdf->SetHTMLHeader('
<table width="100%" class="table-header table-border-less">
<tr>
<td width="80%" style="text-align: left;"><b>Спецификация заказа на изготовление дверей ' . ($orderType == "order" ? $orderNum : "") . '</b></td>
<td width="20%" style="text-align: right;">стр. {PAGENO}/{nbpg}</td>
</tr>
</table>');
$mpdf->SetHTMLFooter('
<table width="100%" class="table-footer table-border-less">
<tr>
<td width="100%" style="text-align: left;">
Подпись данной спецификации подтверждает правильность внесенных мной данных.<br/>
После оплаты заказа, корректировка данных не принимается. Изменения вносятся отдельным заказом.
<br/><br/>Подпись клиента: __________________________________________________
</td>
</tr>
</table>');
$mpdf->SetTitle("Спецификация заказа " . ($orderType == "order" ? $orderNum : ""));
$mpdf->WriteHTML($html);
$mpdf->Output($tmpSpecFile, 'F');
return $tmpSpecFile;
}
}