/** * IMPORTANT: To Be Called BEFORE item amount and currency save * @param $itemId * @param $newAmount * @param $newCurrencyId * @return bool */ public function recalculateTicketBalance($itemId, $newAmount, $newCurrencyId) { /** * @var CurrencyVault $currencyVaultService */ $currencyVaultService = $this->getServiceLocator()->get('service_currency_currency_vault'); $poDao = new Expenses($this->getServiceLocator(), '\\ArrayObject'); $itemDao = new ExpenseItem($this->getServiceLocator(), '\\ArrayObject'); $oldItemData = $itemDao->getItemAmountAndCurrencyIdById($itemId); if (is_null($oldItemData['expense_id'])) { return false; } if ($oldItemData['amount'] == $newAmount && $oldItemData['currency_id'] == $newCurrencyId) { return false; } $poData = $poDao->getDataForRecalculation($oldItemData['expense_id']); $oldItemAmountInPoCurrency = $currencyVaultService->convertCurrency($oldItemData['amount'], (int) $oldItemData['currency_id'], (int) $poData['currency_id'], $oldItemData['date_created']); $newItemAmountInPoCurrency = $currencyVaultService->convertCurrency($newAmount, (int) $newCurrencyId, (int) $poData['currency_id'], $oldItemData['date_created']); $recalculatedPoTicketBalance = $poData['ticket_balance'] - $oldItemAmountInPoCurrency + $newItemAmountInPoCurrency; $recalculatedPoItemBalance = $poData['item_balance'] - $oldItemAmountInPoCurrency + $newItemAmountInPoCurrency; $poDao->save(['ticket_balance' => $recalculatedPoTicketBalance, 'item_balance' => $recalculatedPoItemBalance], ['id' => $oldItemData['expense_id']]); $newItemAmountInOldItemCurrency = $currencyVaultService->convertCurrency($newAmount, (int) $newCurrencyId, (int) $oldItemData['currency_id'], $oldItemData['date_created']); return $newItemAmountInOldItemCurrency; }