/** * @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; }