public function save_allocation() { $db = DB::Instance(); $db->StartTrans(); $total = 0; $base_total = 0; $flash = Flash::Instance(); $errors = array(); if (!isset($this->_data['transactions'])) { $flash->addError('You must select at least one transaction'); } else { $transactions = $this->_data['transactions']; foreach ($transactions as $id => $on) { $trans = DataObjectFactory::Factory('ELTransaction'); $trans->load($id); $total = bcadd($total, $trans->os_value); $base_total = bcadd($base_total, $trans->base_os_value); $trans_store[] = $trans; } if ($total == 0) { foreach ($trans_store as $transaction) { $transaction->status = 'P'; $transaction->os_value = 0; $transaction->twin_os_value = 0; $transaction->base_os_value = 0; $transaction->for_payment = 'f'; if ($transaction->saveForPayment($errors) === false) { $flash->addErrors($errors); $flash->addError('Error saving transaction'); $db->Failtrans(); $db->CompleteTrans(); sendback(); } if ($transaction->transaction_type == 'E') { $expense = DataObjectFactory::Factory('Expense'); $expense->loadBy('expense_number', $transaction->our_reference); if (!$expense->isLoaded() || !$expense->update($expense->{$expense->idField}, 'status', $expense->statusPaid())) { $flash->addError('Error updating Expenses'); $db->Failtrans(); $db->CompleteTrans(); sendback(); } } } if ($base_total != 0) { $data = array(); $data['docref'] = $this->_data['employee_id']; $data['value'] = $base_total * -1; if (!ELTransaction::currencyAdjustment($data, $errors)) { $flash->addErrors($errors); $db->FailTrans(); } } if ($db->CompleteTrans()) { $flash->addMessage('Transactions matched'); sendBack(); } } else { $flash->addError('Transactions must sum to zero'); } } $db->FailTrans(); $this->allocate(); $this->setTemplatename('allocate'); }
public function pay_claim($data, &$errors = array()) { if ($this->paid()) { $errors[] = 'Expense Claim has already been paid'; return false; } $db = DB::Instance(); $db->StartTrans(); // TODO: may be able to reuse some of this code // but see EmployeesController::save_payment and EmployeesController::save_allocation $gl_params = DataObjectFactory::Factory('GLParams'); $data['glaccount_id'] = $gl_params->expenses_control_account(); $data['glcentre_id'] = $gl_params->balance_sheet_cost_centre(); $data['source'] = 'E'; $result = ELTransaction::saveTransaction($data, $errors); // Match the payment to the expense claim if (empty($errors)) { $exptrans = DataObjectFactory::Factory('ELTransaction'); $exptrans->loadBy(array('employee_id', 'transaction_type', 'status', 'our_reference'), array($this->employee_id, 'E', 'O', $this->expense_number)); if (!$exptrans->isLoaded()) { $errors[] = 'Error matching Expense Transaction to Payment'; $db->FailTrans(); } $paytrans = DataObjectFactory::Factory('ELTransaction'); $paytrans->load($data['ledger_transaction_id']); if (!$paytrans->isLoaded()) { $errors[] = 'Error loading payment : ' . $db->ErrorMsg(); $db->Failtrans(); } else { $base_total = bcmul($exptrans->gross_base_total, $paytrans->gross_base_total); $paytrans->status = $exptrans->status = 'P'; $exptrans->os_value = 0; $exptrans->twin_os_value = 0; $exptrans->base_os_value = 0; $exptrans->for_payment = 'f'; // Update the EL Transactions - Expense and matching Payment if (!$exptrans->saveForPayment($errors) || !$paytrans->saveForPayment($errors)) { $db->Failtrans(); } } } // Check for any currency conversion credit/debit if (empty($errors) && $base_total != 0) { $data = array(); $data['docref'] = $this->employee_id; $data['value'] = $base_total * -1; if (!ELTransaction::currencyAdjustment($data, $errors)) { $db->FailTrans(); } } // Update the Expense Claim header status if (empty($errors)) { $this->status = $this->statusPaid(); if (!$this->save()) { $message = $db->ErrorMsg(); if (!empty($message)) { $errors[] = $message; } $db->FailTrans(); } } return $db->CompleteTrans(); }