345 lines
18 KiB
PHP
345 lines
18 KiB
PHP
<?php
|
||||
|
|
|
|||
|
|
namespace App\Model\Table;
|
|||
|
|
|
|||
|
|
use Cake\Core\Configure;
|
|||
|
|
use Cake\ORM\Table;
|
|||
|
|
use Cake\ORM\TableRegistry;
|
|||
|
|
use SMSRU;
|
|||
|
|
|
|||
|
|
class OrderPaymentTable extends Table {
|
|||
|
|
|
|||
|
|
public function initialize(array $config) {
|
|||
|
|
$this->setTable('order_payment');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function importOrdersInfoFromXml($sourceFile, $origFilename = null, $domain = "apps.supersamsev.ru") {
|
|||
|
|
$result = [
|
|||
|
|
'count' => 0,
|
|||
|
|
'reason' => ''
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (!empty($sourceFile) && is_file($sourceFile) && file_exists($sourceFile)) {
|
|||
|
|
$sheetsTable = TableRegistry::getTableLocator()->get('CutSheets');
|
|||
|
|
$orderPaymentTable = TableRegistry::getTableLocator()->get('OrderPayment');
|
|||
|
|
|
|||
|
|
$xml = @simplexml_load_file($sourceFile, 'SimpleXMLIterator');
|
|||
|
|
if (!empty($xml)) {
|
|||
|
|
$isErrorOccurred = false;
|
|||
|
|
|
|||
|
|
if (!isset($xml->orderid) || !isset($xml->orderid->invoice_no)) {
|
|||
|
|
$result['reason'] = 'Неверный формат файла.';
|
|||
|
|
$isErrorOccurred = true;
|
|||
|
|
} else {
|
|||
|
|
$orderYear = date('Y');
|
|||
|
|
if (!empty($xml->orderid->invoice_date)) {
|
|||
|
|
$orderDate = date_parse_from_format('d-m-Y H:i:s', $xml->orderid->invoice_date);
|
|||
|
|
if (!empty($orderDate) && !empty($orderDate['year'])) {
|
|||
|
|
$orderYear = $orderDate['year'];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$orderData = (array)$xml->orderid;
|
|||
|
|
$order = $orderPaymentTable->find('all')->where([
|
|||
|
|
'order_num' => $orderData['invoice_no'],
|
|||
|
|
'order_year' => $orderYear
|
|||
|
|
])->first();
|
|||
|
|
|
|||
|
|
if (!empty($order) && !empty($order['payment'])) {
|
|||
|
|
//не принимаем обновления для уже оплаченных счетов
|
|||
|
|
$settingsTable = TableRegistry::getTableLocator()->get('Settings');
|
|||
|
|
$smsRuApiKey = $settingsTable->find()->where([
|
|||
|
|
'key' => 'smsRuApiKey',
|
|||
|
|
'group' => 'global'
|
|||
|
|
])->first();
|
|||
|
|
|
|||
|
|
if (!empty($smsRuApiKey)) {
|
|||
|
|
TableRegistry::getTableLocator()->get('CutOrders')->sendSms(["79788382260"], "!!!Счёт " . $orderData['invoice_no'] . " выставлен после оплаты", $smsRuApiKey->value, "");
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
if (!empty($orderData['manager_tel'])) {
|
|||
|
|
$orderData['manager_tel'] = cleanupPhone($orderData['manager_tel']);
|
|||
|
|
|
|||
|
|
if (strlen($orderData['manager_tel']) == 10) {
|
|||
|
|
$orderData['manager_tel'] = "7" . $orderData['manager_tel'];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$orderData['manager_tel'] = formatPhone($orderData['manager_tel']);
|
|||
|
|
|
|||
|
|
} else {
|
|||
|
|
$orderData['manager_tel'] = '';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$orderData['firstname'] = (!empty($orderData['firstname']) ? $orderData['firstname'] : '');
|
|||
|
|
$orderData['lastname'] = (!empty($orderData['lastname']) ? $orderData['lastname'] : '');
|
|||
|
|
$name = [];
|
|||
|
|
if (!empty($orderData['firstname'])) {
|
|||
|
|
$name[] = $orderData['firstname'];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!empty($orderData['lastname'])) {
|
|||
|
|
$name[] = $orderData['lastname'];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$orderData['summa_order_decimal'] = $orderData['summa_order'];
|
|||
|
|
$orderData['summa_order'] = str_replace(".00", "", toFixed2Price($orderData['summa_order']));
|
|||
|
|
|
|||
|
|
$orderData['stroki_zakaza'] = [];
|
|||
|
|
foreach ($xml->orderid->stroki_zakaza->stroka as $li) {
|
|||
|
|
$stroka_zakaza = [
|
|||
|
|
'product_price' => (string)$li->attributes()['product_price'],
|
|||
|
|
'product_quantity' => (string)$li->attributes()['product_quantity'],
|
|||
|
|
'product_id_1с' => (string)$li->attributes()['product_id_1с'],
|
|||
|
|
'product_name' => (string)$li->attributes()['product_name'],
|
|||
|
|
'product_ed' => (string)$li->attributes()['product_ed'],
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
$stroka_zakaza['product_total'] = str_replace(".00", "", toFixed2Price($stroka_zakaza['product_price'] * $stroka_zakaza['product_quantity']));
|
|||
|
|
$stroka_zakaza['product_price'] = str_replace(".00", "", toFixed2Price($stroka_zakaza['product_price']));
|
|||
|
|
|
|||
|
|
$orderData['stroki_zakaza'][] = $stroka_zakaza;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$sendPaymentNotify = false;
|
|||
|
|
if (!empty($order)) {
|
|||
|
|
if (empty($order['paid_date'])) {
|
|||
|
|
$sendPaymentNotify = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!empty($order['files'])) {
|
|||
|
|
$order['files'] = json_decode($order['files'], true);
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
$order = $orderPaymentTable->newEntity([
|
|||
|
|
'order_num' => $orderData['invoice_no'],
|
|||
|
|
'order_year' => $orderYear,
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
$sendPaymentNotify = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (empty($order['files'])) {
|
|||
|
|
$order['files'] = [];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (empty($order['files']["import"])) {
|
|||
|
|
$order['files']["import"] = [];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$order['files']["import"][] = [
|
|||
|
|
"date" => date('d.m.Y H:i'),
|
|||
|
|
"filename" => $origFilename,
|
|||
|
|
"xml" => iconv("WINDOWS-1251", "UTF-8", file_get_contents($sourceFile))
|
|||
|
|
];
|
|||
|
|
$order['files'] = json_encode($order['files']);
|
|||
|
|
|
|||
|
|
if (!empty($orderData['telephone'])) {
|
|||
|
|
$order->telephone = cleanupPhone($orderData['telephone']);
|
|||
|
|
|
|||
|
|
if (strlen($order->telephone) == 10) {
|
|||
|
|
$order->telephone = "7" . $order->telephone;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//$order->telephone = formatPhone($order->telephone);
|
|||
|
|
} else {
|
|||
|
|
$order->telephone = '';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$order->expiry_date = date('Y-m-d H:i:s', strtotime('+1 day'));
|
|||
|
|
$order->data = json_encode($orderData);
|
|||
|
|
$order->summa_order_decimal = $orderData['summa_order_decimal'];
|
|||
|
|
$order->name = trim(join(" ", $name));
|
|||
|
|
$order->domain = $domain;
|
|||
|
|
$order->targetGateway = $orderData['gateway'];
|
|||
|
|
|
|||
|
|
if ($orderPaymentTable->save($order)) {
|
|||
|
|
if (empty($order->encryptOrderId)) {
|
|||
|
|
$order->encryptOrderId = TableRegistry::getTableLocator()->get('CutOrders')->encryptCustomData(
|
|||
|
|
$order->id,
|
|||
|
|
'orderId',
|
|||
|
|
["encrypt" => Configure::read("encrypt")]
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
$orderPaymentTable->save($order);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ($sendPaymentNotify) {
|
|||
|
|
$url = "https://".$domain."/order-payment/" . $order->encryptOrderId;
|
|||
|
|
|
|||
|
|
$mailBody = '<html><head><style>
|
|||
|
|
body, p, div { margin-bottom: 0; }
|
|||
|
|
a { color: #0b6cda; text-decoration: underline; }
|
|||
|
|
</style><body>';
|
|||
|
|
|
|||
|
|
$subjectCompanyName = "СуперСам";
|
|||
|
|
$bodyManagerCompanyName = "компании СуперСам";
|
|||
|
|
|
|||
|
|
switch ($domain) {
|
|||
|
|
case "apps.prometeysev.ru":
|
|||
|
|
$subjectCompanyName = "ООО ТЦ \"Прометей\"";
|
|||
|
|
$bodyManagerCompanyName = "ООО ТЦ \"Прометей\"";
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
$mailBody .= "<img src='https://".$domain."/img/logo-".str_replace("apps.", "", $domain).".png' style='max-height: 64px; width: auto;'><br/><br/>Добрый день, " . $orderData['firstname'] . " " . $orderData['lastname'] . "<br/><br/>
|
|||
|
|
Менеджером " . $orderData['invoice_manager'] . " " . $bodyManagerCompanyName . " сформированы счета на оплату " . htmlentities($orderData['invoice_no']) . "<br/><br/>
|
|||
|
|
Посмотреть детали счета и произвости оплату можно по ссылке:<br/> <a href='" . $url . "'>" . htmlentities($url) . "</a>";
|
|||
|
|
|
|||
|
|
$mailBodyFooter = '</body></html>';
|
|||
|
|
|
|||
|
|
$mail = TableRegistry::getTableLocator()->get('CutOrders')->configurePHPMailer([], $subjectCompanyName . " " . $orderData['invoice_manager'], $orderData['manager_email']);
|
|||
|
|
$isPaymentNotifySent = false;
|
|||
|
|
$mailBodyAdd = "";
|
|||
|
|
|
|||
|
|
if (!empty($orderData['email'])) {
|
|||
|
|
$orderData['email'] = trim(cleanupEmail($orderData['email']));
|
|||
|
|
if (filter_var($orderData['email'], FILTER_VALIDATE_EMAIL)) {
|
|||
|
|
$mail->addAddress(trim($orderData['email']));
|
|||
|
|
//$mail->addBCC(trim($orderData['manager_email']));
|
|||
|
|
//$mail->addBCC("sbtestemail789@gmail.com");
|
|||
|
|
$mail->Subject = "Счет на оплату " . htmlentities($orderData['invoice_no']);
|
|||
|
|
|
|||
|
|
$mail->Body = $mailBody . $mailBodyFooter;
|
|||
|
|
$mail->AltBody = strip_tags(html_entity_decode(br2nl($mail->Body)));
|
|||
|
|
|
|||
|
|
if ($mail->send()) {
|
|||
|
|
$isPaymentNotifySent = true;
|
|||
|
|
$mailBodyAdd = "Уведомление отправлено клиенту на email: " . $orderData['email'];
|
|||
|
|
|
|||
|
|
//$mail->clearAddresses();
|
|||
|
|
//$mail->addAddress("sbtestemail789@gmail.com");
|
|||
|
|
//$mail->send();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!$isPaymentNotifySent && !empty($order->telephone)) {
|
|||
|
|
$settingsTable = TableRegistry::getTableLocator()->get('Settings');
|
|||
|
|
$smsRuApiKey = $settingsTable->find()->where([
|
|||
|
|
'key' => 'smsRuApiKey',
|
|||
|
|
'group' => 'global'
|
|||
|
|
])->first();
|
|||
|
|
|
|||
|
|
if (!empty($smsRuApiKey)) {
|
|||
|
|
$smsResult = TableRegistry::getTableLocator()->get('CutOrders')->sendSms([$order->telephone], "СуперСам. Счёт " . $orderData['invoice_no'] . ", оплата " . $url, $smsRuApiKey->value, "");
|
|||
|
|
if (!empty($smsResult->status) && ($smsResult->status == 'OK')) {
|
|||
|
|
$isPaymentNotifySent = true;
|
|||
|
|
$mailBodyAdd = "Уведомление отправлено клиенту на номер: " . formatPhone($order->telephone);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if ($isPaymentNotifySent) {
|
|||
|
|
$mail->Body = $mailBody . (!empty($mailBodyAdd) ? "<br/><br/>------------------<br/><br/>" . $mailBodyAdd : "") . $mailBodyFooter;
|
|||
|
|
$mail->AltBody = strip_tags(html_entity_decode(br2nl($mail->Body)));
|
|||
|
|
|
|||
|
|
$mail->clearAddresses();
|
|||
|
|
$mail->Subject = "счет из 1с " . htmlentities($orderData['invoice_no']) . ", " . $orderData['summa_order'] . "р.";
|
|||
|
|
$mail->addAddress("direktor@mail.supersamsev.ru");
|
|||
|
|
$mail->addBCC("admin@mail.supersamsev.ru");
|
|||
|
|
//$mail->addAddress("sbtestemail789@gmail.com");
|
|||
|
|
$mail->addBCC("sbtestemail789@gmail.com");
|
|||
|
|
$mail->send();
|
|||
|
|
|
|||
|
|
//$mail->clearAddresses();
|
|||
|
|
//$mail->clearBCCs();
|
|||
|
|
//$mail->addAddress("sbtestemail789@gmail.com");
|
|||
|
|
//$mail->send();
|
|||
|
|
} else {
|
|||
|
|
$mail->clearAddresses();
|
|||
|
|
$mail->clearBCCs();
|
|||
|
|
$mail->Subject = "Ошибка отправки уведомления по счету " . htmlentities($orderData['invoice_no']) . ", " . $orderData['summa_order'] . "р.";
|
|||
|
|
$mail->addAddress("sbtestemail789@gmail.com");
|
|||
|
|
|
|||
|
|
$mailBodyAdd = "Файл: " . $origFilename;
|
|||
|
|
$mail->Body = $mailBody . "<br/><br/>------------------<br/><br/>" . $mailBodyAdd . "<br/><br/>" . file_get_contents($sourceFile) ;
|
|||
|
|
if (!empty($smsResult->status)) {
|
|||
|
|
$mail->Body .= "<br/><br/>------------------<br/><br/>" . "sms код ошибки: " . $smsResult->status_code. "<br/>";
|
|||
|
|
$mail->Body .= "sms текст ошибки: " . $smsResult->status_text;
|
|||
|
|
}
|
|||
|
|
$mail->Body .= $mailBodyFooter;
|
|||
|
|
|
|||
|
|
|
|||
|
|
$mail->AltBody = strip_tags(html_entity_decode(br2nl($mail->Body)));
|
|||
|
|
|
|||
|
|
$mail->send();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
$result['count']++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!$isErrorOccurred) {
|
|||
|
|
$sheetsTable->putImportFileToArchive($sourceFile, true, $origFilename);
|
|||
|
|
$result['deleteFtpFile'] = true;
|
|||
|
|
$result['count'] = 1;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
$result['reason'] = 'Файл импорта пустой.';
|
|||
|
|
$sheetsTable->putImportFileToArchive($sourceFile, true, $origFilename);
|
|||
|
|
$result['deleteFtpFile'] = true;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
$result['reason'] = 'Файл импорта не найден.';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function ftpOrderPaymentUploadErrorNotify($sourceFileContent, $origFilename = null, $orderData, $paymentType = "payment", $reason = "оплаты счета") {
|
|||
|
|
$mailBody = '<html><head><style>
|
|||
|
|
body, p, div { margin-bottom: 0; }
|
|||
|
|
a { color: #0b6cda; text-decoration: underline; }
|
|||
|
|
</style><body>';
|
|||
|
|
|
|||
|
|
$subjectCompanyName = "СуперСам";
|
|||
|
|
|
|||
|
|
switch ($orderData['domain']) {
|
|||
|
|
case "apps.prometeysev.ru":
|
|||
|
|
$subjectCompanyName = "ООО ТЦ \"Прометей\"";
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
$mailBody .= "<img src='https://".$orderData['domain']."/img/logo-".str_replace("apps.", "", $orderData['domain']).".png' style='max-height: 64px; width: auto;'><br/>";
|
|||
|
|
|
|||
|
|
$mailBodyFooter = '</body></html>';
|
|||
|
|
|
|||
|
|
$mail = TableRegistry::getTableLocator()->get('CutOrders')->configurePHPMailer([], $subjectCompanyName);
|
|||
|
|
|
|||
|
|
$mail->clearAddresses();
|
|||
|
|
$mail->clearBCCs();
|
|||
|
|
$mail->Subject = "Ошибка выгрузки на фтп ".$reason." " . htmlentities($orderData['order_num']) . ", " . $orderData['summa_order_decimal'] . "р.";
|
|||
|
|
|
|||
|
|
$mail->addAddress("yulya@mail.supersamsev.ru");
|
|||
|
|
$mail->addCC("admin@mail.supersamsev.ru");
|
|||
|
|
$mail->addBCC("sbtestemail789@gmail.com");
|
|||
|
|
|
|||
|
|
$mailBody .= '
|
|||
|
|
<br/><br/><a href="https://'.$orderData['domain'].'/order-payment/' . $orderData['encryptOrderId'] . '">Ссылка на оплату счета</a>
|
|||
|
|
<br/><br/>Папка на фтп: /' . str_replace("apps.", "", $orderData['domain']) . '/' . ($paymentType == "payment" ? "acquiring-in" : "refund"). '
|
|||
|
|
<br/><br/>------------------
|
|||
|
|
<br/><br/>Файл: ' . $origFilename . "
|
|||
|
|
<br/><br/>" . htmlentities($sourceFileContent) ;
|
|||
|
|
$mailBody .= $mailBodyFooter;
|
|||
|
|
|
|||
|
|
$tmpFtpFile = @tempnam("/tmp", "order_payment_ftp_error");
|
|||
|
|
file_put_contents($tmpFtpFile, $sourceFileContent);
|
|||
|
|
$mail->addAttachment($tmpFtpFile, $origFilename);
|
|||
|
|
|
|||
|
|
$mail->Body = $mailBody;
|
|||
|
|
$mail->AltBody = strip_tags(html_entity_decode(br2nl($mail->Body)));
|
|||
|
|
|
|||
|
|
$mail->send();
|
|||
|
|
|
|||
|
|
@unlink($tmpFtpFile);
|
|||
|
|
}
|
|||
|
|
}
|