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: '.$result['id'].''); 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 .= ": {$serviceNote}"; } 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.'); } }