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 == -1) {
92 $page = 0;
93} // If $page is not defined, or '' or -1
94$offset = $limit * $page;
95$pageprev = $page - 1;
96$pagenext = $page + 1;
97if (!$sortfield) {
98 $sortfield = "p.ref";
99}
100if (!$sortorder) {
101 $sortorder = "ASC";
102}
103
104if (empty($action)) {
105 $action = 'list';
106}
107
108$arrayfields = array();
109
110$accounting_product_modes = array(
111 'ACCOUNTANCY_SELL',
112 'ACCOUNTANCY_SELL_INTRA',
113 'ACCOUNTANCY_SELL_EXPORT',
114 'ACCOUNTANCY_BUY',
115 'ACCOUNTANCY_BUY_INTRA',
116 'ACCOUNTANCY_BUY_EXPORT'
117);
118
119if ($accounting_product_mode == 'ACCOUNTANCY_BUY') {
120 $accountancy_field_name = "accountancy_code_buy";
121} elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA') {
122 $accountancy_field_name = "accountancy_code_buy_intra";
123} elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT') {
124 $accountancy_field_name = "accountancy_code_buy_export";
125} elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL') {
126 $accountancy_field_name = "accountancy_code_sell";
127} elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') {
128 $accountancy_field_name = "accountancy_code_sell_intra";
129} else { // $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT'
130 $accountancy_field_name = "accountancy_code_sell_export";
131}
132
133// Security check
134if (!isModEnabled('accounting')) {
136}
137if (!$user->hasRight('accounting', 'bind', 'write')) {
139}
140
141$permissiontobind = $user->hasRight('accounting', 'bind', 'write');
142
143
144/*
145 * Actions
146 */
147
148if (GETPOST('cancel', 'alpha')) {
149 $action = 'list';
150 $massaction = '';
151}
152if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
153 $massaction = '';
154}
155
156$parameters = array();
157$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
158if ($reshook < 0) {
159 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
160}
161
162// Purge search criteria
163if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
164 $searchCategoryProductOperator = 0;
165 $searchCategoryProductList = array();
166 $search_ref = '';
167 $search_label = '';
168 $search_desc = '';
169 $search_vat = '';
170 $search_onsell = '';
171 $search_onpurchase = '';
172 $search_current_account = '';
173 $search_current_account_valid = '-1';
174 $toselect = array();
175}
176
177// Sales or Purchase mode ?
178if ($action == 'update' && $permissiontobind) {
179 if (!empty($btn_changetype)) {
180 $error = 0;
181
182 if (in_array($accounting_product_mode, $accounting_product_modes)) {
183 if (!dolibarr_set_const($db, 'ACCOUNTING_PRODUCT_MODE', $accounting_product_mode, 'chaine', 0, '', $conf->entity)) {
184 $error++;
185 }
186 } else {
187 $error++;
188 }
189 }
190
191 if (!empty($toselect) && $massaction === 'changeaccount') {
192 //$msg = '<div><span class="accountingprocessing">' . $langs->trans("Processing") . '...</span></div>';
193 $ok = 0;
194 $ko = 0;
195 $msg = '';
196 $sql = '';
197 if (!empty($toselect) && in_array($accounting_product_mode, $accounting_product_modes)) {
198 $accounting = new AccountingAccount($db);
199
200 //$msg .= '<div><span class="accountingprocessing">' . count($toselect) . ' ' . $langs->trans("SelectedLines") . '</span></div>';
201 $arrayofdifferentselectedvalues = array();
202
203 $cpt = 0;
204 foreach ($toselect as $productid) {
205 $accounting_account_id = GETPOST('codeventil_'.$productid);
206
207 $result = 0;
208 if ($accounting_account_id > 0) {
209 $arrayofdifferentselectedvalues[$accounting_account_id] = $accounting_account_id;
210 $result = $accounting->fetch($accounting_account_id, null, 1);
211 }
212 if ($result <= 0) {
213 // setEventMessages(null, $accounting->errors, 'errors');
214 $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>';
215 $ko++;
216 } else {
217 if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
218 $sql_exists = "SELECT rowid FROM " . MAIN_DB_PREFIX . "product_perentity";
219 $sql_exists .= " WHERE fk_product = " . ((int) $productid) . " AND entity = " . ((int) $conf->entity);
220 $resql_exists = $db->query($sql_exists);
221 if (!$resql_exists) {
222 $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>';
223 $ko++;
224 } else {
225 $nb_exists = $db->num_rows($resql_exists);
226 if ($nb_exists <= 0) {
227 // insert
228 $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_perentity (fk_product, entity, " . $db->sanitize($accountancy_field_name) . ")";
229 $sql .= " VALUES (" . ((int) $productid) . ", " . ((int) $conf->entity) . ", '" . $db->escape($accounting->account_number) . "')";
230 } else {
231 $obj_exists = $db->fetch_object($resql_exists);
232 // update
233 $sql = "UPDATE " . MAIN_DB_PREFIX . "product_perentity";
234 $sql .= " SET " . $db->sanitize($accountancy_field_name) . " = '" . $db->escape($accounting->account_number) . "'";
235 $sql .= " WHERE rowid = " . ((int) $obj_exists->rowid);
236 }
237 }
238 } else {
239 $sql = " UPDATE ".MAIN_DB_PREFIX."product";
240 $sql .= " SET ".$db->sanitize($accountancy_field_name)." = '".$db->escape($accounting->account_number)."'";
241 $sql .= " WHERE rowid = ".((int) $productid);
242 }
243
244 dol_syslog("/accountancy/admin/productaccount.php", LOG_DEBUG);
245
246 $db->begin();
247
248 if ($db->query($sql)) {
249 $ok++;
250 $db->commit();
251 } else {
252 $ko++;
253 $db->rollback();
254 }
255 }
256
257 $cpt++;
258 }
259 }
260
261 if ($ko) {
262 setEventMessages($langs->trans("XLineFailedToBeBinded", $ko), null, 'errors');
263 }
264 if ($ok) {
265 setEventMessages($langs->trans("XLineSuccessfullyBinded", $ok), null, 'mesgs');
266 }
267 }
268}
269
270
271
272/*
273 * View
274 */
275
276$form = new FormAccounting($db);
277
278// Default AccountingAccount RowId Product / Service
279// at this time ACCOUNTING_SERVICE_SOLD_ACCOUNT & ACCOUNTING_PRODUCT_SOLD_ACCOUNT are account number not accountingacount rowid
280// so we need to get those the rowid of those default value first
281$accounting = new AccountingAccount($db);
282// TODO: we should need to check if result is already exists accountaccount rowid.....
283$aarowid_servbuy = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_BUY_ACCOUNT'), 1);
284$aarowid_servbuy_intra = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT'), 1);
285$aarowid_servbuy_export = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT'), 1);
286$aarowid_prodbuy = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_BUY_ACCOUNT'), 1);
287$aarowid_prodbuy_intra = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT'), 1);
288$aarowid_prodbuy_export = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT'), 1);
289$aarowid_servsell = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_SOLD_ACCOUNT'), 1);
290$aarowid_servsell_intra = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT'), 1);
291$aarowid_servsell_export = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT'), 1);
292$aarowid_prodsell = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUNT'), 1);
293$aarowid_prodsell_intra = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT'), 1);
294$aarowid_prodsell_export = $accounting->fetch(0, getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT'), 1);
295
296$aacompta_servbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
297$aacompta_servbuy_intra = getDolGlobalString('ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
298$aacompta_servbuy_export = getDolGlobalString('ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
299$aacompta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
300$aacompta_prodbuy_intra = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
301$aacompta_prodbuy_export = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
302$aacompta_servsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
303$aacompta_servsell_intra = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
304$aacompta_servsell_export = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
305$aacompta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
306$aacompta_prodsell_intra = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
307$aacompta_prodsell_export = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
308
309
310$title = $langs->trans("ProductsBinding");
311$help_url = 'EN:Module_Double_Entry_Accounting#Setup|FR:Module_Comptabilit&eacute;_en_Partie_Double#Configuration';
312
313$paramsCat = '';
314foreach ($searchCategoryProductList as $searchCategoryProduct) {
315 $paramsCat .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
316}
317
318llxHeader('', $title, $help_url, '', 0, 0, array(), array(), $paramsCat, '');
319
320$pcgverid = getDolGlobalString('CHARTOFACCOUNTS');
321$pcgvercode = dol_getIdFromCode($db, $pcgverid, 'accounting_system', 'rowid', 'pcg_version');
322if (empty($pcgvercode)) {
323 $pcgvercode = $pcgverid;
324}
325
326$sql = "SELECT p.rowid, p.ref, p.label, p.description, p.tosell, p.tobuy, p.tva_tx,";
327if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
328 $sql .= " ppe.accountancy_code_sell, ppe.accountancy_code_sell_intra, ppe.accountancy_code_sell_export,";
329 $sql .= " ppe.accountancy_code_buy, ppe.accountancy_code_buy_intra, ppe.accountancy_code_buy_export,";
330} else {
331 $sql .= " p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export,";
332 $sql .= " p.accountancy_code_buy, p.accountancy_code_buy_intra, p.accountancy_code_buy_export,";
333}
334$sql .= " p.tms, p.fk_product_type as product_type,";
335$sql .= " aa.rowid as aaid";
336$sql .= " FROM ".MAIN_DB_PREFIX."product as p";
337if (getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
338 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product_perentity as ppe ON ppe.fk_product = p.rowid AND ppe.entity = " . ((int) $conf->entity);
339 $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) . "'";
340} else {
341 $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) . "'";
342}
343if (!empty($searchCategoryProductList)) {
344 $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
345}
346$sql .= ' WHERE p.entity IN ('.getEntity('product').')';
347if (strlen(trim($search_current_account))) {
348 $sql .= natural_search((!getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED') ? "p." : "ppe.") . $db->sanitize($accountancy_field_name), $search_current_account);
349}
350if ($search_current_account_valid == 'withoutvalidaccount') {
351 $sql .= " AND aa.account_number IS NULL";
352}
353if ($search_current_account_valid == 'withvalidaccount') {
354 $sql .= " AND aa.account_number IS NOT NULL";
355}
356$searchCategoryProductSqlList = array();
357if ($searchCategoryProductOperator == 1) {
358 foreach ($searchCategoryProductList as $searchCategoryProduct) {
359 if (intval($searchCategoryProduct) == -2) {
360 $searchCategoryProductSqlList[] = "cp.fk_categorie IS NULL";
361 } elseif (intval($searchCategoryProduct) > 0) {
362 $searchCategoryProductSqlList[] = "cp.fk_categorie = ".((int) $searchCategoryProduct);
363 }
364 }
365 if (!empty($searchCategoryProductSqlList)) {
366 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
367 }
368} else {
369 foreach ($searchCategoryProductList as $searchCategoryProduct) {
370 if (intval($searchCategoryProduct) == -2) {
371 $searchCategoryProductSqlList[] = "cp.fk_categorie IS NULL";
372 } elseif (intval($searchCategoryProduct) > 0) {
373 $searchCategoryProductSqlList[] = "p.rowid IN (SELECT fk_product FROM ".MAIN_DB_PREFIX."categorie_product WHERE fk_categorie = ".((int) $searchCategoryProduct).")";
374 }
375 }
376 if (!empty($searchCategoryProductSqlList)) {
377 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
378 }
379}
380// Add search filter like
381if (strlen(trim($search_ref))) {
382 $sql .= natural_search("p.ref", $search_ref);
383}
384if (strlen(trim($search_label))) {
385 $sql .= natural_search("p.label", $search_label);
386}
387if (strlen(trim($search_desc))) {
388 $sql .= natural_search("p.description", $search_desc);
389}
390if (strlen(trim($search_vat))) {
391 $sql .= natural_search("p.tva_tx", price2num($search_vat), 1);
392}
393if ($search_onsell != '' && $search_onsell != '-1') {
394 $sql .= natural_search('p.tosell', $search_onsell, 1);
395}
396if ($search_onpurchase != '' && $search_onpurchase != '-1') {
397 $sql .= natural_search('p.tobuy', $search_onpurchase, 1);
398}
399
400$sql .= " GROUP BY p.rowid, p.ref, p.label, p.description, p.tosell, p.tobuy, p.tva_tx,";
401$sql .= " p.fk_product_type,";
402$sql .= ' p.tms,';
403$sql .= ' aa.rowid,';
404if (!getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED')) {
405 $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";
406} else {
407 $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";
408}
409
410$sql .= $db->order($sortfield, $sortorder);
411
412$nbtotalofrecords = '';
413if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
414 $resql = $db->query($sql);
415 $nbtotalofrecords = $db->num_rows($resql);
416 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
417 $page = 0;
418 $offset = 0;
419 }
420}
421
422$sql .= $db->plimit($limit + 1, $offset);
423
424dol_syslog("/accountancy/admin/productaccount.php", LOG_DEBUG);
425$resql = $db->query($sql);
426if ($resql) {
427 $num = $db->num_rows($resql);
428 $i = 0;
429
430 $param = '';
431 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
432 $param .= '&contextpage='.urlencode($contextpage);
433 }
434 if ($limit > 0 && $limit != $conf->liste_limit) {
435 $param .= '&limit='.((int) $limit);
436 }
437 if ($searchCategoryProductOperator == 1) {
438 $param .= "&search_category_product_operator=".urlencode((string) ($searchCategoryProductOperator));
439 }
440 foreach ($searchCategoryProductList as $searchCategoryProduct) {
441 $param .= "&search_category_product_list[]=".urlencode($searchCategoryProduct);
442 }
443 if ($search_ref > 0) {
444 $param .= "&search_ref=".urlencode($search_ref);
445 }
446 if ($search_label > 0) {
447 $param .= "&search_label=".urlencode($search_label);
448 }
449 if ($search_desc > 0) {
450 $param .= "&search_desc=".urlencode($search_desc);
451 }
452 if ($search_vat > 0) {
453 $param .= '&search_vat='.urlencode($search_vat);
454 }
455 if ($search_current_account > 0) {
456 $param .= "&search_current_account=".urlencode($search_current_account);
457 }
458 if ($search_current_account_valid && $search_current_account_valid != '-1') {
459 $param .= "&search_current_account_valid=".urlencode($search_current_account_valid);
460 }
461 if ($accounting_product_mode) {
462 $param .= '&accounting_product_mode='.urlencode($accounting_product_mode);
463 }
464
465 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">';
466 if ($optioncss != '') {
467 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
468 }
469 print '<input type="hidden" name="token" value="'.newToken().'">';
470 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
471 print '<input type="hidden" name="action" value="update">';
472 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
473 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
474 print '<input type="hidden" name="page_y" value="">';
475
476 print load_fiche_titre($langs->trans("ProductsBinding"), '', 'title_accountancy');
477 print '<br>';
478
479 print '<span class="opacitymedium">'.$langs->trans("InitAccountancyDesc").'</span><br>';
480 print '<br>';
481
482 // Select mode
483 print '<table class="noborder centpercent">';
484 print '<tr class="liste_titre">';
485 print '<td>'.$langs->trans('Options').'</td><td>'.$langs->trans('Description').'</td>';
486 print "</tr>\n";
487 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>';
488 print '<td>'.$langs->trans('OptionModeProductSellDesc');
489 print "</td></tr>\n";
490 if ($mysoc->isInEEC()) {
491 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>';
492 print '<td>'.$langs->trans('OptionModeProductSellIntraDesc');
493 print "</td></tr>\n";
494 }
495 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>';
496 print '<td>'.$langs->trans('OptionModeProductSellExportDesc');
497 print "</td></tr>\n";
498 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>';
499 print '<td>'.$langs->trans('OptionModeProductBuyDesc')."</td></tr>\n";
500 if ($mysoc->isInEEC()) {
501 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>';
502 print '<td>'.$langs->trans('OptionModeProductBuyDesc')."</td></tr>\n";
503 }
504 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>';
505 print '<td>'.$langs->trans('OptionModeProductBuyDesc')."</td></tr>\n";
506 print "</table>\n";
507
508 print '<div class="center"><input type="submit" class="button" value="'.$langs->trans('Refresh').'" name="changetype"></div>';
509
510 print "<br>\n";
511
512
513 // Filter on categories
514 $moreforfilter = '';
515 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
516 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
517
518 $massactionbutton = '';
519
520 $nbselected = is_array($toselect) ? count($toselect) : 0;
521 if ($massaction == 'set_default_account') {
522 if ($nbselected <= 0) {
523 $langs->load("errors");
524 setEventMessages($langs->trans("ErrorSelectAtLeastOne"), null, 'warnings');
525 $action = '';
526 $massaction = '';
527 }
528 }
529
530 if ($massaction !== 'set_default_account') {
531 $arrayofmassactions = array(
532 'set_default_account' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ConfirmPreselectAccount"),
533 'changeaccount' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Save") // TODO The save action should be a button "Save"
534 );
535 $massactionbutton = $form->selectMassAction('', $arrayofmassactions, 1);
536 }
537
538 //$buttonsave = '<input type="submit" class="button button-save" id="changeaccount" name="changeaccount" value="'.$langs->trans("Save").'">';
539 //print '<br><div class="center">'.$buttonsave.'</div>';
540
541 $texte = $langs->trans("ListOfProductsServices");
542 print_barre_liste($texte, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, '', 0, '', '', $limit, 0, 0, 1);
543
544 if ($massaction == 'set_default_account') {
545 $formquestion = array();
546 $formquestion[] = array('type' => 'other',
547 'name' => 'set_default_account',
548 'label' => $langs->trans("AccountancyCode"),
549 'value' => $form->select_account('', 'default_account', 1, array(), 0, 0, 'maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'));
550 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", $nbselected), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1);
551 }
552
553 // Filter on categories
554 $moreforfilter = '';
555 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
556 $formcategory = new FormCategory($db);
557 $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_PRODUCT, $searchCategoryProductList, 'minwidth300', $searchCategoryProductList ? $searchCategoryProductList : 0);
558 }
559
560 // Show/hide child products. Hidden by default
561 if (isModEnabled('variants') && getDolGlobalInt('PRODUIT_ATTRIBUTES_HIDECHILD')) {
562 $moreforfilter .= '<div class="divsearchfield">';
563 $moreforfilter .= '<input type="checkbox" id="search_show_childproducts" name="search_show_childproducts"'.($show_childproducts ? 'checked="checked"' : '').'>';
564 $moreforfilter .= ' <label for="search_show_childproducts">'.$langs->trans('ShowChildProducts').'</label>';
565 $moreforfilter .= '</div>';
566 }
567
568 $parameters = array();
569 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook
570 if (empty($reshook)) {
571 $moreforfilter .= $hookmanager->resPrint;
572 } else {
573 $moreforfilter = $hookmanager->resPrint;
574 }
575
576 if ($moreforfilter) {
577 print '<div class="liste_titre liste_titre_bydiv centpercent">';
578 print $moreforfilter;
579 print '</div>';
580 }
581
582 print '<div class="div-table-responsive">';
583 print '<table class="liste '.($moreforfilter ? "listwithfilterbefore" : "").'">';
584
585 print '<tr class="liste_titre_filter">';
586 // Action column
587 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
588 print '<td class="center liste_titre">';
589 $searchpicto = $form->showFilterButtons();
590 print $searchpicto;
591 print '</td>';
592 }
593 print '<td class="liste_titre"><input type="text" class="flat" size="8" name="search_ref" value="'.dol_escape_htmltag($search_ref).'"></td>';
594 print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_label" value="'.dol_escape_htmltag($search_label).'"></td>';
595 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_vat" placeholder="%" value="'.dol_escape_htmltag($search_vat).'"></td>';
596
597 if (getDolGlobalInt('ACCOUNTANCY_SHOW_PROD_DESC')) {
598 print '<td class="liste_titre"><input type="text" class="flat" size="20" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
599 }
600 // On sell
601 if ($accounting_product_mode == 'ACCOUNTANCY_SELL' || $accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA' || $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
602 print '<td class="liste_titre center">'.$form->selectyesno('search_onsell', $search_onsell, 1, false, 1, 1).'</td>';
603 } else {
604 // On buy
605 print '<td class="liste_titre center">'.$form->selectyesno('search_onpurchase', $search_onpurchase, 1, false, 1, 1).'</td>';
606 }
607 // Current account
608 print '<td class="liste_titre">';
609 print '<input type="text" class="flat" size="6" name="search_current_account" id="search_current_account" value="'.dol_escape_htmltag($search_current_account).'">';
610 $listofvals = array('withoutvalidaccount' => $langs->trans("WithoutValidAccount"), 'withvalidaccount' => $langs->trans("WithValidAccount"));
611 print ' '.$langs->trans("or").' '.$form->selectarray('search_current_account_valid', $listofvals, $search_current_account_valid, 1);
612 print '</td>';
613 print '<td class="liste_titre">&nbsp;</td>';
614 // Action column
615 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
616 print '<td class="center liste_titre">';
617 $searchpicto = $form->showFilterButtons();
618 print $searchpicto;
619 print '</td>';
620 }
621 print '</tr>';
622
623 print '<tr class="liste_titre">';
624 // Action column
625 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
626 $clickpitco = $form->showCheckAddButtons('checkforselect', 1);
627 print_liste_field_titre($clickpitco, '', '', '', '', '', '', '', 'center ');
628 }
629 print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
630 print_liste_field_titre("Label", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
631 if (getDolGlobalInt('ACCOUNTANCY_SHOW_PROD_DESC')) {
632 print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "p.description", "", $param, '', $sortfield, $sortorder);
633 }
634 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "p.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ');
635 // On sell / On purchase
636 if ($accounting_product_mode == 'ACCOUNTANCY_SELL' || $accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA' || $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
637 print_liste_field_titre("OnSell", $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'center ');
638 } else {
639 print_liste_field_titre("OnBuy", $_SERVER["PHP_SELF"], "p.tobuy", "", $param, '', $sortfield, $sortorder, 'center ');
640 }
641 print_liste_field_titre("CurrentDedicatedAccountingAccount", $_SERVER["PHP_SELF"], (!getDolGlobalString('MAIN_PRODUCT_PERENTITY_SHARED') ? "p." : "ppe.") . $accountancy_field_name, "", $param, '', $sortfield, $sortorder);
642 print_liste_field_titre("AssignDedicatedAccountingAccount");
643 // Action column
644 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
645 $clickpitco = $form->showCheckAddButtons('checkforselect', 1);
646 print_liste_field_titre($clickpitco, '', '', '', '', '', '', '', 'center ');
647 }
648 print '</tr>';
649
650 $product_static = new Product($db);
651
652 $i = 0;
653 while ($i < min($num, $limit)) {
654 $obj = $db->fetch_object($resql);
655
656 // Ref produit as link
657 $product_static->ref = $obj->ref;
658 $product_static->id = $obj->rowid;
659 $product_static->type = $obj->product_type;
660 $product_static->label = $obj->label;
661 $product_static->description = $obj->description;
662 $product_static->status = $obj->tosell;
663 $product_static->status_buy = $obj->tobuy;
664
665 // Sales
666 if ($obj->product_type == 0) {
667 if ($accounting_product_mode == 'ACCOUNTANCY_SELL') {
668 $compta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
669 $compta_prodsell_id = $aarowid_prodsell;
670 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') {
671 $compta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
672 $compta_prodsell_id = $aarowid_prodsell_intra;
673 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
674 $compta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
675 $compta_prodsell_id = $aarowid_prodsell_export;
676 } else {
677 $compta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
678 $compta_prodsell_id = $aarowid_prodsell;
679 }
680 } else {
681 if ($accounting_product_mode == 'ACCOUNTANCY_SELL') {
682 $compta_prodsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
683 $compta_prodsell_id = $aarowid_servsell;
684 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') {
685 $compta_prodsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
686 $compta_prodsell_id = $aarowid_servsell_intra;
687 } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') {
688 $compta_prodsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
689
690 $compta_prodsell_id = $aarowid_servsell_export;
691 } else {
692 $compta_prodsell = getDolGlobalString('ACCOUNTING_SERVICE_SOLD_ACCOUNT', $langs->trans("CodeNotDef"));
693 $compta_prodsell_id = $aarowid_servsell;
694 }
695 }
696
697 // Purchases
698 if ($obj->product_type == 0) {
699 if ($accounting_product_mode == 'ACCOUNTANCY_BUY') {
700 $compta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
701 $compta_prodbuy_id = $aarowid_prodbuy;
702 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA') {
703 $compta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
704 $compta_prodbuy_id = $aarowid_prodbuy_intra;
705 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT') {
706 $compta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
707 $compta_prodbuy_id = $aarowid_prodbuy_export;
708 } else {
709 $compta_prodbuy = getDolGlobalString('ACCOUNTING_PRODUCT_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
710 $compta_prodbuy_id = $aarowid_prodbuy;
711 }
712 } else {
713 if ($accounting_product_mode == 'ACCOUNTANCY_BUY') {
714 $compta_prodbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
715 $compta_prodbuy_id = $aarowid_servbuy;
716 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_INTRA') {
717 $compta_prodbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_INTRA_ACCOUNT', $langs->trans("CodeNotDef"));
718 $compta_prodbuy_id = $aarowid_servbuy_intra;
719 } elseif ($accounting_product_mode == 'ACCOUNTANCY_BUY_EXPORT') {
720 $compta_prodbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_EXPORT_ACCOUNT', $langs->trans("CodeNotDef"));
721 $compta_prodbuy_id = $aarowid_servbuy_export;
722 } else {
723 $compta_prodbuy = getDolGlobalString('ACCOUNTING_SERVICE_BUY_ACCOUNT', $langs->trans("CodeNotDef"));
724 $compta_prodbuy_id = $aarowid_servbuy;
725 }
726 }
727
728 $selected = 0;
729 if (!empty($toselect)) {
730 if (in_array($product_static->id, $toselect)) {
731 $selected = 1;
732 }
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.
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.
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.
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_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 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.