/** * @param int $itemId * @param int|null $poId * @return bool * @throws \RuntimeException */ public function approveItem($itemId, $poId = null) { /** * @var CurrencyVault $currencyVaultService * @var ExpenseItemAttachments $expenseItemAttachmentsDao * @var \DDD\Dao\WHOrder\Order $orderDao */ $currencyVaultService = $this->getServiceLocator()->get('service_currency_currency_vault'); $poItemAttachmentsDao = $this->getServiceLocator()->get('dao_finance_expense_expense_item_attachments'); $poDao = new Expenses($this->getServiceLocator(), '\\ArrayObject'); $itemDao = new ExpenseItem($this->getServiceLocator(), '\\ArrayObject'); $orderDao = $this->getServiceLocator()->get('dao_wh_order_order'); $item = $itemDao->fetchOne(['id' => $itemId], ['expense_id', 'currency_id', 'amount', 'date_created', 'status']); $itemAttachment = $poItemAttachmentsDao->fetchOne(['item_id' => $itemId], ['filename']); $po = true; if (!is_null($poId)) { $po = $poDao->fetchOne(['id' => $poId], ['date_created', 'currency_id', 'ticket_balance', 'item_balance', 'finance_status']); } if ($item && $po) { if (is_null($item['expense_id']) && $item['status'] == Helper::ITEM_STATUS_PENDING) { $generalApproval = !is_null($poId); $itemData = ['status' => Helper::ITEM_STATUS_APPROVED]; if ($generalApproval) { if ($item['currency_id'] != $po['currency_id']) { $item['amount'] = $currencyVaultService->convertCurrency($item['amount'], (int) $item['currency_id'], (int) $po['currency_id'], $item['date_created']); } // Save PO $poDao->save(['ticket_balance' => $po['ticket_balance'] + $item['amount'], 'item_balance' => $po['item_balance'] + $item['amount'], 'finance_status' => Helper::FIN_STATUS_NEW], ['id' => $poId]); $itemData['expense_id'] = $poId; } // Save Item $itemDao->save($itemData, ['id' => $itemId]); // Approve Order $orderDao->save(['status' => Order::STATUS_ORDER_APPROVED], ['po_item_id' => $itemId]); if ($generalApproval) { // Save Attachment $poItemAttachmentsDao->save(['expense_id' => $poId], ['item_id' => $itemId]); // Move Attachment if ($itemAttachment) { $this->moveTmpItem($poId, $itemId, $po['date_created'], $itemAttachment->getFilename()); } } } else { throw new \RuntimeException("Unable to approve item #{$itemId}."); } } else { throw new \RuntimeException('PO or PO Item not found.'); } return true; }
/** * @param $data * @return bool */ public function createPOItemTransaction($data, $files) { /** * @var ExpenseTicket $financeService * @var \DDD\Domain\WHOrder\Order $order */ $financeService = $this->getServiceLocator()->get('service_finance_expense_expense_ticket'); $expenseItemDao = new ExpenseItem($this->getServiceLocator(), '\\ArrayObject'); $orderDao = $this->getOrderDao(); if (!is_array($data)) { $data = json_decode($data, true); } $order = $orderDao->fetchOne(['id' => $data['order_id']], ['po_item_id']); if ($order && $order->getPoItemId()) { try { $expenseItemDao->beginTransaction(); $poItem = $expenseItemDao->fetchOne(['id' => $order->getPoItemId()], ['account_id', 'expense_id']); if ($poItem && $data['supplier_id'] && $poItem['expense_id']) { $transactionAccountsDao = $this->getServiceLocator()->get('dao_finance_transaction_transaction_accounts'); $transactionAccountId = $transactionAccountsDao->fetchOne(['holder_id' => $data['supplier_id'], 'type' => 4], ['id'])->getId(); if (is_null($transactionAccountId)) { throw new \Exception(); } $moneyAccountDao = new MoneyAccount($this->getServiceLocator(), '\\ArrayObject'); $moneyAccountCurrencyId = $moneyAccountDao->getCurrencyId($data['money_account_id']); $newItemAmountInOldItemCurrency = $financeService->recalculateTicketBalance($order->getPoItemId(), $data['amount'], $moneyAccountCurrencyId); if ($newItemAmountInOldItemCurrency === false) { $newItemAmountInOldItemCurrency = $data['amount']; } $expenseItemDao->save(['account_id' => $transactionAccountId, 'amount' => $newItemAmountInOldItemCurrency], ['id' => $order->getPoItemId()]); $transactionData = ['poId' => $poItem['expense_id'], 'itemId' => $order->getPoItemId(), 'accountId' => $transactionAccountId, 'moneyAccount' => $data['money_account_id'], 'transactionDate' => date('Y-m-d', strtotime($data['transaction_date'])), 'amount' => $data['amount']]; $orderDao->save(['price' => $data['amount'], 'currency_id' => $moneyAccountCurrencyId], ['id' => $data['order_id']]); $financeService->makeTransaction($transactionData); //attachment processing if ($files->count()) { $errorMessages = $financeService->saveItemFile($files, ['itemId' => $order->getPoItemId()]); if (count($errorMessages)) { throw new \Exception('Cannot save item attachment. ' . print_r($errorMessages, true)); } $expenseItemAttachmentsDao = $this->getServiceLocator()->get('dao_finance_expense_expense_item_attachments'); $attachmentInfo = $expenseItemAttachmentsDao->getAttachmentsToRemove($order->getPoItemId()); $financeService->moveTmpItem($attachmentInfo->getExpenseId(), $order->getPoItemId(), $attachmentInfo->getDateCreated(), $attachmentInfo->getFilename()); } $expenseItemDao->commitTransaction(); return $moneyAccountCurrencyId; } } catch (\Exception $e) { $expenseItemDao->rollbackTransaction(); return false; } } return false; }