dolibarr 18.0.6
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2014 Olivier Geffroy <jeff@jeffinfo.com>
3 * Copyright (C) 2013-2021 Alexandre Spangaro <aspangaro@open-dsi.fr>
4 * Copyright (C) 2014-2015 Ari Elbaz (elarifr) <github@accedinfo.com>
5 * Copyright (C) 2013-2021 Florian Henry <florian.henry@open-concept.pro>
6 * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
8 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
29require '../../main.inc.php';
30
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
34require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
35require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
36require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
40
41// Load translation files required by the page
42$langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", "productbatch", "products"));
43
44$action = GETPOST('action', 'aZ09');
45$massaction = GETPOST('massaction', 'alpha');
46$confirm = GETPOST('confirm', 'alpha');
47$toselect = GETPOST('toselect', 'array');
48$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancycustomerlist'; // To manage different context of search
49$optioncss = GETPOST('optioncss', 'alpha');
50
51$default_account = GETPOST('default_account', 'int');
52
53// Select Box
54$mesCasesCochees = GETPOST('toselect', 'array');
55
56// Search Getpost
57$search_societe = GETPOST('search_societe', 'alpha');
58$search_lineid = GETPOST('search_lineid', 'int');
59$search_ref = GETPOST('search_ref', 'alpha');
60$search_invoice = GETPOST('search_invoice', 'alpha');
61$search_label = GETPOST('search_label', 'alpha');
62$search_desc = GETPOST('search_desc', 'alpha');
63$search_amount = GETPOST('search_amount', 'alpha');
64$search_account = GETPOST('search_account', 'alpha');
65$search_vat = GETPOST('search_vat', 'alpha');
66$search_date_startday = GETPOST('search_date_startday', 'int');
67$search_date_startmonth = GETPOST('search_date_startmonth', 'int');
68$search_date_startyear = GETPOST('search_date_startyear', 'int');
69$search_date_endday = GETPOST('search_date_endday', 'int');
70$search_date_endmonth = GETPOST('search_date_endmonth', 'int');
71$search_date_endyear = GETPOST('search_date_endyear', 'int');
72$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
73$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
74$search_country = GETPOST('search_country', 'alpha');
75$search_tvaintra = GETPOST('search_tvaintra', 'alpha');
76
77// Load variable for pagination
78$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
79$sortfield = GETPOST('sortfield', 'aZ09comma');
80$sortorder = GETPOST('sortorder', 'aZ09comma');
81$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
82if (empty($page) || $page < 0) {
83 $page = 0;
84}
85$offset = $limit * $page;
86$pageprev = $page - 1;
87$pagenext = $page + 1;
88if (!$sortfield) {
89 $sortfield = "f.datef, f.ref, l.rowid";
90}
91if (!$sortorder) {
92 if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO > 0) {
93 $sortorder = "DESC";
94 } else {
95 $sortorder = "ASC";
96 }
97}
98
99// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
100$hookmanager->initHooks(array('accountancycustomerlist'));
101
102$formaccounting = new FormAccounting($db);
103$accountingAccount = new AccountingAccount($db);
104
105$chartaccountcode = dol_getIdFromCode($db, getDolGlobalInt('CHARTOFACCOUNTS'), 'accounting_system', 'rowid', 'pcg_version');
106
107// Security check
108if (!isModEnabled('accounting')) {
110}
111if ($user->socid > 0) {
113}
114if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
116}
117
118
119/*
120 * Actions
121 */
122
123if (GETPOST('cancel', 'alpha')) {
124 $action = 'list'; $massaction = '';
125}
126if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
127 $massaction = '';
128}
129
130$parameters = array();
131$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
132if ($reshook < 0) {
133 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
134}
135
136if (empty($reshook)) {
137 // Purge search criteria
138 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
139 $search_societe = '';
140 $search_lineid = '';
141 $search_ref = '';
142 $search_invoice = '';
143 $search_label = '';
144 $search_desc = '';
145 $search_amount = '';
146 $search_account = '';
147 $search_vat = '';
148 $search_date_startday = '';
149 $search_date_startmonth = '';
150 $search_date_startyear = '';
151 $search_date_endday = '';
152 $search_date_endmonth = '';
153 $search_date_endyear = '';
154 $search_date_start = '';
155 $search_date_end = '';
156 $search_country = '';
157 $search_tvaintra = '';
158 }
159
160 // Mass actions
161 $objectclass = 'AccountingAccount';
162 $permissiontoread = $user->hasRight('accounting', 'read');
163 $permissiontodelete = $user->hasRight('accounting', 'delete');
164 $uploaddir = $conf->accounting->dir_output;
165 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
166}
167
168
169if ($massaction == 'ventil' && $user->hasRight('accounting', 'bind', 'write')) {
170 $msg = '';
171
172 //print '<div><span style="color:red">' . $langs->trans("Processing") . '...</span></div>';
173 if (!empty($mesCasesCochees)) {
174 $msg = '<div>'.$langs->trans("SelectedLines").': '.count($mesCasesCochees).'</div>';
175 $msg .= '<div class="detail">';
176 $cpt = 0;
177 $ok = 0;
178 $ko = 0;
179
180 foreach ($mesCasesCochees as $maLigneCochee) {
181 $maLigneCourante = explode("_", $maLigneCochee);
182 $monId = $maLigneCourante[0];
183 $monCompte = GETPOST('codeventil'.$monId);
184
185 if ($monCompte <= 0) {
186 $msg .= '<div><span style="color:red">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NoAccountSelected").'</span></div>';
187 $ko++;
188 } else {
189 $sql = " UPDATE ".MAIN_DB_PREFIX."facturedet";
190 $sql .= " SET fk_code_ventilation = ".((int) $monCompte);
191 $sql .= " WHERE rowid = ".((int) $monId);
192
193 $accountventilated = new AccountingAccount($db);
194 $accountventilated->fetch($monCompte, '', 1);
195
196 dol_syslog("accountancy/customer/list.php", LOG_DEBUG);
197 if ($db->query($sql)) {
198 $msg .= '<div><span style="color:green">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("VentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'</span></div>';
199 $ok++;
200 } else {
201 $msg .= '<div><span style="color:red">'.$langs->trans("ErrorDB").' : '.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NotVentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'<br> <pre>'.$sql.'</pre></span></div>';
202 $ko++;
203 }
204 }
205
206 $cpt++;
207 }
208 $msg .= '</div>';
209 $msg .= '<div>'.$langs->trans("EndProcessing").'</div>';
210 }
211}
212
213if (GETPOST('sortfield') == 'f.datef, f.ref, l.rowid') {
214 $value = (GETPOST('sortorder') == 'asc,asc,asc' ? 0 : 1);
215 require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
216 $res = dolibarr_set_const($db, "ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value, 'yesno', 0, '', $conf->entity);
217}
218
219
220/*
221 * View
222 */
223
224$form = new Form($db);
225$formother = new FormOther($db);
226
227llxHeader('', $langs->trans("Ventilation"));
228
229if (empty($chartaccountcode)) {
230 print $langs->trans("ErrorChartOfAccountSystemNotSelected");
231 // End of page
232 llxFooter();
233 $db->close();
234 exit;
235}
236
237// Customer Invoice lines
238$sql = "SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.situation_cycle_ref, f.fk_facture_source,";
239$sql .= " l.rowid, l.fk_product, l.description, l.total_ht, l.situation_percent, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, l.vat_src_code,";
240$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.tva_tx as tva_tx_prod,";
241if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
242 $sql .= " ppe.accountancy_code_sell as code_sell, ppe.accountancy_code_sell_intra as code_sell_intra, ppe.accountancy_code_sell_export as code_sell_export,";
243 $sql .= " ppe.accountancy_code_buy as code_buy, ppe.accountancy_code_buy_intra as code_buy_intra, ppe.accountancy_code_buy_export as code_buy_export,";
244} else {
245 $sql .= " p.accountancy_code_sell as code_sell, p.accountancy_code_sell_intra as code_sell_intra, p.accountancy_code_sell_export as code_sell_export,";
246 $sql .= " p.accountancy_code_buy as code_buy, p.accountancy_code_buy_intra as code_buy_intra, p.accountancy_code_buy_export as code_buy_export,";
247}
248$sql .= " p.tosell as status, p.tobuy as status_buy,";
249$sql .= " aa.rowid as aarowid, aa2.rowid as aarowid_intra, aa3.rowid as aarowid_export, aa4.rowid as aarowid_thirdparty,";
250$sql .= " co.code as country_code, co.label as country_label,";
251$sql .= " s.rowid as socid, s.nom as name, s.tva_intra, s.email, s.town, s.zip, s.fk_pays, s.client, s.fournisseur, s.code_client, s.code_fournisseur,";
252if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
253 $sql .= " spe.accountancy_code_customer as code_compta_client,";
254 $sql .= " spe.accountancy_code_supplier as code_compta_fournisseur,";
255 $sql .= " spe.accountancy_code_sell as company_code_sell";
256} else {
257 $sql .= " s.code_compta as code_compta_client,";
258 $sql .= " s.code_compta_fournisseur,";
259 $sql .= " s.accountancy_code_sell as company_code_sell";
260}
261$parameters = array();
262$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
263$sql .= $hookmanager->resPrint;
264$sql .= " FROM ".MAIN_DB_PREFIX."facture as f";
265$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = f.fk_soc";
266if (!empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED)) {
267 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe_perentity as spe ON spe.fk_soc = s.rowid AND spe.entity = " . ((int) $conf->entity);
268}
269$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as co ON co.rowid = s.fk_pays ";
270$sql .= " INNER JOIN ".MAIN_DB_PREFIX."facturedet as l ON f.rowid = l.fk_facture";
271$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON p.rowid = l.fk_product";
272if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
273 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
274}
275$alias_societe_perentity = empty($conf->global->MAIN_COMPANY_PERENTITY_SHARED) ? "s" : "spe";
276$alias_product_perentity = empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED) ? "p" : "ppe";
277$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa ON " . $alias_product_perentity . ".accountancy_code_sell = aa.account_number AND aa.active = 1 AND aa.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa.entity = ".$conf->entity;
278$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa2 ON " . $alias_product_perentity . ".accountancy_code_sell_intra = aa2.account_number AND aa2.active = 1 AND aa2.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa2.entity = ".$conf->entity;
279$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa3 ON " . $alias_product_perentity . ".accountancy_code_sell_export = aa3.account_number AND aa3.active = 1 AND aa3.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa3.entity = ".$conf->entity;
280$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa4 ON " . $alias_societe_perentity . ".accountancy_code_sell = aa4.account_number AND aa4.active = 1 AND aa4.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa4.entity = ".$conf->entity;
281
282$sql .= " WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
283$sql .= " AND l.product_type <= 2";
284// Define begin binding date
285if (!empty($conf->global->ACCOUNTING_DATE_START_BINDING)) {
286 $sql .= " AND f.datef >= '".$db->idate($conf->global->ACCOUNTING_DATE_START_BINDING)."'";
287}
288// Add search filter like
289if ($search_societe) {
290 $sql .= natural_search('s.nom', $search_societe);
291}
292if ($search_lineid) {
293 $sql .= natural_search("l.rowid", $search_lineid, 1);
294}
295if (strlen(trim($search_invoice))) {
296 $sql .= natural_search("f.ref", $search_invoice);
297}
298if (strlen(trim($search_ref))) {
299 $sql .= natural_search("p.ref", $search_ref);
300}
301if (strlen(trim($search_label))) {
302 $sql .= natural_search("p.label", $search_label);
303}
304if (strlen(trim($search_desc))) {
305 $sql .= natural_search("l.description", $search_desc);
306}
307if (strlen(trim($search_amount))) {
308 $sql .= natural_search("l.total_ht", $search_amount, 1);
309}
310if (strlen(trim($search_account))) {
311 $sql .= natural_search("aa.account_number", $search_account);
312}
313if (strlen(trim($search_vat))) {
314 $sql .= natural_search("l.tva_tx", price2num($search_vat), 1);
315}
316if ($search_date_start) {
317 $sql .= " AND f.datef >= '".$db->idate($search_date_start)."'";
318}
319if ($search_date_end) {
320 $sql .= " AND f.datef <= '".$db->idate($search_date_end)."'";
321}
322if (strlen(trim($search_country))) {
323 $arrayofcode = getCountriesInEEC();
324 $country_code_in_EEC = $country_code_in_EEC_without_me = '';
325 foreach ($arrayofcode as $key => $value) {
326 $country_code_in_EEC .= ($country_code_in_EEC ? "," : "")."'".$value."'";
327 if ($value != $mysoc->country_code) {
328 $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ? "," : "")."'".$value."'";
329 }
330 }
331 if ($search_country == 'special_allnotme') {
332 $sql .= " AND co.code <> '".$db->escape($mysoc->country_code)."'";
333 } elseif ($search_country == 'special_eec') {
334 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC, 1).")";
335 } elseif ($search_country == 'special_eecnotme') {
336 $sql .= " AND co.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).")";
337 } elseif ($search_country == 'special_noteec') {
338 $sql .= " AND co.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).")";
339 } else {
340 $sql .= natural_search("co.code", $search_country);
341 }
342}
343if (strlen(trim($search_tvaintra))) {
344 $sql .= natural_search("s.tva_intra", $search_tvaintra);
345}
346if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
347 $sql .= " AND f.type IN (".Facture::TYPE_STANDARD.",".Facture::TYPE_REPLACEMENT.",".Facture::TYPE_CREDIT_NOTE.",".Facture::TYPE_SITUATION.")";
348} else {
349 $sql .= " AND f.type IN (".Facture::TYPE_STANDARD.",".Facture::TYPE_REPLACEMENT.",".Facture::TYPE_CREDIT_NOTE.",".Facture::TYPE_DEPOSIT.",".Facture::TYPE_SITUATION.")";
350}
351$sql .= " AND f.entity IN (".getEntity('invoice', 0).")"; // We don't share object for accountancy
352
353// Add where from hooks
354$parameters = array();
355$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
356$sql .= $hookmanager->resPrint;
357
358$sql .= $db->order($sortfield, $sortorder);
359
360// Count total nb of records
361$nbtotalofrecords = '';
362if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
363 $result = $db->query($sql);
364 $nbtotalofrecords = $db->num_rows($result);
365 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
366 $page = 0;
367 $offset = 0;
368 }
369}
370
371$sql .= $db->plimit($limit + 1, $offset);
372
373dol_syslog("accountancy/customer/list.php", LOG_DEBUG);
374// MAX_JOIN_SIZE can be very low (ex: 300000) on some limited configurations (ex: https://www.online.net/fr/hosting/online-perso)
375// This big SELECT command may exceed the MAX_JOIN_SIZE limit => Therefore we use SQL_BIG_SELECTS=1 to disable the MAX_JOIN_SIZE security
376if ($db->type == 'mysqli') {
377 $db->query("SET SQL_BIG_SELECTS=1");
378}
379
380$result = $db->query($sql);
381if ($result) {
382 $num_lines = $db->num_rows($result);
383 $i = 0;
384
385 $arrayofselected = is_array($toselect) ? $toselect : array();
386
387 $param = '';
388 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
389 $param .= '&contextpage='.urlencode($contextpage);
390 }
391 if ($limit > 0 && $limit != $conf->liste_limit) {
392 $param .= '&limit='.((int) $limit);
393 }
394 if ($search_societe) {
395 $param .= '&search_societe='.urlencode($search_societe);
396 }
397 if ($search_lineid) {
398 $param .= '&search_lineid='.urlencode($search_lineid);
399 }
400 if ($search_date_startday) {
401 $param .= '&search_date_startday='.urlencode($search_date_startday);
402 }
403 if ($search_date_startmonth) {
404 $param .= '&search_date_startmonth='.urlencode($search_date_startmonth);
405 }
406 if ($search_date_startyear) {
407 $param .= '&search_date_startyear='.urlencode($search_date_startyear);
408 }
409 if ($search_date_endday) {
410 $param .= '&search_date_endday='.urlencode($search_date_endday);
411 }
412 if ($search_date_endmonth) {
413 $param .= '&search_date_endmonth='.urlencode($search_date_endmonth);
414 }
415 if ($search_date_endyear) {
416 $param .= '&search_date_endyear='.urlencode($search_date_endyear);
417 }
418 if ($search_invoice) {
419 $param .= '&search_invoice='.urlencode($search_invoice);
420 }
421 if ($search_ref) {
422 $param .= '&search_ref='.urlencode($search_ref);
423 }
424 if ($search_label) {
425 $param .= '&search_label='.urlencode($search_label);
426 }
427 if ($search_desc) {
428 $param .= '&search_desc='.urlencode($search_desc);
429 }
430 if ($search_amount) {
431 $param .= '&search_amount='.urlencode($search_amount);
432 }
433 if ($search_vat) {
434 $param .= '&search_vat='.urlencode($search_vat);
435 }
436 if ($search_country) {
437 $param .= "&search_country=".urlencode($search_country);
438 }
439 if ($search_tvaintra) {
440 $param .= "&search_tvaintra=".urlencode($search_tvaintra);
441 }
442
443 $arrayofmassactions = array(
444 'ventil'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Ventilate")
445 ,'set_default_account'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ConfirmPreselectAccount")
446 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
447 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
448 );
449 //if ($user->hasRight('mymodule', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
450 //if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
451 if ($massaction !== 'set_default_account') {
452 $massactionbutton = $form->selectMassAction('ventil', $arrayofmassactions, 1);
453 }
454
455 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">'."\n";
456 print '<input type="hidden" name="action" value="ventil">';
457 if ($optioncss != '') {
458 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
459 }
460 print '<input type="hidden" name="token" value="'.newToken().'">';
461 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
462 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
463 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
464 print '<input type="hidden" name="page" value="'.$page.'">';
465
466 print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit);
467
468 if ($massaction == 'set_default_account') {
469 $formquestion[]=array('type' => 'other',
470 'name' => 'set_default_account',
471 'label' => $langs->trans("AccountancyCode"),
472 'value' => $formaccounting->select_account('', 'default_account', 1, array(), 0, 0, 'maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'));
473 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", count($toselect)), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
474 }
475
476 print '<span class="opacitymedium">'.$langs->trans("DescVentilTodoCustomer").'</span></br><br>';
477
478 if (!empty($msg)) {
479 print $msg.'<br>';
480 }
481
482 $moreforfilter = '';
483
484 print '<div class="div-table-responsive">';
485 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
486
487 // We add search filter
488 print '<tr class="liste_titre_filter">';
489 print '<td class="liste_titre"><input type="text" class="flat maxwidth25" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).'"></td>';
490 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_invoice" value="'.dol_escape_htmltag($search_invoice).'"></td>';
491 print '<td class="liste_titre center">';
492 print '<div class="nowrap">';
493 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
494 print '</div>';
495 print '<div class="nowrap">';
496 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
497 print '</div>';
498 print '</td>';
499 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_ref" value="'.dol_escape_htmltag($search_ref).'"></td>';
500 print '<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
501 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).'"></td>';
502 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_vat" placeholder="%" size="1" value="'.dol_escape_htmltag($search_vat).'"></td>';
503 print '<td class="liste_titre"><input type="text" class="flat maxwidth75imp" name="search_societe" value="'.dol_escape_htmltag($search_societe).'"></td>';
504 print '<td class="liste_titre">';
505 print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth100', 'code2', 1, 0, 1);
506 //print '<input type="text" class="flat maxwidth50" name="search_country" value="' . dol_escape_htmltag($search_country) . '">';
507 print '</td>';
508 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_tvaintra" value="'.dol_escape_htmltag($search_tvaintra).'"></td>';
509 print '<td class="liste_titre"></td>';
510 print '<td class="liste_titre"></td>';
511 print '<td class="center liste_titre">';
512 $searchpicto = $form->showFilterButtons();
513 print $searchpicto;
514 print '</td>';
515 print "</tr>\n";
516
517 print '<tr class="liste_titre">';
518 print_liste_field_titre("LineId", $_SERVER["PHP_SELF"], "l.rowid", "", $param, '', $sortfield, $sortorder);
519 print_liste_field_titre("Invoice", $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
520 print_liste_field_titre("Date", $_SERVER["PHP_SELF"], "f.datef, f.ref, l.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
521 print_liste_field_titre("ProductRef", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
522 //print_liste_field_titre("ProductLabel", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
523 print_liste_field_titre("ProductDescription", $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder);
524 print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 ');
525 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ', '', 1);
526 print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
527 print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder);
528 print_liste_field_titre("VATIntraShort", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder);
529 print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall ');
530 print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center ');
531 $checkpicto = '';
532 if ($massactionbutton) {
533 $checkpicto = $form->showCheckAddButtons('checkforselect', 1);
534 }
535 print_liste_field_titre($checkpicto, '', '', '', '', '', '', '', 'center ');
536 print "</tr>\n";
537
538 $thirdpartystatic = new Societe($db);
539 $facture_static = new Facture($db);
540 $facture_static_det = new FactureLigne($db);
541 $product_static = new Product($db);
542
543
544 $accountingaccount_codetotid_cache = array();
545
546 while ($i < min($num_lines, $limit)) {
547 $objp = $db->fetch_object($result);
548
549 // product_type: 0 = service, 1 = product
550 // if product does not exist we use the value of product_type provided in facturedet to define if this is a product or service
551 // issue : if we change product_type value in product DB it should differ from the value stored in facturedet DB !
552 $code_sell_l = '';
553 $code_sell_p = '';
554 $code_sell_t = '';
555
556 $thirdpartystatic->id = $objp->socid;
557 $thirdpartystatic->name = $objp->name;
558 $thirdpartystatic->client = $objp->client;
559 $thirdpartystatic->fournisseur = $objp->fournisseur;
560 $thirdpartystatic->code_client = $objp->code_client;
561 $thirdpartystatic->code_compta = $objp->code_compta_client; // For backward compatibility
562 $thirdpartystatic->code_compta_client = $objp->code_compta_client;
563 $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
564 $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
565 $thirdpartystatic->email = $objp->email;
566 $thirdpartystatic->country_code = $objp->country_code;
567 $thirdpartystatic->tva_intra = $objp->tva_intra;
568 $thirdpartystatic->code_compta_product = $objp->company_code_sell; // The accounting account for product stored on thirdparty object (for level3 suggestion)
569
570 $product_static->ref = $objp->product_ref;
571 $product_static->id = $objp->product_id;
572 $product_static->type = $objp->type;
573 $product_static->label = $objp->product_label;
574 $product_static->status = $objp->status;
575 $product_static->status_buy = $objp->status_buy;
576 $product_static->accountancy_code_sell = $objp->code_sell;
577 $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
578 $product_static->accountancy_code_sell_export = $objp->code_sell_export;
579 $product_static->accountancy_code_buy = $objp->code_buy;
580 $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
581 $product_static->accountancy_code_buy_export = $objp->code_buy_export;
582 $product_static->tva_tx = $objp->tva_tx_prod;
583
584 $facture_static->ref = $objp->ref;
585 $facture_static->id = $objp->facid;
586 $facture_static->type = $objp->ftype;
587 $facture_static->date = $db->jdate($objp->datef);
588 $facture_static->fk_facture_source = $objp->fk_facture_source;
589
590 $facture_static_det->id = $objp->rowid;
591 $facture_static_det->total_ht = $objp->total_ht;
592 $facture_static_det->tva_tx = $objp->tva_tx_line;
593 $facture_static_det->vat_src_code = $objp->vat_src_code;
594 $facture_static_det->product_type = $objp->type_l;
595 $facture_static_det->desc = $objp->description;
596
597 $accountingAccountArray = array(
598 'dom'=>$objp->aarowid,
599 'intra'=>$objp->aarowid_intra,
600 'export'=>$objp->aarowid_export,
601 'thirdparty' =>$objp->aarowid_thirdparty);
602
603 $code_sell_p_notset = '';
604 $code_sell_t_notset = '';
605
606 $suggestedid = 0;
607
608 $return=$accountingAccount->getAccountingCodeToBind($thirdpartystatic, $mysoc, $product_static, $facture_static, $facture_static_det, $accountingAccountArray, 'customer');
609 if (!is_array($return) && $return<0) {
610 setEventMessage($accountingAccount->error, 'errors');
611 } else {
612 $suggestedid=$return['suggestedid'];
613 $suggestedaccountingaccountfor=$return['suggestedaccountingaccountfor'];
614 $suggestedaccountingaccountbydefaultfor=$return['suggestedaccountingaccountbydefaultfor'];
615 $code_sell_l=$return['code_l'];
616 $code_sell_p=$return['code_p'];
617 $code_sell_t=$return['code_t'];
618 }
619 //var_dump($return);
620
621 if (!empty($code_sell_p)) {
622 // Value was defined previously
623 } else {
624 $code_sell_p_notset = 'color:orange';
625 }
626 if (empty($code_sell_l) && empty($code_sell_p)) {
627 $code_sell_p_notset = 'color:red';
628 }
629 if ($suggestedaccountingaccountfor == 'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
630 $code_sell_p_notset = 'color:orange';
631 }
632
633 // $code_sell_l is now default code of product/service
634 // $code_sell_p is now code of product/service
635 // $code_sell_t is now code of thirdparty
636 //var_dump($code_sell_l.' - '.$code_sell_p.' - '.$code_sell_t.' -> '.$suggestedid.' ('.$suggestedaccountingaccountbydefaultfor.' '.$suggestedaccountingaccountfor.')');
637
638 print '<tr class="oddeven">';
639
640 // Line id
641 print '<td>'.$facture_static_det->id.'</td>';
642
643 // Ref Invoice
644 print '<td class="nowraponall">'.$facture_static->getNomUrl(1).'</td>';
645
646 print '<td class="center">'.dol_print_date($facture_static->date, 'day').'</td>';
647
648 // Ref Product
649 print '<td class="tdoverflowmax100">';
650 if ($product_static->id > 0) {
651 print $product_static->getNomUrl(1);
652 }
653 if ($product_static->label) {
654 print '<br><span class="opacitymedium small">'.dol_escape_htmltag($product_static->label).'</span>';
655 }
656 print '</td>';
657
658 // Description of line
659 print '<td class="tdoverflowonsmartphone small">';
660 $text = dolGetFirstLineOfText(dol_string_nohtmltag($facture_static_det->desc, 1));
661 $trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION) ? 32 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION;
662 print $form->textwithtooltip(dol_trunc($text, $trunclength), $facture_static_det->desc);
663 print '</td>';
664
665 // Amount
666 print '<td class="right nowraponall amount">';
667
668 // Create a compensation rate for old situation invoice feature.
669 $situation_ratio = 1;
670 if (getDolGlobalInt('INVOICE_USE_SITUATION') == 1) {
671 if ($objp->situation_cycle_ref) {
672 // Avoid divide by 0
673 if ($objp->situation_percent == 0) {
674 $situation_ratio = 0;
675 } else {
676 $line = new FactureLigne($db);
677 $line->fetch($objp->rowid);
678
679 // Situation invoices handling
680 $prev_progress = $line->get_prev_progress($objp->facid);
681
682 $situation_ratio = ($objp->situation_percent - $prev_progress) / $objp->situation_percent;
683 }
684 }
685 print price($objp->total_ht * $situation_ratio);
686 } else {
687 print price($objp->total_ht);
688 }
689 print '</td>';
690
691 // Vat rate
692 $code_vat_differ = '';
693 if ($product_static->tva_tx !== $facture_static_det->tva_tx && price2num($product_static->tva_tx) && price2num($facture_static_det->tva_tx)) { // Note: having a vat rate of 0 is often the normal case when sells is intra b2b or to export
694 $code_vat_differ = 'warning bold';
695 }
696 print '<td class="right'.($code_vat_differ?' '.$code_vat_differ:'').'">';
697 print vatrate($facture_static_det->tva_tx.($facture_static_det->vat_src_code ? ' ('.$facture_static_det->vat_src_code.')' : ''));
698 print '</td>';
699
700 // Thirdparty
701 print '<td class="tdoverflowmax100">'.$thirdpartystatic->getNomUrl(1, 'customer').'</td>';
702
703 // Country
704 $labelcountry = ($objp->country_code && ($langs->trans("Country".$objp->country_code) != "Country".$objp->country_code)) ? $langs->trans("Country".$objp->country_code) : $objp->country_label;
705 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labelcountry).'">';
706 print dol_escape_htmltag($labelcountry);
707 print '</td>';
708
709 // VAT Num
710 print '<td class="tdoverflowmax80" title="'.dol_escape_htmltag($objp->tva_intra).'">'.dol_escape_htmltag($objp->tva_intra).'</td>';
711
712 // Found accounts
713 print '<td class="small">';
714 // First show default account for any products
715 $s = '1. '.(($facture_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': ';
716 $shelp = ''; $ttype = 'help';
717 if ($suggestedaccountingaccountbydefaultfor == 'eec') {
718 $shelp .= $langs->trans("SaleEEC");
719 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithvat') {
720 $shelp = $langs->trans("SaleEECWithVAT");
721 } elseif ($suggestedaccountingaccountbydefaultfor == 'eecwithoutvatnumber') {
722 $shelp = $langs->trans("SaleEECWithoutVATNumber");
723 $ttype = 'warning';
724 } elseif ($suggestedaccountingaccountbydefaultfor == 'export') {
725 $shelp .= $langs->trans("SaleExport");
726 }
727 $s .= ($code_sell_l > 0 ? length_accountg($code_sell_l) : '<span style="'.$code_sell_p_notset.'">'.$langs->trans("NotDefined").'</span>');
728 print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
729 // Now show account for product
730 if ($product_static->id > 0) {
731 print '<br>';
732 $s = '2. '.(($facture_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
733 $shelp = ''; $ttype = 'help';
734 if ($suggestedaccountingaccountfor == 'eec') {
735 $shelp = $langs->trans("SaleEEC");
736 } elseif ($suggestedaccountingaccountfor == 'eecwithvat') {
737 $shelp = $langs->trans("SaleEECWithVAT");
738 } elseif ($suggestedaccountingaccountfor == 'eecwithoutvatnumber') {
739 $shelp = $langs->trans("SaleEECWithoutVATNumber");
740 $ttype = 'warning';
741 } elseif ($suggestedaccountingaccountfor == 'export') {
742 $shelp = $langs->trans("SaleExport");
743 }
744 $s .= (empty($code_sell_p) ? '<span style="'.$code_sell_p_notset.'">'.$langs->trans("NotDefined").'</span>' : length_accountg($code_sell_p));
745 print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
746 } else {
747 print '<br>';
748 $s = '2. '.(($objp->type_l == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
749 $shelp = '';
750 $s .= $langs->trans("NotDefined");
751 print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
752 }
753 if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) {
754 print '<br>';
755 $s = '3. '.(($facture_static_det->product_type == 1) ? $langs->trans("ServiceForThisThirdparty") : $langs->trans("ProductForThisThirdparty")).': ';
756 $shelp = '';
757 $s .= ($code_sell_t > 0 ? length_accountg($code_sell_t) : '<span style="'.$code_sell_t_notset.'">'.$langs->trans("NotDefined").'</span>');
758 print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
759 }
760 print '</td>';
761
762 // Suggested accounting account
763 print '<td>';
764 print $formaccounting->select_account(($default_account > 0 && $confirm === 'yes' && in_array($objp->rowid."_".$i, $toselect)) ? $default_account : $suggestedid, 'codeventil'.$facture_static_det->id, 1, array(), 0, 0, 'codeventil maxwidth150 maxwidthonsmartphone', 'cachewithshowemptyone');
765 print '</td>';
766
767 // Column with checkbox
768 print '<td class="center">';
769 $ischecked = 0;
770 if (!empty($suggestedid) && $suggestedaccountingaccountfor != '' && $suggestedaccountingaccountfor != 'eecwithoutvatnumber') {
771 $ischecked = 1;
772 }
773
774 if (!empty($toselect)) {
775 $ischecked = 0;
776 if (in_array($objp->rowid."_".$i, $toselect)) {
777 $ischecked=1;
778 }
779 }
780
781 print '<input type="checkbox" class="flat checkforselect checkforselect'.$facture_static_det->id.'" name="toselect[]" value="'.$facture_static_det->id."_".$i.'"'.($ischecked ? " checked" : "").'/>';
782 print '</td>';
783
784 print '</tr>';
785 $i++;
786 }
787 if ($num_lines == 0) {
788 print '<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
789 }
790
791 print '</table>';
792 print "</div>";
793
794 print '</form>';
795} else {
796 print $db->error();
797}
798if ($db->type == 'mysqli') {
799 $db->query("SET SQL_BIG_SELECTS=0"); // Enable MAX_JOIN_SIZE limitation
800}
801
802// Add code to auto check the box when we select an account
803print '<script type="text/javascript">
804jQuery(document).ready(function() {
805 jQuery(".codeventil").change(function() {
806 var s=$(this).attr("id").replace("codeventil", "")
807 console.log(s+" "+$(this).val());
808 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
809 else jQuery(".checkforselect"+s).prop("checked", true);
810 });
811});
812</script>';
813
814// End of page
815llxFooter();
816$db->close();
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:56
llxFooter()
Empty footer.
Definition wrapper.php:70
Class to manage accounting accounts.
Class to manage invoices.
const TYPE_REPLACEMENT
Replacement invoice.
const TYPE_SITUATION
Situation invoice.
const TYPE_DEPOSIT
Deposit invoice.
const TYPE_CREDIT_NOTE
Credit note invoice.
Class to manage invoice lines.
Class to manage generation of HTML components for accounting management.
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation de composants html autre Only common components are here.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
getCountriesInEEC()
Return list of countries that are inside the EEC (European Economic Community) Note: Try to keep this...
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formated for view output Used into pdf and HTML pages.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.