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

345 lines
18 KiB
PHP
Raw Normal View History

2026-10-21 23:46:31 +03:00
<?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);
}
}