dolibarr 21.0.0-alpha
payments.php
1<?php
2/* Copyright (C) 2001-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2011-2022 Alexandre Spangaro <aspangaro@open-dsi.fr>
6 * Copyright (C) 2011-2014 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
8 * Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
9 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
10 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
11 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <https://www.gnu.org/licenses/>.
25 */
26
33// Load Dolibarr environment
34require '../../main.inc.php';
35require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
36require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
37require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
38require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/paymentsocialcontribution.class.php';
39require_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/class/html.formsocialcontrib.class.php';
43if (isModEnabled('accounting')) {
44 include_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
45}
46
47$hookmanager = new HookManager($db);
48
49// Initialize a technical object to manage hooks. Note that conf->hooks_modules contains array
50$hookmanager->initHooks(array('specialexpensesindex'));
51
52// Load translation files required by the page
53$langs->loadLangs(array('compta', 'bills', 'hrm'));
54
55$year = GETPOSTINT("year");
56$search_sc_type = GETPOST('search_sc_type', 'intcomma');
57$optioncss = GETPOST('optioncss', 'alpha');
58
59$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
60$sortfield = GETPOST('sortfield', 'aZ09comma');
61$sortorder = GETPOST('sortorder', 'aZ09comma');
62$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
63if (empty($page) || $page < 0) {
64 $page = 0;
65} // If $page is not defined, or '' or -1
66$offset = $limit * $page;
67$pageprev = $page - 1;
68$pagenext = $page + 1;
69if (!$sortfield) {
70 $sortfield = "cs.date_ech";
71}
72if (!$sortorder) {
73 $sortorder = "DESC";
74}
75
76// Security check
77if ($user->socid) {
78 $socid = $user->socid;
79}
80$result = restrictedArea($user, 'tax', '', 'chargesociales', 'charges');
81
82
83/*
84 * Actions
85 */
86
87// Purge search criteria
88if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
89 $search_sc_type = '';
90 //$toselect = array();
91 //$search_array_options = array();
92}
93
94
95/*
96 * View
97 */
98
99$tva_static = new Tva($db);
100$socialcontrib = new ChargeSociales($db);
101$payment_sc_static = new PaymentSocialContribution($db);
102$userstatic = new User($db);
103$sal_static = new Salary($db);
104$accountstatic = new Account($db);
105$accountlinestatic = new AccountLine($db);
106$formsocialcontrib = new FormSocialContrib($db);
107
108$title = $langs->trans("SocialContributionsPayments");
109$help_url = '';
110
111llxHeader('', $title, $help_url);
112
113
114$param = '';
115if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
116 $param .= '&contextpage='.urlencode($contextpage);
117}
118if ($limit > 0 && $limit != $conf->liste_limit) {
119 $param .= '&limit='.((int) $limit);
120}
121if ($sortfield) {
122 $param .= '&sortfield='.urlencode($sortfield);
123}
124if ($sortorder) {
125 $param .= '&sortorder='.urlencode($sortorder);
126}
127if ($year) {
128 $param .= '&year='.urlencode((string) ($year));
129}
130if ($search_sc_type) {
131 $param .= '&search_sc_type='.urlencode((string) ($search_sc_type));
132}
133if ($optioncss != '') {
134 $param .= '&optioncss='.urlencode($optioncss);
135}
136$num = 0;
137
138print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
139if ($optioncss != '') {
140 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
141}
142print '<input type="hidden" name="token" value="'.newToken().'">';
143print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
144print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
145print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
146print '<input type="hidden" name="page" value="'.$page.'">';
147
148$sql = "SELECT c.id, c.libelle as type_label,";
149$sql .= " cs.rowid, cs.libelle as label_sc, cs.fk_type as type, cs.periode, cs.date_ech, cs.amount as total, cs.paye,";
150$sql .= " pc.rowid as pid, pc.datep, pc.amount as totalpaid, pc.num_paiement as num_payment, pc.fk_bank,";
151$sql .= " pct.code as payment_code,";
152$sql .= " u.rowid as uid, u.lastname, u.firstname, u.email, u.login, u.admin, u.statut,";
153$sql .= " ba.rowid as bid, ba.ref as bref, ba.number as bnumber, ba.account_number, ba.fk_accountancy_journal, ba.label as blabel, ba.iban_prefix as iban, ba.bic, ba.currency_code, ba.clos,";
154$sql .= " aj.label as account_journal";
155$sql .= " FROM ".MAIN_DB_PREFIX."c_chargesociales as c,";
156$sql .= " ".MAIN_DB_PREFIX."chargesociales as cs";
157$sql .= " INNER JOIN ".MAIN_DB_PREFIX."paiementcharge as pc ON pc.fk_charge = cs.rowid";
158$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as pct ON pc.fk_typepaiement = pct.id";
159$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON pc.fk_bank = b.rowid";
160$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank_account as ba ON b.fk_account = ba.rowid";
161$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_journal as aj ON ba.fk_accountancy_journal = aj.rowid";
162$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON u.rowid = cs.fk_user";
163$sql .= " WHERE cs.fk_type = c.id";
164$sql .= " AND cs.entity IN (".getEntity("tax").")";
165if ($search_sc_type > 0) {
166 $sql .= " AND cs.fk_type = ".((int) $search_sc_type);
167}
168if ($year > 0) {
169 $sql .= " AND (";
170 // Si period renseignee on l'utilise comme critere de date, sinon on prend date echeance,
171 // ceci afin d'etre compatible avec les cas ou la periode n'etait pas obligatoire
172 $sql .= " (cs.periode IS NOT NULL AND cs.periode between '".$db->idate(dol_get_first_day($year))."' AND '".$db->idate(dol_get_last_day($year))."')";
173 $sql .= " OR (cs.periode IS NULL AND cs.date_ech between '".$db->idate(dol_get_first_day($year))."' AND '".$db->idate(dol_get_last_day($year))."')";
174 $sql .= ")";
175}
176if ($sortfield !== null
177 && preg_match('/^(cs|c|pc|pct|u|ba)\./', $sortfield)
178) {
179 $sql .= $db->order($sortfield, $sortorder);
180}
181
182// Count total nb of records
183$nbtotalofrecords = '';
184if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
185 $resql = $db->query($sql);
186 $nbtotalofrecords = $db->num_rows($resql);
187 if (($page * $limit) > $nbtotalofrecords) { // if total of record found is smaller than page * limit, goto and load page 0
188 $page = 0;
189 $offset = 0;
190 }
191}
192// if total of record found is smaller than limit, no need to do paging and to restart another select with limits set.
193if (is_numeric($nbtotalofrecords) && ($limit > $nbtotalofrecords || empty($limit))) {
194 $num = $nbtotalofrecords;
195} else {
196 if ($limit) {
197 $sql .= $db->plimit($limit + 1, $offset);
198 }
199
200 $resql = $db->query($sql);
201 if (!$resql) {
202 dol_print_error($db);
203 exit;
204 }
205
206 $num = $db->num_rows($resql);
207}
208//$sql.= $db->plimit($limit+1,$offset);
209//print $sql;
210
211$nav = '';
212print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'object_payment', 0, $nav, '', $limit, 0);
213
214print '<table class="noborder centpercent">';
215
216print '<tr class="liste_titre">';
217print '<td class="liste_titre"></td>';
218print '<td class="liste_titre"></td>';
219print '<td class="liste_titre">';
220$formsocialcontrib->select_type_socialcontrib(GETPOSTISSET("search_sc_type") ? $search_sc_type : '', 'search_sc_type', 1, 0, 0, 'minwidth200 maxwidth300');
221print '</td>';
222print '<td class="liste_titre"></td>';
223print '<td class="liste_titre"></td>';
224print '<td class="liste_titre"></td>';
225print '<td class="liste_titre"></td>';
226print '<td class="liste_titre"></td>';
227print '<td class="liste_titre"></td>';
228if (isModEnabled("bank")) {
229 print '<td class="liste_titre"></td>';
230 print '<td class="liste_titre"></td>';
231}
232print '<td class="liste_titre"></td>';
233print '<td class="liste_titre center">';
234$searchpicto = $form->showFilterButtons();
235print $searchpicto;
236print '</td>';
237print "</tr>\n";
238
239print '<tr class="liste_titre">';
240print_liste_field_titre("RefPayment", $_SERVER["PHP_SELF"], "pc.rowid", "", $param, '', $sortfield, $sortorder);
241print_liste_field_titre("SocialContribution", $_SERVER["PHP_SELF"], "c.libelle", "", $param, '', $sortfield, $sortorder);
242print_liste_field_titre("TypeContrib", $_SERVER["PHP_SELF"], "cs.fk_type", "", $param, '', $sortfield, $sortorder);
243print_liste_field_titre("PeriodEndDate", $_SERVER["PHP_SELF"], "cs.periode", "", $param, '', $sortfield, $sortorder, 'center ');
244print_liste_field_titre("DatePayment", $_SERVER["PHP_SELF"], "pc.datep", "", $param, '', $sortfield, $sortorder, 'center ');
245print_liste_field_titre("Employee", $_SERVER["PHP_SELF"], "u.rowid", "", $param, "", $sortfield, $sortorder);
246print_liste_field_titre("PaymentMode", $_SERVER["PHP_SELF"], "pct.code", "", $param, '', $sortfield, $sortorder);
247print_liste_field_titre("Numero", $_SERVER["PHP_SELF"], "pc.num_paiement", "", $param, '', $sortfield, $sortorder, '', 'ChequeOrTransferNumber');
248if (isModEnabled("bank")) {
249 print_liste_field_titre("BankTransactionLine", $_SERVER["PHP_SELF"], "pc.fk_bank", "", $param, '', $sortfield, $sortorder);
250 print_liste_field_titre("BankAccount", $_SERVER["PHP_SELF"], "ba.label", "", $param, "", $sortfield, $sortorder);
251}
252print_liste_field_titre("ExpectedToPay", $_SERVER["PHP_SELF"], "cs.amount", "", $param, 'class="right"', $sortfield, $sortorder);
253print_liste_field_titre("PayedByThisPayment", $_SERVER["PHP_SELF"], "pc.amount", "", $param, 'class="right"', $sortfield, $sortorder);
255print "</tr>\n";
256
257if (!$resql) {
258 dol_print_error($db);
259 exit;
260}
261
262$i = 0;
263$total = 0;
264$totalnb = 0;
265$totalpaid = 0;
266
267while ($i < min($num, $limit)) {
268 $obj = $db->fetch_object($resql);
269
270 $payment_sc_static->id = $obj->pid;
271 $payment_sc_static->ref = $obj->pid;
272 $payment_sc_static->datep = $db->jdate($obj->datep);
273
274 $socialcontrib->id = $obj->rowid;
275 $socialcontrib->ref = empty($obj->label_sc) ? $obj->type_label : $obj->label_sc;
276 $socialcontrib->paye = $obj->paye;
277 // $obj->label_sc is label of social contribution (may be empty)
278 // $obj->type_label is label of type of social contribution
279 $socialcontrib->label = empty($obj->label_sc) ? $obj->type_label : $obj->label_sc;
280 $socialcontrib->type_label = $obj->type_label;
281
282 print '<tr class="oddeven">';
283 // Ref payment
284 print '<td class="nowraponall">'.$payment_sc_static->getNomUrl(1)."</td>\n";
285 // Label
286 print '<td class="tdoverflowmax250">';
287 print $socialcontrib->getNomUrl(1, '');
288 print '</td>';
289 // Type
290 print '<td title="'.dol_escape_htmltag($obj->type_label).'" class="tdoverflowmax300">'.$obj->type_label.'</td>';
291 // Date
292 $date = $obj->periode;
293 if (empty($date)) {
294 $date = $obj->date_ech;
295 }
296 print '<td class="center">'.dol_print_date($date, 'day').'</td>';
297 // Date payment
298 print '<td class="center">'.dol_print_date($db->jdate($obj->datep), 'day').'</td>';
299
300 // Employee
301 print "<td>";
302 if (!empty($obj->uid)) {
303 $userstatic->id = $obj->uid;
304 $userstatic->lastname = $obj->lastname;
305 $userstatic->firstname = $obj->firstname;
306 $userstatic->admin = $obj->admin;
307 $userstatic->login = $obj->login;
308 $userstatic->email = $obj->email;
309 $userstatic->status = $obj->statut;
310 print $userstatic->getNomUrl(1);
311 print "</td>\n";
312 }
313
314 // Type payment
315 $labelpayment = '';
316 if ($obj->payment_code) {
317 $labelpayment = $langs->trans("PaymentTypeShort".$obj->payment_code);
318 }
319 print '<td class="tdoverflowmax150" title="'.$labelpayment.'">';
320 print $labelpayment;
321 print '</td>';
322
323 print '<td>'.$obj->num_payment.'</td>';
324
325 // Account
326 if (isModEnabled("bank")) {
327 // Bank transaction
328 print '<td class="nowraponall">';
329 $accountlinestatic->id = $obj->fk_bank;
330 print $accountlinestatic->getNomUrl(1);
331 print '</td>';
332
333 print '<td class="nowraponall">';
334 if ($obj->bid > 0) {
335 $accountstatic->id = $obj->bid;
336 $accountstatic->ref = $obj->bref;
337 $accountstatic->number = $obj->bnumber;
338 $accountstatic->label = $obj->blabel;
339 $accountstatic->iban = $obj->iban;
340 $accountstatic->bic = $obj->bic;
341 $accountstatic->currency_code = $langs->trans("Currency".$obj->currency_code);
342 $accountstatic->clos = $obj->clos;
343
344 if (isModEnabled('accounting')) {
345 $accountstatic->account_number = $obj->account_number;
346 $accountstatic->accountancy_journal = $obj->account_journal;
347 }
348 print $accountstatic->getNomUrl(1);
349 } else {
350 print '&nbsp;';
351 }
352 print '</td>';
353 }
354
355 // Expected to pay
356 print '<td class="right"><span class="amount">'.price($obj->total).'</span></td>';
357
358 // Paid
359 print '<td class="right">';
360 if ($obj->totalpaid) {
361 print '<span class="amount">'.price($obj->totalpaid).'</span>';
362 }
363 print '</td>';
364
365 print '<td></td>';
366
367 print '</tr>';
368
369 $total += $obj->total;
370 $totalpaid += $obj->totalpaid;
371 $i++;
372}
373
374// Total
375print '<tr class="liste_total"><td colspan="3" class="liste_total">'.$langs->trans("Total").'</td>';
376print '<td class="liste_total right"></td>'; // A total here has no sense
377print '<td align="center" class="liste_total">&nbsp;</td>';
378print '<td align="center" class="liste_total">&nbsp;</td>';
379print '<td align="center" class="liste_total">&nbsp;</td>';
380print '<td align="center" class="liste_total">&nbsp;</td>';
381print '<td align="center" class="liste_total">&nbsp;</td>';
382if (isModEnabled("bank")) {
383 print '<td></td>';
384 print '<td></td>';
385}
386print '<td class="liste_total right">'.price($totalpaid)."</td>";
387print '<td></td>';
388print "</tr>";
389
390print '</table>';
391
392
393print '</form>';
394
395$parameters = array('user' => $user);
396$reshook = $hookmanager->executeHooks('dashboardSpecialBills', $parameters, $object); // Note that $action and $object may have been modified by hook
397
398// End of page
399llxFooter();
400$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($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to manage bank accounts.
Class to manage bank transaction lines.
Class for managing the social charges.
Class to manage generation of HTML components for social contributions management.
Class to manage hooks.
Class to manage payments of social contributions.
Class to manage salary payments.
Class to manage VAT - Value-added tax (also known in French as TVA - Taxe sur la valeur ajoutée)
Definition tva.class.php:38
Class to manage Dolibarr users.
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition date.lib.php:596
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:615
llxFooter()
Footer empty.
Definition document.php:107
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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.