2018-09-28 13:31:41 +02:00
< ? php
2018-12-07 17:02:06 +01:00
/**
* Copyright ( C ) 2018 Andreu Bisquerra < jove @ bisquerra . com >
2021-02-24 15:48:15 +01:00
* Copyright ( C ) 2021 Nicolas ZABOURI < info @ inovea - conseil . com >
2018-09-28 13:31:41 +02:00
*
* 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
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2018-09-28 13:31:41 +02:00
*/
2019-03-28 09:56:01 +01:00
/**
* \file htdocs / takepos / invoice . php
* \ingroup takepos
* \brief Page to generate section with list of lines
*/
2019-03-15 12:07:33 +01:00
// if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Not disabled cause need to load personalized language
// if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Not disabled cause need to load personalized language
// if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1');
// if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1');
2021-02-26 21:17:52 +01:00
if ( ! defined ( 'NOCSRFCHECK' )) {
define ( 'NOCSRFCHECK' , '1' );
}
if ( ! defined ( 'NOTOKENRENEWAL' )) {
define ( 'NOTOKENRENEWAL' , '1' );
}
if ( ! defined ( 'NOREQUIREMENU' )) {
define ( 'NOREQUIREMENU' , '1' );
}
if ( ! defined ( 'NOREQUIREHTML' )) {
define ( 'NOREQUIREHTML' , '1' );
}
if ( ! defined ( 'NOREQUIREAJAX' )) {
define ( 'NOREQUIREAJAX' , '1' );
}
2018-12-07 08:04:40 +01:00
2021-02-26 21:17:52 +01:00
if ( ! defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
require '../main.inc.php' ;
}
2019-11-12 00:15:34 +01:00
require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/html.form.class.php' ;
2022-05-03 09:44:18 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php' ;
2022-05-03 09:35:06 +02:00
$hookmanager -> initHooks ( array ( 'takeposinvoice' ));
2018-12-07 08:04:40 +01:00
2020-03-17 09:44:59 +01:00
global $mysoc ;
2020-06-29 17:58:04 +02:00
$langs -> loadLangs ( array ( " companies " , " commercial " , " bills " , " cashdesk " , " stocks " , " banks " ));
2019-03-14 16:35:36 +01:00
2018-12-07 08:04:40 +01:00
$id = GETPOST ( 'id' , 'int' );
2020-09-16 19:39:50 +02:00
$action = GETPOST ( 'action' , 'aZ09' );
2018-12-07 08:04:40 +01:00
$idproduct = GETPOST ( 'idproduct' , 'int' );
2020-03-23 15:02:15 +01:00
$place = ( GETPOST ( 'place' , 'aZ09' ) ? GETPOST ( 'place' , 'aZ09' ) : 0 ); // $place is id of table for Bar or Restaurant
2020-01-01 21:54:47 +01:00
$placeid = 0 ; // $placeid is ID of invoice
2022-04-08 00:42:39 +02:00
$mobilepage = GETPOST ( 'mobilepage' , 'alpha' );
2020-12-04 00:58:51 +01:00
// Terminal is stored into $_SESSION["takeposterminal"];
2019-03-27 20:13:12 +01:00
2020-05-08 17:25:48 +02:00
if ( empty ( $user -> rights -> takepos -> run ) && ! defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
2020-03-23 15:46:16 +01:00
accessforbidden ();
2020-03-16 19:23:18 +01:00
}
2020-12-04 00:58:51 +01:00
/*
* View
*/
2021-07-08 12:17:32 +02:00
if (( getDolGlobalString ( 'TAKEPOS_PHONE_BASIC_LAYOUT' ) == 1 && $conf -> browser -> layout == 'phone' ) || defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
2019-05-26 16:44:17 +02:00
// DIRECT LINK TO THIS PAGE FROM MOBILE AND NO TERMINAL SELECTED
2021-02-26 21:17:52 +01:00
if ( $_SESSION [ " takeposterminal " ] == " " ) {
2021-07-08 12:17:32 +02:00
if ( getDolGlobalString ( 'TAKEPOS_NUM_TERMINALS' ) == " 1 " ) {
2021-02-26 21:17:52 +01:00
$_SESSION [ " takeposterminal " ] = 1 ;
} else {
2020-03-16 15:41:21 +01:00
header ( " Location: " . DOL_URL_ROOT . " /takepos/index.php " );
2019-05-26 16:44:17 +02:00
exit ;
}
}
2019-11-12 00:15:34 +01:00
$title = 'TakePOS - Dolibarr ' . DOL_VERSION ;
2021-02-26 21:17:52 +01:00
if ( ! empty ( $conf -> global -> MAIN_APPLICATION_TITLE )) {
$title = 'TakePOS - ' . $conf -> global -> MAIN_APPLICATION_TITLE ;
}
2019-11-12 00:15:34 +01:00
$head = ' < meta name = " apple-mobile-web-app-title " content = " TakePOS " />
2019-05-26 16:44:17 +02:00
< meta name = " apple-mobile-web-app-capable " content = " yes " >
< meta name = " mobile-web-app-capable " content = " yes " >
< meta name = " viewport " content = " width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no " /> ' ;
2020-05-15 23:44:19 +02:00
$arrayofcss = array (
'/takepos/css/pos.css.php' ,
'/takepos/js/jquery.colorbox-min.js'
);
$arrayofjs = array ( '/takepos/js/jquery.colorbox-min.js' );
2021-07-08 12:17:32 +02:00
$disablejs = 0 ;
$disablehead = 0 ;
2019-05-26 16:44:17 +02:00
top_htmlhead ( $head , $title , $disablejs , $disablehead , $arrayofjs , $arrayofcss );
}
2019-03-22 09:06:44 +01:00
/**
* Abort invoice creationg with a given error message
*
* @ param string $message Message explaining the error to the user
* @ return void
*/
function fail ( $message )
{
2019-11-12 00:15:34 +01:00
header ( $_SERVER [ 'SERVER_PROTOCOL' ] . ' 500 Internal Server Error' , true , 500 );
2019-03-22 09:06:44 +01:00
die ( $message );
}
2019-03-27 12:40:32 +01:00
$number = GETPOST ( 'number' , 'alpha' );
$idline = GETPOST ( 'idline' , 'int' );
2019-12-08 23:16:49 +01:00
$selectedline = GETPOST ( 'selectedline' , 'int' );
2020-09-16 17:56:26 +02:00
$desc = GETPOST ( 'desc' , 'alphanohtml' );
$pay = GETPOST ( 'pay' , 'aZ09' );
2019-03-27 12:40:32 +01:00
$amountofpayment = price2num ( GETPOST ( 'amount' , 'alpha' ));
2018-12-07 08:04:40 +01:00
2019-03-27 15:42:53 +01:00
$invoiceid = GETPOST ( 'invoiceid' , 'int' );
2019-03-14 16:35:36 +01:00
2019-03-26 20:01:06 +01:00
$paycode = $pay ;
2021-02-26 21:17:52 +01:00
if ( $pay == 'cash' ) {
$paycode = 'LIQ' ; // For backward compatibility
}
if ( $pay == 'card' ) {
$paycode = 'CB' ; // For backward compatibility
}
if ( $pay == 'cheque' ) {
$paycode = 'CHQ' ; // For backward compatibility
}
2019-03-27 12:40:32 +01:00
2019-03-15 12:07:33 +01:00
// Retrieve paiementid
2021-07-08 12:17:32 +02:00
$paiementid = 0 ;
if ( $paycode ) {
$sql = " SELECT id FROM " . MAIN_DB_PREFIX . " c_paiement " ;
$sql .= " WHERE entity IN ( " . getEntity ( 'c_paiement' ) . " ) " ;
$sql .= " AND code = ' " . $db -> escape ( $paycode ) . " ' " ;
$resql = $db -> query ( $sql );
if ( $resql ) {
$obj = $db -> fetch_object ( $resql );
if ( $obj ) {
$paiementid = $obj -> id ;
}
}
}
2019-03-27 12:40:32 +01:00
2019-03-27 15:42:53 +01:00
$invoice = new Facture ( $db );
2021-02-26 21:17:52 +01:00
if ( $invoiceid > 0 ) {
2020-09-07 10:18:17 +02:00
$ret = $invoice -> fetch ( $invoiceid );
2020-05-21 15:05:19 +02:00
} else {
2021-09-02 19:27:43 +02:00
$ret = $invoice -> fetch ( '' , '(PROV-POS' . ( isset ( $_SESSION [ " takeposterminal " ]) ? $_SESSION [ " takeposterminal " ] : '' ) . '-' . $place . ')' );
2019-03-27 15:42:53 +01:00
}
2021-02-26 21:17:52 +01:00
if ( $ret > 0 ) {
2020-09-07 10:18:17 +02:00
$placeid = $invoice -> id ;
2019-03-27 15:42:53 +01:00
}
2021-10-07 09:51:55 +02:00
$constforcompanyid = 'CASHDESK_ID_THIRDPARTY' . ( isset ( $_SESSION [ " takeposterminal " ]) ? $_SESSION [ " takeposterminal " ] : '' );
2020-01-01 21:54:47 +01:00
$soc = new Societe ( $db );
2021-02-26 21:17:52 +01:00
if ( $invoice -> socid > 0 ) {
$soc -> fetch ( $invoice -> socid );
} else {
2021-08-29 16:41:22 +02:00
$soc -> fetch ( getDolGlobalString ( " $constforcompanyid " ));
2021-02-26 21:17:52 +01:00
}
2020-01-01 21:54:47 +01:00
2021-07-06 03:53:42 +02:00
// Change the currency of invoice if it was modified
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'multicurrency' ) && ! empty ( $_SESSION [ " takeposcustomercurrency " ])) {
2021-07-06 03:53:42 +02:00
if ( $invoice -> multicurrency_code != $_SESSION [ " takeposcustomercurrency " ]) {
$invoice -> setMulticurrencyCode ( $_SESSION [ " takeposcustomercurrency " ]);
}
}
2022-07-07 22:35:56 +02:00
2022-05-03 09:35:06 +02:00
/*
* Actions
*/
$parameters = array ();
2022-05-03 09:52:20 +02:00
$reshook = $hookmanager -> executeHooks ( 'doActions' , $parameters , $invoice , $action ); // Note that $action and $object may have been modified by some hooks
2022-05-03 09:35:06 +02:00
if ( $reshook < 0 ) setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
2021-07-06 03:53:42 +02:00
2022-05-03 09:35:06 +02:00
if ( empty ( $reshook )) {
// Action to record a payment on a TakePOS invoice
if ( $action == 'valid' && $user -> rights -> facture -> creer ) {
$bankaccount = 0 ;
$error = 0 ;
2020-06-29 17:58:04 +02:00
2022-05-03 09:35:06 +02:00
if ( ! empty ( $conf -> global -> TAKEPOS_CAN_FORCE_BANK_ACCOUNT_DURING_PAYMENT )) {
$bankaccount = GETPOST ( 'accountid' , 'int' );
2021-02-26 21:17:52 +01:00
} else {
2022-05-03 09:35:06 +02:00
if ( $pay == 'LIQ' ) {
$bankaccount = $conf -> global -> { 'CASHDESK_ID_BANKACCOUNT_CASH' . $_SESSION [ " takeposterminal " ]}; // For backward compatibility
} elseif ( $pay == " CHQ " ) {
$bankaccount = $conf -> global -> { 'CASHDESK_ID_BANKACCOUNT_CHEQUE' . $_SESSION [ " takeposterminal " ]}; // For backward compatibility
} else {
$accountname = " CASHDESK_ID_BANKACCOUNT_ " . $pay . $_SESSION [ " takeposterminal " ];
$bankaccount = $conf -> global -> $accountname ;
}
2020-09-07 10:18:17 +02:00
}
2020-06-29 17:58:04 +02:00
2022-08-26 17:03:20 +02:00
if ( $bankaccount <= 0 && $pay != " delayed " && isModEnabled ( 'banque' )) {
2022-05-03 09:35:06 +02:00
$errormsg = $langs -> trans ( " ErrorFieldRequired " , $langs -> transnoentitiesnoconv ( " BankAccount " ));
$error ++ ;
}
2020-06-29 17:58:04 +02:00
2022-05-03 09:35:06 +02:00
$now = dol_now ();
$res = 0 ;
2019-03-14 16:35:36 +01:00
2022-05-03 09:35:06 +02:00
$invoice = new Facture ( $db );
$invoice -> fetch ( $placeid );
2020-06-29 17:58:04 +02:00
2022-05-03 09:35:06 +02:00
if ( $invoice -> total_ttc < 0 ) {
$invoice -> type = $invoice :: TYPE_CREDIT_NOTE ;
2020-12-30 22:58:40 +01:00
2022-05-03 09:35:06 +02:00
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " facture WHERE " ;
$sql .= " fk_soc = " . (( int ) $invoice -> socid );
$sql .= " AND type <> " . Facture :: TYPE_CREDIT_NOTE ;
$sql .= " AND fk_statut >= " . $invoice :: STATUS_VALIDATED ;
$sql .= " ORDER BY rowid DESC " ;
2020-12-30 22:58:40 +01:00
2022-05-03 09:35:06 +02:00
$resql = $db -> query ( $sql );
if ( $resql ) {
$obj = $db -> fetch_object ( $resql );
$fk_source = $obj -> rowid ;
if ( $fk_source == null ) {
fail ( $langs -> transnoentitiesnoconv ( " NoPreviousBillForCustomer " ));
}
} else {
2019-03-22 09:06:44 +01:00
fail ( $langs -> transnoentitiesnoconv ( " NoPreviousBillForCustomer " ));
}
2022-05-03 09:35:06 +02:00
$invoice -> fk_facture_source = $fk_source ;
$invoice -> update ( $user );
}
//$sav_FACTURE_ADDON = '';
//if (!empty($conf->global->TAKEPOS_ADDON)) {
// $sav_FACTURE_ADDON = $conf->global->FACTURE_ADDON;
// if ($conf->global->TAKEPOS_ADDON == "terminal") $conf->global->FACTURE_ADDON = $conf->global->{'TAKEPOS_ADDON'.$_SESSION["takeposterminal"]};
// else $conf->global->FACTURE_ADDON = $conf->global->TAKEPOS_ADDON;
//}
$constantforkey = 'CASHDESK_NO_DECREASE_STOCK' . $_SESSION [ " takeposterminal " ];
if ( $error ) {
dol_htmloutput_errors ( $errormsg , null , 1 );
} elseif ( $invoice -> statut != Facture :: STATUS_DRAFT ) {
//If invoice is validated but it is not fully paid is not error and make the payment
if ( $invoice -> getRemainToPay () > 0 ) {
$res = 1 ;
} else {
dol_syslog ( " Sale already validated " );
dol_htmloutput_errors ( $langs -> trans ( " InvoiceIsAlreadyValidated " , " TakePos " ), null , 1 );
}
} elseif ( count ( $invoice -> lines ) == 0 ) {
$error ++ ;
dol_syslog ( 'Sale without lines' );
dol_htmloutput_errors ( $langs -> trans ( " NoLinesToBill " , " TakePos " ), null , 1 );
2022-08-26 17:03:20 +02:00
} elseif ( isModEnabled ( 'stock' ) && $conf -> global -> $constantforkey != " 1 " ) {
2022-05-03 09:35:06 +02:00
$savconst = $conf -> global -> STOCK_CALCULATE_ON_BILL ;
$conf -> global -> STOCK_CALCULATE_ON_BILL = 1 ;
$constantforkey = 'CASHDESK_ID_WAREHOUSE' . $_SESSION [ " takeposterminal " ];
dol_syslog ( " Validate invoice with stock change into warehouse defined into constant " . $constantforkey . " = " . $conf -> global -> $constantforkey );
$batch_rule = 0 ;
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'productbatch' ) && ! empty ( $conf -> global -> CASHDESK_FORCE_DECREASE_STOCK )) {
2022-05-03 09:35:06 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/class/productbatch.class.php' ;
$batch_rule = Productbatch :: BATCH_RULE_SELLBY_EATBY_DATES_FIRST ;
}
$res = $invoice -> validate ( $user , '' , $conf -> global -> $constantforkey , 0 , $batch_rule );
2020-02-27 18:13:26 +01:00
2022-05-03 09:35:06 +02:00
$conf -> global -> STOCK_CALCULATE_ON_BILL = $savconst ;
2020-06-29 17:58:04 +02:00
} else {
2022-05-03 09:35:06 +02:00
$res = $invoice -> validate ( $user );
if ( $res < 0 ) {
$error ++ ;
2022-07-07 22:35:56 +02:00
$langs -> load ( " admin " );
dol_htmloutput_errors ( $invoice -> error == 'NotConfigured' ? $langs -> trans ( " NotConfigured " ) . ' (TakePos numbering module)' : $invoice -> error , $invoice -> errors , 1 );
2022-05-03 09:35:06 +02:00
}
2020-12-04 00:58:51 +01:00
}
2020-02-27 18:13:26 +01:00
2022-05-03 09:35:06 +02:00
// Restore save values
//if (!empty($sav_FACTURE_ADDON))
//{
// $conf->global->FACTURE_ADDON = $sav_FACTURE_ADDON;
//}
// Add the payment
if ( ! $error && $res >= 0 ) {
$remaintopay = $invoice -> getRemainToPay ();
if ( $remaintopay > 0 ) {
$payment = new Paiement ( $db );
$payment -> datepaye = $now ;
$payment -> fk_account = $bankaccount ;
$payment -> amounts [ $invoice -> id ] = $amountofpayment ;
if ( $pay == 'LIQ' ) {
$payment -> pos_change = price2num ( GETPOST ( 'excess' , 'alpha' ));
}
2020-09-30 15:09:45 +02:00
2022-05-03 09:35:06 +02:00
// If user has not used change control, add total invoice payment
// Or if user has used change control and the amount of payment is higher than remain to pay, add the remain to pay
if ( $amountofpayment == 0 || $amountofpayment > $remaintopay ) {
$payment -> amounts [ $invoice -> id ] = $remaintopay ;
}
2020-10-01 19:35:49 +02:00
2022-05-03 09:35:06 +02:00
$payment -> paiementid = $paiementid ;
$payment -> num_payment = $invoice -> ref ;
2020-09-30 15:09:45 +02:00
2022-05-03 09:35:06 +02:00
if ( $pay != " delayed " ) {
$payment -> create ( $user );
$payment -> addPaymentToBank ( $user , 'payment' , '(CustomerInvoicePayment)' , $bankaccount , '' , '' );
$remaintopay = $invoice -> getRemainToPay (); // Recalculate remain to pay after the payment is recorded
}
2020-10-01 19:43:23 +02:00
}
2019-09-24 10:08:48 +02:00
2022-05-03 09:35:06 +02:00
if ( $remaintopay == 0 ) {
dol_syslog ( " Invoice is paid, so we set it to status Paid " );
$result = $invoice -> setPaid ( $user );
if ( $result > 0 ) {
$invoice -> paye = 1 ;
}
// set payment method
$invoice -> setPaymentMethods ( $paiementid );
} else {
dol_syslog ( " Invoice is not paid, remain to pay = " . $remaintopay );
2021-02-26 21:17:52 +01:00
}
2019-09-24 10:08:48 +02:00
} else {
2022-05-03 09:35:06 +02:00
dol_htmloutput_errors ( $invoice -> error , $invoice -> errors , 1 );
2019-09-24 10:08:48 +02:00
}
2020-09-07 10:18:17 +02:00
}
2018-09-28 13:31:41 +02:00
2022-05-03 09:35:06 +02:00
if ( $action == 'creditnote' && $user -> rights -> facture -> creer ) {
$creditnote = new Facture ( $db );
$creditnote -> socid = $invoice -> socid ;
$creditnote -> date = dol_now ();
$creditnote -> module_source = 'takepos' ;
$creditnote -> pos_source = isset ( $_SESSION [ " takeposterminal " ]) ? $_SESSION [ " takeposterminal " ] : '' ;
$creditnote -> type = Facture :: TYPE_CREDIT_NOTE ;
$creditnote -> fk_facture_source = $placeid ;
$creditnote -> remise_absolue = $invoice -> remise_absolue ;
$creditnote -> remise_percent = $invoice -> remise_percent ;
$creditnote -> create ( $user );
foreach ( $invoice -> lines as $line ) {
// Extrafields
if ( method_exists ( $line , 'fetch_optionals' )) {
// load extrafields
$line -> fetch_optionals ();
}
// Reset fk_parent_line for no child products and special product
if (( $line -> product_type != 9 && empty ( $line -> fk_parent_line )) || $line -> product_type == 9 ) {
$fk_parent_line = 0 ;
}
if ( $invoice -> type == Facture :: TYPE_SITUATION ) {
$source_fk_prev_id = $line -> fk_prev_id ; // temporary storing situation invoice fk_prev_id
$line -> fk_prev_id = $line -> id ; // The new line of the new credit note we are creating must be linked to the situation invoice line it is created from
if ( ! empty ( $invoice -> tab_previous_situation_invoice )) {
// search the last standard invoice in cycle and the possible credit note between this last and invoice
// TODO Move this out of loop of $invoice->lines
$tab_jumped_credit_notes = array ();
$lineIndex = count ( $invoice -> tab_previous_situation_invoice ) - 1 ;
$searchPreviousInvoice = true ;
while ( $searchPreviousInvoice ) {
if ( $invoice -> tab_previous_situation_invoice [ $lineIndex ] -> type == Facture :: TYPE_SITUATION || $lineIndex < 1 ) {
$searchPreviousInvoice = false ; // find, exit;
break ;
} else {
if ( $invoice -> tab_previous_situation_invoice [ $lineIndex ] -> type == Facture :: TYPE_CREDIT_NOTE ) {
$tab_jumped_credit_notes [ $lineIndex ] = $invoice -> tab_previous_situation_invoice [ $lineIndex ] -> id ;
}
$lineIndex -- ; // go to previous invoice in cycle
2020-10-25 20:03:25 +01:00
}
}
2022-05-03 09:35:06 +02:00
$maxPrevSituationPercent = 0 ;
foreach ( $invoice -> tab_previous_situation_invoice [ $lineIndex ] -> lines as $prevLine ) {
if ( $prevLine -> id == $source_fk_prev_id ) {
$maxPrevSituationPercent = max ( $maxPrevSituationPercent , $prevLine -> situation_percent );
//$line->subprice = $line->subprice - $prevLine->subprice;
$line -> total_ht = $line -> total_ht - $prevLine -> total_ht ;
$line -> total_tva = $line -> total_tva - $prevLine -> total_tva ;
$line -> total_ttc = $line -> total_ttc - $prevLine -> total_ttc ;
$line -> total_localtax1 = $line -> total_localtax1 - $prevLine -> total_localtax1 ;
$line -> total_localtax2 = $line -> total_localtax2 - $prevLine -> total_localtax2 ;
$line -> multicurrency_subprice = $line -> multicurrency_subprice - $prevLine -> multicurrency_subprice ;
$line -> multicurrency_total_ht = $line -> multicurrency_total_ht - $prevLine -> multicurrency_total_ht ;
$line -> multicurrency_total_tva = $line -> multicurrency_total_tva - $prevLine -> multicurrency_total_tva ;
$line -> multicurrency_total_ttc = $line -> multicurrency_total_ttc - $prevLine -> multicurrency_total_ttc ;
}
2020-10-25 20:03:25 +01:00
}
2022-05-03 09:35:06 +02:00
// prorata
$line -> situation_percent = $maxPrevSituationPercent - $line -> situation_percent ;
//print 'New line based on invoice id '.$invoice->tab_previous_situation_invoice[$lineIndex]->id.' fk_prev_id='.$source_fk_prev_id.' will be fk_prev_id='.$line->fk_prev_id.' '.$line->total_ht.' '.$line->situation_percent.'<br>';
// If there is some credit note between last situation invoice and invoice used for credit note generation (note: credit notes are stored as delta)
$maxPrevSituationPercent = 0 ;
foreach ( $tab_jumped_credit_notes as $index => $creditnoteid ) {
foreach ( $invoice -> tab_previous_situation_invoice [ $index ] -> lines as $prevLine ) {
if ( $prevLine -> fk_prev_id == $source_fk_prev_id ) {
$maxPrevSituationPercent = $prevLine -> situation_percent ;
$line -> total_ht -= $prevLine -> total_ht ;
$line -> total_tva -= $prevLine -> total_tva ;
$line -> total_ttc -= $prevLine -> total_ttc ;
$line -> total_localtax1 -= $prevLine -> total_localtax1 ;
$line -> total_localtax2 -= $prevLine -> total_localtax2 ;
$line -> multicurrency_subprice -= $prevLine -> multicurrency_subprice ;
$line -> multicurrency_total_ht -= $prevLine -> multicurrency_total_ht ;
$line -> multicurrency_total_tva -= $prevLine -> multicurrency_total_tva ;
$line -> multicurrency_total_ttc -= $prevLine -> multicurrency_total_ttc ;
}
2020-10-25 20:03:25 +01:00
}
}
2022-05-03 09:35:06 +02:00
// prorata
$line -> situation_percent += $maxPrevSituationPercent ;
2020-10-25 20:03:25 +01:00
2022-05-03 09:35:06 +02:00
//print 'New line based on invoice id '.$invoice->tab_previous_situation_invoice[$lineIndex]->id.' fk_prev_id='.$source_fk_prev_id.' will be fk_prev_id='.$line->fk_prev_id.' '.$line->total_ht.' '.$line->situation_percent.'<br>';
}
2020-10-25 20:03:25 +01:00
}
2022-05-03 09:35:06 +02:00
$line -> fk_facture = $creditnote -> id ;
$line -> fk_parent_line = $fk_parent_line ;
2020-10-25 20:03:25 +01:00
2022-05-03 09:35:06 +02:00
$line -> subprice = - $line -> subprice ; // invert price for object
$line -> pa_ht = $line -> pa_ht ; // we choosed to have buy/cost price always positive, so no revert of sign here
$line -> total_ht = - $line -> total_ht ;
$line -> total_tva = - $line -> total_tva ;
$line -> total_ttc = - $line -> total_ttc ;
$line -> total_localtax1 = - $line -> total_localtax1 ;
$line -> total_localtax2 = - $line -> total_localtax2 ;
2020-10-25 20:03:25 +01:00
2022-05-03 09:35:06 +02:00
$line -> multicurrency_subprice = - $line -> multicurrency_subprice ;
$line -> multicurrency_total_ht = - $line -> multicurrency_total_ht ;
$line -> multicurrency_total_tva = - $line -> multicurrency_total_tva ;
$line -> multicurrency_total_ttc = - $line -> multicurrency_total_ttc ;
2020-10-25 20:03:25 +01:00
2022-05-03 09:35:06 +02:00
$result = $line -> insert ( 0 , 1 ); // When creating credit note with same lines than source, we must ignore error if discount alreayd linked
2020-10-25 20:03:25 +01:00
2022-05-03 09:35:06 +02:00
$creditnote -> lines [] = $line ; // insert new line in current object
2020-10-25 20:03:25 +01:00
2022-05-03 09:35:06 +02:00
// Defined the new fk_parent_line
if ( $result > 0 && $line -> product_type == 9 ) {
$fk_parent_line = $result ;
}
}
$creditnote -> update_price ( 1 );
$constantforkey = 'CASHDESK_NO_DECREASE_STOCK' . $_SESSION [ " takeposterminal " ];
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'stock' ) && $conf -> global -> $constantforkey != " 1 " ) {
2022-05-03 09:35:06 +02:00
$savconst = $conf -> global -> STOCK_CALCULATE_ON_BILL ;
$conf -> global -> STOCK_CALCULATE_ON_BILL = 1 ;
$constantforkey = 'CASHDESK_ID_WAREHOUSE' . $_SESSION [ " takeposterminal " ];
dol_syslog ( " Validate invoice with stock change into warehouse defined into constant " . $constantforkey . " = " . $conf -> global -> $constantforkey );
$batch_rule = 0 ;
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'productbatch' ) && ! empty ( $conf -> global -> CASHDESK_FORCE_DECREASE_STOCK )) {
2022-05-03 09:35:06 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/class/productbatch.class.php' ;
$batch_rule = Productbatch :: BATCH_RULE_SELLBY_EATBY_DATES_FIRST ;
}
$res = $creditnote -> validate ( $user , '' , $conf -> global -> $constantforkey , 0 , $batch_rule );
$conf -> global -> STOCK_CALCULATE_ON_BILL = $savconst ;
} else {
$res = $creditnote -> validate ( $user );
2020-10-25 20:03:25 +01:00
}
}
2019-04-28 18:12:33 +02:00
2022-05-03 09:35:06 +02:00
if ( $action == 'history' || $action == 'creditnote' ) {
if ( $action == 'creditnote' ) {
$placeid = $creditnote -> id ;
} else {
$placeid = ( int ) GETPOST ( 'placeid' , 'int' );
2019-08-01 12:23:02 +02:00
}
2022-05-03 09:35:06 +02:00
$invoice = new Facture ( $db );
$invoice -> fetch ( $placeid );
2019-08-01 12:23:02 +02:00
}
2018-09-28 13:31:41 +02:00
2022-05-03 09:35:06 +02:00
if (( $action == " addline " || $action == " freezone " ) && $placeid == 0 ) {
$invoice -> socid = getDolGlobalString ( " $constforcompanyid " );
$invoice -> date = dol_now ();
$invoice -> module_source = 'takepos' ;
$invoice -> pos_source = isset ( $_SESSION [ " takeposterminal " ]) ? $_SESSION [ " takeposterminal " ] : '' ;
$invoice -> entity = ! empty ( $_SESSION [ " takeposinvoiceentity " ]) ? $_SESSION [ " takeposinvoiceentity " ] : $conf -> entity ;
if ( $invoice -> socid <= 0 ) {
$langs -> load ( 'errors' );
dol_htmloutput_errors ( $langs -> trans ( " ErrorModuleSetupNotComplete " , " TakePos " ), null , 1 );
} else {
$placeid = $invoice -> create ( $user );
if ( $placeid < 0 ) {
dol_htmloutput_errors ( $invoice -> error , $invoice -> errors , 1 );
2021-02-26 21:17:52 +01:00
}
2022-05-03 09:35:06 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture set ref='(PROV-POS " . $_SESSION [ " takeposterminal " ] . " - " . $place . " )' where rowid = " . (( int ) $placeid );
$db -> query ( $sql );
2019-12-08 23:16:49 +01:00
}
}
2022-05-03 09:35:06 +02:00
if ( $action == " addline " ) {
$prod = new Product ( $db );
$prod -> fetch ( $idproduct );
$customer = new Societe ( $db );
$customer -> fetch ( $invoice -> socid );
$datapriceofproduct = $prod -> getSellPrice ( $mysoc , $customer , 0 );
$qty = GETPOSTISSET ( 'qty' ) ? GETPOST ( 'qty' , 'int' ) : 1 ;
$price = $datapriceofproduct [ 'pu_ht' ];
$price_ttc = $datapriceofproduct [ 'pu_ttc' ];
//$price_min = $datapriceofproduct['price_min'];
$price_base_type = $datapriceofproduct [ 'price_base_type' ];
$tva_tx = $datapriceofproduct [ 'tva_tx' ];
$tva_npr = $datapriceofproduct [ 'tva_npr' ];
// Local Taxes
$localtax1_tx = get_localtax ( $tva_tx , 1 , $customer , $mysoc , $tva_npr );
$localtax2_tx = get_localtax ( $tva_tx , 2 , $customer , $mysoc , $tva_npr );
if ( ! empty ( $conf -> global -> TAKEPOS_SUPPLEMENTS )) {
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
$cat = new Categorie ( $db );
$categories = $cat -> containing ( $idproduct , 'product' );
$found = ( array_search ( $conf -> global -> TAKEPOS_SUPPLEMENTS_CATEGORY , array_column ( $categories , 'id' )));
if ( $found !== false ) { // If this product is a supplement
$sql = " SELECT fk_parent_line FROM " . MAIN_DB_PREFIX . " facturedet where rowid= $selectedline " ;
$resql = $db -> query ( $sql );
$row = $db -> fetch_array ( $resql );
if ( $row [ 0 ] == null ) {
$parent_line = $selectedline ;
2020-03-12 11:00:17 +01:00
} else {
2022-05-03 09:35:06 +02:00
$parent_line = $row [ 0 ]; //If the parent line is already a supplement, add the supplement to the main product
2020-03-12 11:00:17 +01:00
}
}
}
2022-05-03 09:35:06 +02:00
$idoflineadded = 0 ;
// Group if enabled. Skip group if line already sent to the printer
if ( ! empty ( $conf -> global -> TAKEPOS_GROUP_SAME_PRODUCT ) && $line -> special_code != " 4 " ) {
foreach ( $invoice -> lines as $line ) {
if ( $line -> product_ref == $prod -> ref ) {
if ( $line -> special_code == 4 ) continue ; // If this line is sended to printer create new line
$result = $invoice -> updateline ( $line -> id , $line -> desc , $line -> subprice , $line -> qty + $qty , $line -> remise_percent , $line -> date_start , $line -> date_end , $line -> tva_tx , $line -> localtax1_tx , $line -> localtax2_tx , 'HT' , $line -> info_bits , $line -> product_type , $line -> fk_parent_line , 0 , $line -> fk_fournprice , $line -> pa_ht , $line -> label , $line -> special_code , $line -> array_options , $line -> situation_percent , $line -> fk_unit );
if ( $result < 0 ) {
dol_htmloutput_errors ( $invoice -> error , $invoice -> errors , 1 );
} else {
$idoflineadded = $line -> id ;
}
break ;
}
}
}
if ( $idoflineadded <= 0 ) {
$invoice -> fetch_thirdparty ();
2022-05-06 15:49:44 +02:00
$array_options = array ();
// complete line by hook
$parameters = array ( 'prod' => $prod );
$reshook = $hookmanager -> executeHooks ( 'completeTakePosAddLine' , $parameters , $invoice , $action );
if ( $reshook < 0 ) setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
2022-05-09 08:23:26 +02:00
if ( empty ( $reshook )) {
$idoflineadded = $invoice -> addline ( $prod -> description , $price , $qty , $tva_tx , $localtax1_tx , $localtax2_tx , $idproduct , $customer -> remise_percent , '' , 0 , 0 , 0 , '' , $price_base_type , $price_ttc , $prod -> type , - 1 , 0 , '' , 0 , ( ! empty ( $parent_line )) ? $parent_line : '' , null , '' , '' , $array_options , 100 , '' , null , 0 );
}
2022-05-06 15:49:44 +02:00
2022-05-03 09:35:06 +02:00
if ( ! empty ( $conf -> global -> TAKEPOS_CUSTOMER_DISPLAY )) {
$CUSTOMER_DISPLAY_line1 = $prod -> label ;
$CUSTOMER_DISPLAY_line2 = price ( $price_ttc );
}
2021-08-08 19:14:28 +02:00
}
2020-01-01 22:37:13 +01:00
2022-05-03 09:35:06 +02:00
$invoice -> fetch ( $placeid );
}
2018-09-28 13:31:41 +02:00
2022-05-03 09:35:06 +02:00
if ( $action == " freezone " ) {
$customer = new Societe ( $db );
$customer -> fetch ( $invoice -> socid );
2020-01-01 21:54:47 +01:00
2022-05-03 09:35:06 +02:00
$tva_tx = GETPOST ( 'tva_tx' , 'alpha' );
if ( $tva_tx != '' ) {
if ( ! preg_match ( '/\((.*)\)/' , $tva_tx )) {
$tva_tx = price2num ( $tva_tx );
}
} else {
$tva_tx = get_default_tva ( $mysoc , $customer );
2021-02-10 01:10:31 +01:00
}
2020-01-01 21:54:47 +01:00
2022-05-03 09:35:06 +02:00
// Local Taxes
$localtax1_tx = get_localtax ( $tva_tx , 1 , $customer , $mysoc , $tva_npr );
$localtax2_tx = get_localtax ( $tva_tx , 2 , $customer , $mysoc , $tva_npr );
2018-09-28 13:31:41 +02:00
2022-06-07 17:46:17 +02:00
$invoice -> addline ( $desc , $number , 1 , $tva_tx , $localtax1_tx , $localtax2_tx , 0 , 0 , '' , 0 , 0 , 0 , '' , getDolGlobalInt ( 'TAKEPOS_CHANGE_PRICE_HT' ) ? 'HT' : 'TTC' , $number , 0 , - 1 , 0 , '' , 0 , 0 , null , '' , '' , 0 , 100 , '' , null , 0 );
2022-05-03 09:35:06 +02:00
$invoice -> fetch ( $placeid );
2020-09-08 21:27:28 +02:00
}
2019-03-03 12:50:36 +01:00
2022-05-03 09:35:06 +02:00
if ( $action == " addnote " ) {
$desc = GETPOST ( 'addnote' , 'alpha' );
if ( $idline == 0 ) {
$invoice -> update_note ( $desc , '_public' );
} else foreach ( $invoice -> lines as $line ) {
if ( $line -> id == $idline ) {
$result = $invoice -> updateline ( $line -> id , $desc , $line -> subprice , $line -> qty , $line -> remise_percent , $line -> date_start , $line -> date_end , $line -> tva_tx , $line -> localtax1_tx , $line -> localtax2_tx , 'HT' , $line -> info_bits , $line -> product_type , $line -> fk_parent_line , 0 , $line -> fk_fournprice , $line -> pa_ht , $line -> label , $line -> special_code , $line -> array_options , $line -> situation_percent , $line -> fk_unit );
}
}
2020-09-08 21:27:28 +02:00
$invoice -> fetch ( $placeid );
}
2022-05-03 09:35:06 +02:00
if ( $action == " deleteline " ) {
if ( $idline > 0 and $placeid > 0 ) { // If invoice exists and line selected. To avoid errors if deleted from another device or no line selected.
$invoice -> deleteline ( $idline );
$invoice -> fetch ( $placeid );
} elseif ( $placeid > 0 ) { // If invoice exists but no line selected, proceed to delete last line.
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " facturedet where fk_facture = " . (( int ) $placeid ) . " ORDER BY rowid DESC " ;
$resql = $db -> query ( $sql );
$row = $db -> fetch_array ( $resql );
$deletelineid = $row [ 0 ];
$invoice -> deleteline ( $deletelineid );
$invoice -> fetch ( $placeid );
}
if ( count ( $invoice -> lines ) == 0 ) {
$invoice -> delete ( $user );
header ( " Location: " . DOL_URL_ROOT . " /takepos/invoice.php " );
exit ;
}
2020-10-04 15:54:23 +02:00
}
2018-09-28 13:31:41 +02:00
2022-05-03 09:35:06 +02:00
// Action to delete or discard an invoice
if ( $action == " delete " ) {
// $placeid is the invoice id (it differs from place) and is defined if the place is set and the ref of invoice is '(PROV-POS'.$_SESSION["takeposterminal"].'-'.$place.')', so the fetch at begining of page works.
if ( $placeid > 0 ) {
$result = $invoice -> fetch ( $placeid );
2019-08-27 15:39:35 +02:00
2022-05-03 09:35:06 +02:00
if ( $result > 0 && $invoice -> statut == Facture :: STATUS_DRAFT ) {
$db -> begin ();
2019-08-27 15:42:35 +02:00
2022-05-03 09:35:06 +02:00
// We delete the lines
$resdeletelines = 1 ;
foreach ( $invoice -> lines as $line ) {
$tmpres = $invoice -> deleteline ( $line -> id );
if ( $tmpres < 0 ) {
$resdeletelines = 0 ;
break ;
}
2020-11-30 15:39:35 +01:00
}
2020-11-30 11:32:58 +01:00
2022-05-03 09:35:06 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture " ;
$varforconst = 'CASHDESK_ID_THIRDPARTY' . $_SESSION [ " takeposterminal " ];
$sql .= " SET fk_soc = " . (( int ) $conf -> global -> $varforconst ) . " , " ;
$sql .= " datec = ' " . $db -> idate ( dol_now ()) . " ' " ;
$sql .= " WHERE ref = '(PROV-POS " . $db -> escape ( $_SESSION [ " takeposterminal " ] . " - " . $place ) . " )' " ;
$resql1 = $db -> query ( $sql );
2019-08-27 15:42:35 +02:00
2022-05-03 09:35:06 +02:00
if ( $resdeletelines && $resql1 ) {
$db -> commit ();
} else {
$db -> rollback ();
}
2019-04-02 17:36:27 +02:00
2022-05-03 09:35:06 +02:00
$invoice -> fetch ( $placeid );
}
2020-09-07 10:18:17 +02:00
}
}
2019-04-02 17:36:27 +02:00
2022-05-03 09:35:06 +02:00
if ( $action == " updateqty " ) {
foreach ( $invoice -> lines as $line ) {
if ( $line -> id == $idline ) {
if ( ! $user -> rights -> takepos -> editlines || ( ! $user -> rights -> takepos -> editorderedlines && $line -> special_code == " 4 " )) {
dol_htmloutput_errors ( $langs -> trans ( " NotEnoughPermissions " , " TakePos " ), null , 1 );
} else {
$result = $invoice -> updateline ( $line -> id , $line -> desc , $line -> subprice , $number , $line -> remise_percent , $line -> date_start , $line -> date_end , $line -> tva_tx , $line -> localtax1_tx , $line -> localtax2_tx , 'HT' , $line -> info_bits , $line -> product_type , $line -> fk_parent_line , 0 , $line -> fk_fournprice , $line -> pa_ht , $line -> label , $line -> special_code , $line -> array_options , $line -> situation_percent , $line -> fk_unit );
}
2021-07-06 03:53:42 +02:00
}
2020-09-07 10:18:17 +02:00
}
2022-05-03 09:35:06 +02:00
$invoice -> fetch ( $placeid );
2020-09-07 10:18:17 +02:00
}
2018-12-07 17:02:06 +01:00
2022-05-03 09:35:06 +02:00
if ( $action == " updateprice " ) {
$customer = new Societe ( $db );
$customer -> fetch ( $invoice -> socid );
2018-09-28 13:31:41 +02:00
2022-05-03 09:35:06 +02:00
foreach ( $invoice -> lines as $line ) {
if ( $line -> id == $idline ) {
$prod = new Product ( $db );
$prod -> fetch ( $line -> fk_product );
$datapriceofproduct = $prod -> getSellPrice ( $mysoc , $customer , 0 );
$price_min = $datapriceofproduct [ 'price_min' ];
$usercanproductignorepricemin = (( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && empty ( $user -> rights -> produit -> ignore_price_min_advance )) || empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ));
$pu_ht = price2num ( $number / ( 1 + ( $line -> tva_tx / 100 )), 'MU' );
//Check min price
if ( $usercanproductignorepricemin && ( ! empty ( $price_min ) && ( price2num ( $pu_ht ) * ( 1 - price2num ( $line -> remise_percent ) / 100 ) < price2num ( $price_min )))) {
echo $langs -> trans ( " CantBeLessThanMinPrice " );
2021-07-06 03:53:42 +02:00
} else {
2022-05-03 09:35:06 +02:00
if ( empty ( $user -> rights -> takepos -> editlines ) || ( empty ( $user -> rights -> takepos -> editorderedlines ) && $line -> special_code == " 4 " )) {
dol_htmloutput_errors ( $langs -> trans ( " NotEnoughPermissions " , " TakePos " ), null , 1 );
} elseif ( getDolGlobalInt ( 'TAKEPOS_CHANGE_PRICE_HT' ) == 1 ) {
$result = $invoice -> updateline ( $line -> id , $line -> desc , $number , $line -> qty , $line -> remise_percent , $line -> date_start , $line -> date_end , $line -> tva_tx , $line -> localtax1_tx , $line -> localtax2_tx , 'HT' , $line -> info_bits , $line -> product_type , $line -> fk_parent_line , 0 , $line -> fk_fournprice , $line -> pa_ht , $line -> label , $line -> special_code , $line -> array_options , $line -> situation_percent , $line -> fk_unit );
} else {
$result = $invoice -> updateline ( $line -> id , $line -> desc , $number , $line -> qty , $line -> remise_percent , $line -> date_start , $line -> date_end , $line -> tva_tx , $line -> localtax1_tx , $line -> localtax2_tx , 'TTC' , $line -> info_bits , $line -> product_type , $line -> fk_parent_line , 0 , $line -> fk_fournprice , $line -> pa_ht , $line -> label , $line -> special_code , $line -> array_options , $line -> situation_percent , $line -> fk_unit );
}
2021-07-06 03:53:42 +02:00
}
2021-02-26 21:17:52 +01:00
}
2020-09-07 10:18:17 +02:00
}
2021-07-06 03:53:42 +02:00
2022-05-03 09:35:06 +02:00
// Reload data
$invoice -> fetch ( $placeid );
}
2018-09-28 13:31:41 +02:00
2022-05-03 09:35:06 +02:00
if ( $action == " updatereduction " ) {
$customer = new Societe ( $db );
$customer -> fetch ( $invoice -> socid );
2021-07-06 03:53:42 +02:00
2022-05-03 09:35:06 +02:00
foreach ( $invoice -> lines as $line ) {
if ( $line -> id == $idline ) {
dol_syslog ( " updatereduction Process line " . $line -> id . ' to apply discount of ' . $number . '%' );
2021-07-06 03:53:42 +02:00
2022-05-03 09:35:06 +02:00
$prod = new Product ( $db );
$prod -> fetch ( $line -> fk_product );
2021-07-06 03:53:42 +02:00
2022-05-03 09:35:06 +02:00
$datapriceofproduct = $prod -> getSellPrice ( $mysoc , $customer , 0 );
$price_min = $datapriceofproduct [ 'price_min' ];
$usercanproductignorepricemin = (( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && empty ( $user -> rights -> produit -> ignore_price_min_advance )) || empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ));
2021-07-06 03:53:42 +02:00
2022-05-03 09:35:06 +02:00
$pu_ht = price2num ( $line -> subprice / ( 1 + ( $line -> tva_tx / 100 )), 'MU' );
2021-07-06 03:53:42 +02:00
2022-05-03 09:35:06 +02:00
// Check min price
if ( $usercanproductignorepricemin && ( ! empty ( $price_min ) && ( price2num ( $line -> subprice ) * ( 1 - price2num ( $number ) / 100 ) < price2num ( $price_min )))) {
echo $langs -> trans ( " CantBeLessThanMinPrice " );
2021-07-06 03:53:42 +02:00
} else {
2022-05-03 09:35:06 +02:00
if ( empty ( $user -> rights -> takepos -> editlines ) || ( empty ( $user -> rights -> takepos -> editorderedlines ) && $line -> special_code == " 4 " )) {
dol_htmloutput_errors ( $langs -> trans ( " NotEnoughPermissions " , " TakePos " ), null , 1 );
} else {
$result = $invoice -> updateline ( $line -> id , $line -> desc , $line -> subprice , $line -> qty , $number , $line -> date_start , $line -> date_end , $line -> tva_tx , $line -> localtax1_tx , $line -> localtax2_tx , 'HT' , $line -> info_bits , $line -> product_type , $line -> fk_parent_line , 0 , $line -> fk_fournprice , $line -> pa_ht , $line -> label , $line -> special_code , $line -> array_options , $line -> situation_percent , $line -> fk_unit );
}
2021-07-06 03:53:42 +02:00
}
2021-02-26 21:17:52 +01:00
}
2020-01-28 22:21:19 +01:00
}
2020-03-11 12:30:07 +01:00
2022-05-03 09:35:06 +02:00
// Reload data
$invoice -> fetch ( $placeid );
} elseif ( $action == 'update_reduction_global' ) {
foreach ( $invoice -> lines as $line ) {
$result = $invoice -> updateline ( $line -> id , $line -> desc , $line -> subprice , $line -> qty , $number , $line -> date_start , $line -> date_end , $line -> tva_tx , $line -> localtax1_tx , $line -> localtax2_tx , 'HT' , $line -> info_bits , $line -> product_type , $line -> fk_parent_line , 0 , $line -> fk_fournprice , $line -> pa_ht , $line -> label , $line -> special_code , $line -> array_options , $line -> situation_percent , $line -> fk_unit );
}
2018-09-28 13:31:41 +02:00
2022-05-03 09:35:06 +02:00
$invoice -> fetch ( $placeid );
2020-02-22 11:30:48 +01:00
}
2018-12-07 17:02:06 +01:00
2022-05-03 09:35:06 +02:00
if ( $action == " order " and $placeid != 0 ) {
include_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
if ( $conf -> global -> TAKEPOS_PRINT_METHOD == " receiptprinter " || $conf -> global -> TAKEPOS_PRINT_METHOD == " takeposconnector " ) {
require_once DOL_DOCUMENT_ROOT . '/core/class/dolreceiptprinter.class.php' ;
$printer = new dolReceiptPrinter ( $db );
}
$sql = " SELECT label FROM " . MAIN_DB_PREFIX . " takepos_floor_tables where rowid= " . (( int ) $place );
$resql = $db -> query ( $sql );
$row = $db -> fetch_object ( $resql );
$headerorder = '<html><br><b>' . $langs -> trans ( 'Place' ) . ' ' . $row -> label . '<br><table width="65%"><thead><tr><th class="left">' . $langs -> trans ( " Label " ) . '</th><th class="right">' . $langs -> trans ( " Qty " ) . '</th></tr></thead><tbody>' ;
$footerorder = '</tbody></table>' . dol_print_date ( dol_now (), 'dayhour' ) . '<br></html>' ;
$order_receipt_printer1 = " " ;
$order_receipt_printer2 = " " ;
$order_receipt_printer3 = " " ;
$catsprinter1 = explode ( ';' , $conf -> global -> TAKEPOS_PRINTED_CATEGORIES_1 );
$catsprinter2 = explode ( ';' , $conf -> global -> TAKEPOS_PRINTED_CATEGORIES_2 );
$catsprinter3 = explode ( ';' , $conf -> global -> TAKEPOS_PRINTED_CATEGORIES_3 );
$linestoprint = 0 ;
foreach ( $invoice -> lines as $line ) {
if ( $line -> special_code == " 4 " ) {
continue ;
2021-02-26 21:17:52 +01:00
}
2022-05-03 09:35:06 +02:00
$c = new Categorie ( $db );
$existing = $c -> containing ( $line -> fk_product , Categorie :: TYPE_PRODUCT , 'id' );
$result = array_intersect ( $catsprinter1 , $existing );
$count = count ( $result );
if ( ! $line -> fk_product ) {
$count ++ ; // Print Free-text item (Unassigned printer) to Printer 1
}
if ( $count > 0 ) {
$linestoprint ++ ;
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet set special_code='1' where rowid= " . $line -> id ; //Set to print on printer 1
$db -> query ( $sql );
$order_receipt_printer1 .= '<tr><td class="left">' ;
if ( $line -> fk_product ) {
$order_receipt_printer1 .= $line -> product_label ;
} else {
$order_receipt_printer1 .= $line -> description ;
}
$order_receipt_printer1 .= '</td><td class="right">' . $line -> qty ;
if ( ! empty ( $line -> array_options [ 'options_order_notes' ])) {
$order_receipt_printer1 .= " <br>( " . $line -> array_options [ 'options_order_notes' ] . " ) " ;
}
$order_receipt_printer1 .= '</td></tr>' ;
2021-02-26 21:17:52 +01:00
}
2020-09-07 10:18:17 +02:00
}
2022-05-03 09:35:06 +02:00
if (( $conf -> global -> TAKEPOS_PRINT_METHOD == " receiptprinter " || $conf -> global -> TAKEPOS_PRINT_METHOD == " takeposconnector " ) && $linestoprint > 0 ) {
$invoice -> fetch ( $placeid ); //Reload object before send to printer
$printer -> orderprinter = 1 ;
echo " <script> " ;
echo " var orderprinter1esc=' " ;
2022-05-24 12:36:11 +02:00
$ret = $printer -> sendToPrinter ( $invoice , getDolGlobalInt ( 'TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS' . $_SESSION [ " takeposterminal " ]), getDolGlobalInt ( 'TAKEPOS_ORDER_PRINTER1_TO_USE' . $_SESSION [ " takeposterminal " ])); // PRINT TO PRINTER 1
2022-05-03 09:35:06 +02:00
echo " ';</script> " ;
}
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet set special_code='4' where special_code='1' and fk_facture= " . $invoice -> id ; // Set as printed
$db -> query ( $sql );
$invoice -> fetch ( $placeid ); //Reload object after set lines as printed
$linestoprint = 0 ;
foreach ( $invoice -> lines as $line ) {
if ( $line -> special_code == " 4 " ) {
continue ;
}
$c = new Categorie ( $db );
$existing = $c -> containing ( $line -> fk_product , Categorie :: TYPE_PRODUCT , 'id' );
$result = array_intersect ( $catsprinter2 , $existing );
$count = count ( $result );
if ( $count > 0 ) {
$linestoprint ++ ;
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet set special_code='2' where rowid= " . $line -> id ; //Set to print on printer 2
$db -> query ( $sql );
$order_receipt_printer2 .= '<tr>' . $line -> product_label . '<td class="right">' . $line -> qty ;
if ( ! empty ( $line -> array_options [ 'options_order_notes' ])) {
$order_receipt_printer2 .= " <br>( " . $line -> array_options [ 'options_order_notes' ] . " ) " ;
}
$order_receipt_printer2 .= '</td></tr>' ;
2021-02-26 21:17:52 +01:00
}
2020-09-07 10:18:17 +02:00
}
2022-05-03 09:35:06 +02:00
if (( $conf -> global -> TAKEPOS_PRINT_METHOD == " receiptprinter " || $conf -> global -> TAKEPOS_PRINT_METHOD == " takeposconnector " ) && $linestoprint > 0 ) {
$invoice -> fetch ( $placeid ); //Reload object before send to printer
$printer -> orderprinter = 2 ;
echo " <script> " ;
echo " var orderprinter2esc=' " ;
2022-05-24 12:36:11 +02:00
$ret = $printer -> sendToPrinter ( $invoice , getDolGlobalInt ( 'TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS' . $_SESSION [ " takeposterminal " ]), getDolGlobalInt ( 'TAKEPOS_ORDER_PRINTER2_TO_USE' . $_SESSION [ " takeposterminal " ])); // PRINT TO PRINTER 2
2022-05-03 09:35:06 +02:00
echo " ';</script> " ;
}
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet set special_code='4' where special_code='2' and fk_facture= " . $invoice -> id ; // Set as printed
$db -> query ( $sql );
$invoice -> fetch ( $placeid ); //Reload object after set lines as printed
$linestoprint = 0 ;
foreach ( $invoice -> lines as $line ) {
if ( $line -> special_code == " 4 " ) {
continue ;
}
$c = new Categorie ( $db );
$existing = $c -> containing ( $line -> fk_product , Categorie :: TYPE_PRODUCT , 'id' );
$result = array_intersect ( $catsprinter3 , $existing );
$count = count ( $result );
if ( $count > 0 ) {
$linestoprint ++ ;
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet set special_code='3' where rowid= " . $line -> id ; //Set to print on printer 3
$db -> query ( $sql );
$order_receipt_printer3 .= '<tr>' . $line -> product_label . '<td class="right">' . $line -> qty ;
if ( ! empty ( $line -> array_options [ 'options_order_notes' ])) {
$order_receipt_printer3 .= " <br>( " . $line -> array_options [ 'options_order_notes' ] . " ) " ;
}
$order_receipt_printer3 .= '</td></tr>' ;
2021-02-26 21:17:52 +01:00
}
2020-10-12 22:07:05 +02:00
}
2022-05-03 09:35:06 +02:00
if (( $conf -> global -> TAKEPOS_PRINT_METHOD == " receiptprinter " || $conf -> global -> TAKEPOS_PRINT_METHOD == " takeposconnector " ) && $linestoprint > 0 ) {
$invoice -> fetch ( $placeid ); //Reload object before send to printer
$printer -> orderprinter = 3 ;
echo " <script> " ;
echo " var orderprinter3esc=' " ;
2022-05-24 12:36:11 +02:00
$ret = $printer -> sendToPrinter ( $invoice , getDolGlobalInt ( 'TAKEPOS_TEMPLATE_TO_USE_FOR_ORDERS' . $_SESSION [ " takeposterminal " ]), getDolGlobalInt ( 'TAKEPOS_ORDER_PRINTER3_TO_USE' . $_SESSION [ " takeposterminal " ])); // PRINT TO PRINTER 3
2022-05-03 09:35:06 +02:00
echo " ';</script> " ;
}
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet set special_code='4' where special_code='3' and fk_facture= " . $invoice -> id ; // Set as printed
$db -> query ( $sql );
$invoice -> fetch ( $placeid ); //Reload object after set lines as printed
2020-10-12 22:07:05 +02:00
}
2018-09-28 13:31:41 +02:00
2022-05-03 09:35:06 +02:00
$sectionwithinvoicelink = '' ;
if ( $action == " valid " || $action == " history " || $action == 'creditnote' ) {
$sectionwithinvoicelink .= '<!-- Section with invoice link -->' . " \n " ;
$sectionwithinvoicelink .= '<span style="font-size:120%;" class="center">' ;
$sectionwithinvoicelink .= $invoice -> getNomUrl ( 1 , '' , 0 , 0 , '' , 0 , 0 , - 1 , '_backoffice' ) . " - " ;
$remaintopay = $invoice -> getRemainToPay ();
if ( $remaintopay > 0 ) {
$sectionwithinvoicelink .= $langs -> trans ( 'RemainToPay' ) . ': <span class="amountremaintopay" style="font-size: unset">' . price ( $remaintopay , 1 , $langs , 1 , - 1 , - 1 , $conf -> currency ) . '</span>' ;
2021-02-26 21:17:52 +01:00
} else {
2022-05-03 09:35:06 +02:00
if ( $invoice -> paye ) {
$sectionwithinvoicelink .= '<span class="amountpaymentcomplete" style="font-size: unset">' . $langs -> trans ( " Paid " ) . '</span>' ;
} else {
$sectionwithinvoicelink .= $langs -> trans ( 'BillShortStatusValidated' );
}
2021-02-26 21:17:52 +01:00
}
2022-05-03 09:35:06 +02:00
$sectionwithinvoicelink .= '</span><br>' ;
if ( getDolGlobalString ( 'TAKEPOS_PRINT_METHOD' ) == " takeposconnector " ) {
if ( getDolGlobalString ( 'TAKEPOS_PRINT_SERVER' ) && filter_var ( $conf -> global -> TAKEPOS_PRINT_SERVER , FILTER_VALIDATE_URL ) == true ) {
$sectionwithinvoicelink .= ' <button id="buttonprint" type="button" onclick="TakeposConnector(' . $placeid . ');">' . $langs -> trans ( 'PrintTicket' ) . '</button>' ;
} else {
$sectionwithinvoicelink .= ' <button id="buttonprint" type="button" onclick="TakeposPrinting(' . $placeid . ');">' . $langs -> trans ( 'PrintTicket' ) . '</button>' ;
}
} elseif ( getDolGlobalString ( 'TAKEPOS_PRINT_METHOD' ) == " receiptprinter " ) {
$sectionwithinvoicelink .= ' <button id="buttonprint" type="button" onclick="DolibarrTakeposPrinting(' . $placeid . ');">' . $langs -> trans ( 'PrintTicket' ) . '</button>' ;
2021-02-26 21:17:52 +01:00
} else {
2022-05-03 09:35:06 +02:00
$sectionwithinvoicelink .= ' <button id="buttonprint" type="button" onclick="Print(' . $placeid . ');">' . $langs -> trans ( 'PrintTicket' ) . '</button>' ;
if ( getDolGlobalString ( 'TAKEPOS_PRINT_WITHOUT_DETAILS' )) {
$sectionwithinvoicelink .= ' <button id="buttonprint" type="button" onclick="PrintBox(' . $placeid . ', \'without_details\');">' . $langs -> trans ( 'PrintWithoutDetails' ) . '</button>' ;
}
if ( getDolGlobalString ( 'TAKEPOS_GIFT_RECEIPT' )) {
$sectionwithinvoicelink .= ' <button id="buttonprint" type="button" onclick="Print(' . $placeid . ', 1);">' . $langs -> trans ( 'GiftReceipt' ) . '</button>' ;
}
2021-10-07 09:51:55 +02:00
}
2022-05-03 09:35:06 +02:00
if ( getDolGlobalString ( 'TAKEPOS_EMAIL_TEMPLATE_INVOICE' ) && $conf -> global -> TAKEPOS_EMAIL_TEMPLATE_INVOICE > 0 ) {
$sectionwithinvoicelink .= ' <button id="buttonsend" type="button" onclick="SendTicket(' . $placeid . ');">' . $langs -> trans ( 'SendTicket' ) . '</button>' ;
2020-08-02 11:13:41 +02:00
}
2019-11-07 15:12:37 +01:00
2022-05-31 08:39:48 +02:00
if ( $remaintopay <= 0 && getDolGlobalString ( 'TAKEPOS_AUTO_PRINT_TICKETS' ) && $action != " history " ) {
2022-05-03 09:35:06 +02:00
$sectionwithinvoicelink .= '<script type="text/javascript">$("#buttonprint").click();</script>' ;
}
2021-02-26 21:17:52 +01:00
}
2019-10-23 22:05:37 +02:00
}
2019-03-27 15:42:53 +01:00
/*
* View
*/
2019-03-27 17:50:23 +01:00
$form = new Form ( $db );
2018-09-28 13:31:41 +02:00
?>
2021-11-29 15:09:18 +01:00
< script type = " text/javascript " >
2018-09-28 13:31:41 +02:00
var selectedline = 0 ;
var selectedtext = " " ;
2022-03-06 12:27:59 +01:00
< ? php if ( $action == " valid " ) echo " var place=0; " ; ?> // Set to default place after close sale
2019-11-12 00:15:34 +01:00
var placeid =< ? php echo ( $placeid > 0 ? $placeid : 0 ); ?> ;
2019-03-27 17:50:23 +01:00
$ ( document ) . ready ( function () {
2021-07-08 12:17:32 +02:00
var idoflineadded = < ? php echo ( empty ( $idoflineadded ) ? 0 : $idoflineadded ); ?> ;
2019-03-29 12:19:23 +01:00
2021-02-26 21:17:52 +01:00
$ ( '.posinvoiceline' ) . click ( function (){
console . log ( " Click done on " + this . id );
$ ( '.posinvoiceline' ) . removeClass ( " selected " );
$ ( this ) . addClass ( " selected " );
if ( selectedline == this . id ) return ; // If is already selected
else selectedline = this . id ;
selectedtext = $ ( '#' + selectedline ) . find ( " td:first " ) . html ();
2020-05-08 17:25:48 +02:00
< ? php
2020-05-15 13:55:31 +02:00
if ( defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
2021-09-27 12:24:01 +02:00
print '$("#phonediv1").load("auto_order.php?action=editline&token=' . newToken () . ' & placeid = " +placeid+ " & selectedline = " +selectedline, function() {
2020-05-08 17:25:48 +02:00
}); ' ;
}
?>
2021-02-26 21:17:52 +01:00
});
/* Autoselect the line */
if ( idoflineadded > 0 )
{
console . log ( " Auto select " + idoflineadded );
$ ( '.posinvoiceline#' + idoflineadded ) . click ();
}
2018-09-28 13:31:41 +02:00
< ? php
2018-12-07 08:04:40 +01:00
2021-09-02 21:14:01 +02:00
if ( $action == " order " && ! empty ( $order_receipt_printer1 )) {
2020-12-01 02:41:19 +01:00
if ( filter_var ( $conf -> global -> TAKEPOS_PRINT_SERVER , FILTER_VALIDATE_URL ) == true ) {
2020-11-12 22:31:32 +01:00
?>
$ . ajax ({
type : " POST " ,
url : '<?php print $conf->global->TAKEPOS_PRINT_SERVER; ?>/printer/index.php' ,
data : 'invoice=' + orderprinter1esc
});
< ? php
2021-02-26 21:17:52 +01:00
} else {
2020-11-12 22:31:32 +01:00
?>
$ . ajax ({
type : " POST " ,
url : 'http://<?php print $conf->global->TAKEPOS_PRINT_SERVER; ?>:8111/print' ,
data : ' < ? php
print $headerorder . $order_receipt_printer1 . $footerorder ; ?> '
});
< ? php
}
2018-09-28 13:31:41 +02:00
}
2018-12-07 08:04:40 +01:00
2021-09-02 21:14:01 +02:00
if ( $action == " order " && ! empty ( $order_receipt_printer2 )) {
2020-12-01 02:41:19 +01:00
if ( filter_var ( $conf -> global -> TAKEPOS_PRINT_SERVER , FILTER_VALIDATE_URL ) == true ) {
2020-11-12 22:31:32 +01:00
?>
$ . ajax ({
type : " POST " ,
url : '<?php print $conf->global->TAKEPOS_PRINT_SERVER; ?>/printer/index.php?printer=2' ,
data : 'invoice=' + orderprinter2esc
});
< ? php
2021-02-26 21:17:52 +01:00
} else {
2020-11-12 22:31:32 +01:00
?>
$ . ajax ({
type : " POST " ,
url : 'http://<?php print $conf->global->TAKEPOS_PRINT_SERVER; ?>:8111/print2' ,
data : ' < ? php
print $headerorder . $order_receipt_printer2 . $footerorder ; ?> '
});
2021-02-26 21:17:52 +01:00
< ? php
2020-11-12 22:31:32 +01:00
}
}
2021-09-02 21:14:01 +02:00
if ( $action == " order " && ! empty ( $order_receipt_printer3 )) {
2020-12-01 02:41:19 +01:00
if ( filter_var ( $conf -> global -> TAKEPOS_PRINT_SERVER , FILTER_VALIDATE_URL ) == true ) {
2020-11-12 22:31:32 +01:00
?>
$ . ajax ({
type : " POST " ,
url : '<?php print $conf->global->TAKEPOS_PRINT_SERVER; ?>/printer/index.php?printer=3' ,
data : 'invoice=' + orderprinter3esc
});
< ? php
}
2018-12-07 17:02:06 +01:00
}
2018-12-07 08:04:40 +01:00
2019-03-29 11:45:40 +01:00
// Set focus to search field
if ( $action == " search " || $action == " valid " ) {
2020-09-07 10:18:17 +02:00
?>
2019-03-29 11:45:40 +01:00
parent . setFocusOnSearchField ();
2021-02-26 21:17:52 +01:00
< ? php
2018-12-07 17:02:06 +01:00
}
2018-12-07 08:04:40 +01:00
2019-03-27 15:42:53 +01:00
2021-09-02 21:14:01 +02:00
if ( $action == " temp " && ! empty ( $ticket_printer1 )) {
2020-09-07 10:18:17 +02:00
?>
2021-02-26 21:17:52 +01:00
$ . ajax ({
type : " POST " ,
url : 'http://<?php print $conf->global->TAKEPOS_PRINT_SERVER; ?>:8111/print' ,
data : ' < ? php
2020-09-07 10:18:17 +02:00
print $header_soc . $header_ticket . $body_ticket . $ticket_printer1 . $ticket_total . $footer_ticket ; ?> '
2021-02-26 21:17:52 +01:00
});
< ? php
2018-09-28 13:31:41 +02:00
}
2018-12-07 00:40:00 +01:00
2018-12-07 17:02:06 +01:00
if ( $action == " search " ) {
2020-09-07 10:18:17 +02:00
?>
2021-02-26 21:17:52 +01:00
$ ( '#search' ) . focus ();
< ? php
2018-09-28 13:31:41 +02:00
}
2018-12-07 08:04:40 +01:00
2018-09-28 13:31:41 +02:00
?>
2019-03-27 17:50:23 +01:00
2018-09-28 13:31:41 +02:00
});
2019-11-07 15:25:57 +01:00
function SendTicket ( id )
2019-08-24 16:46:04 +02:00
{
2021-02-26 21:17:52 +01:00
console . log ( " Open box to select the Print/Send form " );
2021-04-27 19:33:11 +02:00
$ . colorbox ({ href : " send.php?facid= " + id , width : " 70% " , height : " 30% " , transition : " none " , iframe : " true " , title : '<?php echo dol_escape_js($langs->trans("SendTicket")); ?>' });
2019-08-24 16:46:04 +02:00
}
2018-09-28 13:31:41 +02:00
2021-10-07 09:51:55 +02:00
function PrintBox ( id , action ) {
console . log ( " Open box before printing " );
$ . colorbox ({ href : " printbox.php?facid= " + id + " &action= " + action , width : " 80% " , height : " 200px " , transition : " none " , iframe : " true " , title : " <?php echo $langs->trans ( " PrintWithoutDetails " ); ?> " });
}
2020-08-02 11:13:41 +02:00
function Print ( id , gift ){
2021-04-27 19:33:11 +02:00
console . log ( " Call Print() to generate the receipt. " );
$ . colorbox ({ href : " receipt.php?facid= " + id + " &gift= " + gift , width : " 40% " , height : " 90% " , transition : " none " , iframe : " true " , title : '<?php echo dol_escape_js($langs->trans("PrintTicket")); ?>' });
2018-09-28 13:31:41 +02:00
}
function TakeposPrinting ( id ){
2021-02-26 21:17:52 +01:00
var receipt ;
2020-10-05 16:38:40 +02:00
console . log ( " TakeposPrinting " + id );
2021-02-26 21:17:52 +01:00
$ . get ( " receipt.php?facid= " + id , function ( data , status ){
receipt = data . replace ( / ([ ^> \r\n ] ? )( \r\n | \n\r | \r | \n ) / g , '' );
$ . ajax ({
type : " POST " ,
2021-07-08 12:17:32 +02:00
url : 'http://<?php print getDolGlobalString(' TAKEPOS_PRINT_SERVER '); ?>:8111/print' ,
2021-02-26 21:17:52 +01:00
data : receipt
});
});
2018-09-28 13:31:41 +02:00
}
2020-04-11 22:19:36 +02:00
function TakeposConnector ( id ){
2020-10-05 16:38:40 +02:00
console . log ( " TakeposConnector " + id );
2021-08-29 16:48:25 +02:00
$ . get ( " <?php echo DOL_URL_ROOT; ?>/takepos/ajax/ajax.php?action=printinvoiceticket&term=<?php echo urlencode(isset( $_SESSION["takeposterminal"] ) ? $_SESSION["takeposterminal"] : ''); ?>&id= " + id + " &token=<?php echo currentToken(); ?> " , function ( data , status ) {
2021-02-26 21:17:52 +01:00
$ . ajax ({
2020-10-04 22:50:27 +02:00
type : " POST " ,
2021-07-08 12:17:32 +02:00
url : '<?php print getDolGlobalString(' TAKEPOS_PRINT_SERVER '); ?>/printer/index.php' ,
2020-10-04 22:50:27 +02:00
data : 'invoice=' + data
});
2021-02-26 21:17:52 +01:00
});
2020-04-11 22:19:36 +02:00
}
2019-11-03 00:50:58 +01:00
function DolibarrTakeposPrinting ( id ) {
2021-02-26 21:17:52 +01:00
console . log ( " DolibarrTakeposPrinting Printing invoice ticket " + id )
$ . ajax ({
type : " GET " ,
2021-06-17 03:37:52 +02:00
data : { token : '<?php echo currentToken(); ?>' },
2021-08-29 16:48:25 +02:00
url : " <?php print DOL_URL_ROOT.'/takepos/ajax/ajax.php?action=printinvoiceticket&term='.urlencode(isset( $_SESSION["takeposterminal"] ) ? $_SESSION["takeposterminal"] : '').'&id='; ?> " + id ,
2021-02-26 21:17:52 +01:00
});
2019-11-03 00:50:58 +01:00
}
2020-03-08 22:33:56 +01:00
2020-10-25 20:03:25 +01:00
function CreditNote () {
2021-10-02 12:58:15 +02:00
$ ( " #poslines " ) . load ( " invoice.php?action=creditnote&token=<?php echo newToken() ?>&invoiceid= " + placeid , function () {
2020-10-25 20:03:25 +01:00
});
}
2021-04-14 00:15:02 +02:00
function SetNote () {
2021-10-09 23:48:35 +02:00
$ ( " #poslines " ) . load ( " invoice.php?action=addnote&token=<?php echo newToken() ?>&invoiceid= " + placeid + " &idline= " + selectedline , { " addnote " : $ ( " #textinput " ) . val () });
2021-04-14 00:15:02 +02:00
}
2020-03-16 13:27:10 +01:00
2020-03-08 22:33:56 +01:00
$ ( document ) . ready ( function () {
2021-01-02 15:36:19 +01:00
console . log ( " Set customer info and sales in header placeid=<?php echo $placeid ; ?> status=<?php echo $invoice->statut ; ?> " );
2020-03-16 13:27:10 +01:00
2021-02-26 21:17:52 +01:00
< ? php
2020-09-07 10:18:17 +02:00
$s = $langs -> trans ( " Customer " );
if ( $invoice -> id > 0 && ( $invoice -> socid != $conf -> global -> $constforcompanyid )) {
$s = $soc -> name ;
}
?>
2020-03-16 13:27:10 +01:00
2021-02-26 21:17:52 +01:00
$ ( " #customerandsales " ) . html ( '' );
2021-12-20 13:39:34 +01:00
$ ( " #shoppingcart " ) . html ( '' );
2020-04-20 13:20:09 +02:00
2020-12-04 00:58:51 +01:00
$ ( " #customerandsales " ) . append ( '<a class="valignmiddle tdoverflowmax100 minwidth100" id="customer" onclick="Customer();" title="<?php print dol_escape_js($s); ?>"><span class="fas fa-building paddingrightonly"></span><?php print dol_escape_js($s); ?></a>' );
2020-03-16 13:27:10 +01:00
< ? php
2020-03-23 14:12:48 +01:00
$sql = " SELECT rowid, datec, ref FROM " . MAIN_DB_PREFIX . " facture " ;
2021-01-02 15:36:19 +01:00
if ( empty ( $conf -> global -> TAKEPOS_CAN_EDIT_IF_ALREADY_VALIDATED )) {
// By default, only invoices with a ref not already defined can in list of open invoice we can edit.
2021-08-29 16:48:25 +02:00
$sql .= " WHERE ref LIKE '(PROV-POS " . $db -> escape ( isset ( $_SESSION [ " takeposterminal " ]) ? $_SESSION [ " takeposterminal " ] : '' ) . " -0%' AND entity IN ( " . getEntity ( 'invoice' ) . " ) " ;
2021-01-02 15:36:19 +01:00
} else {
// If TAKEPOS_CAN_EDIT_IF_ALREADY_VALIDATED set, we show also draft invoice that already has a reference defined
2021-01-02 15:49:30 +01:00
$sql .= " WHERE pos_source = ' " . $db -> escape ( $_SESSION [ " takeposterminal " ]) . " ' " ;
2021-01-02 15:36:19 +01:00
$sql .= " AND module_source = 'takepos' " ;
2021-01-02 15:49:30 +01:00
$sql .= " AND entity IN ( " . getEntity ( 'invoice' ) . " ) " ;
2021-01-02 15:36:19 +01:00
}
2021-01-02 15:49:30 +01:00
2020-04-10 10:59:32 +02:00
$sql .= $db -> order ( 'datec' , 'ASC' );
2020-03-22 14:50:09 +01:00
$resql = $db -> query ( $sql );
if ( $resql ) {
2021-07-08 12:17:32 +02:00
$max_sale = 0 ;
2020-03-22 14:50:09 +01:00
while ( $obj = $db -> fetch_object ( $resql )) {
2021-12-20 13:39:34 +01:00
echo '$("#shoppingcart").append(\'' ;
2021-07-13 14:07:35 +02:00
echo '<a class="valignmiddle" title="' . dol_escape_js ( $langs -> trans ( " SaleStartedAt " , dol_print_date ( $db -> jdate ( $obj -> datec ), '%H:%M' , 'tzuser' )) . ' - ' . $obj -> ref ) . '" onclick="place=\\\'' ;
2020-04-10 10:59:32 +02:00
$num_sale = str_replace ( " ) " , " " , str_replace ( " (PROV-POS " . $_SESSION [ " takeposterminal " ] . " - " , " " , $obj -> ref ));
2020-03-22 14:50:09 +01:00
echo $num_sale ;
2021-02-26 21:17:52 +01:00
if ( str_replace ( " - " , " " , $num_sale ) > $max_sale ) {
$max_sale = str_replace ( " - " , " " , $num_sale );
}
2021-01-02 15:36:19 +01:00
echo '\\\'; invoiceid=\\\'' ;
echo $obj -> rowid ;
echo '\\\'; Refresh();">' ;
2021-02-26 21:17:52 +01:00
if ( $placeid == $obj -> rowid ) {
echo " <b> " ;
}
2021-03-29 14:03:19 +02:00
echo '<span class="fa fa-shopping-cart paddingright"></span>' . dol_print_date ( $db -> jdate ( $obj -> datec ), '%H:%M' , 'tzuser' );
2021-02-26 21:17:52 +01:00
if ( $placeid == $obj -> rowid ) {
echo " </b> " ;
}
2020-03-22 14:50:09 +01:00
echo '</a>\');' ;
}
2021-12-20 13:39:34 +01:00
echo '$("#shoppingcart").append(\'<a onclick="place=\\\'0-' ;
2020-04-10 10:59:32 +02:00
echo $max_sale + 1 ;
2021-03-29 14:03:19 +02:00
echo '\\\'; invoiceid=0; Refresh();"><div><span class="fa fa-plus" title="' . dol_escape_htmltag ( $langs -> trans ( " StartAParallelSale " )) . '"><span class="fa fa-shopping-cart"></span></div></a>\');' ;
2020-03-23 14:12:48 +01:00
} else {
dol_print_error ( $db );
2020-03-22 14:50:09 +01:00
}
2020-03-22 15:24:32 +01:00
2020-03-16 13:27:10 +01:00
$s = '' ;
2021-12-20 13:39:34 +01:00
$idwarehouse = 0 ;
2021-09-02 21:14:01 +02:00
$constantforkey = 'CASHDESK_NO_DECREASE_STOCK' . ( isset ( $_SESSION [ " takeposterminal " ]) ? $_SESSION [ " takeposterminal " ] : '' );
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'stock' )) {
2021-12-20 13:39:34 +01:00
if ( getDolGlobalString ( " $constantforkey " ) != " 1 " ) {
$constantforkey = 'CASHDESK_ID_WAREHOUSE' . ( isset ( $_SESSION [ " takeposterminal " ]) ? $_SESSION [ " takeposterminal " ] : '' );
$idwarehouse = getDolGlobalString ( $constantforkey );
if ( $idwarehouse > 0 ) {
$s = '<span class="small">' ;
$warehouse = new Entrepot ( $db );
$warehouse -> fetch ( $idwarehouse );
$s .= '<span class="hideonsmartphone">' . $langs -> trans ( " Warehouse " ) . '<br></span>' . $warehouse -> ref ;
if ( $warehouse -> statut == Entrepot :: STATUS_CLOSED ) {
$s .= ' (' . $langs -> trans ( " Closed " ) . ')' ;
}
$s .= '</span>' ;
print " $ ('#infowarehouse').html(' " . dol_escape_js ( $s ) . " '); " ;
print '$("#infowarehouse").css("display", "inline-block");' ;
} else {
$s = '<span class="small hideonsmartphone">' ;
$s .= $langs -> trans ( " StockChangeDisabled " ) . '<br>' . $langs -> trans ( " NoWarehouseDefinedForTerminal " );
$s .= '</span>' ;
print " $ ('#infowarehouse').html(' " . dol_escape_js ( $s ) . " '); " ;
if ( ! empty ( $conf -> dol_optimize_smallscreen )) {
print '$("#infowarehouse").css("display", "none");' ;
}
}
} else {
$s = '<span class="small hideonsmartphone">' . $langs -> trans ( " StockChangeDisabled " ) . '</span>' ;
print " $ ('#infowarehouse').html(' " . dol_escape_js ( $s ) . " '); " ;
if ( ! empty ( $conf -> dol_optimize_smallscreen )) {
print '$("#infowarehouse").css("display", "none");' ;
}
}
2020-09-07 10:18:17 +02:00
}
2020-03-16 13:27:10 +01:00
// Module Adherent
$s = '' ;
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'adherent' ) && $invoice -> socid > 0 && $invoice -> socid != $conf -> global -> $constforcompanyid ) {
2020-03-16 13:27:10 +01:00
$s = '<span class="small">' ;
require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php' ;
$langs -> load ( " members " );
$s .= $langs -> trans ( " Member " ) . ': ' ;
$adh = new Adherent ( $db );
$result = $adh -> fetch ( '' , '' , $invoice -> socid );
2021-02-26 21:17:52 +01:00
if ( $result > 0 ) {
2020-03-16 13:27:10 +01:00
$adh -> ref = $adh -> getFullName ( $langs );
2021-10-24 19:21:51 +02:00
if ( empty ( $adh -> statut ) || $adh -> statut == Adherent :: STATUS_EXCLUDED ) {
2021-02-26 21:17:52 +01:00
$s .= " <s> " ;
}
2020-04-10 10:59:32 +02:00
$s .= $adh -> getFullName ( $langs );
$s .= ' - ' . $adh -> type ;
2021-02-26 21:17:52 +01:00
if ( $adh -> datefin ) {
2020-04-10 10:59:32 +02:00
$s .= '<br>' . $langs -> trans ( " SubscriptionEndDate " ) . ': ' . dol_print_date ( $adh -> datefin , 'day' );
2020-03-16 13:27:10 +01:00
if ( $adh -> hasDelay ()) {
2020-04-10 10:59:32 +02:00
$s .= " " . img_warning ( $langs -> trans ( " Late " ));
2020-03-16 13:27:10 +01:00
}
2020-05-21 15:05:19 +02:00
} else {
2020-04-10 10:59:32 +02:00
$s .= '<br>' . $langs -> trans ( " SubscriptionNotReceived " );
2021-02-26 21:17:52 +01:00
if ( $adh -> statut > 0 ) {
$s .= " " . img_warning ( $langs -> trans ( " Late " )); // displays delay Pictogram only if not a draft and not terminated
}
}
2021-10-24 19:21:51 +02:00
if ( empty ( $adh -> statut ) || $adh -> statut == Adherent :: STATUS_EXCLUDED ) {
2021-02-26 21:17:52 +01:00
$s .= " </s> " ;
2020-03-16 13:27:10 +01:00
}
2020-05-21 15:05:19 +02:00
} else {
2020-04-10 10:59:32 +02:00
$s .= '<br>' . $langs -> trans ( " ThirdpartyNotLinkedToMember " );
2020-03-16 13:27:10 +01:00
}
2020-04-10 10:59:32 +02:00
$s .= '</span>' ;
2020-03-16 13:27:10 +01:00
}
?>
$ ( " #moreinfo " ) . html ( '<?php print dol_escape_js($s); ?>' );
2020-03-08 22:33:56 +01:00
});
2021-08-08 19:14:28 +02:00
< ? php
if ( ! empty ( $conf -> global -> TAKEPOS_CUSTOMER_DISPLAY )) {
echo " function CustomerDisplay() { " ;
echo " var line1=' " . $CUSTOMER_DISPLAY_line1 . " '.substring(0,20); " ;
echo " line1=line1.padEnd(20); " ;
echo " var line2=' " . $CUSTOMER_DISPLAY_line2 . " '.substring(0,20); " ;
echo " line2=line2.padEnd(20); " ;
echo " $ .ajax( {
type : 'GET' ,
data : { text : line1 + line2 },
url : '".getDolGlobalString(' TAKEPOS_PRINT_SERVER ')."/display/index.php' ,
}); " ;
echo " } " ;
}
?>
2018-09-28 13:31:41 +02:00
</ script >
2019-03-27 17:50:23 +01:00
2018-09-28 13:31:41 +02:00
< ? php
2020-03-16 15:41:21 +01:00
// Add again js for footer because this content is injected into index.php page so all init
2019-03-27 17:50:23 +01:00
// for tooltip and other js beautifiers must be reexecuted too.
2021-02-26 21:17:52 +01:00
if ( ! empty ( $conf -> use_javascript_ajax )) {
2020-09-07 10:18:17 +02:00
print " \n " . '<!-- Includes JS Footer of Dolibarr -->' . " \n " ;
2021-07-08 12:17:32 +02:00
print '<script src="' . DOL_URL_ROOT . '/core/js/lib_foot.js.php?lang=' . $langs -> defaultlang . '"></script>' . " \n " ;
2019-03-27 17:50:23 +01:00
}
2021-07-08 12:17:32 +02:00
print '<!-- invoice.php place=' . ( int ) $place . ' invoice=' . $invoice -> ref . ' mobilepage=' . ( empty ( $mobilepage ) ? '' : $mobilepage ) . ' $_SESSION["basiclayout"]=' . ( empty ( $_SESSION [ " basiclayout " ]) ? '' : $_SESSION [ " basiclayout " ]) . ' conf->global->TAKEPOS_BAR_RESTAURANT=' . getDolGlobalString ( 'TAKEPOS_BAR_RESTAURANT' ) . ' -->' . " \n " ;
2018-12-07 21:33:40 +01:00
print '<div class="div-table-responsive-no-min invoice">' ;
2019-03-28 18:51:04 +01:00
print '<table id="tablelines" class="noborder noshadow postablelines" width="100%">' ;
2020-10-13 11:00:56 +02:00
if ( $sectionwithinvoicelink && ( $mobilepage == " invoice " || $mobilepage == " " )) {
2021-02-26 21:17:52 +01:00
if ( ! empty ( $conf -> global -> TAKEPOS_SHOW_HT )) {
print '<tr><td colspan="5">' . $sectionwithinvoicelink . '</td></tr>' ;
} else {
2021-02-24 15:48:15 +01:00
print '<tr><td colspan="4">' . $sectionwithinvoicelink . '</td></tr>' ;
}
2020-10-04 15:01:22 +02:00
}
2018-09-28 13:31:41 +02:00
print '<tr class="liste_titre nodrag nodrop">' ;
2019-03-27 20:13:12 +01:00
print '<td class="linecoldescription">' ;
2020-07-07 03:50:14 +02:00
// In phone version only show when it is invoice page
2021-07-08 12:17:32 +02:00
if ( empty ( $mobilepage ) || $mobilepage == " invoice " ) {
2020-10-04 15:01:22 +02:00
print '<input type="hidden" name="invoiceid" id="invoiceid" value="' . $invoice -> id . '">' ;
2020-07-07 03:50:14 +02:00
}
2021-07-08 12:17:32 +02:00
if ( getDolGlobalString ( 'TAKEPOS_BAR_RESTAURANT' )) {
2020-09-07 10:18:17 +02:00
$sql = " SELECT floor, label FROM " . MAIN_DB_PREFIX . " takepos_floor_tables where rowid= " . (( int ) $place );
$resql = $db -> query ( $sql );
$obj = $db -> fetch_object ( $resql );
2021-02-26 21:17:52 +01:00
if ( $obj ) {
2020-09-07 10:18:17 +02:00
$label = $obj -> label ;
$floor = $obj -> floor ;
}
2019-11-12 00:15:34 +01:00
if ( $mobilepage == " invoice " || $mobilepage == " " ) {
2021-12-06 02:13:15 +01:00
// If not on smartphone version or if it is the invoice page
//print 'mobilepage='.$mobilepage;
2022-04-08 00:42:39 +02:00
print '<span class="opacitymedium">' . $langs -> trans ( 'Place' ) . " </span> <b> " . ( empty ( $label ) ? '?' : $label ) . " </b><br> " ;
print '<span class="opacitymedium">' . $langs -> trans ( 'Floor' ) . " </span> <b> " . ( empty ( $floor ) ? '?' : $floor ) . " </b> " ;
2021-02-26 21:17:52 +01:00
} elseif ( defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
print $mysoc -> name ;
} elseif ( $mobilepage == " cats " ) {
print $langs -> trans ( 'Category' );
} elseif ( $mobilepage == " products " ) {
print $langs -> trans ( 'Label' );
2019-10-16 16:26:00 +02:00
}
2020-07-07 03:50:14 +02:00
} else {
print $langs -> trans ( " Products " );
2019-10-16 16:26:00 +02:00
}
2020-07-07 03:50:14 +02:00
print '</td>' ;
2022-05-06 11:34:05 +02:00
// complete header by hook
$parameters = array ();
$reshook = $hookmanager -> executeHooks ( 'completeTakePosInvoiceHeader' , $parameters , $invoice , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
print $hookmanager -> resPrint ;
2021-07-08 12:17:32 +02:00
if ( empty ( $_SESSION [ " basiclayout " ]) || $_SESSION [ " basiclayout " ] != 1 ) {
2019-11-12 00:15:34 +01:00
print '<td class="linecolqty right">' . $langs -> trans ( 'ReductionShort' ) . '</td>' ;
print '<td class="linecolqty right">' . $langs -> trans ( 'Qty' ) . '</td>' ;
2021-07-08 12:17:32 +02:00
if ( getDolGlobalString ( 'TAKEPOS_SHOW_HT' )) {
2021-02-26 21:17:52 +01:00
print '<td class="linecolht right nowraponall">' ;
print '<span class="opacitymedium small">' . $langs -> trans ( 'TotalHTShort' ) . '</span><br>' ;
// In phone version only show when it is invoice page
2021-07-08 12:17:32 +02:00
if ( empty ( $mobilepage ) || $mobilepage == " invoice " ) {
2021-02-26 21:17:52 +01:00
print '<span id="linecolht-span-total" style="font-size:1.3em; font-weight: bold;">' . price ( $invoice -> total_ht , 1 , '' , 1 , - 1 , - 1 , $conf -> currency ) . '</span>' ;
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'multicurrency' ) && $_SESSION [ " takeposcustomercurrency " ] != " " && $conf -> currency != $_SESSION [ " takeposcustomercurrency " ]) {
2021-02-26 21:17:52 +01:00
//Only show customer currency if multicurrency module is enabled, if currency selected and if this currency selected is not the same as main currency
include_once DOL_DOCUMENT_ROOT . '/multicurrency/class/multicurrency.class.php' ;
$multicurrency = new MultiCurrency ( $db );
$multicurrency -> fetch ( 0 , $_SESSION [ " takeposcustomercurrency " ]);
print '<br><span id="linecolht-span-total" style="font-size:0.9em; font-style:italic;">(' . price ( $invoice -> total_ht * $multicurrency -> rate -> rate ) . ' ' . $_SESSION [ " takeposcustomercurrency " ] . ')</span>' ;
}
print '</td>' ;
}
print '</td>' ;
}
2020-07-07 03:50:14 +02:00
print '<td class="linecolht right nowraponall">' ;
print '<span class="opacitymedium small">' . $langs -> trans ( 'TotalTTCShort' ) . '</span><br>' ;
// In phone version only show when it is invoice page
2021-07-08 12:17:32 +02:00
if ( empty ( $mobilepage ) || $mobilepage == " invoice " ) {
2020-07-07 03:50:14 +02:00
print '<span id="linecolht-span-total" style="font-size:1.3em; font-weight: bold;">' . price ( $invoice -> total_ttc , 1 , '' , 1 , - 1 , - 1 , $conf -> currency ) . '</span>' ;
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'multicurrency' ) && ! empty ( $_SESSION [ " takeposcustomercurrency " ]) && $conf -> currency != $_SESSION [ " takeposcustomercurrency " ]) {
2020-10-04 14:40:52 +02:00
//Only show customer currency if multicurrency module is enabled, if currency selected and if this currency selected is not the same as main currency
include_once DOL_DOCUMENT_ROOT . '/multicurrency/class/multicurrency.class.php' ;
$multicurrency = new MultiCurrency ( $db );
$multicurrency -> fetch ( 0 , $_SESSION [ " takeposcustomercurrency " ]);
2020-10-07 15:01:28 +02:00
print '<br><span id="linecolht-span-total" style="font-size:0.9em; font-style:italic;">(' . price ( $invoice -> total_ttc * $multicurrency -> rate -> rate ) . ' ' . $_SESSION [ " takeposcustomercurrency " ] . ')</span>' ;
2020-10-04 14:40:52 +02:00
}
2020-07-07 03:50:14 +02:00
print '</td>' ;
}
print '</td>' ;
2021-02-26 21:17:52 +01:00
} elseif ( $mobilepage == " invoice " ) {
print '<td class="linecolqty right">' . $langs -> trans ( 'Qty' ) . '</td>' ;
2019-05-26 16:44:17 +02:00
}
2018-09-28 13:31:41 +02:00
print " </tr> \n " ;
2018-12-07 08:04:40 +01:00
2020-01-01 21:54:47 +01:00
2021-07-08 12:17:32 +02:00
if ( ! empty ( $_SESSION [ " basiclayout " ]) && $_SESSION [ " basiclayout " ] == 1 ) {
2021-02-26 21:17:52 +01:00
if ( $mobilepage == " cats " ) {
2019-05-26 16:44:17 +02:00
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
$categorie = new Categorie ( $db );
2020-09-07 10:18:17 +02:00
$categories = $categorie -> get_full_arbo ( 'product' );
2019-05-26 16:44:17 +02:00
$htmlforlines = '' ;
2020-09-07 10:18:17 +02:00
foreach ( $categories as $row ) {
2021-02-26 21:17:52 +01:00
if ( defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
$htmlforlines .= '<div class="leftcat' ;
} else {
$htmlforlines .= '<tr class="drag drop oddeven posinvoiceline' ;
}
2019-11-12 00:15:34 +01:00
$htmlforlines .= '" onclick="LoadProducts(' . $row [ 'id' ] . ');">' ;
2021-02-26 21:17:52 +01:00
if ( defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
$htmlforlines .= '<img class="imgwrapper" width="33%" src="' . DOL_URL_ROOT . '/takepos/public/auto_order.php?genimg=cat&query=cat&id=' . $row [ 'id' ] . '"><br>' ;
} else {
$htmlforlines .= '<td class="left">' ;
}
2019-11-12 00:15:34 +01:00
$htmlforlines .= $row [ 'label' ];
2021-02-26 21:17:52 +01:00
if ( defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
$htmlforlines .= '</div>' . " \n " ;
} else {
$htmlforlines .= '</td></tr>' . " \n " ;
}
2019-05-26 16:44:17 +02:00
}
2019-11-12 00:15:34 +01:00
$htmlforlines .= '</table>' ;
$htmlforlines .= '</table>' ;
2019-05-26 16:44:17 +02:00
print $htmlforlines ;
}
2019-08-26 16:49:25 +02:00
2021-02-26 21:17:52 +01:00
if ( $mobilepage == " products " ) {
2019-05-26 16:44:17 +02:00
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
$object = new Categorie ( $db );
$catid = GETPOST ( 'catid' , 'int' );
2019-11-12 00:15:34 +01:00
$result = $object -> fetch ( $catid );
2019-05-26 16:44:17 +02:00
$prods = $object -> getObjectsInCateg ( " product " );
$htmlforlines = '' ;
foreach ( $prods as $row ) {
2021-02-26 21:17:52 +01:00
if ( defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
$htmlforlines .= '<div class="leftcat' ;
} else {
$htmlforlines .= '<tr class="drag drop oddeven posinvoiceline' ;
}
2019-11-12 00:15:34 +01:00
$htmlforlines .= '" onclick="AddProduct(\'' . $place . '\', ' . $row -> id . ')">' ;
2020-05-24 16:30:42 +02:00
if ( defined ( 'INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE' )) {
$htmlforlines .= '<img class="imgwrapper" width="33%" src="' . DOL_URL_ROOT . '/takepos/public/auto_order.php?genimg=pro&query=pro&id=' . $row -> id . '"><br>' ;
$htmlforlines .= $row -> label . '' . price ( $row -> price_ttc , 1 , $langs , 1 , - 1 , - 1 , $conf -> currency );
$htmlforlines .= '</div>' . " \n " ;
2021-02-26 21:17:52 +01:00
} else {
2020-05-24 16:30:42 +02:00
$htmlforlines .= '<td class="left">' ;
$htmlforlines .= $row -> label ;
$htmlforlines .= '<div class="right">' . price ( $row -> price_ttc , 1 , $langs , 1 , - 1 , - 1 , $conf -> currency ) . '</div>' ;
$htmlforlines .= '</tr>' . " \n " ;
}
2019-05-26 16:44:17 +02:00
}
2019-11-12 00:15:34 +01:00
$htmlforlines .= '</table>' ;
2019-05-26 16:44:17 +02:00
print $htmlforlines ;
}
2019-08-26 16:49:25 +02:00
2021-02-26 21:17:52 +01:00
if ( $mobilepage == " places " ) {
2019-11-12 00:15:34 +01:00
$sql = " SELECT rowid, entity, label, leftpos, toppos, floor FROM " . MAIN_DB_PREFIX . " takepos_floor_tables " ;
2019-05-26 16:44:17 +02:00
$resql = $db -> query ( $sql );
$rows = array ();
$htmlforlines = '' ;
2019-11-12 00:15:34 +01:00
while ( $row = $db -> fetch_array ( $resql )) {
2019-05-26 16:44:17 +02:00
$rows [] = $row ;
2019-11-12 00:15:34 +01:00
$htmlforlines .= '<tr class="drag drop oddeven posinvoiceline' ;
$htmlforlines .= '" onclick="LoadPlace(\'' . $row [ 'label' ] . '\')">' ;
$htmlforlines .= '<td class="left">' ;
$htmlforlines .= $row [ 'label' ];
$htmlforlines .= '</td>' ;
$htmlforlines .= '</tr>' . " \n " ;
2019-05-26 16:44:17 +02:00
}
2019-11-12 00:15:34 +01:00
$htmlforlines .= '</table>' ;
2019-05-26 16:44:17 +02:00
print $htmlforlines ;
}
}
2021-02-26 21:17:52 +01:00
if ( $placeid > 0 ) {
2019-10-16 16:26:00 +02:00
//In Phone basic layout hide some content depends situation
2021-07-08 12:17:32 +02:00
if ( ! empty ( $_SESSION [ " basiclayout " ]) && $_SESSION [ " basiclayout " ] == 1 && $mobilepage != " invoice " && $action != " order " ) {
2021-02-26 21:17:52 +01:00
return ;
}
2019-10-20 15:37:20 +02:00
2021-02-26 21:17:52 +01:00
if ( is_array ( $invoice -> lines ) && count ( $invoice -> lines )) {
2020-12-04 00:58:51 +01:00
print '<!-- invoice.php show lines of invoices -->' . " \n " ;
2020-09-07 10:18:17 +02:00
$tmplines = array_reverse ( $invoice -> lines );
2021-07-08 12:17:32 +02:00
$htmlsupplements = array ();
2021-02-26 21:17:52 +01:00
foreach ( $tmplines as $line ) {
if ( $line -> fk_parent_line != false ) {
2020-03-12 12:45:44 +01:00
$htmlsupplements [ $line -> fk_parent_line ] .= '<tr class="drag drop oddeven posinvoiceline' ;
2021-02-26 21:17:52 +01:00
if ( $line -> special_code == " 4 " ) {
$htmlsupplements [ $line -> fk_parent_line ] .= ' order' ;
}
2022-05-24 12:36:11 +02:00
$htmlsupplements [ $line -> fk_parent_line ] .= '" id="' . $line -> id . '"' ;
if ( $line -> special_code == " 4 " ) {
2022-06-03 02:31:09 +02:00
$htmlsupplements [ $line -> fk_parent_line ] .= ' title="' . dol_escape_htmltag ( $langs -> trans ( " AlreadyPrinted " )) . '"' ;
2022-05-24 12:36:11 +02:00
}
$htmlsupplements [ $line -> fk_parent_line ] .= '>' ;
2020-03-12 12:45:44 +01:00
$htmlsupplements [ $line -> fk_parent_line ] .= '<td class="left">' ;
$htmlsupplements [ $line -> fk_parent_line ] .= img_picto ( '' , 'rightarrow' );
2021-02-26 21:17:52 +01:00
if ( $line -> product_label ) {
$htmlsupplements [ $line -> fk_parent_line ] .= $line -> product_label ;
}
if ( $line -> product_label && $line -> desc ) {
$htmlsupplements [ $line -> fk_parent_line ] .= '<br>' ;
}
if ( $line -> product_label != $line -> desc ) {
2019-12-08 23:16:49 +01:00
$firstline = dolGetFirstLineOfText ( $line -> desc );
2021-02-26 21:17:52 +01:00
if ( $firstline != $line -> desc ) {
2019-12-08 23:16:49 +01:00
$htmlsupplements [ $line -> fk_parent_line ] .= $form -> textwithpicto ( dolGetFirstLineOfText ( $line -> desc ), $line -> desc );
2020-05-21 15:05:19 +02:00
} else {
2019-12-08 23:16:49 +01:00
$htmlsupplements [ $line -> fk_parent_line ] .= $line -> desc ;
}
}
$htmlsupplements [ $line -> fk_parent_line ] .= '</td>' ;
2022-05-06 11:34:05 +02:00
// complete line by hook
$parameters = array ( 'line' => $line );
$reshook = $hookmanager -> executeHooks ( 'completeTakePosInvoiceParentLine' , $parameters , $invoice , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
$htmlsupplements [ $line -> fk_parent_line ] .= $hookmanager -> resPrint ;
2021-07-08 12:17:32 +02:00
if ( empty ( $_SESSION [ " basiclayout " ]) || $_SESSION [ " basiclayout " ] != 1 ) {
2019-12-08 23:16:49 +01:00
$htmlsupplements [ $line -> fk_parent_line ] .= '<td class="right">' . vatrate ( $line -> remise_percent , true ) . '</td>' ;
$htmlsupplements [ $line -> fk_parent_line ] .= '<td class="right">' . $line -> qty . '</td>' ;
$htmlsupplements [ $line -> fk_parent_line ] .= '<td class="right">' . price ( $line -> total_ttc ) . '</td>' ;
}
$htmlsupplements [ $line -> fk_parent_line ] .= '</tr>' . " \n " ;
continue ;
}
2020-09-08 21:27:28 +02:00
$htmlforlines = '' ;
$htmlforlines .= '<tr class="drag drop oddeven posinvoiceline' ;
if ( $line -> special_code == " 4 " ) {
$htmlforlines .= ' order' ;
}
2022-05-24 12:36:11 +02:00
$htmlforlines .= '" id="' . $line -> id . '"' ;
if ( $line -> special_code == " 4 " ) {
2022-06-03 02:31:09 +02:00
$htmlforlines .= ' title="' . dol_escape_htmltag ( $langs -> trans ( " AlreadyPrinted " )) . '"' ;
2022-05-24 12:36:11 +02:00
}
$htmlforlines .= '>' ;
2020-09-08 21:27:28 +02:00
$htmlforlines .= '<td class="left">' ;
2021-07-08 12:17:32 +02:00
if ( ! empty ( $_SESSION [ " basiclayout " ]) && $_SESSION [ " basiclayout " ] == 1 ) {
2021-02-26 21:17:52 +01:00
$htmlforlines .= '<span class="phoneqty">' . $line -> qty . " </span> x " ;
}
if ( isset ( $line -> product_type )) {
if ( empty ( $line -> product_type )) {
$htmlforlines .= img_object ( '' , 'product' ) . ' ' ;
} else {
$htmlforlines .= img_object ( '' , 'service' ) . ' ' ;
}
2020-09-08 21:27:28 +02:00
}
if ( empty ( $conf -> global -> TAKEPOS_SHOW_N_FIRST_LINES )) {
$tooltiptext = '' ;
if ( $line -> product_ref ) {
$tooltiptext .= '<b>' . $langs -> trans ( " Ref " ) . '</b> : ' . $line -> product_ref . '<br>' ;
$tooltiptext .= '<b>' . $langs -> trans ( " Label " ) . '</b> : ' . $line -> product_label . '<br>' ;
if ( $line -> product_label != $line -> desc ) {
2021-02-26 21:17:52 +01:00
if ( $line -> desc ) {
$tooltiptext .= '<br>' ;
}
2020-09-08 21:27:28 +02:00
$tooltiptext .= $line -> desc ;
}
}
2021-11-30 16:07:59 +01:00
if ( $conf -> global -> TAKEPOS_SHOW_PRODUCT_REFERENCE == 1 ) {
2021-11-30 15:41:46 +01:00
$htmlforlines .= $form -> textwithpicto ( $line -> product_label ? '<b>' . $line -> product_ref . '</b> - ' . $line -> product_label : dolGetFirstLineOfText ( $line -> desc , 1 ), $tooltiptext );
2021-11-30 16:07:59 +01:00
} else {
2021-11-30 15:41:46 +01:00
$htmlforlines .= $form -> textwithpicto ( $line -> product_label ? $line -> product_label : ( $line -> product_ref ? $line -> product_ref : dolGetFirstLineOfText ( $line -> desc , 1 )), $tooltiptext );
}
2020-09-08 21:27:28 +02:00
} else {
2021-02-26 21:17:52 +01:00
if ( $line -> product_label ) {
$htmlforlines .= $line -> product_label ;
}
if ( $line -> product_label != $line -> desc ) {
if ( $line -> product_label && $line -> desc ) {
$htmlforlines .= '<br>' ;
}
2020-09-08 21:27:28 +02:00
$firstline = dolGetFirstLineOfText ( $line -> desc , $conf -> global -> TAKEPOS_SHOW_N_FIRST_LINES );
2021-02-26 21:17:52 +01:00
if ( $firstline != $line -> desc ) {
2020-09-08 21:27:28 +02:00
$htmlforlines .= $form -> textwithpicto ( dolGetFirstLineOfText ( $line -> desc ), $line -> desc );
} else {
$htmlforlines .= $line -> desc ;
}
}
}
2021-02-26 21:17:52 +01:00
if ( ! empty ( $line -> array_options [ 'options_order_notes' ])) {
$htmlforlines .= " <br>( " . $line -> array_options [ 'options_order_notes' ] . " ) " ;
}
2021-07-08 12:17:32 +02:00
if ( ! empty ( $_SESSION [ " basiclayout " ]) && $_SESSION [ " basiclayout " ] == 1 ) {
2020-12-04 00:58:51 +01:00
$htmlforlines .= '</td><td class="right phonetable"><button type="button" onclick="SetQty(place, ' . $line -> rowid . ', ' . ( $line -> qty - 1 ) . ');" class="publicphonebutton2 phonered">-</button> <button type="button" onclick="SetQty(place, ' . $line -> rowid . ', ' . ( $line -> qty + 1 ) . ');" class="publicphonebutton2 phonegreen">+</button>' ;
}
2021-07-08 12:17:32 +02:00
if ( empty ( $_SESSION [ " basiclayout " ]) || $_SESSION [ " basiclayout " ] != 1 ) {
2020-01-01 21:54:47 +01:00
$moreinfo = '' ;
$moreinfo .= $langs -> transcountry ( " TotalHT " , $mysoc -> country_code ) . ': ' . price ( $line -> total_ht );
2021-02-26 21:17:52 +01:00
if ( $line -> vat_src_code ) {
$moreinfo .= '<br>' . $langs -> trans ( " VATCode " ) . ': ' . $line -> vat_src_code ;
}
2020-03-23 15:02:15 +01:00
$moreinfo .= '<br>' . $langs -> transcountry ( " TotalVAT " , $mysoc -> country_code ) . ': ' . price ( $line -> total_tva );
2020-01-01 21:54:47 +01:00
$moreinfo .= '<br>' . $langs -> transcountry ( " TotalLT1 " , $mysoc -> country_code ) . ': ' . price ( $line -> total_localtax1 );
$moreinfo .= '<br>' . $langs -> transcountry ( " TotalLT2 " , $mysoc -> country_code ) . ': ' . price ( $line -> total_localtax2 );
$moreinfo .= '<br>' . $langs -> transcountry ( " TotalTTC " , $mysoc -> country_code ) . ': ' . price ( $line -> total_ttc );
//$moreinfo .= $langs->trans("TotalHT").': '.$line->total_ht;
2021-02-26 21:17:52 +01:00
if ( $line -> date_start || $line -> date_end ) {
$htmlforlines .= '<br><div class="clearboth nowraponall">' . get_date_range ( $line -> date_start , $line -> date_end ) . '</div>' ;
}
2019-11-12 00:15:34 +01:00
$htmlforlines .= '</td>' ;
2022-05-06 11:34:05 +02:00
// complete line by hook
$parameters = array ( 'line' => $line );
$reshook = $hookmanager -> executeHooks ( 'completeTakePosInvoiceLine' , $parameters , $invoice , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
$htmlforlines .= $hookmanager -> resPrint ;
2019-11-12 00:15:34 +01:00
$htmlforlines .= '<td class="right">' . vatrate ( $line -> remise_percent , true ) . '</td>' ;
2020-09-20 23:29:59 +02:00
$htmlforlines .= '<td class="right">' ;
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'stock' ) && ! empty ( $user -> rights -> stock -> mouvement -> lire )) {
2020-09-20 23:29:59 +02:00
$constantforkey = 'CASHDESK_ID_WAREHOUSE' . $_SESSION [ " takeposterminal " ];
2022-05-17 09:17:36 +02:00
if ( ! empty ( $conf -> global -> $constantforkey ) && $line -> fk_product > 0 && empty ( $conf -> global -> TAKEPOS_HIDE_STOCK_ON_LINE )) {
2020-12-04 00:58:51 +01:00
$sql = " SELECT e.rowid, e.ref, e.lieu, e.fk_parent, e.statut, ps.reel, ps.rowid as product_stock_id, p.pmp " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " entrepot as e, " ;
$sql .= " " . MAIN_DB_PREFIX . " product_stock as ps " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p ON p.rowid = ps.fk_product " ;
$sql .= " WHERE ps.reel != 0 " ;
2021-03-22 13:31:06 +01:00
$sql .= " AND ps.fk_entrepot = " . (( int ) $conf -> global -> $constantforkey );
2020-12-04 00:58:51 +01:00
$sql .= " AND e.entity IN ( " . getEntity ( 'stock' ) . " ) " ;
2021-08-23 19:33:24 +02:00
$sql .= " AND ps.fk_product = " . (( int ) $line -> fk_product );
2020-12-04 00:58:51 +01:00
$resql = $db -> query ( $sql );
if ( $resql ) {
$obj = $db -> fetch_object ( $resql );
$stock_real = price2num ( $obj -> reel , 'MS' );
$htmlforlines .= $line -> qty ;
2021-02-26 21:17:52 +01:00
if ( $line -> qty && $line -> qty > $stock_real ) {
$htmlforlines .= '<span style="color: var(--amountremaintopaycolor)">' ;
}
2020-12-04 00:58:51 +01:00
$htmlforlines .= ' <span class="posstocktoolow">(' . $langs -> trans ( " Stock " ) . ' ' . $stock_real . ')</span>' ;
2021-02-26 21:17:52 +01:00
if ( $line -> qty && $line -> qty > $stock_real ) {
$htmlforlines .= " </span> " ;
}
2020-12-04 00:58:51 +01:00
} else {
dol_print_error ( $db );
}
} else {
2020-09-24 00:06:02 +02:00
$htmlforlines .= $line -> qty ;
2020-09-20 23:29:59 +02:00
}
2020-12-04 00:58:51 +01:00
} else {
$htmlforlines .= $line -> qty ;
2020-09-20 23:29:59 +02:00
}
2020-12-04 00:58:51 +01:00
2020-09-20 23:29:59 +02:00
$htmlforlines .= '</td>' ;
2021-07-08 12:17:32 +02:00
if ( getDolGlobalString ( 'TAKEPOS_SHOW_HT' )) {
2021-02-26 21:17:52 +01:00
$htmlforlines .= '<td class="right classfortooltip" title="' . $moreinfo . '">' ;
$htmlforlines .= price ( $line -> total_ht , 1 , '' , 1 , - 1 , - 1 , $conf -> currency );
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'multicurrency' ) && ! empty ( $_SESSION [ " takeposcustomercurrency " ]) && $conf -> currency != $_SESSION [ " takeposcustomercurrency " ]) {
2021-02-26 21:17:52 +01:00
//Only show customer currency if multicurrency module is enabled, if currency selected and if this currency selected is not the same as main currency
include_once DOL_DOCUMENT_ROOT . '/multicurrency/class/multicurrency.class.php' ;
$multicurrency = new MultiCurrency ( $db );
$multicurrency -> fetch ( 0 , $_SESSION [ " takeposcustomercurrency " ]);
$htmlforlines .= '<br><span id="linecolht-span-total" style="font-size:0.9em; font-style:italic;">(' . price ( $line -> total_ht * $multicurrency -> rate -> rate ) . ' ' . $_SESSION [ " takeposcustomercurrency " ] . ')</span>' ;
}
$htmlforlines .= '</td>' ;
}
2020-10-03 22:13:32 +02:00
$htmlforlines .= '<td class="right classfortooltip" title="' . $moreinfo . '">' ;
2020-10-04 14:42:16 +02:00
$htmlforlines .= price ( $line -> total_ttc , 1 , '' , 1 , - 1 , - 1 , $conf -> currency );
2022-08-26 17:03:20 +02:00
if ( isModEnabled ( 'multicurrency' ) && ! empty ( $_SESSION [ " takeposcustomercurrency " ]) && $conf -> currency != $_SESSION [ " takeposcustomercurrency " ]) {
2020-10-03 22:13:32 +02:00
//Only show customer currency if multicurrency module is enabled, if currency selected and if this currency selected is not the same as main currency
include_once DOL_DOCUMENT_ROOT . '/multicurrency/class/multicurrency.class.php' ;
$multicurrency = new MultiCurrency ( $db );
$multicurrency -> fetch ( 0 , $_SESSION [ " takeposcustomercurrency " ]);
2020-10-07 15:01:28 +02:00
$htmlforlines .= '<br><span id="linecolht-span-total" style="font-size:0.9em; font-style:italic;">(' . price ( $line -> total_ttc * $multicurrency -> rate -> rate ) . ' ' . $_SESSION [ " takeposcustomercurrency " ] . ')</span>' ;
2020-10-03 22:13:32 +02:00
}
$htmlforlines .= '</td>' ;
2019-05-26 16:44:17 +02:00
}
2019-11-12 00:15:34 +01:00
$htmlforlines .= '</tr>' . " \n " ;
2021-10-23 16:59:25 +02:00
$htmlforlines .= empty ( $htmlsupplements [ $line -> id ]) ? '' : $htmlsupplements [ $line -> id ];
2019-03-27 20:20:39 +01:00
2020-09-07 10:18:17 +02:00
print $htmlforlines ;
}
} else {
2021-02-24 15:48:15 +01:00
print '<tr class="drag drop oddeven"><td class="left"><span class="opacitymedium">' . $langs -> trans ( " Empty " ) . '</span></td><td></td><td></td><td></td>' ;
2021-02-26 21:17:52 +01:00
if ( ! empty ( $conf -> global -> TAKEPOS_SHOW_HT )) {
print '<td></td>' ;
}
2021-02-24 15:48:15 +01:00
print '</tr>' ;
2020-09-07 10:18:17 +02:00
}
2020-05-21 15:05:19 +02:00
} else { // No invoice generated yet
2021-02-24 15:48:15 +01:00
print '<tr class="drag drop oddeven"><td class="left"><span class="opacitymedium">' . $langs -> trans ( " Empty " ) . '</span></td><td></td><td></td><td></td>' ;
2021-02-26 21:17:52 +01:00
if ( ! empty ( $conf -> global -> TAKEPOS_SHOW_HT )) {
print '<td></td>' ;
}
print '</tr>' ;
2019-03-28 09:56:01 +01:00
}
2018-12-07 08:04:40 +01:00
2018-09-28 13:31:41 +02:00
print '</table>' ;
2018-12-07 08:04:40 +01:00
2020-11-10 21:45:15 +01:00
if (( $action == " valid " || $action == " history " ) && $invoice -> type != Facture :: TYPE_CREDIT_NOTE ) {
2020-10-25 20:03:25 +01:00
print '<button id="buttonprint" type="button" onclick="ModalBox(\'ModalCreditNote\')">' . $langs -> trans ( 'CreateCreditNote' ) . '</button>' ;
}
2020-01-01 21:54:47 +01:00
2021-02-26 21:17:52 +01:00
if ( $action == " search " ) {
2020-09-07 10:18:17 +02:00
print ' < center >
2022-11-06 22:47:56 +01:00
< input type = " text " id = " search " class = " input-search-takepos " name = " search " onkeyup = " Search2( \ ' \ ', null); " style = " width: 80%; font-size: 150%; " placeholder = " '.dol_escape_htmltag( $langs->trans ('Search')).' " >
2018-09-28 13:31:41 +02:00
</ center > ' ;
}
2018-12-07 08:04:40 +01:00
2020-12-06 14:20:16 +01:00
print '</div>' ;