* Copyright (C) 2008-2009 Laurent Destailleur * Copyright (C) 2011 Juanjo Menent * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file htdocs/cashdesk/validation_verif.php * \ingroup cashdesk * \brief validation_verif.php */ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/cashdesk/include/environnement.php'; require_once DOL_DOCUMENT_ROOT.'/cashdesk/class/Facturation.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; $obj_facturation = unserialize($_SESSION['serObjFacturation']); $action = GETPOST('action', 'aZ09'); $bankaccountid = GETPOST('cashdeskbank'); if (empty($user->rights->cashdesk->run)) { accessforbidden(); } /* * Actions */ switch ($action) { default: $redirection = DOL_URL_ROOT.'/cashdesk/affIndex.php?menutpl=validation'; break; case 'validate_sell': $thirdpartyid = $_SESSION['CASHDESK_ID_THIRDPARTY']; $company = new Societe($db); $company->fetch($thirdpartyid); $invoice = new Facture($db); $invoice->date = dol_now(); $invoice->type = Facture::TYPE_STANDARD; // To use a specific numbering module for POS, reset $conf->global->FACTURE_ADDON and other vars here // and restore values just after $sav_FACTURE_ADDON = ''; if (!empty($conf->global->POS_ADDON)) { $sav_FACTURE_ADDON = $conf->global->FACTURE_ADDON; $conf->global->FACTURE_ADDON = $conf->global->POS_ADDON; // To force prefix only for POS with terre module if (!empty($conf->global->POS_NUMBERING_TERRE_FORCE_PREFIX)) { $conf->global->INVOICE_NUMBERING_TERRE_FORCE_PREFIX = $conf->global->POS_NUMBERING_TERRE_FORCE_PREFIX; } // To force prefix only for POS with mars module if (!empty($conf->global->POS_NUMBERING_MARS_FORCE_PREFIX)) { $conf->global->INVOICE_NUMBERING_MARS_FORCE_PREFIX = $conf->global->POS_NUMBERING_MARS_FORCE_PREFIX; } // To force rule only for POS with mercure //... } $num = $invoice->getNextNumRef($company); // Restore save values if (!empty($sav_FACTURE_ADDON)) { $conf->global->FACTURE_ADDON = $sav_FACTURE_ADDON; } $obj_facturation->numInvoice($num); $obj_facturation->getSetPaymentMode($_POST['hdnChoix']); // Si paiement autre qu'en especes, montant encaisse = prix total $mode_reglement = $obj_facturation->getSetPaymentMode(); if ($mode_reglement != 'ESP') { $montant = $obj_facturation->amountWithTax(); } else { $montant = $_POST['txtEncaisse']; } if ($mode_reglement != 'DIF') { $obj_facturation->amountCollected($montant); //Determination de la somme rendue $total = $obj_facturation->amountWithTax(); $encaisse = $obj_facturation->amountCollected(); $obj_facturation->amountReturned($encaisse - $total); } else { //$txtDatePaiement=$_POST['txtDatePaiement']; $datePaiement = dol_mktime(0, 0, 0, $_POST['txtDatePaiementmonth'], $_POST['txtDatePaiementday'], $_POST['txtDatePaiementyear']); $txtDatePaiement = dol_print_date($datePaiement, 'dayrfc'); $obj_facturation->paiementLe($txtDatePaiement); } $redirection = 'affIndex.php?menutpl=validation'; break; case 'retour': $redirection = 'affIndex.php?menutpl=facturation'; break; case 'validate_invoice': $now = dol_now(); // Recuperation de la date et de l'heure $date = dol_print_date($now, 'day'); $heure = dol_print_date($now, 'hour'); $note = ''; if (!is_object($obj_facturation)) { dol_print_error('', 'Empty context'); exit; } switch ($obj_facturation->getSetPaymentMode()) { case 'DIF': $mode_reglement_id = 0; //$cond_reglement_id = dol_getIdFromCode($db,'RECEP','cond_reglement','code','rowid') $cond_reglement_id = 0; break; case 'ESP': $mode_reglement_id = dol_getIdFromCode($db, 'LIQ', 'c_paiement', 'code', 'id', 1); $cond_reglement_id = 0; $note .= $langs->trans("Cash")."\n"; $note .= $langs->trans("Received").' : '.$obj_facturation->amountCollected()." ".$conf->currency."\n"; $note .= $langs->trans("Rendu").' : '.$obj_facturation->amountReturned()." ".$conf->currency."\n"; $note .= "\n"; $note .= '--------------------------------------'."\n\n"; break; case 'CB': $mode_reglement_id = dol_getIdFromCode($db, 'CB', 'c_paiement', 'code', 'id', 1); $cond_reglement_id = 0; break; case 'CHQ': $mode_reglement_id = dol_getIdFromCode($db, 'CHQ', 'c_paiement', 'code', 'id', 1); $cond_reglement_id = 0; break; } if (empty($mode_reglement_id)) { $mode_reglement_id = 0; // If mode_reglement_id not found } if (empty($cond_reglement_id)) { $cond_reglement_id = 0; // If cond_reglement_id not found } $note .= GETPOST('txtaNotes', 'alphanohtml'); dol_syslog("obj_facturation->getSetPaymentMode()=".$obj_facturation->getSetPaymentMode()." mode_reglement_id=".$mode_reglement_id." cond_reglement_id=".$cond_reglement_id); $error = 0; $db->begin(); $user->fetch($_SESSION['uid']); $user->getrights(); $thirdpartyid = $_SESSION['CASHDESK_ID_THIRDPARTY']; $societe = new Societe($db); $societe->fetch($thirdpartyid); $invoice = new Facture($db); // Get content of cart $tab_liste = $_SESSION['poscart']; // Loop on each line into cart $tab_liste_size = count($tab_liste); for ($i = 0; $i < $tab_liste_size; $i++) { $tmp = getTaxesFromId($tab_liste[$i]['fk_tva']); $vat_rate = $tmp['rate']; $vat_npr = $tmp['npr']; $vat_src_code = $tmp['code']; $invoiceline = new FactureLigne($db); $invoiceline->fk_product = $tab_liste[$i]['fk_article']; $invoiceline->desc = $tab_liste[$i]['label']; $invoiceline->qty = $tab_liste[$i]['qte']; $invoiceline->remise_percent = $tab_liste[$i]['remise_percent']; $invoiceline->price = $tab_liste[$i]['price']; $invoiceline->subprice = $tab_liste[$i]['price']; $invoiceline->tva_tx = empty($vat_rate) ? 0 : $vat_rate; // works even if vat_rate is '' $invoiceline->info_bits = empty($vat_npr) ? 0 : $vat_npr; $invoiceline->vat_src_code = $vat_src_code; $invoiceline->total_ht = $tab_liste[$i]['total_ht']; $invoiceline->total_ttc = $tab_liste[$i]['total_ttc']; $invoiceline->total_tva = $tab_liste[$i]['total_vat']; $invoiceline->total_localtax1 = $tab_liste[$i]['total_localtax1']; $invoiceline->total_localtax2 = $tab_liste[$i]['total_localtax2']; $invoice->lines[] = $invoiceline; } $invoice->socid = $conf_fksoc; $invoice->date_creation = $now; $invoice->date = $now; $invoice->date_lim_reglement = 0; $invoice->total_ht = $obj_facturation->amountWithoutTax(); $invoice->total_tva = $obj_facturation->amountVat(); $invoice->total_ttc = $obj_facturation->amountWithTax(); $invoice->note_private = $note; $invoice->cond_reglement_id = $cond_reglement_id; $invoice->mode_reglement_id = $mode_reglement_id; $invoice->module_source = 'cashdesk'; $invoice->pos_source = '0'; //print "c=".$invoice->cond_reglement_id." m=".$invoice->mode_reglement_id; exit; // Si paiement differe ... if ($obj_facturation->getSetPaymentMode() == 'DIF') { $resultcreate = $invoice->create($user, 0, dol_stringtotime($obj_facturation->paiementLe())); if ($resultcreate > 0) { $warehouseidtodecrease = (isset($_SESSION["CASHDESK_ID_WAREHOUSE"]) ? $_SESSION["CASHDESK_ID_WAREHOUSE"] : 0); if (!empty($conf->global->CASHDESK_NO_DECREASE_STOCK)) { $warehouseidtodecrease = 0; // If a particular stock is defined, we disable choice } $resultvalid = $invoice->validate($user, $obj_facturation->numInvoice(), 0); if ($warehouseidtodecrease > 0) { // Decrease require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php'; $langs->load("agenda"); // Loop on each line $cpt = count($invoice->lines); for ($i = 0; $i < $cpt; $i++) { if ($invoice->lines[$i]->fk_product > 0) { $mouvP = new MouvementStock($db); $mouvP->origin = &$invoice; // We decrease stock for product if ($invoice->type == $invoice::TYPE_CREDIT_NOTE) { $result = $mouvP->reception($user, $invoice->lines[$i]->fk_product, $warehouseidtodecrease, $invoice->lines[$i]->qty, $invoice->lines[$i]->subprice, $langs->trans("InvoiceValidatedInDolibarrFromPos", $invoice->newref)); } else { $result = $mouvP->livraison($user, $invoice->lines[$i]->fk_product, $warehouseidtodecrease, $invoice->lines[$i]->qty, $invoice->lines[$i]->subprice, $langs->trans("InvoiceValidatedInDolibarrFromPos", $invoice->newref)); } if ($result < 0) { $error++; } } } } } else { setEventMessages($invoice->error, $invoice->errors, 'errors'); $error++; } $id = $invoice->id; } else { $resultcreate = $invoice->create($user, 0, 0); if ($resultcreate > 0) { $warehouseidtodecrease = (isset($_SESSION["CASHDESK_ID_WAREHOUSE"]) ? $_SESSION["CASHDESK_ID_WAREHOUSE"] : 0); if (!empty($conf->global->CASHDESK_NO_DECREASE_STOCK)) { $warehouseidtodecrease = 0; // If a particular stock is defined, we disable choice } $resultvalid = $invoice->validate($user, $obj_facturation->numInvoice(), 0); if ($warehouseidtodecrease > 0) { // Decrease require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php'; $langs->load("agenda"); // Loop on each line $cpt = count($invoice->lines); for ($i = 0; $i < $cpt; $i++) { if ($invoice->lines[$i]->fk_product > 0) { $mouvP = new MouvementStock($db); $mouvP->origin = &$invoice; // We decrease stock for product if ($invoice->type == $invoice::TYPE_CREDIT_NOTE) { $result = $mouvP->reception($user, $invoice->lines[$i]->fk_product, $warehouseidtodecrease, $invoice->lines[$i]->qty, $invoice->lines[$i]->subprice, $langs->trans("InvoiceValidatedInDolibarrFromPos", $invoice->newref)); } else { $result = $mouvP->livraison($user, $invoice->lines[$i]->fk_product, $warehouseidtodecrease, $invoice->lines[$i]->qty, $invoice->lines[$i]->subprice, $langs->trans("InvoiceValidatedInDolibarrFromPos", $invoice->newref)); } if ($result < 0) { setEventMessages($mouvP->error, $mouvP->errors, 'errors'); $error++; } } } } $id = $invoice->id; // Add the payment $payment = new Paiement($db); $payment->datepaye = $now; $payment->amounts[$invoice->id] = $obj_facturation->amountWithTax(); $payment->note_public = $langs->trans("Payment").' '.$langs->trans("Invoice").' '.$obj_facturation->numInvoice(); $payment->paiementid = $invoice->mode_reglement_id; $payment->num_paiement = ''; $payment->num_payment = ''; $paiement_id = $payment->create($user); if ($paiement_id > 0) { if (!$error) { $result = $payment->addPaymentToBank($user, 'payment', '(CustomerInvoicePayment)', $bankaccountid, '', ''); if (!$result > 0) { $errmsg = $paiement->error; $error++; } } if (!$error) { if ($invoice->total_ttc == $obj_facturation->amountWithTax() && $obj_facturation->getSetPaymentMode() != 'DIFF') { // We set status to paid $result = $invoice->setPaid($user); //print 'set paid';exit; } } } else { setEventMessages($invoice->error, $invoice->errors, 'errors'); $error++; } } else { setEventMessages($invoice->error, $invoice->errors, 'errors'); $error++; } } if (!$error) { $db->commit(); $redirection = 'affIndex.php?menutpl=validation_ok&facid='.$id; // Ajout de l'id de la facture, pour l'inclure dans un lien pointant directement vers celle-ci dans Dolibarr } else { $db->rollback(); $redirection = 'affIndex.php?facid='.$id.'&error=1&mesg=ErrorFailedToCreateInvoice'; // Ajout de l'id de la facture, pour l'inclure dans un lien pointant directement vers celle-ci dans Dolibarr } break; // End of case: validate_invoice } unset($_SESSION['serObjFacturation']); $_SESSION['serObjFacturation'] = serialize($obj_facturation); header('Location: '.$redirection); exit;