Files
kupshop/admin/SplitOrder.php
2025-08-02 16:30:27 +02:00

117 lines
4.9 KiB
PHP

<?php
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
use KupShop\OrderingBundle\Util\Order\OrderItemEditTrait;
use KupShop\OrderingBundle\Util\Order\OrderUtil;
use Query\Operator;
class SplitOrder extends Window
{
use DatabaseCommunication;
use OrderItemEditTrait;
public function get_vars()
{
$vars = parent::get_vars();
$ID = $this->getID();
$order = $this->prepareOrder($ID);
$vars['products'] = $order->fetchItems();
$vars['order'] = $order;
$vars['body']['data']['id'] = $ID;
return $vars;
}
public function handleUpdate()
{
$ID_OLD = $this->getID();
$ID_NEW = null;
$data = $this->getData();
$order_old = $this->prepareOrder($ID_OLD);
$order_new = null;
if (findModule(\Modules::ORDER_PAYMENT) && abs($order_old->getPayments()) > 1) {
// Uhrazenou objednávku již nelze rozdělit
$this->returnError('Objednávku nelze rozdělit, protože k ní existuje platba, která doposud nebyla vrácena! Nejprve vraťte platby.');
}
if (intval($order_old['storno']) == 1) {
// Stornovanou objednávku již nelze rozdělit
$this->returnError(getTextString('SplitOrder', 'errorCanceledCantEdit'));
}
$order_new = sqlGetConnection()->transactional(function () use ($data, $ID_OLD, $order_old, $order_new, $ID_NEW) {
$orderUtil = ServiceContainer::getService(OrderUtil::class);
$order_new = $orderUtil->copyOrder($ID_OLD, ['status_payed', 'status_dispatch', 'status_storno']);
sqlQueryBuilder()->update('orders')->directValues(['date_created' => $order_old['date_created']->format('Y-m-d H:i:s')])
->where(Operator::equals(['id' => $order_new['id']]))->execute();
$ID_NEW = $order_new['id'];
$order_items = sqlQueryBuilder()->select('*')
->from('order_items')
->where(Operator::equals(['id_order' => $ID_OLD]))
->execute()
->fetchAll();
foreach ($order_items as $item_old) {
$get_item = $data['items'][$item_old['id']];
if (floatval($get_item['pieces_new']) > 0) {
$old_pcs = $item_old['pieces'] - $get_item['pieces_new'];
if ($old_pcs == 0) {
// na novou objednávku přesunout celou položku
sqlQueryBuilder()->update('order_items')
->directValues(['id_order' => $ID_NEW])
->where(Operator::equals(['id' => $item_old['id']]))
->execute();
} else {
// na novou objednávku přesunout část položek a přepočítat
$item_new_data = $item_old;
$item_new_data['id_order'] = $ID_NEW;
$item_new_data['pieces'] = $get_item['pieces_new'];
$item_new_data['pieces_reserved'] = $get_item['pieces_new'];
$item_new_data['total_price'] = $get_item['pieces_new'] * $item_old['piece_price'];
unset($item_new_data['id'], $item_new_data['pohoda_id']);
sqlQueryBuilder()->insert('order_items')
->directValues($item_new_data)
->execute();
// z původní objednávky odebrat část položek a přepočítat
sqlQueryBuilder()->update('order_items')
->directValues([
'pieces' => $item_old['pieces'] - $get_item['pieces_new'],
'pieces_reserved' => $item_old['pieces_reserved'] - $get_item['pieces_new'],
'total_price' => $item_old['piece_price'] * ($item_old['pieces'] - $get_item['pieces_new']),
])
->where(Operator::equals(['id' => $item_old['id']]))
->execute();
}
}
}
$order_old->recalculate();
$order_new->recalculate();
return $order_new;
});
writeDownActivity(sprintf(getTextString('SplitOrder', 'activitySplit'), $order_old['order_no'], $order_new['order_no']));
$order_old->logHistory(sprintf(getTextString('SplitOrder', 'splitOldNote'), $order_new['order_no']));
$order_new->logHistory(sprintf(getTextString('SplitOrder', 'splitNewNote'), $order_old['order_no']));
$this->redirect(['s' => 'orders.php', 'ID' => $order_new['id'], 'acn' => 'edit', 'force_resize' => 1, 'reload_parent' => 1]);
}
public function prepareOrder($orderId)
{
$order = new Order();
$order->createFromDB($orderId);
return $order;
}
}
return SplitOrder::class;