29require
'../../main.inc.php';
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';
42$langs->loadLangs(array(
"bills",
"companies",
"compta",
"accountancy",
"other",
"productbatch",
"products"));
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';
49$optioncss =
GETPOST(
'optioncss',
'alpha');
51$default_account =
GETPOSTINT(
'default_account');
54$mesCasesCochees =
GETPOST(
'toselect',
'array');
57$search_societe =
GETPOST(
'search_societe',
'alpha');
58$search_lineid =
GETPOST(
'search_lineid',
'alpha');
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 =
GETPOSTINT(
'search_date_startday');
67$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
68$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
69$search_date_endday =
GETPOSTINT(
'search_date_endday');
70$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
71$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
72$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
73$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
74$search_country =
GETPOST(
'search_country',
'aZ09');
75$search_tvaintra =
GETPOST(
'search_tvaintra',
'alpha');
84$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
85$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
87if (empty($page) || $page < 0) {
90$offset = $limit * $page;
94 $sortfield =
"f.datef, f.ref, l.rowid";
105$hookmanager->initHooks(array(
'accountancycustomerlist'));
113if (!isModEnabled(
'accounting')) {
116if ($user->socid > 0) {
119if (!$user->hasRight(
'accounting',
'bind',
'write')) {
128if (
GETPOST(
'cancel',
'alpha')) {
132if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
136$parameters = array();
137$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
142if (empty($reshook)) {
144 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
145 $search_societe =
'';
148 $search_invoice =
'';
152 $search_account =
'';
154 $search_date_startday =
'';
155 $search_date_startmonth =
'';
156 $search_date_startyear =
'';
157 $search_date_endday =
'';
158 $search_date_endmonth =
'';
159 $search_date_endyear =
'';
160 $search_date_start =
'';
161 $search_date_end =
'';
162 $search_country =
'';
163 $search_tvaintra =
'';
167 $objectclass =
'AccountingAccount';
168 $permissiontoread = $user->hasRight(
'accounting',
'read');
169 $permissiontodelete = $user->hasRight(
'accounting',
'delete');
170 $uploaddir = $conf->accounting->dir_output;
171 include DOL_DOCUMENT_ROOT.
'/core/actions_massactions.inc.php';
175if ($massaction ==
'ventil' && $user->hasRight(
'accounting',
'bind',
'write')) {
179 if (!empty($mesCasesCochees)) {
180 $msg =
'<div>'.$langs->trans(
"SelectedLines").
': '.count($mesCasesCochees).
'</div>';
181 $msg .=
'<div class="detail">';
186 foreach ($mesCasesCochees as $maLigneCochee) {
187 $maLigneCourante = explode(
"_", $maLigneCochee);
188 $monId = $maLigneCourante[0];
189 $monCompte =
GETPOST(
'codeventil'.$monId);
191 if ($monCompte <= 0) {
192 $msg .=
'<div><span style="color:red">'.$langs->trans(
"Lineofinvoice").
' '.$monId.
' - '.$langs->trans(
"NoAccountSelected").
'</span></div>';
195 $sql =
" UPDATE ".MAIN_DB_PREFIX.
"facturedet";
196 $sql .=
" SET fk_code_ventilation = ".((int) $monCompte);
197 $sql .=
" WHERE rowid = ".((int) $monId);
200 $accountventilated->fetch($monCompte,
'', 1);
202 dol_syslog(
"accountancy/customer/list.php", LOG_DEBUG);
203 if ($db->query($sql)) {
204 $msg .=
'<div><span style="color:green">'.$langs->trans(
"Lineofinvoice").
' '.$monId.
' - '.$langs->trans(
"VentilatedinAccount").
' : '.
length_accountg($accountventilated->account_number).
'</span></div>';
207 $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>';
215 $msg .=
'<div>'.$langs->trans(
"EndProcessing").
'</div>';
219if (
GETPOST(
'sortfield') ==
'f.datef, f.ref, l.rowid') {
220 $value = (
GETPOST(
'sortorder') ==
'asc,asc,asc' ? 0 : 1);
221 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
222 $res =
dolibarr_set_const($db,
"ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value,
'yesno', 0,
'', $conf->entity);
230$form =
new Form($db);
233$help_url =
'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilité_en_Partie_Double#Liaisons_comptables';
235llxHeader(
'', $langs->trans(
"CustomersVentilation"), $help_url,
'', 0, 0,
'',
'',
'',
'bodyforlist mod-accountancy accountancy-customer page-list');
237if (empty($chartaccountcode)) {
238 print $langs->trans(
"ErrorChartOfAccountSystemNotSelected");
246$sql =
"SELECT f.rowid as facid, f.ref, f.datef, f.type as ftype, f.situation_cycle_ref, f.fk_facture_source,";
247$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,";
248$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,";
250 $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,";
251 $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,";
253 $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,";
254 $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,";
256$sql .=
" p.tosell as status, p.tobuy as status_buy,";
257$sql .=
" aa.rowid as aarowid, aa2.rowid as aarowid_intra, aa3.rowid as aarowid_export, aa4.rowid as aarowid_thirdparty,";
258$sql .=
" co.code as country_code, co.label as country_label,";
259$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,";
261 $sql .=
" spe.accountancy_code_customer as code_compta_client,";
262 $sql .=
" spe.accountancy_code_supplier as code_compta_fournisseur,";
263 $sql .=
" spe.accountancy_code_sell as company_code_sell";
265 $sql .=
" s.code_compta as code_compta_client,";
266 $sql .=
" s.code_compta_fournisseur,";
267 $sql .=
" s.accountancy_code_sell as company_code_sell";
269$parameters = array();
270$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters);
271$sql .= $hookmanager->resPrint;
272$sql .=
" FROM ".MAIN_DB_PREFIX.
"facture as f";
273$sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = f.fk_soc";
275 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"societe_perentity as spe ON spe.fk_soc = s.rowid AND spe.entity = " . ((int) $conf->entity);
277$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_country as co ON co.rowid = s.fk_pays ";
278$sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"facturedet as l ON f.rowid = l.fk_facture";
279$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON p.rowid = l.fk_product";
281 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
283$alias_societe_perentity = !
getDolGlobalString(
'MAIN_COMPANY_PERENTITY_SHARED') ?
"s" :
"spe";
284$alias_product_perentity = !
getDolGlobalString(
'MAIN_PRODUCT_PERENTITY_SHARED') ?
"p" :
"ppe";
285$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;
286$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;
287$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;
288$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;
290$sql .=
" WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
291$sql .=
" AND l.product_type <= 2";
293if ($search_societe) {
299if (strlen(trim($search_invoice))) {
302if (strlen(trim($search_ref))) {
305if (strlen(trim($search_label))) {
308if (strlen(trim($search_desc))) {
311if (strlen(trim($search_amount))) {
314if (strlen(trim($search_account))) {
317if (strlen(trim($search_vat))) {
320if ($search_date_start) {
321 $sql .=
" AND f.datef >= '".$db->idate($search_date_start).
"'";
323if ($search_date_end) {
324 $sql .=
" AND f.datef <= '".$db->idate($search_date_end).
"'";
326if (strlen(trim($search_country))) {
328 $country_code_in_EEC = $country_code_in_EEC_without_me =
'';
329 foreach ($arrayofcode as $key => $value) {
330 $country_code_in_EEC .= ($country_code_in_EEC ?
"," :
"").
"'".$value.
"'";
331 if ($value != $mysoc->country_code) {
332 $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ?
"," :
"").
"'".$value.
"'";
335 if ($search_country ==
'special_allnotme') {
336 $sql .=
" AND co.code <> '".$db->escape($mysoc->country_code).
"'";
337 } elseif ($search_country ==
'special_eec') {
338 $sql .=
" AND co.code IN (".$db->sanitize($country_code_in_EEC, 1).
")";
339 } elseif ($search_country ==
'special_eecnotme') {
340 $sql .=
" AND co.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).
")";
341 } elseif ($search_country ==
'special_noteec') {
342 $sql .=
" AND co.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).
")";
347if (strlen(trim($search_tvaintra))) {
355$sql .=
" AND f.entity IN (".getEntity(
'invoice', 0).
")";
358$parameters = array();
359$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
360$sql .= $hookmanager->resPrint;
362$sql .= $db->order($sortfield, $sortorder);
365$nbtotalofrecords =
'';
367 $result = $db->query($sql);
368 $nbtotalofrecords = $db->num_rows($result);
369 if (($page * $limit) > $nbtotalofrecords) {
375$sql .= $db->plimit($limit + 1, $offset);
377dol_syslog(
"accountancy/customer/list.php", LOG_DEBUG);
380if ($db->type ==
'mysqli') {
381 $db->query(
"SET SQL_BIG_SELECTS=1");
384$result = $db->query($sql);
386 $num_lines = $db->num_rows($result);
389 $arrayofselected = is_array($toselect) ? $toselect : array();
392 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
393 $param .=
'&contextpage='.urlencode($contextpage);
395 if ($limit > 0 && $limit != $conf->liste_limit) {
396 $param .=
'&limit='.((int) $limit);
398 if ($search_societe) {
399 $param .=
'&search_societe='.urlencode($search_societe);
401 if ($search_lineid) {
402 $param .=
'&search_lineid='.urlencode((
string) ($search_lineid));
404 if ($search_date_startday) {
405 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
407 if ($search_date_startmonth) {
408 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
410 if ($search_date_startyear) {
411 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
413 if ($search_date_endday) {
414 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
416 if ($search_date_endmonth) {
417 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
419 if ($search_date_endyear) {
420 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
422 if ($search_invoice) {
423 $param .=
'&search_invoice='.urlencode($search_invoice);
426 $param .=
'&search_ref='.urlencode($search_ref);
429 $param .=
'&search_label='.urlencode($search_label);
432 $param .=
'&search_desc='.urlencode($search_desc);
434 if ($search_amount) {
435 $param .=
'&search_amount='.urlencode($search_amount);
438 $param .=
'&search_vat='.urlencode($search_vat);
440 if ($search_country) {
441 $param .=
"&search_country=".urlencode($search_country);
443 if ($search_tvaintra) {
444 $param .=
"&search_tvaintra=".urlencode($search_tvaintra);
447 $arrayofmassactions = array(
448 'set_default_account' =>
img_picto(
'',
'check',
'class="pictofixedwidth"').$langs->trans(
"ConfirmPreselectAccount"),
449 'ventil' =>
img_picto(
'',
'check',
'class="pictofixedwidth"').$langs->trans(
"Ventilate")
455 $massactionbutton =
'';
456 if ($massaction !==
'set_default_account') {
457 $massactionbutton = $form->selectMassAction(
'ventil', $arrayofmassactions, 1);
460 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="post">'.
"\n";
461 print
'<input type="hidden" name="action" value="ventil">';
462 if ($optioncss !=
'') {
463 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
465 print
'<input type="hidden" name="token" value="'.newToken().
'">';
466 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
467 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
468 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
469 print
'<input type="hidden" name="page" value="'.$page.
'">';
472 print_barre_liste($langs->trans(
"InvoiceLines"), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords,
'title_accountancy', 0,
'',
'', $limit);
474 if ($massaction ==
'set_default_account') {
475 $formquestion = array();
476 $formquestion[] = array(
'type' =>
'other',
477 'name' =>
'set_default_account',
478 'label' => $langs->trans(
"AccountancyCode"),
479 'value' => $formaccounting->select_account(
'',
'default_account', 1, array(), 0, 0,
'maxwidth200 maxwidthonsmartphone',
'cachewithshowemptyone'));
480 print $form->formconfirm($_SERVER[
"PHP_SELF"], $langs->trans(
"ConfirmPreselectAccount"), $langs->trans(
"ConfirmPreselectAccountQuestion", count($toselect)),
"confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
483 print
'<span class="opacitymedium">'.$langs->trans(
"DescVentilTodoCustomer").
'</span></br><br>';
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();
553 while ($i < min($num_lines, $limit)) {
554 $objp = $db->fetch_object($result);
563 $thirdpartystatic->id = $objp->socid;
564 $thirdpartystatic->name = $objp->name;
565 $thirdpartystatic->client = $objp->client;
566 $thirdpartystatic->fournisseur = $objp->fournisseur;
567 $thirdpartystatic->code_client = $objp->code_client;
568 $thirdpartystatic->code_compta = $objp->code_compta_client;
569 $thirdpartystatic->code_compta_client = $objp->code_compta_client;
570 $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
571 $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
572 $thirdpartystatic->email = $objp->email;
573 $thirdpartystatic->country_code = $objp->country_code;
574 $thirdpartystatic->tva_intra = $objp->tva_intra;
575 $thirdpartystatic->code_compta_product = $objp->company_code_sell;
577 $product_static->ref = $objp->product_ref;
578 $product_static->id = $objp->product_id;
579 $product_static->type = $objp->type;
580 $product_static->label = $objp->product_label;
581 $product_static->status = $objp->status;
582 $product_static->status_buy = $objp->status_buy;
583 $product_static->accountancy_code_sell = $objp->code_sell;
584 $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
585 $product_static->accountancy_code_sell_export = $objp->code_sell_export;
586 $product_static->accountancy_code_buy = $objp->code_buy;
587 $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
588 $product_static->accountancy_code_buy_export = $objp->code_buy_export;
589 $product_static->tva_tx = $objp->tva_tx_prod;
591 $facture_static->ref = $objp->ref;
592 $facture_static->id = $objp->facid;
593 $facture_static->type = $objp->ftype;
594 $facture_static->date = $db->jdate($objp->datef);
595 $facture_static->fk_facture_source = $objp->fk_facture_source;
597 $facture_static_det->id = $objp->rowid;
598 $facture_static_det->total_ht = $objp->total_ht;
599 $facture_static_det->tva_tx = $objp->tva_tx_line;
600 $facture_static_det->vat_src_code = $objp->vat_src_code;
601 $facture_static_det->product_type = $objp->type_l;
602 $facture_static_det->desc = $objp->description;
604 $accountingAccountArray = array(
605 'dom' => $objp->aarowid,
606 'intra' => $objp->aarowid_intra,
607 'export' => $objp->aarowid_export,
608 'thirdparty' => $objp->aarowid_thirdparty);
610 $code_sell_p_notset =
'';
611 $code_sell_t_notset =
'';
615 $return = $accountingAccount->getAccountingCodeToBind($thirdpartystatic, $mysoc, $product_static, $facture_static, $facture_static_det, $accountingAccountArray,
'customer');
616 if (!is_array($return) && $return < 0) {
619 $suggestedid = $return[
'suggestedid'];
620 $suggestedaccountingaccountfor = $return[
'suggestedaccountingaccountfor'];
621 $suggestedaccountingaccountbydefaultfor = $return[
'suggestedaccountingaccountbydefaultfor'];
622 $code_sell_l = $return[
'code_l'];
623 $code_sell_p = $return[
'code_p'];
624 $code_sell_t = $return[
'code_t'];
628 if (!empty($code_sell_p)) {
631 $code_sell_p_notset =
'color:orange';
633 if (empty($code_sell_l) && empty($code_sell_p)) {
634 $code_sell_p_notset =
'color:red';
636 if ($suggestedaccountingaccountfor ==
'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
637 $code_sell_p_notset =
'color:orange';
645 print
'<tr class="oddeven">';
648 print
'<td>'.$facture_static_det->id.
'</td>';
651 print
'<td class="nowraponall">'.$facture_static->getNomUrl(1).
'</td>';
653 print
'<td class="center">'.dol_print_date($facture_static->date,
'day').
'</td>';
656 print
'<td class="tdoverflowmax100">';
657 if ($product_static->id > 0) {
658 print $product_static->getNomUrl(1);
660 if ($product_static->label) {
661 print
'<br><span class="opacitymedium small">'.dol_escape_htmltag($product_static->label).
'</span>';
667 print
'<td class="tdoverflowmax150 small classfortooltip" title="'.dol_escape_htmltag($text).
'">';
673 print
'<td class="right nowraponall amount">';
676 $situation_ratio = 1;
678 if ($objp->situation_cycle_ref) {
680 if ($objp->situation_percent == 0) {
681 $situation_ratio = 0;
684 $line->fetch($objp->rowid);
687 $prev_progress = $line->get_prev_progress($objp->facid);
689 $situation_ratio = ($objp->situation_percent - $prev_progress) / $objp->situation_percent;
692 print
price($objp->total_ht * $situation_ratio);
694 print
price($objp->total_ht);
699 $code_vat_differ =
'';
700 if ($product_static->tva_tx !== $facture_static_det->tva_tx &&
price2num($product_static->tva_tx) &&
price2num($facture_static_det->tva_tx)) {
701 $code_vat_differ =
'warning bold';
703 print
'<td class="right'.($code_vat_differ ?
' '.$code_vat_differ :
'').
'">';
704 print
vatrate($facture_static_det->tva_tx.($facture_static_det->vat_src_code ?
' ('.$facture_static_det->vat_src_code.
')' :
''));
708 print
'<td class="tdoverflowmax100">'.$thirdpartystatic->getNomUrl(1,
'customer').
'</td>';
711 $labelcountry = ($objp->country_code && ($langs->trans(
"Country".$objp->country_code) !=
"Country".$objp->country_code)) ? $langs->trans(
"Country".$objp->country_code) : $objp->country_label;
712 print
'<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labelcountry).
'">';
717 print
'<td class="tdoverflowmax80" title="'.dol_escape_htmltag($objp->tva_intra).
'">'.
dol_escape_htmltag($objp->tva_intra).
'</td>';
720 print
'<td class="small">';
722 $s =
'1. '.(($facture_static_det->product_type == 1) ? $langs->trans(
"DefaultForService") : $langs->trans(
"DefaultForProduct")).
': ';
725 if ($suggestedaccountingaccountbydefaultfor ==
'eec') {
726 $shelp .= $langs->trans(
"SaleEEC");
727 } elseif ($suggestedaccountingaccountbydefaultfor ==
'eecwithvat') {
728 $shelp = $langs->trans(
"SaleEECWithVAT");
729 } elseif ($suggestedaccountingaccountbydefaultfor ==
'eecwithoutvatnumber') {
730 $shelp = $langs->trans(
"SaleEECWithoutVATNumber");
732 } elseif ($suggestedaccountingaccountbydefaultfor ==
'export') {
733 $shelp .= $langs->trans(
"SaleExport");
735 $s .= ($code_sell_l > 0 ?
length_accountg($code_sell_l) :
'<span style="'.$code_sell_p_notset.
'">'.$langs->trans(
"NotDefined").
'</span>');
736 print $form->textwithpicto($s, $shelp, 1, $ttype,
'', 0, 2,
'', 1);
738 if ($product_static->id > 0) {
740 $s =
'2. '.(($facture_static_det->product_type == 1) ? $langs->trans(
"ThisService") : $langs->trans(
"ThisProduct")).
': ';
743 if ($suggestedaccountingaccountfor ==
'eec') {
744 $shelp = $langs->trans(
"SaleEEC");
745 } elseif ($suggestedaccountingaccountfor ==
'eecwithvat') {
746 $shelp = $langs->trans(
"SaleEECWithVAT");
747 } elseif ($suggestedaccountingaccountfor ==
'eecwithoutvatnumber') {
748 $shelp = $langs->trans(
"SaleEECWithoutVATNumber");
750 } elseif ($suggestedaccountingaccountfor ==
'export') {
751 $shelp = $langs->trans(
"SaleExport");
753 $s .= (empty($code_sell_p) ?
'<span style="'.$code_sell_p_notset.
'">'.$langs->trans(
"NotDefined").
'</span>' :
length_accountg($code_sell_p));
754 print $form->textwithpicto($s, $shelp, 1, $ttype,
'', 0, 2,
'', 1);
757 $s =
'2. '.(($objp->type_l == 1) ? $langs->trans(
"ThisService") : $langs->trans(
"ThisProduct")).
': ';
759 $s .= $langs->trans(
"NotDefined");
760 print $form->textwithpicto($s, $shelp, 1,
'help',
'', 0, 2,
'', 1);
764 $s =
'3. '.(($facture_static_det->product_type == 1) ? $langs->trans(
"ServiceForThisThirdparty") : $langs->trans(
"ProductForThisThirdparty")).
': ';
766 $s .= ($code_sell_t > 0 ?
length_accountg($code_sell_t) :
'<span style="'.$code_sell_t_notset.
'">'.$langs->trans(
"NotDefined").
'</span>');
767 print $form->textwithpicto($s, $shelp, 1,
'help',
'', 0, 2,
'', 1);
773 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');
777 print
'<td class="center">';
779 if (!empty($suggestedid) && $suggestedaccountingaccountfor !=
'' && $suggestedaccountingaccountfor !=
'eecwithoutvatnumber') {
783 if (!empty($toselect)) {
785 if (in_array($objp->rowid.
"_".$i, $toselect)) {
790 print
'<input type="checkbox" class="flat checkforselect checkforselect'.$facture_static_det->id.
'" name="toselect[]" value="'.$facture_static_det->id.
"_".$i.
'"'.($ischecked ?
" checked" :
"").
'/>';
796 if ($num_lines == 0) {
797 print
'<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
807if ($db->type ==
'mysqli') {
808 $db->query(
"SET SQL_BIG_SELECTS=0");
812print
'<script type="text/javascript">
813jQuery(document).ready(function() {
814 jQuery(".codeventil").change(function() {
815 var s=$(this).attr("id").replace("codeventil", "")
816 console.log(s+" "+$(this).val());
817 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
818 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()
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...
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.
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 '.
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 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.
print_barre_liste($title, $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.
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.
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 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.