/** * Update the status of the returned item if there is one to whatever the * status was before it was returned. * * Currently this just chooses the status before the current one, but it * could be more robust. * * @todo Look into making this more robust, by knowing how many steps to * take back in the status history to get to just before the return * started. * * @param OrderTransaction\Event\TransactionalEvent $event */ public function revertReturnedItemStatus(OrderTransaction\Event\TransactionalEvent $event) { $transaction = $event->getTransaction(); // Skip if the transaction is not a return transaction if (Types::ORDER_RETURN !== $transaction->type) { return false; } $itemEdit = $this->get('order.item.edit'); $itemEdit->setTransaction($event->getDbTransaction()); foreach ($transaction->records->getByType(OrderReturn::RECORD_TYPE) as $return) { // Skip if the return was not for an order (i.e. it was a standalone return) if (!$return->item->order) { return false; } $item = $return->item->orderItem; $history = $this->get('order.item.status.loader')->getHistory($item); // Skip if there was not more than 2 statuses on the item if (count($history) < 2) { continue; } // Get the status before the current one $previousStatus = array_shift($history); $previousStatus = array_shift($history); $itemEdit->updateStatus($item, $previousStatus->code); } }
/** * Create a stock movement to put all items in a transaction that is being * voided back into stock in the stock location they were purchased from. * * @param Transaction\Event\TransactionalEvent $event */ public function returnItemsToStock(Transaction\Event\TransactionalEvent $event) { $transaction = $event->getTransaction(); $stockManager = $this->get('stock.manager'); $stockManager->setTransaction($event->getDbTransaction()); $stockManager->createWithRawNote(true); $stockManager->setReason($this->get('stock.movement.reasons')->get('void_transaction')); $event->getDbTransaction()->add("\n\t\t\tSET @STOCK_NOTE = CONCAT('Void transaction #', ?i)\n\t\t", $transaction->id); $stockManager->setNote('@STOCK_NOTE'); $stockManager->setAutomated(true); foreach ($transaction->records->getByType(Item\Item::RECORD_TYPE) as $item) { $stockManager->increment($item->getUnit(), $item->stockLocation); } }