dolibarr 20.0.2
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
29require '../../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formsocialcontrib.class.php';
32require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
33require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
34require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/paymentsocialcontribution.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/tax.lib.php';
38require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
39if (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}
43if (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
77if (empty($action) && empty($id) && empty($ref)) {
78 $action = 'view';
79}
80
81// Load object
82if ($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');
95if ($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
108if ($reshook < 0) {
109 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
110}
111
112if (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);
336if (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)';
344llxHeader("", $title, $help_url);
345
346
347// Form to create a social contribution
348if ($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
451if ($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
892llxFooter();
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.
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:125
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.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
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