dolibarr  20.0.0-beta
card.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) 2024 Frédéric France <frederic.france@free.fr>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <https://www.gnu.org/licenses/>.
19  */
20 
27 // Load Dolibarr environment
28 require '../../main.inc.php';
29 require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
30 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
31 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancysystem.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
33 
34 $error = 0;
35 
36 // Load translation files required by the page
37 $langs->loadLangs(array('accountancy', 'bills', 'compta'));
38 
39 $action = GETPOST('action', 'aZ09');
40 $backtopage = GETPOST('backtopage', 'alpha');
41 $id = GETPOSTINT('id');
42 $ref = GETPOST('ref', 'alpha');
43 $rowid = GETPOSTINT('rowid');
44 $cancel = GETPOST('cancel', 'alpha');
45 
46 $account_number = GETPOST('account_number', 'alphanohtml');
47 $label = GETPOST('label', 'alpha');
48 
49 // Security check
50 if ($user->socid > 0) {
52 }
53 if (!$user->hasRight('accounting', 'chartofaccount')) {
55 }
56 
57 
59 
60 
61 /*
62  * Action
63  */
64 
65 if (GETPOST('cancel', 'alpha')) {
66  $urltogo = $backtopage ? $backtopage : DOL_URL_ROOT.'/accountancy/admin/account.php';
67  header("Location: ".$urltogo);
68  exit;
69 }
70 
71 if ($action == 'add' && $user->hasRight('accounting', 'chartofaccount')) {
72  if (!$cancel) {
73  if (!$account_number) {
74  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("AccountNumber")), null, 'errors');
75  $action = 'create';
76  } elseif (!$label) {
77  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Label")), null, 'errors');
78  $action = 'create';
79  } else {
80  $sql = "SELECT pcg_version FROM " . MAIN_DB_PREFIX . "accounting_system WHERE rowid = ".((int) getDolGlobalInt('CHARTOFACCOUNTS'));
81 
82  dol_syslog('accountancy/admin/card.php:: $sql=' . $sql);
83  $result = $db->query($sql);
84  $obj = $db->fetch_object($result);
85 
86  // Clean code
87 
88  // To manage zero or not at the end of the accounting account
89  if (!getDolGlobalString('ACCOUNTING_MANAGE_ZERO')) {
90  $account_number = clean_account($account_number);
91  }
92 
93  $account_parent = (GETPOSTINT('account_parent') > 0) ? GETPOSTINT('account_parent') : 0;
94 
95  $object->fk_pcg_version = $obj->pcg_version;
96  $object->pcg_type = GETPOST('pcg_type', 'alpha');
97  $object->account_number = $account_number;
98  $object->account_parent = $account_parent;
99  $object->account_category = GETPOSTINT('account_category');
100  $object->label = $label;
101  $object->labelshort = GETPOST('labelshort', 'alpha');
102  $object->active = 1;
103 
104  $res = $object->create($user);
105  if ($res == -3) {
106  $error = 1;
107  $action = "create";
108  setEventMessages($object->error, $object->errors, 'errors');
109  } elseif ($res == -4) {
110  $error = 2;
111  $action = "create";
112  setEventMessages($object->error, $object->errors, 'errors');
113  } elseif ($res < 0) {
114  $error++;
115  setEventMessages($object->error, $object->errors, 'errors');
116  $action = "create";
117  }
118  if (!$error) {
119  setEventMessages("RecordCreatedSuccessfully", null, 'mesgs');
120  $urltogo = $backtopage ? $backtopage : DOL_URL_ROOT.'/accountancy/admin/account.php';
121  header("Location: " . $urltogo);
122  exit;
123  }
124  }
125  }
126 } elseif ($action == 'edit' && $user->hasRight('accounting', 'chartofaccount')) {
127  if (!$cancel) {
128  if (!$account_number) {
129  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("AccountNumber")), null, 'errors');
130  $action = 'update';
131  } elseif (!$label) {
132  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Label")), null, 'errors');
133  $action = 'update';
134  } else {
135  $result = $object->fetch($id);
136 
137  $sql = "SELECT pcg_version FROM ".MAIN_DB_PREFIX."accounting_system WHERE rowid=".((int) getDolGlobalInt('CHARTOFACCOUNTS'));
138 
139  dol_syslog('accountancy/admin/card.php:: $sql=' . $sql);
140  $result2 = $db->query($sql);
141  $obj = $db->fetch_object($result2);
142 
143  // Clean code
144 
145  // To manage zero or not at the end of the accounting account
146  if (!getDolGlobalString('ACCOUNTING_MANAGE_ZERO')) {
147  $account_number = clean_account($account_number);
148  }
149 
150  $account_parent = (GETPOSTINT('account_parent') > 0) ? GETPOSTINT('account_parent') : 0;
151 
152  $object->fk_pcg_version = $obj->pcg_version;
153  $object->pcg_type = GETPOST('pcg_type', 'alpha');
154  $object->account_number = $account_number;
155  $object->account_parent = $account_parent;
156  $object->account_category = GETPOSTINT('account_category');
157  $object->label = $label;
158  $object->labelshort = GETPOST('labelshort', 'alpha');
159 
160  $result = $object->update($user);
161 
162  if ($result > 0) {
163  $urltogo = $backtopage ? $backtopage : ($_SERVER["PHP_SELF"] . "?id=" . $id);
164  header("Location: " . $urltogo);
165  exit();
166  } elseif ($result == -2) {
167  setEventMessages($langs->trans("ErrorAccountNumberAlreadyExists", $object->account_number), null, 'errors');
168  } else {
169  setEventMessages($object->error, null, 'errors');
170  }
171  }
172  } else {
173  $urltogo = $backtopage ? $backtopage : ($_SERVER["PHP_SELF"]."?id=".$id);
174  header("Location: ".$urltogo);
175  exit();
176  }
177 } elseif ($action == 'delete' && $user->hasRight('accounting', 'chartofaccount')) {
178  $result = $object->fetch($id);
179 
180  if (!empty($object->id)) {
181  $result = $object->delete($user);
182 
183  if ($result > 0) {
184  header("Location: account.php");
185  exit;
186  }
187  }
188 
189  if ($result < 0) {
190  setEventMessages($object->error, $object->errors, 'errors');
191  }
192 }
193 
194 
195 /*
196  * View
197  */
198 
199 $form = new Form($db);
200 $formaccounting = new FormAccounting($db);
201 
202 $accountsystem = new AccountancySystem($db);
203 $accountsystem->fetch(getDolGlobalInt('CHARTOFACCOUNTS'));
204 
205 $title = $langs->trans('AccountAccounting')." - ".$langs->trans('Card');
206 
207 $help_url = 'EN:Module_Double_Entry_Accounting#Setup|FR:Module_Comptabilit&eacute;_en_Partie_Double#Configuration';
208 
209 llxHeader('', $title, $help_url);
210 
211 
212 // Create mode
213 if ($action == 'create') {
214  print load_fiche_titre($langs->trans('NewAccountingAccount'));
215 
216  print '<form name="add" action="'.$_SERVER["PHP_SELF"].'" method="POST">'."\n";
217  print '<input type="hidden" name="token" value="'.newToken().'">';
218  print '<input type="hidden" name="action" value="add">';
219 
220  print dol_get_fiche_head();
221 
222  print '<table class="border centpercent">';
223 
224  // Chart of account
225  print '<tr><td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("Chartofaccounts").'</span></td>';
226  print '<td>';
227  print $accountsystem->ref;
228  print '</td></tr>';
229 
230  // Account number
231  print '<tr><td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("AccountNumber").'</span></td>';
232  print '<td><input name="account_number" size="30" value="'.$account_number.'"></td></tr>';
233 
234  // Label
235  print '<tr><td><span class="fieldrequired">'.$langs->trans("Label").'</span></td>';
236  print '<td><input name="label" size="70" value="'.$object->label.'"></td></tr>';
237 
238  // Label short
239  print '<tr><td>'.$langs->trans("LabelToShow").'</td>';
240  print '<td><input name="labelshort" size="70" value="'.$object->labelshort.'"></td></tr>';
241 
242  // Account parent
243  print '<tr><td>'.$langs->trans("Accountparent").'</td>';
244  print '<td>';
245  print $formaccounting->select_account($object->account_parent, 'account_parent', 1, [], 0, 0, 'minwidth200');
246  print '</td></tr>';
247 
248  // Chart of accounts type
249  print '<tr><td>';
250  print $form->textwithpicto($langs->trans("Pcgtype"), $langs->transnoentitiesnoconv("PcgtypeDesc"));
251  print '</td>';
252  print '<td>';
253  print '<input type="text" name="pcg_type" list="pcg_type_datalist" value="'.dol_escape_htmltag(GETPOSTISSET('pcg_type') ? GETPOST('pcg_type', 'alpha') : $object->pcg_type).'">';
254  // autosuggest from existing account types if found
255  print '<datalist id="pcg_type_datalist">';
256  $sql = "SELECT DISTINCT pcg_type FROM " . MAIN_DB_PREFIX . "accounting_account";
257  $sql .= " WHERE fk_pcg_version = '" . $db->escape($accountsystem->ref) . "'";
258  $sql .= ' AND entity in ('.getEntity('accounting_account', 0).')'; // Always limit to current entity. No sharing in accountancy.
259  $sql .= ' LIMIT 50000'; // just as a sanity check
260  $resql = $db->query($sql);
261  if ($resql) {
262  while ($obj = $db->fetch_object($resql)) {
263  print '<option value="' . dol_escape_htmltag($obj->pcg_type) . '">';
264  }
265  }
266  print '</datalist>';
267  print '</td></tr>';
268 
269  // Category
270  print '<tr><td>';
271  print $form->textwithpicto($langs->trans("AccountingCategory"), $langs->transnoentitiesnoconv("AccountingAccountGroupsDesc"));
272  print '</td>';
273  print '<td>';
274  print $formaccounting->select_accounting_category($object->account_category, 'account_category', 1, 0, 1);
275  print '</td></tr>';
276 
277  print '</table>';
278 
279  print dol_get_fiche_end();
280 
281  print '<div class="center">';
282  print '<input class="button button-save" type="submit" value="'.$langs->trans("Save").'">';
283  print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
284  print '<input class="button button-cancel" type="submit" name="cancel" value="'.$langs->trans("Cancel").'">';
285  print '</div>';
286 
287  print '</form>';
288 } elseif ($id > 0 || $ref) {
289  $result = $object->fetch($id, $ref, 1);
290 
291  if ($result > 0) {
293 
294  // Edit mode
295  if ($action == 'update') {
296  print dol_get_fiche_head($head, 'card', $langs->trans('AccountAccounting'), 0, 'accounting_account');
297 
298  print '<form name="update" action="'.$_SERVER["PHP_SELF"].'" method="POST">'."\n";
299  print '<input type="hidden" name="token" value="'.newToken().'">';
300  print '<input type="hidden" name="action" value="edit">';
301  print '<input type="hidden" name="id" value="'.$id.'">';
302  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
303 
304  print '<table class="border centpercent">';
305 
306  // Account number
307  print '<tr><td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("AccountNumber").'</span></td>';
308  print '<td><input name="account_number" size="30" value="'.$object->account_number.'"</td></tr>';
309 
310  // Label
311  print '<tr><td><span class="fieldrequired">'.$langs->trans("Label").'</span></td>';
312  print '<td><input name="label" size="70" value="'.$object->label.'"</td></tr>';
313 
314  // Label short
315  print '<tr><td>'.$langs->trans("LabelToShow").'</td>';
316  print '<td><input name="labelshort" size="70" value="'.$object->labelshort.'"</td></tr>';
317 
318  // Account parent
319  print '<tr><td>'.$langs->trans("Accountparent").'</td>';
320  print '<td>';
321  // Note: We accept disabled account as parent account so we can build a hierarchy and use only children
322  print $formaccounting->select_account($object->account_parent, 'account_parent', 1, array(), 0, 0, 'minwidth100 maxwidth300 maxwidthonsmartphone', 1, '');
323  print '</td></tr>';
324 
325  // Chart of accounts type
326  print '<tr><td>';
327  print $form->textwithpicto($langs->trans("Pcgtype"), $langs->transnoentitiesnoconv("PcgtypeDesc"));
328  print '</td>';
329  print '<td>';
330  print '<input type="text" name="pcg_type" list="pcg_type_datalist" value="'.dol_escape_htmltag(GETPOSTISSET('pcg_type') ? GETPOST('pcg_type', 'alpha') : $object->pcg_type).'">';
331  // autosuggest from existing account types if found
332  print '<datalist id="pcg_type_datalist">';
333  $sql = 'SELECT DISTINCT pcg_type FROM ' . MAIN_DB_PREFIX . 'accounting_account';
334  $sql .= " WHERE fk_pcg_version = '" . $db->escape($accountsystem->ref) . "'";
335  $sql .= ' AND entity in ('.getEntity('accounting_account', 0).')'; // Always limit to current entity. No sharing in accountancy.
336  $sql .= ' LIMIT 50000'; // just as a sanity check
337  $resql = $db->query($sql);
338  if ($resql) {
339  while ($obj = $db->fetch_object($resql)) {
340  print '<option value="' . dol_escape_htmltag($obj->pcg_type) . '">';
341  }
342  }
343  print '</datalist>';
344  print '</td></tr>';
345 
346  // Category
347  print '<tr><td>';
348  print $form->textwithpicto($langs->trans("AccountingCategory"), $langs->transnoentitiesnoconv("AccountingAccountGroupsDesc"));
349  print '</td>';
350  print '<td>';
351  print $formaccounting->select_accounting_category($object->account_category, 'account_category', 1);
352  print '</td></tr>';
353 
354  print '</table>';
355 
356  print dol_get_fiche_end();
357 
358  print $form->buttonsSaveCancel();
359 
360  print '</form>';
361  } else {
362  // View mode
363  $linkback = '<a href="'.DOL_URL_ROOT.'/accountancy/admin/account.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
364 
365  print dol_get_fiche_head($head, 'card', $langs->trans('AccountAccounting'), -1, 'accounting_account');
366 
367  dol_banner_tab($object, 'ref', $linkback, 1, 'account_number', 'ref');
368 
369 
370  print '<div class="fichecenter">';
371  print '<div class="underbanner clearboth"></div>';
372 
373  print '<table class="border centpercent tableforfield">';
374 
375  // Label
376  print '<tr><td class="titlefield">'.$langs->trans("Label").'</td>';
377  print '<td colspan="2">'.$object->label.'</td></tr>';
378 
379  // Label to show
380  print '<tr><td class="titlefield">'.$langs->trans("LabelToShow").'</td>';
381  print '<td colspan="2">'.$object->labelshort.'</td></tr>';
382 
383  // Account parent
384  $accp = new AccountingAccount($db);
385  if (!empty($object->account_parent)) {
386  $accp->fetch($object->account_parent, '');
387  }
388  print '<tr><td>'.$langs->trans("Accountparent").'</td>';
389  print '<td colspan="2">'.$accp->account_number.' - '.$accp->label.'</td></tr>';
390 
391  // Group of accounting account
392  print '<tr><td>';
393  print $form->textwithpicto($langs->trans("Pcgtype"), $langs->transnoentitiesnoconv("PcgtypeDesc"));
394  print '</td>';
395  print '<td colspan="2">'.$object->pcg_type.'</td></tr>';
396 
397  // Custom group of accounting account
398  print "<tr><td>";
399  print $form->textwithpicto($langs->trans("AccountingCategory"), $langs->transnoentitiesnoconv("AccountingAccountGroupsDesc"));
400  print "</td><td colspan='2'>".$object->account_category_label."</td>";
401 
402  print '</table>';
403 
404  print '</div>';
405 
406  print dol_get_fiche_end();
407 
408  /*
409  * Actions buttons
410  */
411  print '<div class="tabsAction">';
412 
413  if ($user->hasRight('accounting', 'chartofaccount')) {
414  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=update&token='.newToken().'&id='.$object->id.'">'.$langs->trans('Modify').'</a>';
415  } else {
416  print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'">'.$langs->trans('Modify').'</a>';
417  }
418 
419  // Delete
420  $permissiontodelete = $user->hasRight('accounting', 'chartofaccount');
421  print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
422 
423  print '</div>';
424  }
425  } else {
426  dol_print_error($db, $object->error, $object->errors);
427  }
428 }
429 
430 // End of page
431 llxFooter();
432 $db->close();
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
accounting_prepare_head(AccountingAccount $object)
Prepare array with list of tabs.
clean_account($account)
Return accounting account without zero on the right.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:55
llxFooter()
Empty footer.
Definition: wrapper.php:69
Class to manage accountancy systems.
Class to manage accounting accounts.
Class to manage generation of HTML components for accounting management.
Class to manage generation of HTML components Only common components must be here.
if(isModEnabled('invoice') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&!getDolGlobalString('MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') && $user->hasRight('tax', 'charges', 'lire')) if(isModEnabled('invoice') &&isModEnabled('order') && $user->hasRight("commande", "lire") &&!getDolGlobalString('WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER')) $sql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
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...
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.