Ejemplo n.º 1
0
 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');
 }
Ejemplo n.º 2
0
 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();
 }