/** * @return bool * @throws \Exception */ public function process() { /** * @var Expenses $expenseDao */ $expenseDao = $this->getServiceLocator()->get('dao_finance_expense_expenses'); $expenseDao->setEntity(new \ArrayObject()); $finance = new Finance($this->getServiceLocator()); $expenseList = $this->getExpenses(); if (!count($expenseList)) { throw new \Exception('No expense attached.'); } $transactionIdList = parent::processGeneralTransaction(); if (count($transactionIdList) > 1) { throw new \RuntimeException('It is impossible to store more than one transaction id for expense transaction.'); } else { $moneyTransactionId = array_shift($transactionIdList); } foreach ($expenseList as $expense) { $expenseData = $expenseDao->fetchOne(['id' => $expense['id']]); $expenseTicket = $finance->getExpense($expense['id']); $expenseTicket->prepare($this->getExpenseTicketData($expenseData, $expense['amount'])); $expenseTicket->addTransaction($this->getTransactionData($moneyTransactionId, $expense['amount'])); $expenseTicket->save(); } // Set as verified transaction $this->changeVerifyStatus($moneyTransactionId, self::IS_VERIFIED); return $moneyTransactionId; }
/** * @param array $data * @param ParametersInterface|bool $files * @param array $extra * @return bool * @throws \Exception */ public function saveExpenseTicket($data, ParametersInterface $files, &$extra = []) { $data = $this->prepareData($data); if ($this->checkExpenseData($data)) { $finance = new Finance($this->getServiceLocator()); $expenseTicket = $finance->getExpense($data['isEdit'] ? $data['ticket']['id'] : null); // Exact expense (ticket) $expenseTicket->prepare($data['ticket']); if (!empty($data['items']['add'])) { foreach ($data['items']['add'] as $item) { $expenseTicket->addItem($item['data']); } } if (!empty($data['transactions']['add'])) { foreach ($data['transactions']['add'] as $item) { $expenseTicket->addTransaction($item); } } $expenseTicket->save(); list($ticketFiles, $itemFiles) = $this->separateAttachments($expenseTicket, $files); // Files $errorMessages = array_merge_recursive($this->saveFiles($ticketFiles, $expenseTicket), $this->saveItemFiles($itemFiles, $expenseTicket), $this->removeFiles($data['attachments'])); // Passed by reference. Look up $extra = ['isEdit' => $data['isEdit'], 'ticketId' => $expenseTicket->getExpenseId(), 'errorMessages' => $errorMessages]; return true; } return false; }
/** * @param int $moneyTransactionId * @return int */ private function createExpense($moneyTransactionId) { $data = $this->constructExpenseData($moneyTransactionId); $finance = new Finance($this->getServiceLocator()); $expenseTicket = $finance->getExpense(); $expenseTicket->prepare($data['ticket']); if (count($data['items'])) { foreach ($data['items'] as $item) { $expenseTicket->addItem($item); } } $expenseTicket->addTransaction($data['transaction']); $expenseTicket->save(); return $expenseTicket->getExpenseId(); }