/** * @param $purchaseOrderTransactionId * @param bool $updatePurchaseOrderBalance * @return bool */ public function removePurchaseOrderTransaction($purchaseOrderTransactionId, $updatePurchaseOrderBalance = true) { /** * @var MoneyAccountsDAO $moneyAccountsDao */ $moneyTransactionsDao = new Transactions($this->getServiceLocator(), '\\ArrayObject'); $purchaseOrderTransactionsDao = new ExpenseTransactions($this->getServiceLocator(), '\\ArrayObject'); $purchaseOrdersDao = new Expenses($this->getServiceLocator(), '\\ArrayObject'); $moneyAccountsDao = new MoneyAccountsDAO($this->getServiceLocator(), '\\ArrayObject'); $purchaseOrderTransaction = $purchaseOrderTransactionsDao->fetchOne(['id' => $purchaseOrderTransactionId], ['money_transaction_id', 'money_account_id', 'amount', 'expense_id', 'creation_date']); $moneyTransactionId = $purchaseOrderTransaction['money_transaction_id']; $purchaseOrderTransactionAmount = $purchaseOrderTransaction['amount']; $purchaseOrderId = $purchaseOrderTransaction['expense_id']; $purchaseOrder = $purchaseOrdersDao->fetchOne(['id' => $purchaseOrderId], ['ticket_balance', 'transaction_balance', 'currency_id']); $purchaseOrderTransactionMoneyAccountId = $purchaseOrderTransaction['money_account_id']; $moneyAccount = $moneyAccountsDao->fetchOne(['id' => $purchaseOrderTransactionMoneyAccountId], ['balance', 'currency_id']); // Remove money transaction $moneyTransactionsDao->delete(['id' => $moneyTransactionId]); // Remove purchase order transaction $purchaseOrderTransactionsDao->delete(['id' => $purchaseOrderTransactionId]); // Update money account balance $moneyAccountBalance = $moneyAccount['balance']; $moneyAccountBalance -= $purchaseOrderTransactionAmount; $moneyAccountsDao->update(['balance' => $moneyAccountBalance], ['id' => $purchaseOrderTransactionMoneyAccountId]); if ($updatePurchaseOrderBalance) { // Update purchase order balance // Update purchase order transaction balance if ($purchaseOrder['currency_id'] != $moneyAccount['currency_id']) { // PO balance and PO transaction balance are in PO currency // We need to convert currencies to correctly recalculate those balances // Please note that we need to make conversion by currency rate for that particular date when transaction was made $currencyVaultService = new CurrencyVault(); $purchaseOrderTransactionAmount = $currencyVaultService->convertCurrency($purchaseOrderTransactionAmount, $moneyAccount['currency_id'], $purchaseOrder['currency_id'], $purchaseOrderTransaction['creation_date']); $purchaseOrdersDao->update(['ticket_balance' => $purchaseOrder['balance'] - $purchaseOrderTransactionAmount, 'transaction_balance' => $purchaseOrder['transaction_balance'] - $purchaseOrderTransactionAmount], ['id' => $purchaseOrder['id']]); } } return true; }
/** * @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; }