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'] = '
Номер заказа: ' . ($order->order_type == "order" ? $orderNum : "-"). '
' . ' Дата заказа: ' . $orderDate . '
'; if (($selectedBranchId != "printOnly") && !empty($selectedBranch)) { $orderSpec['order'] .= 'Контакт-менеджер: ' . $selectedBranch['label'] . '
'; } $orderSpec['client'] = 'Данные клиента:
ФИО: ' . $orderName . '
' ; if (!empty($data['orderEmail'])) { $orderSpec['client'] .= 'E-mail: ' . htmlentities($data['orderEmail']) . '
'; } if (!empty($orderPhone)) { $orderSpec['client'] .= 'Телефон: ' . $orderPhone . '
'; } if (!empty($orderAddress)) { $orderSpec['client'] .= 'Адрес доставки: ' . $orderAddress . '
'; } if (!empty($data['selectedDoorData']['params']['discount'])) { $orderSpec['client'] .= 'Скидка: ' . min((int) $data['selectedDoorData']['params']['discount'], 100) . '%' . '
'; } if (!empty($data['orderComment'])) { $orderSpec['client'] .= 'Комментарий к заказу: ' . nl2br(htmlentities($data['orderComment'])) . '
'; } $orderSpec['client'] .= '
ПрофильС: ' . $configDoor['profile'] . " " . $cutConfig["doorsManufacturers"][$configDoor['manufacturer_id']]["label"] . '
' . ' Цвет системы: ' . $configDoor['color'] . '
' . ' Направ.верх: ' . $configDoor['colorNapravlyaushayaVerh'] . '
' . ' Направ.низ: ' . $configDoor['colorNapravlyaushayaNiz'] . '
'; $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 .= '
Номер заказа: ' . ($order->order_type == "order" ? $orderNum : "-") . '
' . ' Дата заказа: ' . $orderDate . '
'; $mail->AltBody .= ' Номер заказа: ' . ($order->order_type == "order" ? $orderNum : "-") . ' Дата заказа: ' . $orderDate; if (!empty($selectedBranch)) { $mail->Body .= 'Контакт-менеджер: ' . $selectedBranch['label'] . '
'; $mail->AltBody .= ' Контакт-менеджер: ' . $selectedBranch['label']; } $mail->Body .= '

ФИО: ' . $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->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 .= '
ПрофильС: ' . $configDoor['profile'] . " " . $cutConfig["doorsManufacturers"][$configDoor['manufacturer_id']]["label"] . '
' . ' Цвет системы: ' . $configDoor['color'] . '
' . ' Направ.верх: ' . $configDoor['color'] . '
' . ' Направ.низ: ' . $configDoor['color'] . '
'; $mail->AltBody .= '
ПрофильС: ' . $configDoor['profile'] . " " . $cutConfig["doorsManufacturers"][$configDoor['manufacturer_id']]["label"] . ' Цвет системы: ' . $configDoor['color'] . ' Направ.верх: ' . $configDoor['color'] . ' Направ.низ: ' . $configDoor['color'] ; if (!empty($viewOrderUrl)) { $mail->Body .= '

Ссылка для печати заказа'; $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 = ""; $html .= $orderSpec['order'] . '
'; $html .= $orderSpec['client'] . '
'; $params = $data['selectedDoorData']['params']; $calc = $data['selectedDoorData']['order_calc_results']; $html .= "Высота проема: " . $params['height'] . "мм" . "
" . "Ширина проема: " . $params['width'] . "мм" . "
" . "Количество дверей: " . $params['doorsCount'] . "шт" . "
"; $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 .= ' '; $html .= ' '; $html .= '
НаименованиеЕд.измКол-воЦена (руб.)Стоимость (руб.)
Профиль вертикальный С шт '.toFixed2($calc['profileVertCount']).' '.toFixed2Price(($params['height'] > $doorPrices['profileVertHeight']) && !empty($doorPrices['profileVertHigherLimit']) ? $doorPrices['profileVertHigherLimit'] : $doorPrices['profileVertBelowLimit']).' '.toFixed2Price($calc['profileVertPrice']).'
Направляющая верхняя м '.toFixed2($calc['napravlyaushayaVerhCount']).' '.toFixed2Price($doorPrices['napravlyaushayaVerh']).' '.toFixed2Price($calc['napravlyaushayaVerhPrice']).'
Направляющая нижняя м '.toFixed2($calc['napravlyaushayaNizCount']).' '.toFixed2Price($doorPrices['napravlyaushayaNiz']).' '.toFixed2Price($calc['napravlyaushayaNizPrice']).'
Рама горизонт.низ м '.toFixed2($calc['ramaGorizontNizCount']).' '.toFixed2Price($doorPrices['ramaGorizontNiz']).' '.toFixed2Price($calc['ramaGorizontNizPrice']).'
Рама горизонт.верх. м '.toFixed2($calc['ramaGorizontVerhCount']).' '.toFixed2Price($doorPrices['ramaGorizontVerh']).' '.toFixed2Price($calc['ramaGorizontVerhPrice']).'
Комплект роликов на 1-у дверь комп '.$calc['komplektRolikovCount'].' '.toFixed2Price($manufacturerPrices['komplektRolikov']).' '.toFixed2Price($calc['komplektRolikovPrice']).'
Стопор шт '.$calc['stoporCount'].' '.toFixed2Price($manufacturerPrices['stopor']).' '.toFixed2Price($calc['stoporPrice']).'
Шлегель м '.toFixed2($calc['shlegelCount']).' '.toFixed2Price($manufacturerPrices['shlegel']).' '.toFixed2Price($calc['shlegelPrice']).'
Зажим д\шлегеля шт '.$calc['zagimDlyaShlegelyaCount'].' '.toFixed2Price($manufacturerPrices['zagimDlyaShlegelya']).' '.toFixed2Price($calc['zagimDlyaShlegelyaPrice']).'
Уплотнитель ПК-80-0104 м '.toFixed2($calc['uplotnitelPK80Count']).' '.toFixed2Price($manufacturerPrices['uplotnitelPK80']).' '.toFixed2Price($calc['uplotnitelPK80Price']).'
Итого профиля '.toFixed2Price($calc['profilePrice']).'
Зеркало серебро кв.м. '.toFixed2($calc['zerkaloSerebroCount']).' '.toFixed2Price($manufacturerPrices['zerkaloSerebro']).' '.toFixed2Price($calc['zerkaloSerebroPrice']).'
Пленка безопасности д\зеркал пог.м. '.toFixed2($calc['plenkaBezopasnostiZerkalCount']).' '.toFixed2Price($manufacturerPrices['plenkaBezopasnostiZerkal']).' '.toFixed2Price($calc['plenkaBezopasnostiZerkalPrice']).'
Оракал белый м. кв. '.toFixed2($calc['plenkaOrakalCount']).' '.toFixed2Price($manufacturerPrices['plenkaOrakal']).' '.toFixed2Price($calc['plenkaOrakalPrice']).'
Стекло кв.м. '.toFixed2($calc['StekloCount']).' '.toFixed2Price($manufacturerPrices['Steklo']).' '.toFixed2Price($calc['StekloPrice']).'
ДСП 10мм лист лист '.toFixed2($calc['dsp10mmCount']).' '.toFixed2Price($manufacturerPrices['dsp10mm']).' '.toFixed2Price($calc['dsp10mmPrice']).'
Итого наполнение '.toFixed2Price($calc['napolneniePrice']).'
Сборка 1-ой двери кв.м. '.toFixed2($calc['sborkeDveriCount']).' '.toFixed2Price($manufacturerPrices['sborkeDveri']).' '.toFixed2Price($calc['sborkeDveriPrice']).'
Порезка '.$calc['porezkaMaterialaPercent'].'% от стоимости материала '.$calc['porezkaMaterialaPercent'].'% '.$calc['porezkaMaterialaCount'].' '.toFixed2Price($calc['porezkaMaterialaPrice']).' '.toFixed2Price($calc['porezkaMaterialaTotalPrice']).'
Сверление отверстий на одну дверь 1 дверь '.$calc['sverlenieOtverstiyNaDverCount'].' '.toFixed2Price($manufacturerPrices['sverlenieOtverstiyNaDver']).' '.toFixed2Price($calc['sverlenieOtverstiyNaDverPrice']).'
Работа сложная '.toFixed2($calc['rabotaSlognayaCount']).' '.toFixed2Price($manufacturerPrices['rabotaSlognaya']).' '.toFixed2Price($calc['rabotaSlognayaPrice']).'
Итого работа, руб. '.toFixed2Price($calc['rabotaPrice']).'
Итого, руб. '.toFixed2Price($calc['price']).'

'; $mpdf = new \Mpdf\Mpdf(Configure::read('mpdfPageParams')); $mpdf->SetHTMLHeader('
Спецификация заказа на изготовление дверей ' . ($orderType == "order" ? $orderNum : "") . ' стр. {PAGENO}/{nbpg}
'); $mpdf->SetHTMLFooter(' '); $mpdf->SetTitle("Спецификация заказа " . ($orderType == "order" ? $orderNum : "")); $mpdf->WriteHTML($html); $mpdf->Output($tmpSpecFile, 'F'); return $tmpSpecFile; } }