418 lines
14 KiB
PHP
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.');
|
|
}
|
|
}
|