Example #1
0
 public function save_contras()
 {
     if (!$this->loadData()) {
         $this->dataError();
         sendBack();
     }
     $db = DB::Instance();
     $db->StartTrans();
     $flash = Flash::Instance();
     $errors = array();
     $transactions = array();
     $contras_sessionobject = new SessionData('sl_contras');
     foreach ($this->_data['SLTransaction'] as $id => $data) {
         $data['contra'] = isset($data['contra']) && $data['contra'] == 'on';
         $contras_sessionobject->updatePageData($id, $data, $errors);
     }
     $contra_total = isset($this->_data['contra_total']) ? $this->_data['contra_total'] : '0.00';
     $contra_sum = 0;
     foreach ($contras_sessionobject->getPageData($errors) as $id => $data) {
         if (isset($data['contra']) && $data['contra'] == 'on') {
             // using bcadd to format value
             $transactions[$id] = bcadd($data['os_value'], 0);
             $contra_sum = bcadd($contra_sum, $data['os_value']);
         }
     }
     if (count($transactions) == 0) {
         $errors[] = 'You must select at least one transaction';
     } elseif ($contra_total == $contra_sum) {
         $pl_journal_seq = $db->GenID('pl_journals_id_seq');
         $sl_journal_seq = $db->GenID('sl_journals_id_seq');
         // Create the PL and SL contra journals
         $sltransaction = DataObjectFactory::Factory('SLTransaction');
         $sltransaction->load($id);
         $slcontra = array();
         $slcontra['gross_value'] = $slcontra['net_value'] = bcmul($contra_sum, -1);
         $glparams = DataObjectFactory::Factory('GLParams');
         $slcontra['glaccount_id'] = $glparams->contras_control_account();
         $slcontra['glcentre_id'] = $glparams->balance_sheet_cost_centre();
         $slcontra['transaction_date'] = date(DATE_FORMAT);
         $slcontra['tax_value'] = '0.00';
         $slcontra['source'] = 'S';
         $slcontra['transaction_type'] = 'J';
         $slcontra['our_reference'] = $sl_journal_seq;
         $slcontra['currency_id'] = $this->_data['SLCustomer']['currency_id'];
         $slcontra['rate'] = $this->_data['SLCustomer']['rate'];
         $slcontra['payment_term_id'] = $this->_data['SLCustomer']['payment_term_id'];
         $plcontra = $slcontra;
         $slcontra['slmaster_id'] = $this->_data['SLCustomer']['id'];
         $slcontra['description'] = 'Contra Sales Ledger - PL Ref:' . $pl_journal_seq;
         $sltrans = SLTransaction::Factory($slcontra, $errors, 'SLTransaction');
         if ($sltrans && $sltrans->save('', $errors) && $sltrans->saveGLTransaction($slcontra, $errors)) {
             $transactions[$sltrans->{$sltrans->idField}] = bcadd($slcontra['net_value'], 0);
         } else {
             $errors[] = 'Errror saving SL Transaction Contra : ' . $db->ErrorMsg();
             $flash->addErrors($errors);
         }
         $plcontra['source'] = 'P';
         $plcontra['our_reference'] = $pl_journal_seq;
         $plcontra['description'] = 'Contra Purchase Ledger - SL Ref:' . $sl_journal_seq;
         $plcontra['gross_value'] = $plcontra['net_value'] = bcmul($contra_sum, -1);
         $supplier = DataObjectFactory::Factory('PLSupplier');
         $supplier->loadBy('company_id', $this->_data['SLCustomer']['company_id']);
         if ($supplier->isLoaded()) {
             $plcontra['plmaster_id'] = $supplier->{$supplier->idField};
             $pltrans = PLTransaction::Factory($plcontra, $errors, 'PLTransaction');
         } else {
             $pltrans = FALSE;
         }
         if (!$pltrans || !$pltrans->save('', $errors) || !$pltrans->saveGLTransaction($plcontra, $errors)) {
             $errors[] = 'Errror saving PL Transaction Contra : ' . $db->ErrorMsg();
             $flash->addErrors($errors);
         }
     } else {
         $errors[] = 'Transactions sum mismatch Sum: ' . $contra_sum . ' Control Total: ' . $contra_total;
     }
     if (count($errors) > 0 || !SLTransaction::allocatePayment($transactions, $this->_data['id'], $errors) || !SLAllocation::saveAllocation($transactions, $errors)) {
         $db->FailTrans();
     }
     if ($db->CompleteTrans()) {
         $contras_sessionobject->clear();
         $flash->addMessage('Contra Transactions matched');
         sendTo($this->name, 'view', $this->_modules, array('id' => $this->_data['id']));
     }
     $flash->addErrors($errors);
     $this->outstanding_transactions();
 }
Example #2
0
 public function updateBalance(SLTransaction $sltrans)
 {
     $cc = new ConstraintChain();
     $id = $this->{$this->idField};
     $cc->add(new Constraint('slmaster_id', '=', $id));
     $amount = $sltrans->outstandingBalance($cc);
     if ($this->update($id, 'outstanding_balance', $amount)) {
         return true;
     }
     return false;
 }
 public function savePayments()
 {
     $flash = Flash::Instance();
     $errors = array();
     $data = $this->_data['PeriodicPayment'];
     $db = DB::Instance();
     $db->StartTrans();
     foreach ($data as $id => $set) {
         if (isset($set['pay']) || isset($set['skip'])) {
             $pp = new PeriodicPayment();
             $pp->load($id);
             if (isset($set['pay'])) {
                 //	Create payment record array
                 $data = $pp->makePaymentTransaction();
                 $data['description'] = $set['description'];
                 $data['ext_reference'] = $set['ext_reference'];
                 if (isset($set['next_due_date'])) {
                     $data['transaction_date'] = $set['next_due_date'];
                 }
                 if (isset($set['net_value'])) {
                     $data['net_value'] = $set['net_value'];
                     $data['tax_value'] = $set['tax_value'];
                     $data['value'] = bcadd($data['net_value'], $data['tax_value']);
                 }
                 if (isset($set['gross_value'])) {
                     $data['tax_value'] = 0.0;
                     $data['net_value'] = $data['value'] = $set['gross_value'];
                 }
                 if ($pp->source == 'CR' || $pp->source == 'CP') {
                     if ($pp->source == 'CP') {
                         $data['net_value'] = bcmul($data['net_value'], -1);
                         $data['tax_value'] = bcmul($data['tax_value'], -1);
                         $data['value'] = bcmul($data['value'], -1);
                     }
                     CBTransaction::saveCashPayment($data, $errors);
                 } else {
                     if ($pp->source == 'PP') {
                         $payment = new PLTransaction();
                     } else {
                         $payment = new SLTransaction();
                     }
                     $payment->saveTransaction($data, $errors);
                 }
                 //	Update Periodic Payment record
                 $pp->current++;
                 if (!is_null($pp->end_date) && $pp->next_due_date > $pp->end_date) {
                     $pp->status = 'S';
                 }
                 if (!is_null($pp->occurs) && $pp->current >= $pp->occurs) {
                     $pp->status = 'S';
                 }
                 if ($pp->variable == 't' && $pp->write_variance == 't') {
                     $pp->net_value = $data['net_value'];
                     $pp->tax_value = $data['tax_value'];
                     $pp->gross_value = $data['value'];
                 }
                 if ($pp->status == 'S') {
                     $pp->glaccount_centre_id = null;
                 } else {
                     $pp->glaccount_centre_id = GLAccountCentre::getAccountCentreId($pp->glaccount_id, $pp->glcentre_id, $errors);
                 }
             }
             // Update the date if skipping or paying
             $pp->nextDate();
             if (count($errors) > 0 || !$pp->save()) {
                 $errors[] = 'Failed to update Periodic Payment details';
                 break;
             }
         }
     }
     if (count($errors) == 0 && $db->completeTrans()) {
         $flash->addMessage('Payments processed OK');
         sendTo($_SESSION['refererPage']['controller'], $_SESSION['refererPage']['action'], $_SESSION['refererPage']['modules'], isset($_SESSION['refererPage']['other']) ? $_SESSION['refererPage']['other'] : null);
     } else {
         $db->FailTrans();
         $db->completeTrans();
         $flash->addErrors($errors);
         $flash->addError('Failed to make payments');
         $this->refresh();
     }
 }
Example #4
0
 public function save_confirmsale()
 {
     if (!isset($this->_data) || !$this->loadData()) {
         $this->dataError();
         sendBack();
     }
     $sorder = $this->_uses[$this->modeltype];
     $sorder_data = $this->_data[$this->modeltype];
     $flash = Flash::Instance();
     $errors = array();
     $db = DB::Instance();
     $db->startTrans();
     $slcustomer = DataObjectFactory::Factory('SLCustomer');
     $slcustomer->load($sorder->slmaster_id);
     // save the customer details
     // Existing or new person?
     $person_data = array();
     if (!empty($sorder_data['person_id']) && $sorder_data['person_id'] > 0) {
         // Existing person
         $sorder->person_id = $sorder_data['person_id'];
         $person = DataObjectFactory::Factory('Person');
         $person->load($sorder_data['person_id']);
         if ($person->isLoaded()) {
             $sorder_data['party_id'] = $person->party_id;
         }
     } elseif (!empty($sorder_data['surname'])) {
         // TODO: Saving of person and party data needs to move to appropriate model
         // See also EmployeesController, CompanysController and PersonsController
         // new person
         $sorder_data['party_id'] = '';
         $person_data['Party']['id'] = '';
         $person_data['Party']['type'] = 'Person';
         $person_data['Person']['title'] = $sorder_data['title'];
         $person_data['Person']['firstname'] = $sorder_data['firstname'];
         $person_data['Person']['surname'] = $sorder_data['surname'];
         $person_data['Person']['id'] = '';
         $person_data['Person']['party_id'] = '';
         $person_data['Person']['company_id'] = $slcustomer->company_id;
         $index = 0;
         foreach (array('phone', 'email') as $contact_type) {
             if (!empty($sorder_data[$contact_type])) {
                 $cm = DataObjectFactory::Factory('PartyContactMethod');
                 $person_data[$index]['Contactmethod']['id'] = '';
                 $person_data[$index]['Contactmethod']['contact'] = $sorder_data[$contact_type];
                 $person_data[$index]['PartyContactMethod']['id'] = '';
                 $person_data[$index]['PartyContactMethod']['contactmethod_id'] = '';
                 $person_data[$index]['PartyContactMethod']['party_id'] = '';
                 $person_data[$index]['PartyContactMethod']['name'] = 'MAIN';
                 $person_data[$index]['PartyContactMethod']['type'] = $cm->getType($contact_type);
                 $person_data[$index]['PartyContactMethod']['main'] = 't';
                 $person_data[$index]['PartyContactMethod']['billing'] = 't';
                 $person_data[$index]['PartyContactMethod']['shipping'] = 't';
                 $person_data[$index]['PartyContactMethod']['payment'] = 't';
                 $person_data[$index]['PartyContactMethod']['technical'] = 't';
                 $index++;
             }
         }
         if (parent::save('Person', $person_data, $errors)) {
             foreach ($this->saved_models as $model) {
                 if (isset($model['Person'])) {
                     $person = $model['Person'];
                     $sorder->person_id = $person->id;
                     $sorder_data['party_id'] = $person->party_id;
                 }
             }
         } else {
             $errors[] = 'Error saving Customer Details : ' . $db->ErrorMsg();
         }
     }
     foreach (array('invoice' => $sorder_data['inv_address_id'], 'delivery' => $sorder_data['del_address_id']) as $address_type => $address_id) {
         $address_data = array();
         if (!empty($sorder_data[$address_type]['street1'])) {
             // New address
             $address_data['Address']['id'] = '';
             $address_data['Address']['street1'] = $sorder_data[$address_type]['street1'];
             $address_data['Address']['street2'] = $sorder_data[$address_type]['street2'];
             $address_data['Address']['street3'] = $sorder_data[$address_type]['street3'];
             $address_data['Address']['town'] = $sorder_data[$address_type]['town'];
             $address_data['Address']['county'] = $sorder_data[$address_type]['county'];
             $address_data['Address']['postcode'] = $sorder_data[$address_type]['postcode'];
             $address_data['Address']['countrycode'] = $sorder_data[$address_type]['countrycode'];
             $address_data['PartyAddress']['address_id'] = '';
         } elseif (!empty($person_data['Person'])) {
             // Existing address needs to be linked to new person
             $address_data['PartyAddress']['address_id'] = $address_id;
         }
         if (!empty($sorder_data[$address_type]['street1']) || !empty($person_data['Person'])) {
             // If new address or new person, link address to party
             $address_data['PartyAddress']['id'] = '';
             $address_data['PartyAddress']['party_id'] = $sorder_data['party_id'];
             $address_data['PartyAddress']['name'] = 'MAIN';
             $address_data['PartyAddress']['main'] = $address_type == 'invoice' ? 't' : 'f';
             $address_data['PartyAddress']['billing'] = $address_type == 'invoice' ? 't' : 'f';
             $address_data['PartyAddress']['shipping'] = $address_type == 'delivery' ? 't' : 'f';
             $address_data['PartyAddress']['payment'] = $address_type == 'invoice' ? 't' : 'f';
             $address_data['PartyAddress']['technical'] = 'f';
             if (parent::save('Address', $address_data, $errors)) {
                 foreach ($this->saved_models as $model) {
                     if (isset($model['Address'])) {
                         $address = $model['Address'];
                         if ($address_type == 'invoice') {
                             $sorder_data['inv_address_id'] = $address->id;
                         } else {
                             $sorder_data['del_address_id'] = $address->id;
                         }
                     }
                 }
             } else {
                 $errors[] = 'Error saving Customer ' . $address_type . ' Address Details : ' . $db->ErrorMsg();
             }
         }
     }
     if (!empty($sorder_data['inv_address_id']) && $sorder_data['inv_address_id'] > 0) {
         $sorder->inv_address_id = $sorder_data['inv_address_id'];
     }
     if (!empty($sorder_data['del_address_id']) && $sorder_data['del_address_id'] > 0) {
         $sorder->del_address_id = $sorder_data['del_address_id'];
     } else {
         $sorder->del_address_id = $sorder_data['inv_address_id'];
     }
     if (count($errors) > 0 || !$sorder->save()) {
         $errors[] = 'Error updating customer order details';
     }
     // create and post the invoice
     if (count($errors) == 0) {
         $invoice = $this->createPostInvoice($sorder, $errors);
     }
     // Create the Payment
     if (count($errors) == 0) {
         $cb_data = array();
         $cb_data['cb_account_id'] = $slcustomer->cb_account_id;
         $cb_data['source'] = 'S';
         $cb_data['slmaster_id'] = $sorder->slmaster_id;
         $cb_data['company_id'] = $slcustomer->company_id;
         if ($sorder->person_id > 0) {
             $cb_data['person_id'] = $sorder->person_id;
         }
         $cb_data['ext_reference'] = $sorder_data['ext_reference'];
         $cb_data['payment_term_id'] = $slcustomer->payment_term_id;
         $cb_data['payment_type_id'] = $sorder_data['payment_type_id'];
         $cb_data['transaction_type'] = 'R';
         $cb_data['currency_id'] = $sorder->currency_id;
         $cb_data['transaction_date'] = date(DATE_FORMAT);
         // $cb_data['net_value'] = $sorder_data['gross_value'];
         $cb_data['net_value'] = bcsub($invoice->gross_value, $invoice->settlement_discount);
         if (!SLTransaction::saveTransaction($cb_data, $errors)) {
             $errors[] = 'Error saving Payment Details';
         }
     }
     // Match Payment to Invoice
     if (count($errors) == 0) {
         if ($invoice->isLoaded()) {
             $invoice_trans = DataObjectFactory::Factory('SLTransaction');
             $invoice_trans->identifierField = gross_value;
             $cc = new ConstraintChain();
             $cc->add(new Constraint('transaction_type', '=', 'I'));
             $cc->add(new Constraint('status', '=', 'O'));
             $cc->add(new Constraint('our_reference', '=', $invoice->invoice_number));
             $transactions = $invoice_trans->getAll($cc);
             $transactions[$cb_data['ledger_transaction_id']] = $cb_data['payment_value'];
             // Save settlement discount if present?
             if ($invoice->settlement_discount > 0) {
                 $payment_term = DataObjectFactory::Factory('PaymentTerm');
                 $payment_term->load($slcustomer->payment_term_id);
                 // Create GL Journal for settlement discount
                 $discount = $cb_data;
                 $discount['gross_value'] = $discount['net_value'] = $invoice->settlement_discount;
                 $discount['glaccount_id'] = $payment_term->sl_discount_glaccount_id;
                 $discount['glcentre_id'] = $payment_term->sl_discount_glcentre_id;
                 $discount['tax_value'] = '0.00';
                 $discount['source'] = 'S';
                 $discount['transaction_type'] = 'SD';
                 $discount['description'] = !empty($payment_term->sl_discount_description) ? $payment_term->sl_discount_description . ' ' : '';
                 $discount['description'] .= $cb_data->description;
                 $discount['status'] = 'P';
                 $sldiscount = SLTransaction::Factory($discount, $errors, 'SLTransaction');
                 if ($sldiscount && $sldiscount->save('', $errors) && $sldiscount->saveGLTransaction($discount, $errors)) {
                     $transactions[$sldiscount->{$sldiscount->idField}] = bcadd($discount['net_value'], 0);
                 } else {
                     $errors[] = 'Errror saving Settlement Discount : ' . $db->ErrorMsg();
                     $flash->addErrors($errors);
                 }
             }
             if (!SLTransaction::allocatePayment($transactions, $invoice->slmaster_id, $errors) || !SLAllocation::saveAllocation($transactions, $errors)) {
                 $errors[] = 'Error allocating Payment';
             }
         } else {
             $errors[] = 'Error matching to Invoice';
         }
     }
     // Check for errors
     if (count($errors) > 0) {
         $flash->clear();
         $flash->addErrors($errors);
         $flash->addError('Sale confirmation failed');
         $db->failTrans();
     } else {
         $flash->addMessage('Sale Confirmed');
     }
     $db->CompleteTrans();
     if (count($errors) == 0) {
         // now print the invoice to the users default printer
         $userPreferences = UserPreferences::instance(EGS_USERNAME);
         $defaultPrinter = $userPreferences->getPreferenceValue('default_printer', 'shared');
         if (empty($defaultPrinter)) {
             // Use normal print action
             // ATTN: what happens here? If we don't have a default printer set it's going to ignore our request?
             $this->_data['invoice_id'] = $invoice->id;
             $this->_data['printaction'] = 'printinvoice';
             parent::printaction();
             $this->printaction = array('Print' => 'Print');
             $this->printtype = array('pdf' => 'PDF');
             $this->_templateName = $this->getTemplateName('printaction');
             return;
         } else {
             // Overide print action
             $data = array();
             $data['invoice_id'] = $invoice->id;
             $data['printtype'] = 'pdf';
             $data['printaction'] = 'Print';
             $data['printer'] = $defaultPrinter;
             // call printInvoice and decode the response, output errors / messages
             $response = json_decode($this->printInvoice($invoice, $data));
             if ($response->status === true) {
                 $flash->addMessage('Print Sales Invoice Completed');
                 $invoice->update($invoice->id, array('date_printed', 'print_count'), array(fix_date(date(DATE_FORMAT)), $invoice->print_count + 1));
             } else {
                 $flash->addError('Print Sales Invoice Failed');
                 $flash->addError($response->message);
             }
         }
         // we're not using JavaScript to get here
         // so just go back to the order view
     }
     sendTo($this->name, 'view', $this->_modules, array('id' => $sorder->id));
 }