dolibarr 21.0.0-alpha
productaccount.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2014 Olivier Geffroy <jeff@jeffinfo.com>
3 * Copyright (C) 2013-2024 Alexandre Spangaro <aspangaro@easya.solutions>
4 * Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
5 * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2015 Ari Elbaz (elarifr) <github@accedinfo.com>
7 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
8 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
9 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
30require '../../main.inc.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
38require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
39require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
40require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
41
42// Load translation files required by the page
43$langs->loadLangs(array("companies", "compta", "accountancy", "products"));
44
45// search & action GETPOST
46$action = GETPOST('action', 'aZ09');
47$massaction = GETPOST('massaction', 'alpha');
48$confirm = GETPOST('confirm', 'alpha');
49$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
50$optioncss = GETPOST('optioncss', 'alpha');
51
52$toselect = GETPOST('chk_prod', 'array:int');
53'@phan-var-force string[] $toselect';
54$default_account = GETPOSTINT('default_account');
55$searchCategoryProductOperator = GETPOSTINT('search_category_product_operator');
56$searchCategoryProductList = GETPOST('search_category_product_list', 'array:int');
57'@phan-var-force string[] $searchCategoryProductList';
58$search_ref = GETPOST('search_ref', 'alpha');
59$search_label = GETPOST('search_label', 'alpha');
60$search_desc = GETPOST('search_desc', 'alpha');
61$search_vat = GETPOST('search_vat', 'alpha');
62$search_current_account = GETPOST('search_current_account', 'alpha');
63$search_current_account_valid = GETPOST('search_current_account_valid', 'alpha');
64if ($search_current_account_valid == '') {
65 $search_current_account_valid = 'withoutvalidaccount';
66}
67$search_onsell = GETPOST('search_onsell', 'alpha');
68$search_onpurchase = GETPOST('search_onpurchase', 'alpha');
69
70if (!is_array($toselect)) {
71 $toselect = array();
72}
73
74$accounting_product_mode = GETPOST('accounting_product_mode', 'alpha');
75$btn_changetype = GETPOST('changetype', 'alpha');
76
77// Show/hide child product variants
78$show_childproducts = 0;
79if (isModEnabled('variants')) {
80 $show_childproducts = GETPOST('search_show_childproducts');
81}
82
83if (empty($accounting_product_mode)) {
84 $accounting_product_mode = 'ACCOUNTANCY_SELL';
85}
86
87$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : getDolGlobalInt('ACCOUNTING_LIMIT_LIST_VENTILATION', $conf->liste_limit);
88$sortfield = GETPOST('sortfield', 'aZ09comma');
89$sortorder = GETPOST('sortorder', 'aZ09comma');
90$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
91if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
92 // If $page is not defined, or '' or -1 or if we click on clear filters
93 $page = 0;
94}
95$offset = $limit * $page;
96$pageprev = $page - 1;
97$pagenext = $page + 1;
98if (!$sortfield) {
99 $sortfield = "p.ref";
100}
101if (!$sortorder) {
102 $sortorder = "ASC";
103}
104
105if (empty($action)) {
106 $action = 'list';
107}
108
109$arrayfields = array();
110
111$accounting_product_modes = array(
112 'ACCOUNTANCY_SELL',
113 'ACCOUNTANCY_SELL_INTRA',
114 'ACCOUNTANCY_SELL_EXPORT',
115 'ACCOUNTANCY_BUY',
116 'ACCOUNTANCY_BUY_INTRA',
117 'ACCOUNTANCY_BUY_EXPORT'
118);
119
120if ($accounting_product_mode == 'ACCOUNTANCY_BUY') {
121 $accountancy_field_name = "accountancy_code_buy";
122} elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA') {
123 $accountancy_field_name = "accountancy_code_buy_intra";
124} elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT') {
125 $accountancy_field_name = "accountancy_code_buy_export";
126} elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL') {
127 $accountancy_field_name = "accountancy_code_sell";
128} elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') {
129 $accountancy_field_name = "accountancy_code_sell_intra";
130} else { // $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT'
131 $accountancy_field_name = "accountancy_code_sell_export";
132}
133
134// Security check
135if (!isModEnabled('accounting')) {
137}
138if (!$user->hasRight('accounting', 'bind', 'write')) {
140}
141
142$permissiontobind = $user->hasRight('accounting', 'bind', 'write');
143
144
145/*
146 * Actions
147 */
148
149if (GETPOST('cancel', 'alpha')) {
150 $action = 'list';
151 $massaction = '';
152}
153if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
154 $massaction = '';
155}
156
157$parameters = array();
158$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
159if ($reshook < 0) {
160 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
161}
162
163// Purge search criteria
164if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
165 $searchCategoryProductOperator = 0;
166 $searchCategoryProductList = array();
167 $search_ref = '';
168 $search_label = '';
169 $search_desc = '';
170 $search_vat = '';
171 $search_onsell = '';
172 $search_onpurchase = '';
173 $search_current_account = '';
174 $search_current_account_valid = '-1';
175 $toselect = array();
176}
177
178// Sales or Purchase mode ?
179if ($action == 'update' && $permissiontobind) {
180 if (!empty($btn_changetype)) {
181 $error = 0;
182
183 if (in_array($accounting_product_mode, $accounting_product_modes)) {
184 if (!dolibarr_set_const($db, 'ACCOUNTING_PRODUCT_MODE', $accounting_product_mode, 'chaine', 0, '', $conf->entity)) {
185 $error++;
186 }
187 } else {
188 $error++;
189 }
190 }
191
192 if (!empty($toselect) && $massaction === 'changeaccount') {
193 //$msg = '<div><span class="accountingprocessing">' . $langs->trans("Processing") . '...</span></div>';
194 $ok = 0;
195 $ko = 0;
196 $msg = '';
197 $sql = '';
198 if (!empty($toselect) && in_array($accounting_product_mode, $accounting_product_modes)) {
199 $accounting = new AccountingAccount($db);
200
201 //$msg .= '<div><span class="accountingprocessing">' . count($toselect) . ' ' . $langs->trans("SelectedLines") . '</span></div>';
202 $arrayofdifferentselectedvalues = array();
203
204 $cpt = 0;
205 foreach ($toselect as $productid) {
206 $accounting_account_id = GETPOST('codeventil_'.$productid);
207
208 $result = 0;
209 if ($accounting_account_id > 0) {
210 $arrayofdifferentselectedvalues[$accounting_account_id] = $accounting_account_id;
211 $result = $accounting->fetch($accounting_account_id, null, 1);
212 }
213 if ($result <= 0) {
214 // setEventMessages(null, $accounting->errors, 'errors');
215 $msg .= '<div><span class="error">'.$langs->trans("ErrorDB").' : '.$langs->trans("Product").' '.$productid.' '.$langs->trans("NotVentilatedinAccount").' : id='.$accounting_account_id.'<br> <pre>'.$sql.'</pre></span></div>';
216 $ko++;
217 } else {
218 if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
219 $sql_exists = "SELECT rowid FROM " . MAIN_DB_PREFIX . "product_perentity";
220 $sql_exists .= " WHERE fk_product = " . ((int) $productid) . " AND entity = " . ((int) $conf->entity);
221 $resql_exists = $db->query($sql_exists);
222 if (!$resql_exists) {
223 $msg .= '<div><span class="error">'.$langs->trans("ErrorDB").' : '.$langs->trans("Product").' '.$productid.' '.$langs->trans("NotVentilatedinAccount").' : id='.$accounting_account_id.'<br> <pre>'.json_encode($resql_exists).'</pre></span></div>';
224 $ko++;
225 } else {
226 $nb_exists = $db->num_rows($resql_exists);
227 if ($nb_exists <= 0) {
228 // insert
229 $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_perentity (fk_product, entity, " . $db->sanitize($accountancy_field_name) . ")";
230 $sql .= " VALUES (" . ((int) $productid) . ", " . ((int) $conf->entity) . ", '" . $db->escape($accounting->account_number) . "')";
231 } else {
232 $obj_exists = $db->fetch_object($resql_exists);
233 // update
234 $sql = "UPDATE " . MAIN_DB_PREFIX . "product_perentity";
235 $sql .= " SET " . $db->sanitize($accountancy_field_name) . " = '" . $db->escape($accounting->account_number) . "'";
236 $sql .= " WHERE rowid = " . ((int) $obj_exists->rowid);
237 }
238 }
239 } else {
240 $sql = " UPDATE ".MAIN_DB_PREFIX."product";
241 $sql .= " SET ".$db->sanitize($accountancy_field_name)." = '".$db->escape($accounting->account_number)."'";
242 $sql .= " WHERE rowid = ".((int) $productid);
243 }
244
245 dol_syslog("/accountancy/admin/productaccount.php", LOG_DEBUG);
246
247 $db->begin();
248
249 if ($db->query($sql)) {
250 $ok++;
251 $db->commit();
252 } else {
253 $ko++;
254 $db->rollback();
255 }
256 }
257
258 $cpt++;
259 }
260 }
261
262 if ($ko) {
263 setEventMessages($langs->trans("XLineFailedToBeBinded", $ko), null, 'errors');
264 }
265 if ($ok) {
266 setEventMessages($langs->trans("XLineSuccessfullyBinded", $ok), null, 'mesgs');
267 }
268 }
269}
270
271
272
273/*
274 * View
275 */
276
277$form = new FormAccounting($db);
278'@phan-var-force string[] $toselect'; // For some reason typing is lost at this point
279
280// Default AccountingAccount RowId Product / Service
281// at this time ACCOUNTING_SERVICE_SOLD_ACCOUNT & ACCOUNTING_PRODUCT_SOLD_ACCOUNT are account number not accountingacount rowid
282// so we need to get those the rowid of those default value first
283$accounting = new AccountingAccount($db);
284// TODO: we should need to check if result is already exists accountaccount rowid.....
285$aarowid_servbuy = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_BUY_ACCOUNT'), 1);
286$aarowid_servbuy_intra = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT'), 1);
287$aarowid_servbuy_export = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT'), 1);
288$aarowid_prodbuy = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_BUY_ACCOUNT'), 1);
289$aarowid_prodbuy_intra = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT'), 1);
290$aarowid_prodbuy_export = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT'), 1);
291$aarowid_servsell = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_SOLD_ACCOUNT'), 1);
292$aarowid_servsell_intra = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT'), 1);
293$aarowid_servsell_export = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT'), 1);
294$aarowid_prodsell = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUNT'), 1);
295$aarowid_prodsell_intra = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT'), 1);
296$aarowid_prodsell_export = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT'), 1);
297
298$aacompta_servbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
299$aacompta_servbuy_intra = getDolGlobalString('ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
300$aacompta_servbuy_export = getDolGlobalString('ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
301$aacompta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
302$aacompta_prodbuy_intra = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
303$aacompta_prodbuy_export = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
304$aacompta_servsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
305$aacompta_servsell_intra = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
306$aacompta_servsell_export = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
307$aacompta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
308$aacompta_prodsell_intra = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
309$aacompta_prodsell_export = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
310
311
312$title = $langs->trans("ProductsBinding");
313$help_url = 'EN:Module_Double_Entry_Accounting#Setup|FR:Module_Comptabilit&eacute;_en_Partie_Double#Configuration';
314
315$paramsCat = '';
316foreach ($searchCategoryProductList as $searchCategoryProduct) {
317 $paramsCat .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
318}
319
320llxHeader('', $title, $help_url, '', 0, 0, array(), array(), $paramsCat, '');
321
322$pcgverid = getDolGlobalString('CHARTOFACCOUNTS');
323$pcgvercode = dol_getIdFromCode($db, $pcgverid, 'accounting_system', 'rowid', 'pcg_version');
324if (empty($pcgvercode)) {
325 $pcgvercode = $pcgverid;
326}
327
328$sql = "SELECT p.rowid, p.ref, p.label, p.description, p.tosell, p.tobuy, p.tva_tx,";
329if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
330 $sql .= " ppe.accountancy_code_sell, ppe.accountancy_code_sell_intra, ppe.accountancy_code_sell_export,";
331 $sql .= " ppe.accountancy_code_buy, ppe.accountancy_code_buy_intra, ppe.accountancy_code_buy_export,";
332} else {
333 $sql .= " p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export,";
334 $sql .= " p.accountancy_code_buy, p.accountancy_code_buy_intra, p.accountancy_code_buy_export,";
335}
336$sql .= " p.tms, p.fk_product_type as product_type,";
337$sql .= " aa.rowid as aaid";
338$sql .= " FROM ".MAIN_DB_PREFIX."product as p";
339if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
340 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
341 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON aa.account_number = ppe." . $db->sanitize($accountancy_field_name) . " AND aa.fk_pcg_version = '" . $db->escape($pcgvercode) . "'";
342} else {
343 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON aa.account_number = p." . $db->sanitize($accountancy_field_name) . " AND aa.fk_pcg_version = '" . $db->escape($pcgvercode) . "'";
344}
345if (!empty($searchCategoryProductList)) {
346 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product"; // We'll need this table joined to the select in order to filter by categ
347}
348$sql .= ' WHERE p.entity IN ('.getEntity('product').')';
349if (strlen(trim($search_current_account))) {
350 $sql .= natural_search((!getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED') ? "p." : "ppe.") . $db->sanitize($accountancy_field_name), $search_current_account);
351}
352if ($search_current_account_valid == 'withoutvalidaccount') {
353 $sql .= " AND aa.account_number IS NULL";
354}
355if ($search_current_account_valid == 'withvalidaccount') {
356 $sql .= " AND aa.account_number IS NOT NULL";
357}
358$searchCategoryProductSqlList = array();
359if ($searchCategoryProductOperator == 1) {
360 foreach ($searchCategoryProductList as $searchCategoryProduct) {
361 if (intval($searchCategoryProduct) == -2) {
362 $searchCategoryProductSqlList[] = "cp.fk_categorie IS NULL";
363 } elseif (intval($searchCategoryProduct) > 0) {
364 $searchCategoryProductSqlList[] = "cp.fk_categorie = ".((int) $searchCategoryProduct);
365 }
366 }
367 if (!empty($searchCategoryProductSqlList)) {
368 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
369 }
370} else {
371 foreach ($searchCategoryProductList as $searchCategoryProduct) {
372 if (intval($searchCategoryProduct) == -2) {
373 $searchCategoryProductSqlList[] = "cp.fk_categorie IS NULL";
374 } elseif (intval($searchCategoryProduct) > 0) {
375 $searchCategoryProductSqlList[] = "p.rowid IN (SELECT fk_product FROM ".MAIN_DB_PREFIX."categorie_product WHERE fk_categorie = ".((int) $searchCategoryProduct).")";
376 }
377 }
378 if (!empty($searchCategoryProductSqlList)) {
379 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
380 }
381}
382// Add search filter like
383if (strlen(trim($search_ref))) {
384 $sql .= natural_search("p.ref", $search_ref);
385}
386if (strlen(trim($search_label))) {
387 $sql .= natural_search("p.label", $search_label);
388}
389if (strlen(trim($search_desc))) {
390 $sql .= natural_search("p.description", $search_desc);
391}
392if (strlen(trim($search_vat))) {
393 $sql .= natural_search("p.tva_tx", price2num($search_vat), 1);
394}
395if ($search_onsell != '' && $search_onsell != '-1') {
396 $sql .= natural_search('p.tosell', $search_onsell, 1);
397}
398if ($search_onpurchase != '' && $search_onpurchase != '-1') {
399 $sql .= natural_search('p.tobuy', $search_onpurchase, 1);
400}
401
402$sql .= " GROUP BY p.rowid, p.ref, p.label, p.description, p.tosell, p.tobuy, p.tva_tx,";
403$sql .= " p.fk_product_type,";
404$sql .= ' p.tms,';
405$sql .= ' aa.rowid,';
406if (!getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
407 $sql .= " p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy, p.accountancy_code_buy_intra, p.accountancy_code_buy_export";
408} else {
409 $sql .= " ppe.accountancy_code_sell, ppe.accountancy_code_sell_intra, ppe.accountancy_code_sell_export, ppe.accountancy_code_buy, ppe.accountancy_code_buy_intra, ppe.accountancy_code_buy_export";
410}
411
412$sql .= $db->order($sortfield, $sortorder);
413
414$nbtotalofrecords = '';
415if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
416 $resql = $db->query($sql);
417 $nbtotalofrecords = $db->num_rows($resql);
418 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
419 $page = 0;
420 $offset = 0;
421 }
422}
423
424$sql .= $db->plimit($limit + 1, $offset);
425
426dol_syslog("/accountancy/admin/productaccount.php", LOG_DEBUG);
427$resql = $db->query($sql);
428if ($resql) {
429 $num = $db->num_rows($resql);
430 $i = 0;
431
432 $param = '';
433 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
434 $param .= '&contextpage='.urlencode($contextpage);
435 }
436 if ($limit > 0 && $limit != $conf->liste_limit) {
437 $param .= '&limit='.((int) $limit);
438 }
439 if ($searchCategoryProductOperator == 1) {
440 $param .= "&search_category_product_operator=".urlencode((string) ($searchCategoryProductOperator));
441 }
442 foreach ($searchCategoryProductList as $searchCategoryProduct) {
443 $param .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
444 }
445 if ($search_ref > 0) {
446 $param .= "&search_ref=".urlencode($search_ref);
447 }
448 if ($search_label > 0) {
449 $param .= "&search_label=".urlencode($search_label);
450 }
451 if ($search_desc > 0) {
452 $param .= "&search_desc=".urlencode($search_desc);
453 }
454 if ($search_vat > 0) {
455 $param .= '&search_vat='.urlencode($search_vat);
456 }
457 if ($search_current_account > 0) {
458 $param .= "&search_current_account=".urlencode($search_current_account);
459 }
460 if ($search_current_account_valid && $search_current_account_valid != '-1') {
461 $param .= "&search_current_account_valid=".urlencode($search_current_account_valid);
462 }
463 if ($accounting_product_mode) {
464 $param .= '&accounting_product_mode='.urlencode($accounting_product_mode);
465 }
466
467 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">';
468 if ($optioncss != '') {
469 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
470 }
471 print '<input type="hidden" name="token" value="'.newToken().'">';
472 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
473 print '<input type="hidden" name="action" value="update">';
474 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
475 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
476 print '<input type="hidden" name="page_y" value="">';
477
478 print load_fiche_titre($langs->trans("ProductsBinding"), '', 'title_accountancy');
479 print '<br>';
480
481 print '<span class="opacitymedium">'.$langs->trans("InitAccountancyDesc").'</span><br>';
482 print '<br>';
483
484 // Select mode
485 print '<table class="noborder centpercent">';
486 print '<tr class="liste_titre">';
487 print '<td>'.$langs->trans('Options').'</td><td>'.$langs->trans('Description').'</td>';
488 print "</tr>\n";
489 print '<tr class="oddeven"><td><input type="radio" id="accounting_product_mode1" name="accounting_product_mode" value="ACCOUNTANCY_SELL"'.($accounting_product_mode == 'ACCOUNTANCY_SELL' ? ' checked' : '').'> <label for="accounting_product_mode1">'.$langs->trans('OptionModeProductSell').'</label></td>';
490 print '<td>'.$langs->trans('OptionModeProductSellDesc');
491 print "</td></tr>\n";
492 if ($mysoc->isInEEC()) {
493 print '<tr class="oddeven"><td><input type="radio" id="accounting_product_mode2" name="accounting_product_mode" value="ACCOUNTANCY_SELL_INTRA"'.($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA' ? ' checked' : '').'> <label for="accounting_product_mode2">'.$langs->trans('OptionModeProductSellIntra').'</label></td>';
494 print '<td>'.$langs->trans('OptionModeProductSellIntraDesc');
495 print "</td></tr>\n";
496 }
497 print '<tr class="oddeven"><td><input type="radio" id="accounting_product_mode3" name="accounting_product_mode" value="ACCOUNTANCY_SELL_EXPORT"'.($accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT' ? ' checked' : '').'> <label for="accounting_product_mode3">'.$langs->trans('OptionModeProductSellExport').'</label></td>';
498 print '<td>'.$langs->trans('OptionModeProductSellExportDesc');
499 print "</td></tr>\n";
500 print '<tr class="oddeven"><td><input type="radio" id="accounting_product_mode4" name="accounting_product_mode" value="ACCOUNTANCY_BUY"'.($accounting_product_mode == 'ACCOUNTANCY_BUY' ? ' checked' : '').'> <label for="accounting_product_mode4">'.$langs->trans('OptionModeProductBuy').'</label></td>';
501 print '<td>'.$langs->trans('OptionModeProductBuyDesc')."</td></tr>\n";
502 if ($mysoc->isInEEC()) {
503 print '<tr class="oddeven"><td><input type="radio" id="accounting_product_mode5" name="accounting_product_mode" value="ACCOUNTANCY_BUY_INTRA"'.($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA' ? ' checked' : '').'> <label for="accounting_product_mode5">'.$langs->trans('OptionModeProductBuyIntra').'</label></td>';
504 print '<td>'.$langs->trans('OptionModeProductBuyDesc')."</td></tr>\n";
505 }
506 print '<tr class="oddeven"><td><input type="radio" id="accounting_product_mode6" name="accounting_product_mode" value="ACCOUNTANCY_BUY_EXPORT"'.($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT' ? ' checked' : '').'> <label for="accounting_product_mode6">'.$langs->trans('OptionModeProductBuyExport').'</label></td>';
507 print '<td>'.$langs->trans('OptionModeProductBuyDesc')."</td></tr>\n";
508 print "</table>\n";
509
510 print '<div class="center"><input type="submit" class="button" value="'.$langs->trans('Refresh').'" name="changetype"></div>';
511
512 print "<br>\n";
513
514
515 // Filter on categories
516 $moreforfilter = '';
517 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
518 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
519
520 $massactionbutton = '';
521
522 $nbselected = count($toselect);
523 if ($massaction == 'set_default_account') {
524 if ($nbselected <= 0) {
525 $langs->load("errors");
526 setEventMessages($langs->trans("ErrorSelectAtLeastOne"), null, 'warnings');
527 $action = '';
528 $massaction = '';
529 }
530 }
531
532 if ($massaction !== 'set_default_account') {
533 $arrayofmassactions = array(
534 'set_default_account' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ConfirmPreselectAccount"),
535 'changeaccount' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Save") // TODO The save action should be a button "Save"
536 );
537 $massactionbutton = $form->selectMassAction('', $arrayofmassactions, 1);
538 }
539
540 //$buttonsave = '<input type="submit" class="button button-save" id="changeaccount" name="changeaccount" value="'.$langs->trans("Save").'">';
541 //print '<br><div class="center">'.$buttonsave.'</div>';
542
543 $texte = $langs->trans("ListOfProductsServices");
544 print_barre_liste($texte, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, '', 0, '', '', $limit, 0, 0, 1);
545
546 if ($massaction == 'set_default_account') {
547 $formquestion = array();
548 $formquestion[] = array('type' => 'other',
549 'name' => 'set_default_account',
550 'label' => $langs->trans("AccountancyCode"),
551 'value' => $form->select_account('', 'default_account', 1, array(), 0, 0, 'maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'));
552 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", $nbselected), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
553 }
554
555 // Filter on categories
556 $moreforfilter = '';
557 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
558 $formcategory = new FormCategory($db);
559 $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_PRODUCT, $searchCategoryProductList, 'minwidth300', $searchCategoryProductList ? $searchCategoryProductList : 0);
560 }
561
562 // Show/hide child products. Hidden by default
563 if (isModEnabled('variants') && getDolGlobalInt('PRODUIT_ATTRIBUTES_HIDECHILD')) {
564 $moreforfilter .= '<div class="divsearchfield">';
565 $moreforfilter .= '<input type="checkbox" id="search_show_childproducts" name="search_show_childproducts"'.($show_childproducts ? 'checked="checked"' : '').'>';
566 $moreforfilter .= ' <label for="search_show_childproducts">'.$langs->trans('ShowChildProducts').'</label>';
567 $moreforfilter .= '</div>';
568 }
569
570 $parameters = array();
571 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
572 if (empty($reshook)) {
573 $moreforfilter .= $hookmanager->resPrint;
574 } else {
575 $moreforfilter = $hookmanager->resPrint;
576 }
577
578 if ($moreforfilter) {
579 print '<div class="liste_titre liste_titre_bydiv centpercent">';
580 print $moreforfilter;
581 print '</div>';
582 }
583
584 print '<div class="div-table-responsive">';
585 print '<table class="liste '.($moreforfilter ? "listwithfilterbefore" : "").'">';
586
587 print '<tr class="liste_titre_filter">';
588 // Action column
589 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
590 print '<td class="center liste_titre">';
591 $searchpicto = $form->showFilterButtons();
592 print $searchpicto;
593 print '</td>';
594 }
595 print '<td class="liste_titre"><input type="text" class="flat" size="8" name="search_ref" value="'.dol_escape_htmltag($search_ref).'"></td>';
596 print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_label" value="'.dol_escape_htmltag($search_label).'"></td>';
597 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_vat" placeholder="%" value="'.dol_escape_htmltag($search_vat).'"></td>';
598
599 if (getDolGlobalInt('ACCOUNTANCY_SHOW_PROD_DESC')) {
600 print '<td class="liste_titre"><input type="text" class="flat" size="20" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
601 }
602 // On sell
603 if ($accounting_product_mode == 'ACCOUNTANCY_SELL' || $accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA' || $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
604 print '<td class="liste_titre center">'.$form->selectyesno('search_onsell', $search_onsell, 1, false, 1, 1).'</td>';
605 } else {
606 // On buy
607 print '<td class="liste_titre center">'.$form->selectyesno('search_onpurchase', $search_onpurchase, 1, false, 1, 1).'</td>';
608 }
609 // Current account
610 print '<td class="liste_titre">';
611 print '<input type="text" class="flat" size="6" name="search_current_account" id="search_current_account" value="'.dol_escape_htmltag($search_current_account).'">';
612 $listofvals = array('withoutvalidaccount' => $langs->trans("WithoutValidAccount"), 'withvalidaccount' => $langs->trans("WithValidAccount"));
613 print ' '.$langs->trans("or").' '.$form->selectarray('search_current_account_valid', $listofvals, $search_current_account_valid, 1);
614 print '</td>';
615 print '<td class="liste_titre">&nbsp;</td>';
616 // Action column
617 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
618 print '<td class="center liste_titre">';
619 $searchpicto = $form->showFilterButtons();
620 print $searchpicto;
621 print '</td>';
622 }
623 print '</tr>';
624
625 print '<tr class="liste_titre">';
626 // Action column
627 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
628 $clickpitco = $form->showCheckAddButtons('checkforselect', 1);
629 print_liste_field_titre($clickpitco, '', '', '', '', '', '', '', 'center ');
630 }
631 print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
632 print_liste_field_titre("Label", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
633 if (getDolGlobalInt('ACCOUNTANCY_SHOW_PROD_DESC')) {
634 print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "p.description", "", $param, '', $sortfield, $sortorder);
635 }
636 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "p.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ');
637 // On sell / On purchase
638 if ($accounting_product_mode == 'ACCOUNTANCY_SELL' || $accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA' || $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
639 print_liste_field_titre("OnSell", $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'center ');
640 } else {
641 print_liste_field_titre("OnBuy", $_SERVER["PHP_SELF"], "p.tobuy", "", $param, '', $sortfield, $sortorder, 'center ');
642 }
643 print_liste_field_titre("CurrentDedicatedAccountingAccount", $_SERVER["PHP_SELF"], (!getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED') ? "p." : "ppe.") . $accountancy_field_name, "", $param, '', $sortfield, $sortorder);
644 print_liste_field_titre("AssignDedicatedAccountingAccount");
645 // Action column
646 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
647 $clickpitco = $form->showCheckAddButtons('checkforselect', 1);
648 print_liste_field_titre($clickpitco, '', '', '', '', '', '', '', 'center ');
649 }
650 print '</tr>';
651
652 $product_static = new Product($db);
653
654 $i = 0;
655 while ($i < min($num, $limit)) {
656 $obj = $db->fetch_object($resql);
657
658 // Ref produit as link
659 $product_static->ref = $obj->ref;
660 $product_static->id = $obj->rowid;
661 $product_static->type = $obj->product_type;
662 $product_static->label = $obj->label;
663 $product_static->description = $obj->description;
664 $product_static->status = $obj->tosell;
665 $product_static->status_buy = $obj->tobuy;
666
667 // Sales
668 if ($obj->product_type == 0) {
669 if ($accounting_product_mode == 'ACCOUNTANCY_SELL') {
670 $compta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
671 $compta_prodsell_id = $aarowid_prodsell;
672 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') {
673 $compta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
674 $compta_prodsell_id = $aarowid_prodsell_intra;
675 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
676 $compta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
677 $compta_prodsell_id = $aarowid_prodsell_export;
678 } else {
679 $compta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
680 $compta_prodsell_id = $aarowid_prodsell;
681 }
682 } else {
683 if ($accounting_product_mode == 'ACCOUNTANCY_SELL') {
684 $compta_prodsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
685 $compta_prodsell_id = $aarowid_servsell;
686 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') {
687 $compta_prodsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
688 $compta_prodsell_id = $aarowid_servsell_intra;
689 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
690 $compta_prodsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
691
692 $compta_prodsell_id = $aarowid_servsell_export;
693 } else {
694 $compta_prodsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
695 $compta_prodsell_id = $aarowid_servsell;
696 }
697 }
698
699 // Purchases
700 if ($obj->product_type == 0) {
701 if ($accounting_product_mode == 'ACCOUNTANCY_BUY') {
702 $compta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
703 $compta_prodbuy_id = $aarowid_prodbuy;
704 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA') {
705 $compta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
706 $compta_prodbuy_id = $aarowid_prodbuy_intra;
707 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT') {
708 $compta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
709 $compta_prodbuy_id = $aarowid_prodbuy_export;
710 } else {
711 $compta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
712 $compta_prodbuy_id = $aarowid_prodbuy;
713 }
714 } else {
715 if ($accounting_product_mode == 'ACCOUNTANCY_BUY') {
716 $compta_prodbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
717 $compta_prodbuy_id = $aarowid_servbuy;
718 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA') {
719 $compta_prodbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
720 $compta_prodbuy_id = $aarowid_servbuy_intra;
721 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT') {
722 $compta_prodbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
723 $compta_prodbuy_id = $aarowid_servbuy_export;
724 } else {
725 $compta_prodbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
726 $compta_prodbuy_id = $aarowid_servbuy;
727 }
728 }
729
730 $selected = 0;
731 if (in_array($product_static->id, $toselect)) {
732 $selected = 1;
733 }
734
735 print '<tr class="oddeven">';
736
737 // Action column
738 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
739 print '<td class="center">';
740 print '<input type="checkbox" class="checkforselect productforselectcodeventil_'.$product_static->id.'" name="chk_prod[]" '.($selected ? "checked" : "").' value="'.$obj->rowid.'"/>';
741 print '</td>';
742 }
743
744 print '<td>';
745 print $product_static->getNomUrl(1);
746 print '</td>';
747
748 print '<td class="left">'.$obj->label.'</td>';
749
750 if (getDolGlobalInt('ACCOUNTANCY_SHOW_PROD_DESC')) {
751 // TODO ADJUST DESCRIPTION SIZE
752 // print '<td class="left">' . $obj->description . '</td>';
753 // TODO: we should set a user defined value to adjust user square / wide screen size
754 $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION', 32);
755 print '<td>'.nl2br(dol_trunc($obj->description, $trunclength)).'</td>';
756 }
757
758 // VAT
759 print '<td class="right">';
760 print vatrate($obj->tva_tx);
761 print '</td>';
762
763 // On sell / On purchase
764 if ($accounting_product_mode == 'ACCOUNTANCY_SELL' || $accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA' || $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
765 print '<td class="center">'.$product_static->getLibStatut(3, 0).'</td>';
766 } else {
767 print '<td class="center">'.$product_static->getLibStatut(3, 1).'</td>';
768 }
769
770 // Current accounting account
771 print '<td class="left">';
772 if ($accounting_product_mode == 'ACCOUNTANCY_BUY') {
773 print length_accountg($obj->accountancy_code_buy);
774 if ($obj->accountancy_code_buy && empty($obj->aaid)) {
775 print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount"));
776 }
777 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA') {
778 print length_accountg($obj->accountancy_code_buy_intra);
779 if ($obj->accountancy_code_buy_intra && empty($obj->aaid)) {
780 print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount"));
781 }
782 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT') {
783 print length_accountg($obj->accountancy_code_buy_export);
784 if ($obj->accountancy_code_buy_export && empty($obj->aaid)) {
785 print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount"));
786 }
787 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL') {
788 print length_accountg($obj->accountancy_code_sell);
789 if ($obj->accountancy_code_sell && empty($obj->aaid)) {
790 print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount"));
791 }
792 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') {
793 print length_accountg($obj->accountancy_code_sell_intra);
794 if ($obj->accountancy_code_sell_intra && empty($obj->aaid)) {
795 print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount"));
796 }
797 } else {
798 print length_accountg($obj->accountancy_code_sell_export);
799 if ($obj->accountancy_code_sell_export && empty($obj->aaid)) {
800 print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount"));
801 }
802 }
803 print '</td>';
804
805 // New account to set
806 $defaultvalue = '';
807 if ($accounting_product_mode == 'ACCOUNTANCY_BUY') {
808 // Accounting account buy
809 print '<td class="left">';
810 //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code
811 if (empty($defaultvalue)) {
812 $defaultvalue = $compta_prodbuy;
813 }
814 $codesell = length_accountg($obj->accountancy_code_buy);
815 if (!empty($obj->aaid)) {
816 $defaultvalue = ''; // Do not suggest default new value is code is already valid
817 }
818 print $form->select_account(($default_account > 0 && $confirm === 'yes' && in_array($product_static->id, $toselect)) ? $default_account : $defaultvalue, 'codeventil_'.$product_static->id, 1, array(), 1, 0, 'maxwidth300 maxwidthonsmartphone productforselect');
819 print '</td>';
820 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA') {
821 // Accounting account buy intra (In EEC)
822 print '<td class="left">';
823 //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code
824 if (empty($defaultvalue)) {
825 $defaultvalue = $compta_prodbuy;
826 }
827 $codesell = length_accountg($obj->accountancy_code_buy_intra);
828 //var_dump($defaultvalue.' - '.$codesell.' - '.$compta_prodsell);
829 if (!empty($obj->aaid)) {
830 $defaultvalue = ''; // Do not suggest default new value is code is already valid
831 }
832 print $form->select_account(($default_account > 0 && $confirm === 'yes' && in_array($product_static->id, $toselect)) ? $default_account : $defaultvalue, 'codeventil_'.$product_static->id, 1, array(), 1, 0, 'maxwidth300 maxwidthonsmartphone productforselect');
833 print '</td>';
834 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT') {
835 // Accounting account buy export (Out of EEC)
836 print '<td class="left">';
837 //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code
838 if (empty($defaultvalue)) {
839 $defaultvalue = $compta_prodbuy;
840 }
841 $codesell = length_accountg($obj->accountancy_code_buy_export);
842 //var_dump($defaultvalue.' - '.$codesell.' - '.$compta_prodsell);
843 if (!empty($obj->aaid)) {
844 $defaultvalue = ''; // Do not suggest default new value is code is already valid
845 }
846 print $form->select_account(($default_account > 0 && $confirm === 'yes' && in_array($product_static->id, $toselect)) ? $default_account : $defaultvalue, 'codeventil_'.$product_static->id, 1, array(), 1, 0, 'maxwidth300 maxwidthonsmartphone productforselect');
847 print '</td>';
848 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL') {
849 // Accounting account sell
850 print '<td class="left">';
851 //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code
852 if (empty($defaultvalue)) {
853 $defaultvalue = $compta_prodsell;
854 }
855 $codesell = length_accountg($obj->accountancy_code_sell);
856 //var_dump($defaultvalue.' - '.$codesell.' - '.$compta_prodsell);
857 if (!empty($obj->aaid)) {
858 $defaultvalue = ''; // Do not suggest default new value is code is already valid
859 }
860 print $form->select_account(($default_account > 0 && $confirm === 'yes' && in_array($product_static->id, $toselect)) ? $default_account : $defaultvalue, 'codeventil_'.$product_static->id, 1, array(), 1, 0, 'maxwidth300 maxwidthonsmartphone productforselect');
861 print '</td>';
862 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') {
863 // Accounting account sell intra (In EEC)
864 print '<td class="left">';
865 //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code
866 if (empty($defaultvalue)) {
867 $defaultvalue = $compta_prodsell;
868 }
869 $codesell = length_accountg($obj->accountancy_code_sell_intra);
870 //var_dump($defaultvalue.' - '.$codesell.' - '.$compta_prodsell);
871 if (!empty($obj->aaid)) {
872 $defaultvalue = ''; // Do not suggest default new value is code is already valid
873 }
874 print $form->select_account(($default_account > 0 && $confirm === 'yes' && in_array($product_static->id, $toselect)) ? $default_account : $defaultvalue, 'codeventil_'.$product_static->id, 1, array(), 1, 0, 'maxwidth300 maxwidthonsmartphone productforselect');
875 print '</td>';
876 } else {
877 // Accounting account sell export (Out of EEC)
878 print '<td class="left">';
879 //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code
880 if (empty($defaultvalue)) {
881 $defaultvalue = $compta_prodsell;
882 }
883 $codesell = length_accountg($obj->accountancy_code_sell_export);
884 if (!empty($obj->aaid)) {
885 $defaultvalue = ''; // Do not suggest default new value is code is already valid
886 }
887 print $form->select_account(($default_account > 0 && $confirm === 'yes' && in_array($product_static->id, $toselect)) ? $default_account : $defaultvalue, 'codeventil_'.$product_static->id, 1, array(), 1, 0, 'maxwidth300 maxwidthonsmartphone productforselect');
888 print '</td>';
889 }
890
891 // Action column
892 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
893 print '<td class="center">';
894 print '<input type="checkbox" class="checkforselect productforselectcodeventil_'.$product_static->id.'" name="chk_prod[]" '.($selected ? "checked" : "").' value="'.$obj->rowid.'"/>';
895 print '</td>';
896 }
897
898 print "</tr>";
899 $i++;
900 }
901 print '</table>';
902 print '</div>';
903
904 print '<script type="text/javascript">
905 jQuery(document).ready(function() {
906 function init_savebutton()
907 {
908 console.log("We check if at least one line is checked")
909
910 atleastoneselected=0;
911 jQuery(".checkforselect").each(function( index ) {
912 /* console.log( index + ": " + $( this ).text() ); */
913 if ($(this).is(\':checked\')) atleastoneselected++;
914 });
915
916 if (atleastoneselected) jQuery("#changeaccount").removeAttr(\'disabled\');
917 else jQuery("#changeaccount").attr(\'disabled\',\'disabled\');
918 if (atleastoneselected) jQuery("#changeaccount").attr(\'class\',\'button\');
919 else jQuery("#changeaccount").attr(\'class\',\'button\');
920 }
921
922 jQuery(".checkforselect").change(function() {
923 init_savebutton();
924 });
925 jQuery(".productforselect").change(function() {
926 console.log($(this).attr("id")+" "+$(this).val());
927 if ($(this).val() && $(this).val() != -1) {
928 $(".productforselect"+$(this).attr("id")).prop(\'checked\', true);
929 } else {
930 $(".productforselect"+$(this).attr("id")).prop(\'checked\', false);
931 }
932 init_savebutton();
933 });
934
935 init_savebutton();
936
937 jQuery("#search_current_account").keyup(function() {
938 if (jQuery("#search_current_account").val() != \'\')
939 {
940 console.log("We set a value of account to search "+jQuery("#search_current_account").val()+", so we disable the other search criteria on account");
941 jQuery("#search_current_account_valid").val(-1);
942 }
943 });
944 });
945 </script>';
946
947 print '</form>';
948
949 $db->free($resql);
950} else {
951 dol_print_error($db);
952}
953
954// End of page
955llxFooter();
956$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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.
Definition wrapper.php:70
Class to manage accounting accounts.
Class to manage generation of HTML components for accounting management.
Class to manage forms for categories.
Class to manage products or services.
llxFooter()
Footer empty.
Definition document.php:107
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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.
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...
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_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.