Ejemplo n.º 1
0
 /**
  * @param int $transactionId
  * @param int $itemId
  * @return bool
  * @throws \Exception
  */
 public function attachItem($transactionId, $itemId)
 {
     try {
         $expenseItemDao = new ExpenseItem($this->getServiceLocator(), '\\ArrayObject');
         $expenseTransactionDao = new ExpenseTransactions($this->getServiceLocator(), '\\ArrayObject');
         $expenseDao = new Expenses($this->getServiceLocator(), '\\ArrayObject');
         $item = $expenseItemDao->fetchOne(['id' => $itemId], ['transaction_id', 'date_created']);
         $transactionPoInfo = $expenseTransactionDao->getTransactionInfoWithAdditionalInfo($transactionId);
         if ($item && is_null($item['transaction_id']) && $transactionPoInfo) {
             $expenseItemDao->save(['transaction_id' => $transactionId], ['id' => $itemId]);
             $transactionDateArray = explode(' ', $transactionPoInfo['creation_date']);
             $transactionDateCreated = $transactionDateArray[0];
             $itemDateArray = explode(' ', $item['date_created']);
             $itemDateCreated = $itemDateArray[0];
             if ($transactionDateCreated != $itemDateCreated || $transactionPoInfo['currency_code_transaction'] != $transactionPoInfo['currency_code_expense']) {
                 //recalculate balances with currency conversion rate of item creation date
                 /**
                  * @var \DDD\Service\Currency\CurrencyVault $currencyVaultService
                  */
                 $currencyVaultService = $this->getServiceLocator()->get('service_currency_currency_vault');
                 $transactionAmountInPOCurrencyByTransactionCreationDateConversionRate = $currencyVaultService->convertCurrency($transactionPoInfo['amount'], $transactionPoInfo['currency_code_transaction'], $transactionPoInfo['currency_code_expense'], $transactionDateCreated);
                 $transactionAmountInPOCurrencyByTransactionCreationDateConversionRate = number_format((double) abs($transactionAmountInPOCurrencyByTransactionCreationDateConversionRate), 2, '.', '');
                 $transactionAmountInPOCurrencyByItemCreationDateConversionRate = $currencyVaultService->convertCurrency($transactionPoInfo['amount'], $transactionPoInfo['currency_code_transaction'], $transactionPoInfo['currency_code_expense'], $itemDateCreated);
                 $transactionAmountInPOCurrencyByItemCreationDateConversionRate = number_format((double) abs($transactionAmountInPOCurrencyByItemCreationDateConversionRate), 2, '.', '');
                 if ($transactionAmountInPOCurrencyByTransactionCreationDateConversionRate != $transactionAmountInPOCurrencyByItemCreationDateConversionRate) {
                     $refundFactor = $transactionPoInfo['is_refund'] ? -1 : 1;
                     $newPOTransactionBalance = (double) $transactionPoInfo['expense_transaction_balance'] + $transactionAmountInPOCurrencyByTransactionCreationDateConversionRate * $refundFactor - $transactionAmountInPOCurrencyByItemCreationDateConversionRate * $refundFactor;
                     $newPOTicketBalance = (double) $transactionPoInfo['expense_ticket_balance'] + $transactionAmountInPOCurrencyByTransactionCreationDateConversionRate * $refundFactor - $transactionAmountInPOCurrencyByItemCreationDateConversionRate * $refundFactor;
                     $expenseDao->save(['ticket_balance' => $newPOTicketBalance, 'transaction_balance' => $newPOTransactionBalance], ['id' => $transactionPoInfo['expense_id']]);
                 }
             }
         } else {
             throw new \Exception('You shall not pass');
         }
     } catch (\Exception $ex) {
         return false;
     }
     return true;
 }