Files
2025-08-02 16:30:27 +02:00

418 lines
14 KiB
PHP

<?php
global $cfg;
use KupShop\ElninoBundle\Util\Daktela;
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
use KupShop\OrderingBundle\Event\OrderEvent;
require_once $cfg['Path']['shared_version'].'admin/orders.php';
$main_class = 'CustomOrders';
class CustomOrders extends AdminOrders
{
public function get_vars()
{
$vars = parent::get_vars();
$ID = $this->getID();
if (!empty($ID)) {
$SQL = $this->selectSQL('abra_orders', ['id_order' => $ID]);
$vars['body']['abra_id'] = sqlFetchArray($SQL)['id_abra'] ?? null;
foreach ($vars['body']['oop'] as &$item) {
$item['set'] = '';
if (!empty($item['id_product'])) {
if ($set = $this->selectSQL('products', ['id' => $item['id_product']], ['`set`'])->fetchColumn()) {
$item['set'] = 'Složení: '.$set;
}
}
}
}
if (findModule('elnino_daktela')) {
$adminData = $this->selectSQL('admins', ['id' => getAdminUser()['id']], ['data'])->fetchColumn();
$adminData = json_decode($adminData, true) ?? [];
$vars['body']['adminData'] = $adminData;
}
return $vars;
}
public function handleCreateDaktelaTicket()
{
$order = new Order();
$order->createFromDB($this->getID());
if ($result = $this->sendToDaktela($order->order_no, $order->invoice_email)) {
$order->logHistory('Byl založen Daktela ticket. ID: <a href="'.$result['url'].'" target="_blank">'.$result['id'].'</a>');
redirect($result['url']);
}
$this->returnError('Nepodařilo se založit ticket v Daktela, překontrolujte si, prosím, svoje údaje nastavení. (Administrace / Změna hesla - záložka Daktela)');
}
public function handleAuthorizeOrder()
{
$abra = new AbraElnino();
$order = $this->getOrderObject();
if ($order->isClosed()) {
$this->returnError(translate('kzOrderClosed', 'orders'));
}
$order->fetchItems();
foreach ($order->items as $item) {
if (empty($item['pieces'])) {
$this->returnError(translate('kzOrderHasEmptyItem', 'orders'));
}
}
switch ($order->status) {
case 0:
$status = 1;
$msg = translate('kzOrderAuthorized', 'orders');
break;
case 2:
$status = 3;
$msg = translate('kzOrderAuthorizedCorrected', 'orders');
break;
default:
return;
}
// Autorizace nezaplacené objednávky s platbou předem nesmí změnit stav
if ($order->isActive() && !$order->isPaid()) {
$payment = $order->getDeliveryType()->getPayment();
if ($payment && ($payment->getPayMethod() == \Payment::METHOD_ONLINE || $payment->getPayMethod() == \Payment::METHOD_TRANSFER)) {
$status = -1; // preserve old status
$msg = translate('kzOrderModified', 'orders');
}
}
$log = $msg;
$serviceNote = $this->getData()['comments'];
if ($serviceNote) {
$log .= ": <b>{$serviceNote}</b>";
}
try {
if ($order->isModified()) {
if (empty($serviceNote)) {
$this->returnError(translate('kzOrderNoteRequired', 'orders'));
}
// status passed into $abra->updateOrder() can be -1, 1, 3
// -1 = preserve original status
// 0 = new orders only
// 1 = authorized from status 0 - new
// 3 = authorized from status 2 - expedition error
$abra->updateOrder($order->id, $status, strip_tags($serviceNote));
$order->logChange($log, false);
if ($order->status != $status && $status != -1) {
$order->changeStatus($status, $log, false);
}
} elseif ($order->status != $status && $status != -1) {
$abra->changeOrderStatus($order->id, $status, $log, strip_tags($serviceNote));
}
} catch (Exception $e) {
getRaven()->captureException($e);
$this->returnError(translate('kzOrderAuthFailed', 'orders').$e->getMessage());
}
$this->returnOK($msg);
}
public function handleRequestEdit()
{
$ID = $this->getID();
$order = new Order();
$order->createFromDB($ID);
if ($order->getData('enableEdit') === true) {
$order->setData('enableEdit', false);
$this->redirect(['acn' => 'edit']);
} else {
$abra = new AbraElnino();
if ($abra->getOrderStatus($order) < 6) {
$order->setData('enableEdit', true);
$this->redirect(['acn' => 'edit']);
} else {
$this->returnError(translate('kzOrderEditDenied', 'orders'));
}
}
}
public function handleCancelOrder()
{
$order = $this->getOrderObject();
try {
$this->returnOK($order->storno(false, null, true));
} catch (Exception $e) {
$this->returnError($e->getMessage());
}
}
public function getOrderObject()
{
$ID = $this->getID();
$order = new Order();
$order->createFromDB($ID, true, true, true);
// Allow order cancellation if status < 6
if ($this->getAction() == 'cancelOrder' && $order->status < 6) {
return $order;
}
// kontrola jestli objednavka nebyla stornovana
if ($order->isClosed() && !$this->isDuplicate()) {
// Stornovanou objednávku již nelze upravovat
$this->returnError('Objednávku nelze v tomto stavu upravovat');
}
return $order;
}
public function handleOrderDelivered()
{
$order = $this->getOrderObject();
$msg = translate('kzOrderPicked', 'orders');
$order->changeStatus(7, $msg, false);
$this->returnOK($msg);
}
public function handleUpdate()
{
$ID = $this->getID();
$acn = $this->getAction();
$data = $this->getData();
$order = new Order();
if ($acn == 'edit') {
$order->createFromDB($ID, true, false, true);
}
// kontrola jestli objednavka nebyla stornovana
if ($order->isClosed() && !$this->isDuplicate() && !findRight('ORDER_STATUS')) {
$data['comments'] = trim($data['comments']);
if ($data['comments'] != '') {
$force = empty($data['doNotNotify']);
$order->changeStatus($order->status, $data['comments'], $force, $data['status_comment']);
$this->returnOK('Komentář uložen');
}
if (!empty($data['flags'])) {
$this->updateSQL('orders', ['flags' => $data['flags']], ['id' => $ID]);
$this->returnOK('Příznak uložen');
}
// Stornovanou objednávku již nelze upravovat
$this->returnError('Objednávku nelze v tomto stavu upravovat');
}
foreach ($data['custom_data'] ?? [] as $key => $value) {
$order->setData($key, $value);
}
if ($this->isDuplicate()) {
$OLD_ID = $ID;
$data['order_no'] = '';
}
$error = 0;
if (empty($error)) {
if ($acn == 'edit' && $order->getData('enableEdit') === true) {
$this->processOrderEditInTransaction($order);
} else {
$SQL = Window::handleUpdate();
}
if ($SQL) {
if ($acn == 'add') {
$ID = $this->getID();
// Generate order ID
// if(empty($data['order_no']))
$data['order_no'] = Orders::createOrderNumber($ID);
if (empty($data['order_no'])) {
logError(__FILE__, __LINE__, 'Empty orderNo!');
}
// Store generated order ID
sqlQuery('UPDATE '.getTableName('orders')." SET order_no='{$data['order_no']}', date_created=NOW() WHERE id={$ID}");
writeDownActivity(sprintf(getTextString('orders', 'activityAdded'), $data['order_no']));
$order->createFromDB($ID, true);
// send order created event
$eventDispatcher = ServiceContainer::getService('event_dispatcher');
$event = new OrderEvent($order);
$eventDispatcher->dispatch($event, OrderEvent::ORDER_CREATED);
if ($this->isDuplicate()) {
$old_order = new Order();
$old_order->createFromDB($OLD_ID);
$fields = [
'date_accept' => null,
'date_handle' => null,
];
if (findModule('currencies')) {
$fields['currency'] = $old_order->currency;
$fields['currency_rate'] = $old_order->currency_rate;
changeCurrency($old_order->currency);
}
if (findModule('price_levels')) {
changePriceLevel($order->getOrderPriceLevel());
}
$order->copyItems($old_order, false);
$this->updateSQL('orders', $fields, ['id' => $order->id]);
if (findModule('price_levels')) {
changePriceLevel();
}
if (findModule('currencies')) {
changeCurrency();
}
}
$order->status = -1;
} elseif ($acn == 'edit') {
writeDownActivity(sprintf(getTextString('orders', 'activityEdited'), $data['order_no']));
}
if (findModule('telfa') && !empty($data['send_telfa_sms'])) {
if (empty($data['invoice_phone'])) {
$this->returnError('Není vyplněno telefonní číslo příjemce sms!');
}
if (empty($data['comments'])) {
$this->returnError('Neodesláno - prázdná zpráva!');
}
$order = new Order($ID);
$order->createFromArray($data);
$message = $order->replacePlaceholders($data['comments']);
$telfa = new Telfa();
$res = $telfa->sendSMS($data['invoice_phone'], strip_tags($message));
if ($res !== true) {
$this->returnError($res);
}
$telfa->saveSMStoOrder($ID, 'Na tel. '.$data['invoice_phone'].': '.$message, 2, $order->status);
$this->returnOK('SMS odeslána.');
}
// Change order status
$force = null;
$data['comments'] = trim($data['comments']);
if ($data['comments'] != '') {
$force = true;
}
if (!empty($data['doNotNotify']) || $acn == 'add') {
$force = false;
}
if (!findRight('ORDER_STATUS')) {
$data['status'] = $order->status;
}
$order->changeStatus($data['status'], $data['comments'], $force, $data['status_comment']);
$this->returnOK(null, true);
} else {
$this->returnError($GLOBALS['txt_str']['status']['scripterror']);
}
}
}
public function sendToDaktela($orderNo, $email)
{
$data = $this->selectSQL('admins', ['id' => getAdminUser()['id']], ['data'])->fetchColumn();
$data = json_decode($data, true) ?? [];
if (!empty($data['daktela']['login']) && !empty($data['daktela']['password']) && !empty($data['daktela']['access_token'])) {
$daktela = ServiceContainer::getService(Daktela::class);
$daktela->setAccessToken($data['daktela']['access_token'], $data['daktela']['workspace'] ?: null, $data['daktela']['category'] ?: null);
if ($response = $daktela->createTicket($orderNo, $email)) {
if (empty($response['error']) && $name = ($response['result']['name'] ?? null)) {
return [
'id' => $name,
'url' => $daktela->getTicketUrl($name),
];
}
}
}
return false;
}
public function processOrderEditInTransaction(Order $order)
{
$db = sqlGetConnection();
try {
$db->beginTransaction();
$SQL = Window::handleUpdate();
if ($order->isModified()) {
$serviceNote = $this->getData()['comments'];
$abra = new AbraElnino();
$abra->updateOrder($order->id, $order->status, strip_tags($serviceNote));
}
$db->commit();
$this->returnOK('Objednávka byla upravena');
} catch (AbraUpdateOrderException $e) {
$db->rollBack();
$this->returnError('Objednávka nemohla být upravena');
}
}
public function handlePayOrder()
{
$order = $this->prepareOrder();
$delivery_type = $order->getDeliveryType($order->getDeliveryId());
if (!empty($delivery_type->payment_class)) {
$pay_method = $delivery_type->payment_class->getPayMethod();
} else {
$pay_method = 0;
}
$remaining_payment = $order->getRemainingPayment();
if (!$order->isActive()) {
$this->returnOK('Stornována objednávka');
}
if ($order->isPaid()) {
$this->returnOK('Již zaplaceno');
}
$order->insertPayment($remaining_payment, 'Zaplaceno z administrace eshopu', null, true, $pay_method);
$order->sendEmail(null, null, false, \KupShop\KupShopBundle\Email\PaymentSuccessEmail::getType());
$order->logHistory(translate_shop('msgStatusFinished', 'payment'));
$this->returnOK('Ok.');
}
}