613 lines
27 KiB
PHP
613 lines
27 KiB
PHP
<?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;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|