31require
'../../main.inc.php';
33require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formaccounting.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/core/lib/accounting.lib.php';
40require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
44$langs->loadLangs(array(
"bills",
"companies",
"compta",
"accountancy",
"other",
"productbatch",
"products"));
46$action =
GETPOST(
'action',
'aZ09');
47$massaction =
GETPOST(
'massaction',
'alpha');
48$confirm =
GETPOST(
'confirm',
'alpha');
49$toselect =
GETPOST(
'toselect',
'array');
50$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'accountancycustomerlist';
51$optioncss =
GETPOST(
'optioncss',
'alpha');
53$default_account =
GETPOSTINT(
'default_account');
56$mesCasesCochees =
GETPOST(
'toselect',
'array');
59$search_societe =
GETPOST(
'search_societe',
'alpha');
60$search_lineid =
GETPOST(
'search_lineid',
'alpha');
61$search_ref =
GETPOST(
'search_ref',
'alpha');
62$search_invoice =
GETPOST(
'search_invoice',
'alpha');
63$search_label =
GETPOST(
'search_label',
'alpha');
64$search_desc =
GETPOST(
'search_desc',
'alpha');
65$search_amount =
GETPOST(
'search_amount',
'alpha');
66$search_account =
GETPOST(
'search_account',
'alpha');
67$search_vat =
GETPOST(
'search_vat',
'alpha');
68$search_date_startday =
GETPOSTINT(
'search_date_startday');
69$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
70$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
71$search_date_endday =
GETPOSTINT(
'search_date_endday');
72$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
73$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
74$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
75$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
76$search_country =
GETPOST(
'search_country',
'aZ09');
77$search_tvaintra =
GETPOST(
'search_tvaintra',
'alpha');
86$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
87$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
89if (empty($page) || $page < 0) {
92$offset = $limit * $page;
96 $sortfield =
"f.datef, f.ref, l.rowid";
107$hookmanager->initHooks(array(
'accountancycustomerlist'));
115if (!isModEnabled(
'accounting')) {
118if ($user->socid > 0) {
121if (!$user->hasRight(
'accounting',
'bind',
'write')) {
130if (
GETPOST(
'cancel',
'alpha')) {
134if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
138$parameters = array();
139$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
144if (empty($reshook)) {
146 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
147 $search_societe =
'';
150 $search_invoice =
'';
154 $search_account =
'';
156 $search_date_startday =
'';
157 $search_date_startmonth =
'';
158 $search_date_startyear =
'';
159 $search_date_endday =
'';
160 $search_date_endmonth =
'';
161 $search_date_endyear =
'';
162 $search_date_start =
'';
163 $search_date_end =
'';
164 $search_country =
'';
165 $search_tvaintra =
'';
169 $objectclass =
'AccountingAccount';
170 $permissiontoread = $user->hasRight(
'accounting',
'read');
171 $permissiontodelete = $user->hasRight(
'accounting',
'delete');
172 $uploaddir = $conf->accounting->dir_output;
173 include DOL_DOCUMENT_ROOT.
'/core/actions_massactions.inc.php';
177if ($massaction ==
'ventil' && $user->hasRight(
'accounting',
'bind',
'write')) {
181 if (!empty($mesCasesCochees)) {
182 $msg =
'<div>'.$langs->trans(
"SelectedLines").
': '.count($mesCasesCochees).
'</div>';
183 $msg .=
'<div class="detail">';
188 foreach ($mesCasesCochees as $maLigneCochee) {
189 $maLigneCourante = explode(
"_", $maLigneCochee);
190 $monId = $maLigneCourante[0];
191 $monCompte =
GETPOST(
'codeventil'.$monId);
193 if ($monCompte <= 0) {
194 $msg .=
'<div><span style="color:red">'.$langs->trans(
"Lineofinvoice").
' '.$monId.
' - '.$langs->trans(
"NoAccountSelected").
'</span></div>';
197 $sql =
" UPDATE ".MAIN_DB_PREFIX.
"facturedet";
198 $sql .=
" SET fk_code_ventilation = ".((int) $monCompte);
199 $sql .=
" WHERE rowid = ".((int) $monId);
202 $accountventilated->fetch($monCompte,
'', 1);
204 dol_syslog(
"accountancy/customer/list.php", LOG_DEBUG);
205 if ($db->query($sql)) {
206 $msg .=
'<div><span style="color:green">'.$langs->trans(
"Lineofinvoice").
' '.$monId.
' - '.$langs->trans(
"VentilatedinAccount").
' : '.
length_accountg($accountventilated->account_number).
'</span></div>';
209 $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>';
217 $msg .=
'<div>'.$langs->trans(
"EndProcessing").
'</div>';
221if (
GETPOST(
'sortfield') ==
'f.datef, f.ref, l.rowid') {
222 $value = (
GETPOST(
'sortorder') ==
'asc,asc,asc' ? 0 : 1);
223 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
224 $res =
dolibarr_set_const($db,
"ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value,
'yesno', 0,
'', $conf->entity);
232$form =
new Form($db);
235$help_url =
'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilité_en_Partie_Double#Liaisons_comptables';
237llxHeader(
'', $langs->trans(
"CustomersVentilation"), $help_url,
'', 0, 0,
'',
'',
'',
'bodyforlist mod-accountancy accountancy-customer page-list');
239if (empty($chartaccountcode)) {
240 print $langs->trans(
"ErrorChartOfAccountSystemNotSelected");
248$sql =
"SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.situation_cycle_ref, f.fk_facture_source,";
249$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,";
250$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,";
252 $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,";
253 $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,";
255 $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,";
256 $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,";
258$sql .=
" p.tosell as status, p.tobuy as status_buy,";
259$sql .=
" aa.rowid as aarowid, aa2.rowid as aarowid_intra, aa3.rowid as aarowid_export, aa4.rowid as aarowid_thirdparty,";
260$sql .=
" co.code as country_code, co.label as country_label,";
261$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,";
263 $sql .=
" spe.accountancy_code_customer as code_compta_client,";
264 $sql .=
" spe.accountancy_code_supplier as code_compta_fournisseur,";
265 $sql .=
" spe.accountancy_code_sell as company_code_sell";
267 $sql .=
" s.code_compta as code_compta_client,";
268 $sql .=
" s.code_compta_fournisseur,";
269 $sql .=
" s.accountancy_code_sell as company_code_sell";
271$parameters = array();
272$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters);
273$sql .= $hookmanager->resPrint;
274$sql .=
" FROM ".MAIN_DB_PREFIX.
"facture as f";
275$sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = f.fk_soc";
277 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"societe_perentity as spe ON spe.fk_soc = s.rowid AND spe.entity = " . ((int) $conf->entity);
279$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_country as co ON co.rowid = s.fk_pays ";
280$sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"facturedet as l ON f.rowid = l.fk_facture";
281$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON p.rowid = l.fk_product";
283 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
285$alias_societe_perentity = !
getDolGlobalString(
'MAIN_COMPANY_PERENTITY_SHARED') ?
"s" :
"spe";
286$alias_product_perentity = !
getDolGlobalString(
'MAIN_PRODUCT_PERENTITY_SHARED') ?
"p" :
"ppe";
287$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;
288$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;
289$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;
290$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;
292$sql .=
" WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
293$sql .=
" AND l.product_type <= 2";
295if ($search_societe) {
301if (strlen(trim($search_invoice))) {
304if (strlen(trim($search_ref))) {
307if (strlen(trim($search_label))) {
310if (strlen(trim($search_desc))) {
313if (strlen(trim($search_amount))) {
316if (strlen(trim($search_account))) {
319if (strlen(trim($search_vat))) {
322if ($search_date_start) {
323 $sql .=
" AND f.datef >= '".$db->idate($search_date_start).
"'";
325if ($search_date_end) {
326 $sql .=
" AND f.datef <= '".$db->idate($search_date_end).
"'";
328if (strlen(trim($search_country))) {
330 $country_code_in_EEC = $country_code_in_EEC_without_me =
'';
331 foreach ($arrayofcode as $key => $value) {
332 $country_code_in_EEC .= ($country_code_in_EEC ?
"," :
"").
"'".$value.
"'";
333 if ($value != $mysoc->country_code) {
334 $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ?
"," :
"").
"'".$value.
"'";
337 if ($search_country ==
'special_allnotme') {
338 $sql .=
" AND co.code <> '".$db->escape($mysoc->country_code).
"'";
339 } elseif ($search_country ==
'special_eec') {
340 $sql .=
" AND co.code IN (".$db->sanitize($country_code_in_EEC, 1).
")";
341 } elseif ($search_country ==
'special_eecnotme') {
342 $sql .=
" AND co.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).
")";
343 } elseif ($search_country ==
'special_noteec') {
344 $sql .=
" AND co.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).
")";
349if (strlen(trim($search_tvaintra))) {
357$sql .=
" AND f.entity IN (".getEntity(
'invoice', 0).
")";
360$parameters = array();
361$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
362$sql .= $hookmanager->resPrint;
364$sql .= $db->order($sortfield, $sortorder);
367$nbtotalofrecords =
'';
369 $result = $db->query($sql);
370 $nbtotalofrecords = $db->num_rows($result);
371 if (($page * $limit) > $nbtotalofrecords) {
377$sql .= $db->plimit($limit + 1, $offset);
379dol_syslog(
"accountancy/customer/list.php", LOG_DEBUG);
382if ($db->type ==
'mysqli') {
383 $db->query(
"SET SQL_BIG_SELECTS=1");
386$result = $db->query($sql);
388 $num_lines = $db->num_rows($result);
391 $arrayofselected = is_array($toselect) ? $toselect : array();
394 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
395 $param .=
'&contextpage='.urlencode($contextpage);
397 if ($limit > 0 && $limit != $conf->liste_limit) {
398 $param .=
'&limit='.((int) $limit);
400 if ($search_societe) {
401 $param .=
'&search_societe='.urlencode($search_societe);
403 if ($search_lineid) {
404 $param .=
'&search_lineid='.urlencode((
string) ($search_lineid));
406 if ($search_date_startday) {
407 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
409 if ($search_date_startmonth) {
410 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
412 if ($search_date_startyear) {
413 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
415 if ($search_date_endday) {
416 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
418 if ($search_date_endmonth) {
419 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
421 if ($search_date_endyear) {
422 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
424 if ($search_invoice) {
425 $param .=
'&search_invoice='.urlencode($search_invoice);
428 $param .=
'&search_ref='.urlencode($search_ref);
431 $param .=
'&search_label='.urlencode($search_label);
434 $param .=
'&search_desc='.urlencode($search_desc);
436 if ($search_amount) {
437 $param .=
'&search_amount='.urlencode($search_amount);
440 $param .=
'&search_vat='.urlencode($search_vat);
442 if ($search_country) {
443 $param .=
"&search_country=".urlencode($search_country);
445 if ($search_tvaintra) {
446 $param .=
"&search_tvaintra=".urlencode($search_tvaintra);
449 $arrayofmassactions = array(
450 'set_default_account' =>
img_picto(
'',
'check',
'class="pictofixedwidth"').$langs->trans(
"ConfirmPreselectAccount"),
451 'ventil' =>
img_picto(
'',
'check',
'class="pictofixedwidth"').$langs->trans(
"Ventilate")
457 $massactionbutton =
'';
458 if ($massaction !==
'set_default_account') {
459 $massactionbutton = $form->selectMassAction(
'ventil', $arrayofmassactions, 1);
462 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="post">'.
"\n";
463 print
'<input type="hidden" name="action" value="ventil">';
464 if ($optioncss !=
'') {
465 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
467 print
'<input type="hidden" name="token" value="'.newToken().
'">';
468 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
469 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
470 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
471 print
'<input type="hidden" name="page" value="'.$page.
'">';
474 print_barre_liste($langs->trans(
"InvoiceLines").
'<br><span class="opacitymedium small">'.$langs->trans(
"DescVentilTodoCustomer").
'</span>', $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords,
'title_accountancy', 0,
'',
'', $limit, 0, 0, 1);
476 if ($massaction ==
'set_default_account') {
477 $formquestion = array();
478 $formquestion[] = array(
'type' =>
'other',
479 'name' =>
'set_default_account',
480 'label' => $langs->trans(
"AccountancyCode"),
481 'value' => $formaccounting->select_account(
'',
'default_account', 1, array(), 0, 0,
'maxwidth200 maxwidthonsmartphone',
'cachewithshowemptyone'));
482 print $form->formconfirm($_SERVER[
"PHP_SELF"], $langs->trans(
"ConfirmPreselectAccount"), $langs->trans(
"ConfirmPreselectAccountQuestion", count($toselect)),
"confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
491 print
'<div class="div-table-responsive">';
492 print
'<table class="tagtable liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
495 print
'<tr class="liste_titre_filter">';
496 print
'<td class="liste_titre"><input type="text" class="flat maxwidth25" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).
'"></td>';
497 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_invoice" value="'.dol_escape_htmltag($search_invoice).
'"></td>';
498 print
'<td class="liste_titre center">';
499 print
'<div class="nowrapfordate">';
500 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
502 print
'<div class="nowrapfordate">';
503 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
506 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_ref" value="'.dol_escape_htmltag($search_ref).
'"></td>';
507 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_desc" value="'.dol_escape_htmltag($search_desc).
'"></td>';
508 print
'<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).
'"></td>';
509 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>';
510 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75imp" name="search_societe" value="'.dol_escape_htmltag($search_societe).
'"></td>';
511 print
'<td class="liste_titre">';
512 print $form->select_country($search_country,
'search_country',
'', 0,
'maxwidth100',
'code2', 1, 0, 1);
515 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_tvaintra" value="'.dol_escape_htmltag($search_tvaintra).
'"></td>';
516 print
'<td class="liste_titre"></td>';
517 print
'<td class="liste_titre"></td>';
518 print
'<td class="center liste_titre">';
519 $searchpicto = $form->showFilterButtons();
524 print
'<tr class="liste_titre">';
527 print_liste_field_titre(
"Date", $_SERVER[
"PHP_SELF"],
"f.datef, f.ref, l.rowid",
"", $param,
'', $sortfield, $sortorder,
'center ');
530 print_liste_field_titre(
"ProductDescription", $_SERVER[
"PHP_SELF"],
"l.description",
"", $param,
'', $sortfield, $sortorder);
531 print_liste_field_titre(
"Amount", $_SERVER[
"PHP_SELF"],
"l.total_ht",
"", $param,
'', $sortfield, $sortorder,
'right maxwidth50 ');
532 print_liste_field_titre(
"VATRate", $_SERVER[
"PHP_SELF"],
"l.tva_tx",
"", $param,
'', $sortfield, $sortorder,
'right ',
'', 1);
535 print_liste_field_titre(
"VATIntraShort", $_SERVER[
"PHP_SELF"],
"s.tva_intra",
"", $param,
'', $sortfield, $sortorder);
539 if ($massactionbutton) {
540 $checkpicto = $form->showCheckAddButtons(
'checkforselect', 1);
545 $thirdpartystatic =
new Societe($db);
546 $facture_static =
new Facture($db);
548 $product_static =
new Product($db);
551 $accountingaccount_codetotid_cache = array();
552 $suggestedaccountingaccountfor =
'';
553 $suggestedaccountingaccountbydefaultfor =
'';
555 while ($i < min($num_lines, $limit)) {
556 $objp = $db->fetch_object($result);
565 $thirdpartystatic->id = $objp->socid;
566 $thirdpartystatic->name = $objp->name;
567 $thirdpartystatic->client = $objp->client;
568 $thirdpartystatic->fournisseur = $objp->fournisseur;
569 $thirdpartystatic->code_client = $objp->code_client;
570 $thirdpartystatic->code_compta = $objp->code_compta_client;
571 $thirdpartystatic->code_compta_client = $objp->code_compta_client;
572 $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
573 $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
574 $thirdpartystatic->email = $objp->email;
575 $thirdpartystatic->country_code = $objp->country_code;
576 $thirdpartystatic->tva_intra = $objp->tva_intra;
577 $thirdpartystatic->code_compta_product = $objp->company_code_sell;
579 $product_static->ref = $objp->product_ref;
580 $product_static->id = $objp->product_id;
581 $product_static->type = $objp->type;
582 $product_static->label = $objp->product_label;
583 $product_static->status = $objp->status;
584 $product_static->status_buy = $objp->status_buy;
585 $product_static->accountancy_code_sell = $objp->code_sell;
586 $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
587 $product_static->accountancy_code_sell_export = $objp->code_sell_export;
588 $product_static->accountancy_code_buy = $objp->code_buy;
589 $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
590 $product_static->accountancy_code_buy_export = $objp->code_buy_export;
591 $product_static->tva_tx = $objp->tva_tx_prod;
593 $facture_static->ref = $objp->ref;
594 $facture_static->id = $objp->facid;
595 $facture_static->type = $objp->ftype;
596 $facture_static->date = $db->jdate($objp->datef);
597 $facture_static->fk_facture_source = $objp->fk_facture_source;
599 $facture_static_det->id = $objp->rowid;
600 $facture_static_det->total_ht = $objp->total_ht;
601 $facture_static_det->tva_tx = $objp->tva_tx_line;
602 $facture_static_det->vat_src_code = $objp->vat_src_code;
603 $facture_static_det->product_type = $objp->type_l;
604 $facture_static_det->desc = $objp->description;
606 $accountingAccountArray = array(
607 'dom' => $objp->aarowid,
608 'intra' => $objp->aarowid_intra,
609 'export' => $objp->aarowid_export,
610 'thirdparty' => $objp->aarowid_thirdparty);
612 $code_sell_p_notset =
'';
613 $code_sell_t_notset =
'';
617 $return = $accountingAccount->getAccountingCodeToBind($thirdpartystatic, $mysoc, $product_static, $facture_static, $facture_static_det, $accountingAccountArray,
'customer');
618 if (!is_array($return) && $return < 0) {
621 $suggestedid = $return[
'suggestedid'];
622 $suggestedaccountingaccountfor = $return[
'suggestedaccountingaccountfor'];
623 $suggestedaccountingaccountbydefaultfor = $return[
'suggestedaccountingaccountbydefaultfor'];
624 $code_sell_l = $return[
'code_l'];
625 $code_sell_p = $return[
'code_p'];
626 $code_sell_t = $return[
'code_t'];
630 if (!empty($code_sell_p)) {
633 $code_sell_p_notset =
'color:orange';
635 if (empty($code_sell_l) && empty($code_sell_p)) {
636 $code_sell_p_notset =
'color:red';
638 if ($suggestedaccountingaccountfor ==
'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
639 $code_sell_p_notset =
'color:orange';
647 print
'<tr class="oddeven">';
650 print
'<td>'.$facture_static_det->id.
'</td>';
653 print
'<td class="nowraponall">'.$facture_static->getNomUrl(1).
'</td>';
655 print
'<td class="center">'.dol_print_date($facture_static->date,
'day').
'</td>';
658 print
'<td class="tdoverflowmax100">';
659 if ($product_static->id > 0) {
660 print $product_static->getNomUrl(1);
662 if ($product_static->label) {
663 print
'<br><span class="opacitymedium small">'.dol_escape_htmltag($product_static->label).
'</span>';
669 print
'<td class="tdoverflowmax150 small classfortooltip" title="'.dol_escape_htmltag($text).
'">';
675 print
'<td class="right nowraponall amount">';
678 $situation_ratio = 1;
680 if ($objp->situation_cycle_ref) {
682 if ($objp->situation_percent == 0) {
683 $situation_ratio = 0;
686 $line->fetch($objp->rowid);
689 $prev_progress = $line->get_prev_progress($objp->facid);
691 $situation_ratio = ($objp->situation_percent - $prev_progress) / $objp->situation_percent;
694 print
price($objp->total_ht * $situation_ratio);
696 print
price($objp->total_ht);
701 $code_vat_differ =
'';
702 if ($product_static->tva_tx !== $facture_static_det->tva_tx &&
price2num($product_static->tva_tx) &&
price2num($facture_static_det->tva_tx)) {
703 $code_vat_differ =
'warning bold';
705 print
'<td class="right'.($code_vat_differ ?
' '.$code_vat_differ :
'').
'">';
706 print
vatrate($facture_static_det->tva_tx.($facture_static_det->vat_src_code ?
' ('.$facture_static_det->vat_src_code.
')' :
''));
710 print
'<td class="tdoverflowmax100">'.$thirdpartystatic->getNomUrl(1,
'customer').
'</td>';
713 $labelcountry = ($objp->country_code && ($langs->trans(
"Country".$objp->country_code) !=
"Country".$objp->country_code)) ? $langs->trans(
"Country".$objp->country_code) : $objp->country_label;
714 print
'<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labelcountry).
'">';
719 print
'<td class="tdoverflowmax80" title="'.dol_escape_htmltag($objp->tva_intra).
'">'.
dol_escape_htmltag($objp->tva_intra).
'</td>';
722 print
'<td class="small">';
724 $s =
'1. '.(($facture_static_det->product_type == 1) ? $langs->trans(
"DefaultForService") : $langs->trans(
"DefaultForProduct")).
': ';
727 if ($suggestedaccountingaccountbydefaultfor ==
'eec') {
728 $shelp .= $langs->trans(
"SaleEEC");
729 } elseif ($suggestedaccountingaccountbydefaultfor ==
'eecwithvat') {
730 $shelp = $langs->trans(
"SaleEECWithVAT");
731 } elseif ($suggestedaccountingaccountbydefaultfor ==
'eecwithoutvatnumber') {
732 $shelp = $langs->trans(
"SaleEECWithoutVATNumber");
734 } elseif ($suggestedaccountingaccountbydefaultfor ==
'export') {
735 $shelp .= $langs->trans(
"SaleExport");
737 $s .= ($code_sell_l > 0 ?
length_accountg($code_sell_l) :
'<span style="'.$code_sell_p_notset.
'">'.$langs->trans(
"NotDefined").
'</span>');
738 print $form->textwithpicto($s, $shelp, 1, $ttype,
'', 0, 2,
'', 1);
740 if ($product_static->id > 0) {
742 $s =
'2. '.(($facture_static_det->product_type == 1) ? $langs->trans(
"ThisService") : $langs->trans(
"ThisProduct")).
': ';
745 if ($suggestedaccountingaccountfor ==
'eec') {
746 $shelp = $langs->trans(
"SaleEEC");
747 } elseif ($suggestedaccountingaccountfor ==
'eecwithvat') {
748 $shelp = $langs->trans(
"SaleEECWithVAT");
749 } elseif ($suggestedaccountingaccountfor ==
'eecwithoutvatnumber') {
750 $shelp = $langs->trans(
"SaleEECWithoutVATNumber");
752 } elseif ($suggestedaccountingaccountfor ==
'export') {
753 $shelp = $langs->trans(
"SaleExport");
755 $s .= (empty($code_sell_p) ?
'<span style="'.$code_sell_p_notset.
'">'.$langs->trans(
"NotDefined").
'</span>' :
length_accountg($code_sell_p));
756 print $form->textwithpicto($s, $shelp, 1, $ttype,
'', 0, 2,
'', 1);
759 $s =
'2. '.(($objp->type_l == 1) ? $langs->trans(
"ThisService") : $langs->trans(
"ThisProduct")).
': ';
761 $s .= $langs->trans(
"NotDefined");
762 print $form->textwithpicto($s, $shelp, 1,
'help',
'', 0, 2,
'', 1);
766 $s =
'3. '.(($facture_static_det->product_type == 1) ? $langs->trans(
"ServiceForThisThirdparty") : $langs->trans(
"ProductForThisThirdparty")).
': ';
768 $s .= ($code_sell_t > 0 ?
length_accountg($code_sell_t) :
'<span style="'.$code_sell_t_notset.
'">'.$langs->trans(
"NotDefined").
'</span>');
769 print $form->textwithpicto($s, $shelp, 1,
'help',
'', 0, 2,
'', 1);
775 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');
779 print
'<td class="center">';
781 if (!empty($suggestedid) && $suggestedaccountingaccountfor !=
'' && $suggestedaccountingaccountfor !=
'eecwithoutvatnumber') {
785 if (!empty($toselect)) {
787 if (in_array($objp->rowid.
"_".$i, $toselect)) {
792 print
'<input type="checkbox" class="flat checkforselect checkforselect'.$facture_static_det->id.
'" name="toselect[]" value="'.$facture_static_det->id.
"_".$i.
'"'.($ischecked ?
" checked" :
"").
'/>';
798 if ($num_lines == 0) {
799 print
'<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
809if ($db->type ==
'mysqli') {
810 $db->query(
"SET SQL_BIG_SELECTS=0");
814print
'<script type="text/javascript">
815jQuery(document).ready(function() {
816 jQuery(".codeventil").change(function() {
817 var s=$(this).attr("id").replace("codeventil", "")
818 console.log(s+" "+$(this).val());
819 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
820 else jQuery(".checkforselect"+s).prop("checked", true);
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($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
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 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 information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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 '.
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...
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
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 a Dolibarr global constant int value.
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.
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.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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.