Example #1
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));
 }