Exemple #1
0
 /**
  * @param int $expenseTransactionId
  * @param array $extra
  * @return bool
  * @throws \Exception
  */
 public function voidTransaction($expenseTransactionId, &$extra)
 {
     /**
      * @var CurrencyVault $currencyVaultService
      * @var ExpenseItemAttachments $expenseItemAttachmentsDao
      * @var BackofficeAuthenticationService $auth
      */
     $auth = $this->getServiceLocator()->get('library_backoffice_auth');
     $currencyVaultService = $this->getServiceLocator()->get('service_currency_currency_vault');
     $expenseDao = new Expenses($this->getServiceLocator(), '\\ArrayObject');
     $expenseItemDao = new ExpenseItem($this->getServiceLocator(), '\\ArrayObject');
     $expenseTransactionDao = new ExpenseTransactions($this->getServiceLocator(), '\\ArrayObject');
     $transactionDao = new Transactions($this->getServiceLocator(), '\\ArrayObject');
     $transactionDetails = $expenseTransactionDao->getTransactionDetails($expenseTransactionId);
     if ($transactionDetails) {
         if ($transactionDetails['currency_id'] != $transactionDetails['expense_currency_id']) {
             $transactionDetails['amount'] = $currencyVaultService->convertCurrency($transactionDetails['amount'], (int) $transactionDetails['currency_id'], (int) $transactionDetails['expense_currency_id'], $transactionDetails['creation_date']);
         }
         try {
             $expenseTransactionDao->beginTransaction();
             $transactionCount = $expenseTransactionDao->getActiveTransactionCount($transactionDetails['expense_id']);
             $siblingCount = 0;
             $expenseTransactionData = ['status' => Expense::STATUS_VOID, 'verifier_id' => $auth->getIdentity()->id];
             if (!is_null($transactionDetails['money_transaction_id'])) {
                 $siblingCount = $transactionDao->getSiblingTransactionsCount($transactionDetails['money_transaction_id']);
                 if ($siblingCount == 1) {
                     $expenseTransactionData['money_transaction_id'] = null;
                 }
             }
             // Detach items from transaction
             $expenseItemDao->update(['transaction_id' => null], ['transaction_id' => $expenseTransactionId]);
             // Update expense transaction data
             $expenseTransactionDao->save($expenseTransactionData, ['id' => $expenseTransactionId]);
             // If one to one connected transactions then remove money transaction
             if (!is_null($transactionDetails['money_transaction_id']) && $siblingCount == 1) {
                 $transactionDao->delete(['id' => $transactionDetails['money_transaction_id']]);
             }
             $expenseTransactionAmount = abs($transactionDetails['amount']);
             if ($transactionDetails['is_refund']) {
                 $transactionDetails['ticket_balance'] -= $expenseTransactionAmount;
                 $transactionDetails['transaction_balance'] -= $expenseTransactionAmount;
             } else {
                 if ($transactionCount == 1) {
                     $transactionDetails['transaction_balance'] = 0;
                 } else {
                     $transactionDetails['transaction_balance'] += $expenseTransactionAmount;
                 }
                 $transactionDetails['ticket_balance'] += $expenseTransactionAmount;
             }
             $extra = ['ticket_balance' => $transactionDetails['ticket_balance'], 'transaction_balance' => $transactionDetails['transaction_balance']];
             // Update expense ticket balance
             $expenseDao->save(['ticket_balance' => $transactionDetails['ticket_balance'], 'transaction_balance' => $transactionDetails['transaction_balance']], ['id' => $transactionDetails['expense_id']]);
             $expenseTransactionDao->commitTransaction();
             return true;
         } catch (\Exception $ex) {
             $expenseTransactionDao->rollbackTransaction();
         }
     }
     return false;
 }