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