dolibarr  20.0.0-beta
card.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2004-2020 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) 2005-2013 Regis Houssin <regis.houssin@inodbox.com>
4  * Copyright (C) 2016-2018 Frédéric France <frederic.france@netlogic.fr>
5  * Copyright (C) 2017-2022 Alexandre Spangaro <aspangaro@open-dsi.fr>
6  * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
28 // Load Dolibarr environment
29 require '../../main.inc.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formsocialcontrib.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/paymentsocialcontribution.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
36 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/lib/tax.lib.php';
38 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
39 if (isModEnabled('project')) {
40  include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
41  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
42 }
43 if (isModEnabled('accounting')) {
44  include_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
45 }
46 
47 // Load translation files required by the page
48 $langs->loadLangs(array('compta', 'bills', 'banks', 'hrm'));
49 
50 $id = GETPOSTINT('id');
51 $ref = GETPOST('ref', 'alpha');
52 $action = GETPOST('action', 'aZ09');
53 $confirm = GETPOST('confirm', 'alpha');
54 $cancel = GETPOST('cancel', 'aZ09');
55 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'myobjectcard'; // To manage different context of search
56 $backtopage = GETPOST('backtopage', 'alpha');
57 $backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
58 $lineid = GETPOSTINT('lineid');
59 
60 $fk_project = (GETPOST('fk_project') ? GETPOSTINT('fk_project') : 0);
61 
62 $dateech = dol_mktime(GETPOST('echhour'), GETPOST('echmin'), GETPOST('echsec'), GETPOST('echmonth'), GETPOST('echday'), GETPOST('echyear'));
63 $dateperiod = dol_mktime(GETPOST('periodhour'), GETPOST('periodmin'), GETPOST('periodsec'), GETPOST('periodmonth'), GETPOST('periodday'), GETPOST('periodyear'));
64 $label = GETPOST('label', 'alpha');
65 $actioncode = GETPOST('actioncode');
66 $fk_user = GETPOSTINT('userid') > 0 ? GETPOSTINT('userid') : 0;
67 
68 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
69 $hookmanager->initHooks(array('taxcard', 'globalcard'));
70 
71 // Initialize technical objects
72 $object = new ChargeSociales($db);
73 $extrafields = new ExtraFields($db);
74 $diroutputmassaction = $conf->tax->dir_output.'/temp/massgeneration/'.$user->id;
75 $hookmanager->initHooks(array('taxsocialcontributioncard', 'globalcard'));
76 
77 if (empty($action) && empty($id) && empty($ref)) {
78  $action = 'view';
79 }
80 
81 // Load object
82 if ($id > 0 || $ref) {
83  $object->fetch($id, $ref);
84 }
85 
86 $permissiontoread = $user->hasRight('tax', 'charges', 'lire');
87 $permissiontoadd = $user->hasRight('tax', 'charges', 'creer'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
88 $permissiontodelete = $user->rights->tax->charges->supprimer || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_UNPAID);
89 $permissionnote = $user->hasRight('tax', 'charges', 'creer'); // Used by the include of actions_setnotes.inc.php
90 $permissiondellink = $user->hasRight('tax', 'charges', 'creer'); // Used by the include of actions_dellink.inc.php
91 $upload_dir = $conf->tax->multidir_output[isset($object->entity) ? $object->entity : 1];
92 
93 // Security check
94 $socid = GETPOSTINT('socid');
95 if ($user->socid) {
96  $socid = $user->socid;
97 }
98 $result = restrictedArea($user, 'tax', $object->id, 'chargesociales', 'charges');
99 
100 
101 
102 /*
103  * Actions
104  */
105 
106 $parameters = array('socid' => $socid);
107 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
108 if ($reshook < 0) {
109  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
110 }
111 
112 if (empty($reshook)) {
113  // Classify paid
114  if ($action == 'confirm_paid' && $permissiontoadd && $confirm == 'yes') {
115  $result = $object->setPaid($user);
116  }
117 
118  if ($action == 'reopen' && $user->hasRight('tax', 'charges', 'creer')) {
119  if ($object->paye) {
120  $result = $object->setUnpaid($user);
121  if ($result > 0) {
122  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id);
123  exit();
124  } else {
125  setEventMessages($object->error, $object->errors, 'errors');
126  }
127  }
128  }
129 
130  // Link to a project
131  if ($action == 'classin' && $permissiontoadd) {
132  $object->setProject(GETPOST('fk_project'));
133  }
134 
135  if ($action == 'setfk_user' && $permissiontoadd) {
136  $object->fk_user = $fk_user;
137  $object->update($user);
138  }
139 
140  if ($action == 'setlib' && $permissiontoadd) {
141  $result = $object->setValueFrom('libelle', GETPOST('lib'), '', '', 'text', '', $user, 'TAX_MODIFY');
142  if ($result < 0) {
143  setEventMessages($object->error, $object->errors, 'errors');
144  }
145  }
146 
147  // payment mode
148  if ($action == 'setmode' && $permissiontoadd) {
149  $result = $object->setPaymentMethods(GETPOSTINT('mode_reglement_id'));
150  if ($result < 0) {
151  setEventMessages($object->error, $object->errors, 'errors');
152  }
153  }
154 
155  // Bank account
156  if ($action == 'setbankaccount' && $permissiontoadd) {
157  $result = $object->setBankAccount(GETPOSTINT('fk_account'));
158  if ($result < 0) {
159  setEventMessages($object->error, $object->errors, 'errors');
160  }
161  }
162 
163  // Delete social contribution
164  if ($action == 'confirm_delete' && $permissiontodelete && $confirm == 'yes') {
165  $totalpaid = $object->getSommePaiement();
166  if (empty($totalpaid)) {
167  $result = $object->delete($user);
168  if ($result > 0) {
169  header("Location: list.php");
170  exit;
171  } else {
172  setEventMessages($object->error, $object->errors, 'errors');
173  }
174  } else {
175  setEventMessages($langs->trans('DisabledBecausePayments'), null, 'errors');
176  }
177  }
178 
179 
180  // Add social contribution
181  if ($action == 'add' && $permissiontoadd) {
182  $amount = price2num(GETPOST('amount', 'alpha'), 'MT');
183 
184  if (!$dateech) {
185  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Date")), null, 'errors');
186  $action = 'create';
187  } elseif (!$dateperiod) {
188  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Period")), null, 'errors');
189  $action = 'create';
190  } elseif (!($actioncode > 0)) {
191  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Type")), null, 'errors');
192  $action = 'create';
193  } elseif (empty($amount)) {
194  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount")), null, 'errors');
195  $action = 'create';
196  } elseif (!is_numeric($amount)) {
197  setEventMessages($langs->trans("ErrorFieldMustBeANumeric", $langs->transnoentities("Amount")), null, 'errors');
198  $action = 'create';
199  } else {
200  $object->type = $actioncode;
201  $object->label = GETPOST('label', 'alpha');
202  $object->date_ech = $dateech;
203  $object->periode = $dateperiod;
204  $object->period = $dateperiod;
205  $object->amount = $amount;
206  $object->fk_user = $fk_user;
207  $object->mode_reglement_id = GETPOSTINT('mode_reglement_id');
208  $object->fk_account = GETPOSTINT('fk_account');
209  $object->fk_project = GETPOSTINT('fk_project');
210 
211  $id = $object->create($user);
212  if ($id <= 0) {
213  setEventMessages($object->error, $object->errors, 'errors');
214  $action = 'create';
215  }
216  }
217  }
218 
219 
220  if ($action == 'update' && !$cancel && $permissiontoadd) {
221  $amount = price2num(GETPOST('amount', 'alpha'), 'MT');
222 
223  if (!$dateech) {
224  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Date")), null, 'errors');
225  $action = 'edit';
226  } elseif (!$dateperiod) {
227  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Period")), null, 'errors');
228  $action = 'edit';
229  } elseif (empty($amount)) {
230  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount")), null, 'errors');
231  $action = 'edit';
232  } elseif (!is_numeric($amount)) {
233  setEventMessages($langs->trans("ErrorFieldMustBeANumeric", $langs->transnoentities("Amount")), null, 'errors');
234  $action = 'create';
235  } else {
236  $result = $object->fetch($id);
237 
238  $object->date_ech = $dateech;
239  $object->periode = $dateperiod;
240  $object->period = $dateperiod;
241  $object->amount = $amount;
242  $object->fk_user = $fk_user;
243 
244  $result = $object->update($user);
245  if ($result <= 0) {
246  setEventMessages($object->error, $object->errors, 'errors');
247  }
248  }
249  }
250 
251  // Action clone object
252  if ($action == 'confirm_clone' && $confirm != 'yes') {
253  $action = '';
254  }
255 
256  if ($action == 'confirm_clone' && $confirm == 'yes' && $permissiontoadd) {
257  $db->begin();
258 
259  $originalId = $object->id;
260 
261  if ($object->id > 0) {
262  $object->id = 0;
263  $object->ref = '';
264  $object->paye = 0;
265  if (GETPOST('amount', 'alphanohtml')) {
266  $object->amount = price2num(GETPOST('amount', 'alphanohtml'), 'MT', 2);
267  }
268 
269  if (GETPOST('clone_label', 'alphanohtml')) {
270  $object->label = GETPOST('clone_label', 'alphanohtml');
271  } else {
272  $object->label = $langs->trans("CopyOf").' '.$object->label;
273  }
274 
275  if (GETPOSTINT('clone_for_next_month')) { // This can be true only if TAX_ADD_CLONE_FOR_NEXT_MONTH_CHECKBOX has been set
276  $object->periode = dol_time_plus_duree($object->periode, 1, 'm');
277  $object->period = dol_time_plus_duree($object->periode, 1, 'm');
278  $object->date_ech = dol_time_plus_duree($object->date_ech, 1, 'm');
279  } else {
280  // Note date_ech is often a little bit higher than dateperiod
281  $newdateperiod = dol_mktime(0, 0, 0, GETPOSTINT('clone_periodmonth'), GETPOSTINT('clone_periodday'), GETPOSTINT('clone_periodyear'));
282  $newdateech = dol_mktime(0, 0, 0, GETPOSTINT('clone_date_echmonth'), GETPOSTINT('clone_date_echday'), GETPOSTINT('clone_date_echyear'));
283  if ($newdateperiod) {
284  $object->periode = $newdateperiod;
285  $object->period = $newdateperiod;
286  if (empty($newdateech)) {
287  $object->date_ech = $object->periode;
288  }
289  }
290  if ($newdateech) {
291  $object->date_ech = $newdateech;
292  if (empty($newdateperiod)) {
293  // TODO We can here get dol_get_last_day of previous month:
294  // $object->periode = dol_get_last_day(year of $object->date_ech - 1m, month or $object->date_ech -1m)
295  $object->periode = $object->date_ech;
296  $object->period = $object->date_ech;
297  }
298  }
299  }
300 
301  $resultcheck = $object->check();
302  if ($resultcheck) {
303  $id = $object->create($user);
304  if ($id > 0) {
305  $db->commit();
306  $db->close();
307 
308  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
309  exit;
310  } else {
311  $id = $originalId;
312  $db->rollback();
313 
314  setEventMessages($object->error, $object->errors, 'errors');
315  }
316  }
317  } else {
318  $db->rollback();
319  dol_print_error($db, $object->error);
320  }
321  }
322 
323  // Actions to build doc
324  include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
325 }
326 
327 
328 /*
329  * View
330  */
331 
332 $form = new Form($db);
333 $formfile = new FormFile($db);
334 $formsocialcontrib = new FormSocialContrib($db);
335 $bankaccountstatic = new Account($db);
336 if (isModEnabled('project')) {
337  $formproject = new FormProjets($db);
338 }
339 
340 $now = dol_now();
341 
342 $title = $langs->trans("SocialContribution").' - '.$langs->trans("Card");
343 $help_url = 'EN:Module_Taxes_and_social_contributions|FR:Module_Taxes_et_charges_spéciales|ES:M&oacute;dulo Impuestos y cargas sociales (IVA, impuestos)';
344 llxHeader("", $title, $help_url);
345 
346 
347 // Form to create a social contribution
348 if ($action == 'create') {
349  print load_fiche_titre($langs->trans("NewSocialContribution"));
350 
351  print '<form name="charge" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
352  print '<input type="hidden" name="token" value="'.newToken().'">';
353  print '<input type="hidden" name="action" value="add">';
354 
355  print dol_get_fiche_head();
356 
357  print '<table class="border centpercent tableforfieldcreate">';
358 
359  // Label
360  print "<tr>";
361  print '<td class="titlefieldcreate fieldrequired">';
362  print $langs->trans("Label");
363  print '</td>';
364  print '<td><input type="text" name="label" class="flat minwidth300" value="'.dol_escape_htmltag(GETPOST('label', 'alpha')).'" autofocus></td>';
365  print '</tr>';
366  print '<tr>';
367 
368  // Type
369  print '<td class="fieldrequired">';
370  print $langs->trans("Type");
371  print '</td>';
372  print '<td>';
373  $formsocialcontrib->select_type_socialcontrib(GETPOST("actioncode", 'alpha') ? GETPOST("actioncode", 'alpha') : '', 'actioncode', 1);
374  print '</td>';
375  print '</tr>';
376 
377  // Date
378  print '<tr>';
379  print '<td class="fieldrequired">';
380  print $langs->trans("Date");
381  print '</td>';
382  print '<td>';
383  print $form->selectDate(!empty($dateech) ? $dateech : '-1', 'ech', 0, 0, 0, 'charge', 1, 1);
384  print '</td>';
385  print "</tr>\n";
386 
387  // Date end period
388  print '<tr>';
389  print '<td class="fieldrequired">';
390  print $form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo"));
391  print '</td>';
392  print '<td>';
393  print $form->selectDate(!empty($dateperiod) ? $dateperiod : '-1', 'period', 0, 0, 0, 'charge', 1);
394  print '</td>';
395  print '</tr>';
396 
397  // Amount
398  print '<tr>';
399  print '<td class="fieldrequired">';
400  print $langs->trans("Amount");
401  print '</td>';
402  print '<td><input type="text" size="6" name="amount" class="flat" value="'.dol_escape_htmltag(GETPOST('amount', 'alpha')).'"></td>';
403  print '</tr>';
404 
405  // Employee
406  print '<tr><td>';
407  print $langs->trans('Employee');
408  print '</td>';
409  print '<td>'.img_picto('', 'user', 'class="pictofixedwidth"').$form->select_dolusers('', 'userid', 1).'</td></tr>';
410 
411  // Project
412  if (isModEnabled('project')) {
413  $formproject = new FormProjets($db);
414 
415  // Associated project
416  $langs->load("projects");
417 
418  print '<tr><td>'.$langs->trans("Project").'</td><td>';
419 
420  print img_picto('', 'project', 'class="pictofixedwidth"').$formproject->select_projects(-1, $fk_project, 'fk_project', 0, 0, 1, 1, 0, 0, 0, '', 1);
421 
422  print '</td></tr>';
423  }
424 
425  // Payment Mode
426  print '<tr><td>'.$langs->trans('DefaultPaymentMode').'</td><td colspan="2">';
427  $form->select_types_paiements(GETPOSTINT('mode_reglement_id'), 'mode_reglement_id');
428  print '</td></tr>';
429 
430  // Bank Account
431  if (isModEnabled("bank")) {
432  print '<tr><td>'.$langs->trans('DefaultBankAccount').'</td><td colspan="2">';
433  print img_picto('', 'bank_account', 'class="pictofixedwidth"').$form->select_comptes(GETPOSTINT('fk_account'), 'fk_account', 0, '', 2, '', 0, '', 1);
434  print '</td></tr>';
435  }
436 
437  print '</table>';
438 
439  print dol_get_fiche_end();
440 
441  print '<div class="center">';
442  print '<input type="submit" class="button button-add" value="'.$langs->trans("Add").'">';
443  print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
444  print '<input type="button" class="button button-cancel" value="'.$langs->trans("Cancel").'" onClick="history.go(-1)">';
445  print '</div>';
446 
447  print '</form>';
448 }
449 
450 // View mode
451 if ($id > 0) {
452  $formconfirm = '';
453 
454  if ($result > 0) {
455  $head = tax_prepare_head($object);
456 
457  $totalpaid = $object->getSommePaiement();
458 
459  // Clone confirmation
460  if ($action === 'clone') {
461  $formquestion = array(
462  array('type' => 'text', 'name' => 'clone_label', 'label' => $langs->trans("Label"), 'value' => $langs->trans("CopyOf").' '.$object->label, 'tdclass'=>'fieldrequired'),
463  );
464  if (getDolGlobalString('TAX_ADD_CLONE_FOR_NEXT_MONTH_CHECKBOX')) {
465  $formquestion[] = array('type' => 'checkbox', 'name' => 'clone_for_next_month', 'label' => $langs->trans("CloneTaxForNextMonth"), 'value' => 1);
466  } else {
467  $formquestion[] = array('type' => 'date', 'datenow'=>1, 'name' => 'clone_date_ech', 'label' => $langs->trans("Date"), 'value' => -1);
468  $formquestion[] = array('type' => 'date', 'name' => 'clone_period', 'label' => $langs->trans("PeriodEndDate"), 'value' => -1);
469  $formquestion[] = array('type' => 'text', 'name' => 'amount', 'label' => $langs->trans("Amount"), 'value' => price($object->amount), 'morecss' => 'width100');
470  }
471 
472  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneTax', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 280);
473  }
474 
475 
476  if ($action == 'paid') {
477  $text = $langs->trans('ConfirmPaySocialContribution');
478  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans('PaySocialContribution'), $text, "confirm_paid", '', '', 2);
479  }
480 
481  // Confirmation of the removal of the Social Contribution
482  if ($action == 'delete') {
483  $text = $langs->trans('ConfirmDeleteSocialContribution');
484  $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('DeleteSocialContribution'), $text, 'confirm_delete', '', '', 2);
485  }
486 
487  if ($action == 'edit') {
488  print '<form name="charge" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="POST">';
489  print '<input type="hidden" name="token" value="'.newToken().'">';
490  print '<input type="hidden" name="action" value="update">';
491  }
492  // Call Hook formConfirm
493  $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
494  $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
495  if (empty($reshook)) {
496  $formconfirm .= $hookmanager->resPrint;
497  } elseif ($reshook > 0) {
498  $formconfirm = $hookmanager->resPrint;
499  }
500 
501  /*
502  * View card
503  */
504  print dol_get_fiche_head($head, 'card', $langs->trans("SocialContribution"), -1, 'bill', 0, '', '', 0, '', 1);
505 
506  // Print form confirm
507  print $formconfirm;
508 
509 
510  // Social contribution card
511  $linkback = '<a href="'.DOL_URL_ROOT.'/compta/sociales/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
512 
513  $morehtmlref = '<div class="refidno">';
514  // Ref customer
515  $morehtmlref .= $form->editfieldkey("Label", 'lib', $object->label, $object, $user->hasRight('tax', 'charges', 'creer'), 'string', '', 0, 1);
516  $morehtmlref .= $form->editfieldval("Label", 'lib', $object->label, $object, $user->hasRight('tax', 'charges', 'creer'), 'string', '', null, null, '', 1);
517 
518  // Employee
519  if ($action != 'editfk_user') {
520  if ($object->getSommePaiement() > 0 && $object->fk_user > 0) {
521  $userstatic = new User($db);
522  $result = $userstatic->fetch($object->fk_user);
523  if ($result > 0) {
524  $morehtmlref .= '<br>' .$langs->trans('Employee').' : '.$userstatic->getNomUrl(1);
525  }
526  } else {
527  $morehtmlref .= '<br>' . $form->editfieldkey("Employee", 'fk_user', $object->label, $object, $user->hasRight('salaries', 'write'), 'string', '', 0, 1);
528  if ($object->fk_user > 0) {
529  $userstatic = new User($db);
530  $result = $userstatic->fetch($object->fk_user);
531  if ($result > 0) {
532  $morehtmlref .= $userstatic->getNomUrl(1);
533  } else {
534  dol_print_error($db);
535  exit();
536  }
537  }
538  }
539  } else {
540  $morehtmlref .= '<br>'.$langs->trans('Employee').' :&nbsp;';
541  $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
542  $morehtmlref .= '<input type="hidden" name="action" value="setfk_user">';
543  $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
544  $morehtmlref .= $form->select_dolusers($object->fk_user, 'userid', 1);
545  $morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
546  $morehtmlref .= '</form>';
547  }
548 
549  // Project
550  if (isModEnabled('project')) {
551  $langs->load("projects");
552  $morehtmlref .= '<br>';
553  if ($permissiontoadd) {
554  $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
555  if ($action != 'classify') {
556  $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.((int) $object->id).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
557  }
558  $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'fk_project' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
559  } else {
560  if (!empty($object->fk_project)) {
561  $proj = new Project($db);
562  $proj->fetch($object->fk_project);
563  $morehtmlref .= $proj->getNomUrl(1);
564  if ($proj->title) {
565  $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
566  }
567  }
568  }
569  }
570  $morehtmlref .= '</div>';
571 
572  $morehtmlright = '';
573 
574  $object->totalpaid = $totalpaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
575 
576  dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', '', 0, $morehtmlright);
577 
578  print '<div class="fichecenter">';
579  print '<div class="fichehalfleft">';
580  print '<div class="underbanner clearboth"></div>';
581 
582  print '<table class="border centpercent tableforfield">';
583 
584  // Type
585  print '<tr><td class="titlefield">';
586  print $langs->trans("Type")."</td><td>".$object->type_label."</td>";
587  print "</tr>";
588 
589  // Date
590  if ($action == 'edit') {
591  print '<tr><td>'.$langs->trans("Date")."</td><td>";
592  print $form->selectDate($object->date_ech, 'ech', 0, 0, 0, 'charge', 1, 1);
593  print "</td></tr>";
594  } else {
595  print "<tr><td>".$langs->trans("Date")."</td><td>".dol_print_date($object->date_ech, 'day')."</td></tr>";
596  }
597 
598  // Period end date
599  print "<tr><td>".$form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo"))."</td>";
600  print "<td>";
601  if ($action == 'edit') {
602  print $form->selectDate($object->periode, 'period', 0, 0, 0, 'charge', 1);
603  } else {
604  print dol_print_date($object->periode, "day");
605  }
606  print "</td></tr>";
607 
608  // Amount
609  if ($action == 'edit') {
610  print '<tr><td>'.$langs->trans("AmountTTC")."</td><td>";
611  print '<input type="text" name="amount" size="12" class="flat" value="'.price($object->amount).'">';
612  print "</td></tr>";
613  } else {
614  print '<tr><td>'.$langs->trans("AmountTTC").'</td><td><span class="amount">'.price($object->amount, 0, $langs, 1, -1, -1, $conf->currency).'</span></td></tr>';
615  }
616 
617  // Mode of payment
618  print '<tr><td>';
619  print '<table class="nobordernopadding" width="100%"><tr><td>';
620  print $langs->trans('DefaultPaymentMode');
621  print '</td>';
622  if ($action != 'editmode') {
623  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmode&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetMode'), 1).'</a></td>';
624  }
625  print '</tr></table>';
626  print '</td><td>';
627  if ($action == 'editmode') {
628  $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'mode_reglement_id', '', 1, 1);
629  } else {
630  $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'none');
631  }
632  print '</td></tr>';
633 
634  // Bank account
635  if (isModEnabled("bank")) {
636  print '<tr><td class="nowrap">';
637  print '<table class="centpercent nobordernopadding"><tr><td class="nowrap">';
638  print $langs->trans('DefaultBankAccount');
639  print '<td>';
640  if ($action != 'editbankaccount' && $user->hasRight('tax', 'charges', 'creer')) {
641  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editbankaccount&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetBankAccount'), 1).'</a></td>';
642  }
643  print '</tr></table>';
644  print '</td><td>';
645  if ($action == 'editbankaccount') {
646  $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1);
647  } else {
648  $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none');
649  }
650  print '</td>';
651  print '</tr>';
652  }
653 
654  // Other attributes
655  $parameters = array();
656  $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
657  print $hookmanager->resPrint;
658 
659  print '</table>';
660 
661  print '</div>';
662  print '<div class="fichehalfright">';
663 
664  print '<div class="underbanner clearboth"></div>';
665 
666  $nbcols = 3;
667  if (isModEnabled("bank")) {
668  $nbcols++;
669  }
670 
671  /*
672  * Payments
673  */
674  $sql = "SELECT p.rowid, p.num_paiement as num_payment, p.datep as dp, p.amount,";
675  $sql .= " c.code as type_code,c.libelle as paiement_type,";
676  $sql .= ' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.currency_code as bacurrency_code, ba.fk_accountancy_journal';
677  $sql .= " FROM ".MAIN_DB_PREFIX."paiementcharge as p";
678  $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid';
679  $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid';
680  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as c ON p.fk_typepaiement = c.id";
681  $sql .= ", ".MAIN_DB_PREFIX."chargesociales as cs";
682  $sql .= " WHERE p.fk_charge = ".((int) $id);
683  $sql .= " AND p.fk_charge = cs.rowid";
684  $sql .= " AND cs.entity IN (".getEntity('sc').")";
685  $sql .= " ORDER BY dp DESC";
686 
687  //print $sql;
688  $resql = $db->query($sql);
689  if ($resql) {
690  $totalpaid = 0;
691 
692  $num = $db->num_rows($resql);
693  $i = 0;
694  $total = 0;
695 
696  print '<div class="div-table-responsive-no-min">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
697  print '<table class="noborder paymenttable">';
698  print '<tr class="liste_titre">';
699  print '<td>'.$langs->trans("RefPayment").'</td>';
700  print '<td>'.$langs->trans("Date").'</td>';
701  print '<td>'.$langs->trans("Type").'</td>';
702  if (isModEnabled("bank")) {
703  print '<td class="liste_titre right">'.$langs->trans('BankAccount').'</td>';
704  }
705  print '<td class="right">'.$langs->trans("Amount").'</td>';
706  print '</tr>';
707 
708  $paymentsocialcontributiontmp = new PaymentSocialContribution($db);
709 
710  if ($num > 0) {
711  while ($i < $num) {
712  $objp = $db->fetch_object($resql);
713 
714  $paymentsocialcontributiontmp->id = $objp->rowid;
715  $paymentsocialcontributiontmp->ref = $objp->rowid;
716  $paymentsocialcontributiontmp->datep = $db->jdate($objp->dp);
717 
718  print '<tr class="oddeven"><td>';
719  print $paymentsocialcontributiontmp->getNomUrl(1);
720  print '</td>';
721 
722  print '<td>'.dol_print_date($db->jdate($objp->dp), 'day')."</td>\n";
723  $labeltype = $langs->trans("PaymentType".$objp->type_code) != "PaymentType".$objp->type_code ? $langs->trans("PaymentType".$objp->type_code) : $objp->paiement_type;
724  print "<td>".$labeltype.' '.$objp->num_payment."</td>\n";
725  if (isModEnabled("bank")) {
726  $bankaccountstatic->id = $objp->baid;
727  $bankaccountstatic->ref = $objp->baref;
728  $bankaccountstatic->label = $objp->baref;
729  $bankaccountstatic->number = $objp->banumber;
730  $bankaccountstatic->currency_code = $objp->bacurrency_code;
731 
732  if (isModEnabled('accounting')) {
733  $bankaccountstatic->account_number = $objp->account_number;
734 
735  $accountingjournal = new AccountingJournal($db);
736  $accountingjournal->fetch($objp->fk_accountancy_journal);
737  $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
738  }
739 
740  print '<td class="right">';
741  if ($bankaccountstatic->id) {
742  print $bankaccountstatic->getNomUrl(1, 'transactions');
743  }
744  print '</td>';
745  }
746  print '<td class="right"><span class="amount">'.price($objp->amount)."</span></td>\n";
747  print "</tr>";
748  $totalpaid += $objp->amount;
749  $i++;
750  }
751  } else {
752  print '<tr class="oddeven"><td><span class="opacitymedium">'.$langs->trans("None").'</span></td>';
753  print '<td></td><td></td><td></td><td></td>';
754  print '</tr>';
755  }
756 
757  print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AlreadyPaid").' :</td><td class="right nowraponall">'.price($totalpaid)."</td></tr>\n";
758  print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AmountExpected").' :</td><td class="right nowraponall">'.price($object->amount)."</td></tr>\n";
759 
760  $resteapayer = $object->amount - $totalpaid;
761  $cssforamountpaymentcomplete = 'amountpaymentcomplete';
762 
763  print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("RemainderToPay")." :</td>";
764  print '<td class="right nowraponall'.($resteapayer ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.price($resteapayer)."</td></tr>\n";
765 
766  print "</table>";
767  print '</div>';
768 
769  $db->free($resql);
770  } else {
771  dol_print_error($db);
772  }
773 
774  print '</div>';
775  print '</div>';
776 
777  print '<div class="clearboth"></div>';
778 
779  print dol_get_fiche_end();
780 
781  if ($action == 'edit') {
782  print $form->buttonsSaveCancel();
783 
784  print "</form>\n";
785  }
786 
787 
788 
789  // Buttons for actions
790 
791  if ($action != 'edit') {
792  print '<div class="tabsAction">'."\n";
793 
794  // Reopen
795  if ($object->paye && $user->hasRight('tax', 'charges', 'creer')) {
796  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("ReOpen").'</a></div>';
797  }
798 
799  // Edit
800  if ($object->paye == 0 && $user->hasRight('tax', 'charges', 'creer')) {
801  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans("Modify").'</a></div>';
802  }
803 
804  // Emit payment
805  if ($object->paye == 0 && ((price2num($object->amount) < 0 && price2num($resteapayer, 'MT') < 0) || (price2num($object->amount) > 0 && price2num($resteapayer, 'MT') > 0)) && $user->hasRight('tax', 'charges', 'creer')) {
806  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/paiement_charge.php?id='.$object->id.'&action=create&token='.newToken().'">'.$langs->trans("DoPayment")."</a></div>";
807  }
808 
809  // Classify 'paid'
810  if ($object->paye == 0 && round($resteapayer) <= 0 && $user->hasRight('tax', 'charges', 'creer')) {
811  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$object->id.'&action=paid&token='.newToken().'">'.$langs->trans("ClassifyPaid").'</a></div>';
812  }
813 
814  // Clone
815  if ($user->hasRight('tax', 'charges', 'creer')) {
816  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$object->id.'&action=clone&token='.newToken().'">'.$langs->trans("ToClone")."</a></div>";
817  }
818 
819  // Delete
820  if ($user->hasRight('tax', 'charges', 'supprimer') && empty($totalpaid)) {
821  print '<div class="inline-block divButAction"><a class="butActionDelete" href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$object->id.'&action=delete&token='.newToken().'">'.$langs->trans("Delete").'</a></div>';
822  } else {
823  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.(dol_escape_htmltag($langs->trans("DisabledBecausePayments"))).'">'.$langs->trans("Delete").'</a></div>';
824  }
825 
826  print "</div>";
827  }
828 
829 
830  // Select mail models is same action as presend
831  if (GETPOST('modelselected')) {
832  $action = 'presend';
833  }
834 
835  if ($action != 'presend') {
836  print '<div class="fichecenter"><div class="fichehalfleft">';
837  print '<a name="builddoc"></a>'; // ancre
838 
839  $includedocgeneration = 1;
840 
841  // Documents
842  if ($includedocgeneration) {
843  $objref = dol_sanitizeFileName($object->ref);
844  $relativepath = $objref.'/'.$objref.'.pdf';
845  $filedir = $conf->tax->dir_output.'/'.$objref;
846  $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
847  $genallowed = 0;
848  $delallowed = $user->hasRight('tax', 'charges', 'creer'); // If you can create/edit, you can remove a file on card
849  print $formfile->showdocuments('tax', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang);
850  }
851 
852  // Show links to link elements
853  //$linktoelem = $form->showLinkToObjectBlock($object, null, array('myobject'));
854  //$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
855 
856 
857  print '</div><div class="fichehalfright">';
858 
859  /*
860  $MAXEVENT = 10;
861 
862  $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', dol_buildpath('/mymodule/myobject_agenda.php', 1).'?id='.$object->id);
863 
864  // List of actions on element
865  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
866  $formactions = new FormActions($db);
867  $somethingshown = $formactions->showactions($object, $object->element.'@'.$object->module, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1, '', $MAXEVENT, '', $morehtmlcenter);
868  */
869 
870  print '</div></div>';
871  }
872 
873  //Select mail models is same action as presend
874  if (GETPOST('modelselected')) {
875  $action = 'presend';
876  }
877 
878  // Presend form
879  $modelmail = 'sc';
880  $defaulttopic = 'InformationMessage';
881  $diroutput = $conf->tax->dir_output;
882  $trackid = 'sc'.$object->id;
883 
884  include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
885  } else {
886  /* Social contribution not found */
887  dol_print_error(null, $object->error);
888  }
889 }
890 
891 // End of page
892 llxFooter();
893 $db->close();
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
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 bank accounts.
Class to manage accounting journals.
Class for managing the social charges.
Class to manage standard extra fields.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class to manage generation of HTML components for social contributions management.
Class to manage payments of social contributions.
Class to manage projects.
Class to manage Dolibarr users.
Definition: user.class.php:50
$parameters
Actions.
Definition: card.php:84
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
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition: date.lib.php:124
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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.
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
$formconfirm
if ($action == 'delbookkeepingyear') {
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
tax_prepare_head(ChargeSociales $object)
Prepare array with list of tabs.
Definition: tax.lib.php:38