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