Example #1
0
 /**
  * @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;
 }
Example #2
0
 /**
  * @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;
 }