dolibarr 19.0.3
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2013 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2015-2023 Alexandre Spangaro <aspangaro@easya.solutions>
6 * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
7 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
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.formcompany.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
34require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
35require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/paymentvat.class.php';
36require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/vat.lib.php';
38
39if (isModEnabled('accounting')) {
40 include_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
41}
42
43// Load translation files required by the page
44$langs->loadLangs(array('compta', 'banks', 'bills'));
45
46$id = GETPOST('id', 'int');
47$ref = GETPOST('ref', 'alpha');
48$action = GETPOST('action', 'aZ09');
49$confirm = GETPOST('confirm', 'alpha');
50$cancel = GETPOST('cancel', 'aZ09');
51$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'myobjectcard'; // To manage different context of search
52$backtopage = GETPOST('backtopage', 'alpha');
53$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
54
55$refund = GETPOST("refund", "int");
56if (GETPOSTISSET('auto_create_paiement') || $action === 'add') {
57 $auto_create_payment = GETPOST("auto_create_paiement", "int");
58} else {
59 $auto_create_payment = !getDolGlobalString('CREATE_NEW_VAT_WITHOUT_AUTO_PAYMENT');
60}
61
62if (empty($refund)) {
63 $refund = 0;
64}
65
66$datev = dol_mktime(12, 0, 0, GETPOST("datevmonth", 'int'), GETPOST("datevday", 'int'), GETPOST("datevyear", 'int'));
67$datep = dol_mktime(12, 0, 0, GETPOST("datepmonth", 'int'), GETPOST("datepday", 'int'), GETPOST("datepyear", 'int'));
68
69// Initialize technical objects
70$object = new Tva($db);
71$extrafields = new ExtraFields($db);
72$diroutputmassaction = $conf->tax->dir_output.'/temp/massgeneration/'.$user->id;
73$hookmanager->initHooks(array('taxvatcard', 'globalcard'));
74
75// Fetch optionals attributes and labels
76$extrafields->fetch_name_optionals_label($object->table_element);
77
78if (empty($action) && empty($id) && empty($ref)) {
79 $action = 'view';
80}
81
82// Load object
83include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
84
85$permissiontoread = $user->rights->tax->charges->lire;
86$permissiontoadd = $user->rights->tax->charges->creer; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
87$permissiontodelete = $user->rights->tax->charges->supprimer || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
88$permissionnote = $user->rights->tax->charges->creer; // Used by the include of actions_setnotes.inc.php
89$permissiondellink = $user->rights->tax->charges->creer; // Used by the include of actions_dellink.inc.php
90$upload_dir = $conf->tax->multidir_output[isset($object->entity) ? $object->entity : 1].'/vat';
91
92// Security check
93$socid = GETPOST('socid', 'int');
94if (!empty($user->socid)) {
95 $socid = $user->socid;
96}
97$result = restrictedArea($user, 'tax', $object->id, 'tva', 'charges');
98
99
100/*
101 * Actions
102 */
103
104$parameters = array('socid' => $socid);
105$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
106if ($reshook < 0) {
107 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
108}
109
110if (empty($reshook)) {
111 if ($cancel && !$id) {
112 header("Location: list.php");
113 exit;
114 }
115
116 if ($action == 'setlib' && $user->hasRight('tax', 'charges', 'creer')) {
117 $object->fetch($id);
118 $result = $object->setValueFrom('label', GETPOST('lib', 'alpha'), '', '', 'text', '', $user, 'TAX_MODIFY');
119 if ($result < 0) {
120 setEventMessages($object->error, $object->errors, 'errors');
121 }
122 }
123
124 if ($action == 'setdatev' && $user->hasRight('tax', 'charges', 'creer')) {
125 $object->fetch($id);
126 $object->datev = $datev;
127 $result = $object->update($user);
128 if ($result < 0) {
129 dol_print_error($db, $object->error);
130 }
131
132 $action = '';
133 }
134
135 // payment mode
136 if ($action == 'setmode' && $user->hasRight('tax', 'charges', 'creer')) {
137 $object->fetch($id);
138 $result = $object->setPaymentMethods(GETPOST('mode_reglement_id', 'int'));
139 if ($result < 0) {
140 setEventMessages($object->error, $object->errors, 'errors');
141 }
142 }
143
144 // Bank account
145 if ($action == 'setbankaccount' && $user->hasRight('tax', 'charges', 'creer')) {
146 $object->fetch($id);
147 $result = $object->setBankAccount(GETPOST('fk_account', 'int'));
148 if ($result < 0) {
149 setEventMessages($object->error, $object->errors, 'errors');
150 }
151 }
152
153 // Classify paid
154 if ($action == 'confirm_paid' && $user->hasRight('tax', 'charges', 'creer') && $confirm == 'yes') {
155 $object->fetch($id);
156 $result = $object->setPaid($user);
157 }
158
159 if ($action == 'reopen' && $user->hasRight('tax', 'charges', 'creer')) {
160 $result = $object->fetch($id);
161 if ($object->paye) {
162 $result = $object->setUnpaid($user);
163 if ($result > 0) {
164 header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id);
165 exit();
166 } else {
167 setEventMessages($object->error, $object->errors, 'errors');
168 }
169 }
170 }
171
172 if ($action == 'add' && !$cancel) {
173 $error = 0;
174
175 $object->fk_account = GETPOST("accountid", 'int');
176 $object->type_payment = GETPOST("type_payment", 'alphanohtml');
177 $object->num_payment = GETPOST("num_payment", 'alphanohtml');
178
179 $object->datev = $datev;
180 $object->datep = $datep;
181
182 $amount = price2num(GETPOST("amount", 'alpha'));
183 if ($refund == 1) {
184 $amount = price2num(-1 * $amount);
185 }
186 $object->amount = $amount;
187 $object->label = GETPOST("label", 'alpha');
188 $object->note = GETPOST("note", 'restricthtml');
189 $object->note_private = GETPOST("note", 'restricthtml');
190
191 if (empty($object->datep)) {
192 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DatePayment")), null, 'errors');
193 $error++;
194 }
195 if (empty($object->datev)) {
196 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("PeriodEndDate")), null, 'errors');
197 $error++;
198 }
199 if (!empty($auto_create_payment) && (empty($object->type_payment) || $object->type_payment < 0)) {
200 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("PaymentMode")), null, 'errors');
201 $error++;
202 }
203 if (empty($object->amount)) {
204 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Amount")), null, 'errors');
205 $error++;
206 }
207 if (!empty($auto_create_payment) && ($object->fk_account <= 0)) {
208 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("AccountToCredit")), null, 'errors');
209 $error++;
210 }
211
212 if (!$error) {
213 $ret = $object->create($user);
214 if ($ret < 0) {
215 $error++;
216 }
217
218 // Auto create payment
219 if (!empty($auto_create_payment) && !$error) {
220 $db->begin();
221
222 // Create a line of payments
223 $paiement = new PaymentVAT($db);
224 $paiement->chid = $object->id;
225 $paiement->datepaye = $datep;
226 $paiement->amounts = array($object->id=>$amount); // Tableau de montant
227 $paiement->paiementtype = GETPOST("type_payment", 'alphanohtml');
228 $paiement->num_payment = GETPOST("num_payment", 'alphanohtml');
229 $paiement->note = GETPOST("note", 'restricthtml');
230
231 if (!$error) {
232 $paymentid = $paiement->create($user, (int) GETPOST('closepaidtva'));
233 if ($paymentid < 0) {
234 $error++;
235 setEventMessages($paiement->error, null, 'errors');
236 $action = 'create';
237 }
238 }
239
240 if (!$error) {
241 $result = $paiement->addPaymentToBank($user, 'payment_vat', '(VATPayment)', GETPOST('accountid', 'int'), '', '');
242 if (!($result > 0)) {
243 $error++;
244 setEventMessages($paiement->error, null, 'errors');
245 }
246 }
247
248 if (!$error) {
249 $db->commit();
250 } else {
251 $db->rollback();
252 }
253 }
254 if (empty($error)) {
255 header("Location: card.php?id=" . $object->id);
256 exit;
257 }
258 }
259
260 $action = 'create';
261 }
262
263 if ($action == 'confirm_delete' && $confirm == 'yes') {
264 $result = $object->fetch($id);
265 $totalpaid = $object->getSommePaiement();
266
267 if (empty($totalpaid)) {
268 $db->begin();
269
270 $ret = $object->delete($user);
271 if ($ret > 0) {
272 if ($object->fk_bank) {
273 $accountline = new AccountLine($db);
274 $result = $accountline->fetch($object->fk_bank);
275 if ($result > 0) {
276 $result = $accountline->delete($user); // $result may be 0 if not found (when bank entry was deleted manually and fk_bank point to nothing)
277 }
278 }
279
280 if ($result >= 0) {
281 $db->commit();
282 header("Location: ".DOL_URL_ROOT.'/compta/tva/list.php');
283 exit;
284 } else {
285 $object->error = $accountline->error;
286 $db->rollback();
287 setEventMessages($object->error, $object->errors, 'errors');
288 }
289 } else {
290 $db->rollback();
291 setEventMessages($object->error, $object->errors, 'errors');
292 }
293 } else {
294 setEventMessages($langs->trans('DisabledBecausePayments'), null, 'errors');
295 }
296 }
297
298 if ($action == 'update' && !GETPOST("cancel") && $user->hasRight('tax', 'charges', 'creer')) {
299 $amount = price2num(GETPOST('amount', 'alpha'), 'MT');
300
301 if (empty($amount)) {
302 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount")), null, 'errors');
303 $action = 'edit';
304 } elseif (!is_numeric($amount)) {
305 setEventMessages($langs->trans("ErrorFieldMustBeANumeric", $langs->transnoentities("Amount")), null, 'errors');
306 $action = 'create';
307 } else {
308 $result = $object->fetch($id);
309
310 $object->amount = $amount;
311
312 $result = $object->update($user);
313 if ($result <= 0) {
314 setEventMessages($object->error, $object->errors, 'errors');
315 }
316 }
317 }
318
319 // Action clone object
320 if ($action == 'confirm_clone' && $confirm != 'yes') {
321 $action = '';
322 }
323
324 if ($action == 'confirm_clone' && $confirm == 'yes' && ($user->hasRight('tax', 'charges', 'creer'))) {
325 $db->begin();
326
327 $originalId = $id;
328
329 $object->fetch($id);
330
331 if ($object->id > 0) {
332 $object->id = $object->ref = null;
333 $object->paye = 0;
334
335 if (GETPOST('amount', 'alphanohtml')) {
336 $object->amount = price2num(GETPOST('amount', 'alphanohtml'), 'MT', 2);
337 }
338
339 if (GETPOST('clone_label', 'alphanohtml')) {
340 $object->label = GETPOST('clone_label', 'alphanohtml');
341 } else {
342 $object->label = $langs->trans("CopyOf").' '.$object->label;
343 }
344
345 $newdateperiod = dol_mktime(0, 0, 0, GETPOST('clone_periodmonth', 'int'), GETPOST('clone_periodday', 'int'), GETPOST('clone_periodyear', 'int'));
346 if ($newdateperiod) {
347 $object->datev = $newdateperiod;
348 }
349
350 //if ($object->check()) {
351 $id = $object->create($user);
352 if ($id > 0) {
353 $db->commit();
354 $db->close();
355
356 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
357 exit;
358 } else {
359 $id = $originalId;
360 $db->rollback();
361
362 setEventMessages($object->error, $object->errors, 'errors');
363 }
364 //}
365 } else {
366 $db->rollback();
367 dol_print_error($db, $object->error);
368 }
369 }
370
371 // Actions to build doc
372 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
373}
374
375
376/*
377 * View
378 */
379
380$form = new Form($db);
381$formfile = new FormFile($db);
382$formproject = new FormProjets($db);
383
384$title = $langs->trans("VAT")." - ".$langs->trans("Card");
385$help_url = '';
386llxHeader('', $title, $help_url);
387
388// Form to create a VAT
389if ($action == 'create') {
390 print load_fiche_titre($langs->trans("VAT").' - '.$langs->trans("New"));
391
392 if (!empty($conf->use_javascript_ajax)) {
393 print "\n".'<script type="text/javascript">';
394 print '
395 $(document).ready(function () {
396 let onAutoCreatePaiementChange = function () {
397 if($("#auto_create_paiement").is(":checked")) {
398 $("#label_fk_account").addClass("fieldrequired");
399 $("#label_type_payment").addClass("fieldrequired");
400 $(".hide_if_no_auto_create_payment").show();
401 } else {
402 $("#label_fk_account").removeClass("fieldrequired");
403 $("#label_type_payment").removeClass("fieldrequired");
404 $(".hide_if_no_auto_create_payment").hide();
405 }
406 }
407 $("#radiopayment").click(function() {
408 $("#label").val($(this).data("label"));
409 });
410 $("#radiorefund").click(function() {
411 $("#label").val($(this).data("label"));
412
413 });
414 $("#auto_create_paiement").click(function () {
415 onAutoCreatePaiementChange();
416 });
417 onAutoCreatePaiementChange();
418 });
419 ';
420
421 print '</script>'."\n";
422 }
423
424 print '<form name="add" action="'.$_SERVER["PHP_SELF"].'" name="formvat" method="post">';
425 print '<input type="hidden" name="token" value="'.newToken().'">';
426 print '<input type="hidden" name="action" value="add">';
427
428 print dol_get_fiche_head();
429
430 print '<table class="border centpercent">';
431
432 print '<tr><td class="titlefieldcreate fieldrequired">';
433 //print $langs->trans("Type");
434 print '</td><td>';
435
436 print '<div id="selectmethod">';
437 print '<label for="radiopayment">';
438 print '<input type="radio" id="radiopayment" data-label="'.$langs->trans('VATPayment').'" class="flat" name="refund" value="0"'.($refund ? '' : ' checked="checked"').'>';
439 print '&nbsp;';
440 print $langs->trans("Payment");
441 print '</label>';
442 print '&nbsp;&nbsp;&nbsp;';
443 print '<label for="radiorefund">';
444 print '<input type="radio" id="radiorefund" data-label="'.$langs->trans('VATRefund').'" class="flat" name="refund" value="1"'.($refund ? ' checked="checked"' : '').'>';
445 print '&nbsp;';
446 print $langs->trans("Refund");
447 print '</label>';
448 print '</div>';
449
450 print '</td>';
451 print "</tr>\n";
452
453 // Label
454 if ($refund == 1) {
455 $label = $langs->trans("VATRefund");
456 } else {
457 $label = $langs->trans("VATPayment");
458 }
459 print '<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans("Label").'</td><td><input class="minwidth300" name="label" id="label" value="'.(GETPOSTISSET("label") ? GETPOST("label", '', 2) : $label).'" autofocus></td></tr>';
460
461 print '<tr><td class="titlefieldcreate fieldrequired">'.$form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")).'</td><td>';
462 print $form->selectDate((GETPOST("datevmonth", 'int') ? $datev : -1), "datev", '', '', '', 'add', 1, 1);
463 print '</td></tr>';
464
465 // Amount
466 print '<tr><td class="fieldrequired">'.$langs->trans("Amount").'</td><td><input name="amount" class="right width75" value="'.GETPOST("amount", "alpha").'"></td></tr>';
467
468 print '<tr><td colspan="2"><hr></td></tr>';
469
470 // Auto create payment
471 print '<tr><td><label for="auto_create_paiement">'.$langs->trans('AutomaticCreationPayment').'</label></td>';
472 print '<td><input id="auto_create_paiement" name="auto_create_paiement" type="checkbox" ' . (empty($auto_create_payment) ? '' : 'checked="checked"') . ' value="1"></td></tr>'."\n";
473
474 print '<tr class="hide_if_no_auto_create_payment">';
475 print '<td class="fieldrequired">'.$langs->trans("DatePayment").'</td><td>';
476 print $form->selectDate($datep, "datep", '', '', '', 'add', 1, 1);
477 print '</td></tr>';
478
479 // Type payment
480 print '<tr><td class="fieldrequired" id="label_type_payment">'.$langs->trans("PaymentMode").'</td><td>';
481 print $form->select_types_paiements(GETPOST("type_payment", 'int'), "type_payment", '', 0, 1, 0, 0, 1, 'maxwidth500 widthcentpercentminusx', 1);
482 print "</td>\n";
483 print "</tr>";
484
485 if (isModEnabled("banque")) {
486 // Bank account
487 print '<tr><td class="fieldrequired" id="label_fk_account">'.$langs->trans("BankAccount").'</td><td>';
488 print img_picto('', 'bank_account', 'pictofixedwidth');
489 $form->select_comptes(GETPOST("accountid", 'int'), "accountid", 0, "courant=1", 1, '', 0, 'maxwidth500 widthcentpercentminusx'); // List of bank account available
490 print '</td></tr>';
491 }
492
493 // Number
494 print '<tr class="hide_if_no_auto_create_payment"><td>'.$langs->trans('Numero');
495 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
496 print '<td><input name="num_payment" type="text" value="'.GETPOST("num_payment").'"></td></tr>'."\n";
497
498 // Comments
499 print '<tr class="hide_if_no_auto_create_payment">';
500 print '<td class="tdtop">'.$langs->trans("Comments").'</td>';
501 print '<td class="tdtop"><textarea name="note" wrap="soft" rows="'.ROWS_3.'" class="quatrevingtpercent">'.GETPOST('note', 'restricthtml').'</textarea></td>';
502 print '</tr>';
503
504 // Other attributes
505 $parameters = array();
506 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
507 print $hookmanager->resPrint;
508
509 print '</table>';
510
511 print dol_get_fiche_end();
512
513 print '<div class="center">';
514 print '<div class="hide_if_no_auto_create_payment paddingbottom">';
515 print '<input type="checkbox" checked value="1" name="closepaidtva"> <span class="">'.$langs->trans("ClosePaidVATAutomatically").'</span>';
516 print '<br>';
517 print '</div>';
518
519 print '<input type="submit" class="button button-save" value="'.$langs->trans("Save").'">';
520 print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
521 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
522 print '</div>';
523
524 print '</form>';
525}
526
527// View mode
528if ($id > 0) {
529 $formconfirm = '';
530
531 $head = vat_prepare_head($object);
532
533 $totalpaid = $object->getSommePaiement();
534
535 // Clone confirmation
536 if ($action === 'clone') {
537 $formquestion = array(
538 array('type' => 'text', 'name' => 'clone_label', 'label' => $langs->trans("Label"), 'value' => $langs->trans("CopyOf").' '.$object->label),
539 );
540
541 //$formquestion[] = array('type' => 'date', 'name' => 'clone_date_ech', 'label' => $langs->trans("Date"), 'value' => -1);
542 $formquestion[] = array('type' => 'date', 'name' => 'clone_period', 'label' => $langs->trans("PeriodEndDate"), 'value' => -1);
543 $formquestion[] = array('type' => 'text', 'name' => 'amount', 'label' => $langs->trans("Amount"), 'value' => price($object->amount), 'morecss' => 'width100');
544
545 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneVAT', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 240);
546 }
547
548 if ($action == 'paid') {
549 $text = $langs->trans('ConfirmPayVAT');
550 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans('PayVAT'), $text, "confirm_paid", '', '', 2);
551 }
552
553 if ($action == 'delete') {
554 $text = $langs->trans('ConfirmDeleteVAT');
555 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('DeleteVAT'), $text, 'confirm_delete', '', '', 2);
556 }
557
558 if ($action == 'edit') {
559 print '<form name="charge" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="POST">';
560 print '<input type="hidden" name="token" value="'.newToken().'">';
561 print '<input type="hidden" name="action" value="update">';
562 }
563 // Call Hook formConfirm
564 $parameters = array('formConfirm' => $formconfirm);
565 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
566 if (empty($reshook)) {
567 $formconfirm .= $hookmanager->resPrint;
568 } elseif ($reshook > 0) {
569 $formconfirm = $hookmanager->resPrint;
570 }
571
572 print dol_get_fiche_head($head, 'card', $langs->trans("VATPayment"), -1, 'payment', 0, '', '', 0, '', 1);
573
574 // Print form confirm
575 print $formconfirm;
576
577 $morehtmlref = '<div class="refidno">';
578 // Label of social contribution
579 $morehtmlref .= $form->editfieldkey("Label", 'lib', $object->label, $object, $user->hasRight('tax', 'charges', 'creer'), 'string', '', 0, 1);
580 $morehtmlref .= $form->editfieldval("Label", 'lib', $object->label, $object, $user->hasRight('tax', 'charges', 'creer'), 'string', '', null, null, '', 1);
581 // Project
582 $morehtmlref .= '</div>';
583
584 $linkback = '<a href="'.DOL_URL_ROOT.'/compta/tva/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
585
586 $object->totalpaid = $totalpaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
587
588 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', '');
589
590 print '<div class="fichecenter">';
591 print '<div class="fichehalfleft">';
592 print '<div class="underbanner clearboth"></div>';
593
594 print '<table class="border centpercent">';
595
596 // Label
597 //print '<tr><td class="titlefield">'.$langs->trans("Label").'</td><td>'.$object->label.'</td></tr>';
598
599 /*print "<tr>";
600 print '<td class="titlefield">'.$langs->trans("DatePayment").'</td><td>';
601 print dol_print_date($object->datep, 'day');
602 print '</td></tr>';*/
603
604 print '<tr><td>';
605 print $form->editfieldkey($form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")), 'datev', $object->datev, $object, $user->hasRight('tax', 'charges', 'creer'), 'day');
606 print '</td><td>';
607 print $form->editfieldval("PeriodEndDate", 'datev', $object->datev, $object, $user->hasRight('tax', 'charges', 'creer'), 'day');
608 //print dol_print_date($object->datev,'day');
609 print '</td></tr>';
610
611 if ($action == 'edit') {
612 print '<tr><td class="fieldrequired">' . $langs->trans("Amount") . '</td><td><input name="amount" size="10" value="' . price($object->amount) . '"></td></tr>';
613 } else {
614 print '<tr><td>' . $langs->trans("Amount") . '</td><td>' . price($object->amount) . '</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('PaymentMode');
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->type_payment, 'mode_reglement_id');
629 } else {
630 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->type_payment, 'none');
631 }
632 print '</td></tr>';
633
634 // Bank account
635 if (isModEnabled("banque")) {
636 print '<tr><td class="nowrap">';
637 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
638 print $langs->trans('BankAccount');
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
663 print '<div class="fichehalfright">';
664
665 $nbcols = 3;
666 if (isModEnabled("banque")) {
667 $nbcols++;
668 }
669
670 /*
671 * Payments
672 */
673 $sql = "SELECT p.rowid, p.num_paiement as num_payment, p.datep as dp, p.amount,";
674 $sql .= " c.code as type_code,c.libelle as paiement_type,";
675 $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';
676 $sql .= " FROM ".MAIN_DB_PREFIX."payment_vat as p";
677 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid';
678 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid';
679 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as c ON p.fk_typepaiement = c.id";
680 $sql .= ", ".MAIN_DB_PREFIX."tva as tva";
681 $sql .= " WHERE p.fk_tva = ".((int) $id);
682 $sql .= " AND p.fk_tva = tva.rowid";
683 $sql .= " AND tva.entity IN (".getEntity('tax').")";
684 $sql .= " ORDER BY dp DESC";
685
686 //print $sql;
687 $resql = $db->query($sql);
688 if ($resql) {
689 $totalpaid = 0;
690
691 $num = $db->num_rows($resql);
692 $i = 0;
693 $total = 0;
694
695 print '<div class="div-table-responsive-no-min">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
696 print '<table class="noborder paymenttable">';
697 print '<tr class="liste_titre">';
698 print '<td>'.$langs->trans("RefPayment").'</td>';
699 print '<td>'.$langs->trans("Date").'</td>';
700 print '<td>'.$langs->trans("Type").'</td>';
701 if (isModEnabled("banque")) {
702 print '<td class="liste_titre right">'.$langs->trans('BankAccount').'</td>';
703 }
704 print '<td class="right">'.$langs->trans("Amount").'</td>';
705 print '</tr>';
706
707 if ($num > 0) {
708 $bankaccountstatic = new Account($db);
709 while ($i < $num) {
710 $objp = $db->fetch_object($resql);
711
712 print '<tr class="oddeven"><td>';
713 print '<a href="'.DOL_URL_ROOT.'/compta/payment_vat/card.php?id='.$objp->rowid.'">'.img_object($langs->trans("Payment"), "payment").' '.$objp->rowid.'</a>';
714 print '</td>';
715 print '<td>'.dol_print_date($db->jdate($objp->dp), 'day')."</td>\n";
716 $labeltype = $langs->trans("PaymentType".$objp->type_code) != "PaymentType".$objp->type_code ? $langs->trans("PaymentType".$objp->type_code) : $objp->paiement_type;
717 print "<td>".$labeltype.' '.$objp->num_payment."</td>\n";
718 if (isModEnabled("banque")) {
719 $bankaccountstatic->id = $objp->baid;
720 $bankaccountstatic->ref = $objp->baref;
721 $bankaccountstatic->label = $objp->baref;
722 $bankaccountstatic->number = $objp->banumber;
723 $bankaccountstatic->currency_code = $objp->bacurrency_code;
724
725 if (isModEnabled('accounting')) {
726 $bankaccountstatic->account_number = $objp->account_number;
727
728 $accountingjournal = new AccountingJournal($db);
729 $accountingjournal->fetch($objp->fk_accountancy_journal);
730 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
731 }
732
733 print '<td class="right">';
734 if ($bankaccountstatic->id) {
735 print $bankaccountstatic->getNomUrl(1, 'transactions');
736 }
737 print '</td>';
738 }
739 print '<td class="right"><span class="amount">'.price($objp->amount)."</span></td>\n";
740 print "</tr>";
741 $totalpaid += $objp->amount;
742 $i++;
743 }
744 } else {
745 print '<tr class="oddeven"><td><span class="opacitymedium">'.$langs->trans("None").'</span></td>';
746 print '<td></td><td></td><td></td><td></td>';
747 print '</tr>';
748 }
749
750 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AlreadyPaid")." :</td><td class=\"right\">".price($totalpaid)."</td></tr>\n";
751 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AmountExpected")." :</td><td class=\"right\">".price($object->amount)."</td></tr>\n";
752
753 $resteapayer = $object->amount - $totalpaid;
754 $cssforamountpaymentcomplete = 'amountpaymentcomplete';
755
756 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("RemainderToPay")." :</td>";
757 print '<td class="right'.($resteapayer ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.price($resteapayer)."</td></tr>\n";
758
759 print "</table>";
760 print '</div>';
761
762 $db->free($resql);
763 } else {
764 dol_print_error($db);
765 }
766
767 print '</div>';
768 print '</div>';
769
770 print '<div class="clearboth"></div>';
771
772 print dol_get_fiche_end();
773
774 if ($action == 'edit') {
775 print $form->buttonsSaveCancel();
776
777 print "</form>\n";
778 }
779
780
781 // Buttons for actions
782
783 print '<div class="tabsAction">'."\n";
784
785 if ($action != 'edit') {
786 // Reopen
787 if ($object->paye && $user->hasRight('tax', 'charges', 'creer')) {
788 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/tva/card.php?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans("ReOpen")."</a></div>";
789 }
790
791 // Edit
792 if ($object->paye == 0 && $user->hasRight('tax', 'charges', 'creer')) {
793 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/tva/card.php?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans("Modify")."</a></div>";
794 }
795
796 // Emit payment
797 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')) {
798 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/paiement_vat.php?id='.$object->id.'&action=create&token='.newToken().'">'.$langs->trans("DoPayment").'</a></div>';
799 }
800
801 // Classify 'paid'
802 if ($object->paye == 0
803 && (
804 (round($resteapayer) <= 0 && $object->amount > 0)
805 || (round($resteapayer) >= 0 && $object->amount < 0)
806 )
807 && $user->hasRight('tax', 'charges', 'creer')) {
808 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/tva/card.php?id='.$object->id.'&token='.newToken().'&action=paid">'.$langs->trans("ClassifyPaid")."</a></div>";
809 }
810
811 // Clone
812 if ($user->hasRight('tax', 'charges', 'creer')) {
813 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/tva/card.php?id='.$object->id.'&token='.newToken().'&action=clone">'.$langs->trans("ToClone")."</a></div>";
814 }
815
816 if ($user->hasRight('tax', 'charges', 'supprimer') && empty($totalpaid)) {
817 print '<div class="inline-block divButAction"><a class="butActionDelete" href="card.php?id='.$object->id.'&action=delete&token='.newToken().'">'.$langs->trans("Delete").'</a></div>';
818 } else {
819 print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.(dol_escape_htmltag($langs->trans("DisabledBecausePayments"))).'">'.$langs->trans("Delete").'</a></div>';
820 }
821 }
822 print '</div>'."\n";
823
824
825
826 // Select mail models is same action as presend
827 if (GETPOST('modelselected')) {
828 $action = 'presend';
829 }
830
831 if ($action != 'presend') {
832 print '<div class="fichecenter"><div class="fichehalfleft">';
833 print '<a name="builddoc"></a>'; // ancre
834
835 $includedocgeneration = 1;
836
837 // Documents
838 if ($includedocgeneration) {
839 $objref = dol_sanitizeFileName($object->ref);
840 $relativepath = $objref.'/'.$objref.'.pdf';
841 $filedir = $conf->tax->dir_output.'/vat/'.$objref;
842 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
843 //$genallowed = $user->rights->tax->charges->lire; // If you can read, you can build the PDF to read content
844 $genallowed = 0;
845 $delallowed = $user->rights->tax->charges->creer; // If you can create/edit, you can remove a file on card
846 print $formfile->showdocuments('tax-vat', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang);
847 }
848
849 // Show links to link elements
850 //$linktoelem = $form->showLinkToObjectBlock($object, null, array('myobject'));
851 //$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
852
853
854 print '</div><div class="fichehalfright">';
855
856 /*
857 $MAXEVENT = 10;
858
859 $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', dol_buildpath('/mymodule/myobject_agenda.php', 1).'?id='.$object->id);
860
861 // List of actions on element
862 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
863 $formactions = new FormActions($db);
864 $somethingshown = $formactions->showactions($object, $object->element.'@'.$object->module, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1, '', $MAXEVENT, '', $morehtmlcenter);
865 */
866
867 print '</div></div>';
868 }
869
870 //Select mail models is same action as presend
871 if (GETPOST('modelselected')) {
872 $action = 'presend';
873 }
874
875 // Presend form
876 $modelmail = 'vat';
877 $defaulttopic = 'InformationMessage';
878 $diroutput = $conf->tax->dir_output;
879 $trackid = 'vat'.$object->id;
880
881 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
882}
883
884llxFooter();
885$db->close();
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 bank transaction lines.
Class to manage accounting journals.
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 payments of social contributions.
Put here description of your class.
Definition tva.class.php:36
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
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.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier 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.
vat_prepare_head($object)
Prepare array with list of tabs.
Definition vat.lib.php:33