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