dolibarr 21.0.0-beta
recap-compta.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2017 Pierre-Henry Favre <support@atm-consulting.fr>
5 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
6 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28// Load Dolibarr environment
29require '../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
31require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
32require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
33
42// Load translation files required by the page
43$langs->load("companies");
44if (isModEnabled('invoice')) {
45 $langs->load("bills");
46}
47
48$id = GETPOST('id') ? GETPOSTINT('id') : GETPOSTINT('socid');
49
50// Security check
51if ($user->socid > 0) {
52 $id = $user->socid;
53}
54
55// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
56$hookmanager->initHooks(array('recapcomptacard', 'globalcard'));
57
58$result = restrictedArea($user, 'societe', $id, '&societe');
59
60$object = new Societe($db);
61if ($id > 0) {
62 $object->fetch($id);
63}
64
65
66// Load variable for pagination
67$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
68$sortfield = GETPOST('sortfield', 'aZ09comma');
69$sortorder = GETPOST('sortorder', 'aZ09comma');
70$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
71if (empty($page) || $page == -1) {
72 $page = 0;
73} // If $page is not defined, or '' or -1
74$offset = $limit * $page;
75$pageprev = $page - 1;
76$pagenext = $page + 1;
77if (!$sortfield) {
78 $sortfield = "f.datef,f.rowid"; // Set here default search field
79}
80if (!$sortorder) {
81 $sortorder = "DESC";
82}
83
84
85$arrayfields = array(
86 'f.datef' => array('label' => "Date", 'checked' => 1),
87 //...
88);
89
90// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
91$hookmanager->initHooks(array('supplierbalencelist', 'globalcard'));
92
93
94/*
95 * Actions
96 */
97
98$parameters = array('socid' => $id);
99$reshook = $hookmanager->executeHooks('doActions', $parameters, $object); // Note that $object may have been modified by some hooks
100if ($reshook < 0) {
101 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
102}
103
104// None
105
106
107/*
108 * View
109 */
110
111$form = new Form($db);
112$userstatic = new User($db);
113
114$title = $langs->trans("ThirdParty").' - '.$langs->trans("Summary");
115if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/thirdpartynameonly/', getDolGlobalString('MAIN_HTML_TITLE')) && $object->name) {
116 $title = $object->name.' - '.$langs->trans("Summary");
117}
118$help_url = 'EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
119
120llxHeader('', $title, $help_url);
121
122if ($id > 0) {
123 $param = '';
124 if ($id > 0) {
125 $param .= '&socid='.$id;
126 }
127
128 $head = societe_prepare_head($object);
129
130 print dol_get_fiche_head($head, 'customer', $langs->trans("ThirdParty"), 0, 'company');
131 dol_banner_tab($object, 'socid', '', ($user->socid ? 0 : 1), 'rowid', 'nom', '', '', 0, '', '', 1);
132 print dol_get_fiche_end();
133
134 if (isModEnabled('invoice') && $user->hasRight('facture', 'lire')) {
135 // Invoice list
136 print load_fiche_titre($langs->trans("CustomerPreview"));
137
138 print '<table class="noborder tagtable liste centpercent">';
139 print '<tr class="liste_titre">';
140 if (!empty($arrayfields['f.datef']['checked'])) {
141 print_liste_field_titre($arrayfields['f.datef']['label'], $_SERVER["PHP_SELF"], "f.datef", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder);
142 }
143 print '<td>'.$langs->trans("Element").'</td>';
144 print '<td>'.$langs->trans("Status").'</td>';
145 print '<td class="right">'.$langs->trans("Debit").'</td>';
146 print '<td class="right">'.$langs->trans("Credit").'</td>';
147 print '<td class="right">'.$langs->trans("Balance").'</td>';
148 print '<td class="right">'.$langs->trans("Author").'</td>';
149 print '</tr>';
150
151 $TData = array();
152
153 $sql = "SELECT s.nom, s.rowid as socid, f.ref, f.total_ttc, f.datef as df,";
154 $sql .= " f.paye as paye, f.fk_statut as statut, f.rowid as facid,";
155 $sql .= " u.login, u.rowid as userid";
156 $sql .= " FROM ".MAIN_DB_PREFIX."societe as s,".MAIN_DB_PREFIX."facture as f,".MAIN_DB_PREFIX."user as u";
157 $sql .= " WHERE f.fk_soc = s.rowid AND s.rowid = ".((int) $object->id);
158 $sql .= " AND f.entity IN (".getEntity('invoice').")";
159 $sql .= " AND f.fk_user_valid = u.rowid";
160 $sql .= $db->order($sortfield, $sortorder);
161
162 $resql = $db->query($sql);
163 if ($resql) {
164 $num = $db->num_rows($resql);
165
166 // Boucle sur chaque facture
167 for ($i = 0; $i < $num; $i++) {
168 $objf = $db->fetch_object($resql);
169
170 $fac = new Facture($db);
171 $ret = $fac->fetch($objf->facid);
172 if ($ret < 0) {
173 print $fac->error."<br>";
174 continue;
175 }
176
177 $alreadypaid = $fac->getSommePaiement();
178 $alreadypaid += $fac->getSumDepositsUsed();
179 $alreadypaid += $fac->getSumCreditNotesUsed();
180
181 $userstatic->id = $objf->userid;
182 $userstatic->login = $objf->login;
183
184 $values = array(
185 'fk_facture' => $objf->facid,
186 'date' => $fac->date,
187 'datefieldforsort' => $fac->date.'-'.$fac->ref,
188 'link' => $fac->getNomUrl(1),
189 'status' => $fac->getLibStatut(2, $alreadypaid),
190 'amount' => $fac->total_ttc,
191 'author' => $userstatic->getLoginUrl(1)
192 );
193
194 $parameters = array('socid' => $id, 'values' => &$values, 'fac' => $fac, 'userstatic' => $userstatic);
195 $reshook = $hookmanager->executeHooks('facdao', $parameters, $object); // Note that $parameters['values'] and $object may have been modified by some hooks
196 if ($reshook < 0) {
197 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
198 }
199
200 $TData[] = $values;
201
202 // Paiements
203 $sql = "SELECT p.rowid, p.datep as dp, pf.amount, p.statut,";
204 $sql .= " p.fk_user_creat, u.login, u.rowid as userid";
205 $sql .= " FROM ".MAIN_DB_PREFIX."paiement_facture as pf,";
206 $sql .= " ".MAIN_DB_PREFIX."paiement as p";
207 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON p.fk_user_creat = u.rowid";
208 $sql .= " WHERE pf.fk_paiement = p.rowid";
209 $sql .= " AND p.entity = ".$conf->entity;
210 $sql .= " AND pf.fk_facture = ".((int) $fac->id);
211 $sql .= " ORDER BY p.datep ASC, p.rowid ASC";
212
213 $resqlp = $db->query($sql);
214 if ($resqlp) {
215 $nump = $db->num_rows($resqlp);
216 $j = 0;
217
218 while ($j < $nump) {
219 $objp = $db->fetch_object($resqlp);
220
221 $paymentstatic = new Paiement($db);
222 $paymentstatic->id = $objp->rowid;
223
224 $userstatic->id = $objp->userid;
225 $userstatic->login = $objp->login;
226
227 $values = array(
228 'fk_paiement' => $objp->rowid,
229 'date' => $db->jdate($objp->dp),
230 'datefieldforsort' => $db->jdate($objp->dp).'-'.$fac->ref,
231 'link' => $langs->trans("Payment").' '.$paymentstatic->getNomUrl(1),
232 'status' => '',
233 'amount' => -$objp->amount,
234 'author' => $userstatic->getLoginUrl(1)
235 );
236
237 $parameters = array('socid' => $id, 'values' => &$values, 'fac' => $fac, 'userstatic' => $userstatic, 'paymentstatic' => $paymentstatic);
238 $reshook = $hookmanager->executeHooks('paydao', $parameters, $object); // Note that $parameters['values'] and $object may have been modified by some hooks
239 if ($reshook < 0) {
240 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
241 }
242
243 $TData[] = $values;
244
245 $j++;
246 }
247
248 $db->free($resqlp);
249 } else {
250 dol_print_error($db);
251 }
252 }
253 } else {
254 dol_print_error($db);
255 }
256
257 if (empty($TData)) {
258 print '<tr class="oddeven"><td colspan="7"><span class="opacitymedium">'.$langs->trans("NoInvoice").'</span></td></tr>';
259 } else {
260 // Sort array by date ASC to calculate balance
261 $TData = dol_sort_array($TData, 'datefieldforsort', 'ASC');
262
263 // Balance calculation
264 $balance = 0;
265 foreach (array_keys($TData) as $key) {
266 $balance += $TData[$key]['amount'];
267 if (!array_key_exists('balance', $TData[$key])) {
268 $TData[$key]['balance'] = 0;
269 }
270 $TData[$key]['balance'] += $balance;
271 }
272
273 // Resorte array to have elements on the required $sortorder
274 $TData = dol_sort_array($TData, 'datefieldforsort', $sortorder);
275
276 $totalDebit = 0;
277 $totalCredit = 0;
278
279 // Display array
280 foreach ($TData as $data) {
281 $html_class = '';
282 if (!empty($data['fk_facture'])) {
283 $html_class = 'facid-'.$data['fk_facture'];
284 } elseif (!empty($data['fk_paiement'])) {
285 $html_class = 'payid-'.$data['fk_paiement'];
286 }
287
288 print '<tr class="oddeven '.$html_class.'">';
289
290 $datedetail = dol_print_date($data['date'], 'dayhour');
291 if (!empty($data['fk_facture'])) {
292 $datedetail = dol_print_date($data['date'], 'day');
293 }
294 print '<td class="center" title="'.dol_escape_htmltag($datedetail).'">';
295 print dol_print_date($data['date'], 'day');
296 print "</td>\n";
297
298 print '<td>'.$data['link']."</td>\n";
299
300 print '<td class="left">'.$data['status'].'</td>';
301
302 print '<td class="right">'.(($data['amount'] > 0) ? price(abs($data['amount'])) : '')."</td>\n";
303
304 $totalDebit += ($data['amount'] > 0) ? abs($data['amount']) : 0;
305
306 print '<td class="right">'.(($data['amount'] > 0) ? '' : price(abs($data['amount'])))."</td>\n";
307 $totalCredit += ($data['amount'] > 0) ? 0 : abs($data['amount']);
308
309 // Balance
310 print '<td class="right"><span class="amount">'.price($data['balance'])."</span></td>\n";
311
312 // Author
313 print '<td class="nowrap right">';
314 print $data['author'];
315 print '</td>';
316
317 print "</tr>\n";
318 }
319
320 print '<tr class="liste_total">';
321 print '<td colspan="3">&nbsp;</td>';
322 print '<td class="right">'.price($totalDebit).'</td>';
323 print '<td class="right">'.price($totalCredit).'</td>';
324 print '<td class="right">'.price(price2num($totalDebit - $totalCredit, 'MT')).'</td>';
325 print '<td></td>';
326 print "</tr>\n";
327 }
328
329 print "</table>";
330 }
331} else {
332 dol_print_error($db);
333}
334
335llxFooter();
336
337$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
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 invoices.
Class to manage generation of HTML components Only common components must be here.
Class to manage payments of customer invoices.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
societe_prepare_head(Societe $object)
Return array of tabs to used on pages for third parties cards.
llxFooter()
Footer empty.
Definition document.php:107
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.
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_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
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...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
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.