dolibarr 20.0.0
clients.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
4 * Copyright (C) 2004-2018 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2006 Yannick Warnier <ywarnier@beeznest.org>
6 * Copyright (C) 2014 Ferran Marcet <fmarcet@2byte.es>
7 * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
8 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
30// Load Dolibarr environment
31require '../../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/tax.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
36require_once DOL_DOCUMENT_ROOT.'/compta/localtax/class/localtax.class.php';
37require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
38require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
39require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
40require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
41require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
42require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
43require_once DOL_DOCUMENT_ROOT.'/expensereport/class/paymentexpensereport.class.php';
44
45// Load translation files required by the page
46$langs->loadLangs(array("other", "compta", "banks", "bills", "companies", "product", "trips", "admin"));
47
48include DOL_DOCUMENT_ROOT.'/compta/tva/initdatesforvat.inc.php';
49
50$min = price2num(GETPOST("min", "alpha"));
51if (empty($min)) {
52 $min = 0;
53}
54
55// Define modetax (0 or 1)
56// 0=normal, 1=option vat for services is on debit, 2=option on payments for products
57$modetax = getDolGlobalInt('TAX_MODE');
58if (GETPOSTISSET("modetax")) {
59 $modetax = GETPOSTINT("modetax");
60}
61if (empty($modetax)) {
62 $modetax = 0;
63}
64
65// Security check
66$socid = GETPOSTINT('socid');
67if ($user->socid) {
68 $socid = $user->socid;
69}
70$result = restrictedArea($user, 'tax', '', 'tva', 'charges');
71
72
73
74/*
75 * View
76 */
77
78$form = new Form($db);
79$company_static = new Societe($db);
80$invoice_customer = new Facture($db);
81$invoice_supplier = new FactureFournisseur($db);
82$expensereport = new ExpenseReport($db);
83$product_static = new Product($db);
84$payment_static = new Paiement($db);
85$paymentfourn_static = new PaiementFourn($db);
86$paymentexpensereport_static = new PaymentExpenseReport($db);
87$user_static = new User($db);
88
89$morequerystring = '';
90$listofparams = array('date_startmonth', 'date_startyear', 'date_startday', 'date_endmonth', 'date_endyear', 'date_endday');
91foreach ($listofparams as $param) {
92 if (GETPOST($param) != '') {
93 $morequerystring .= ($morequerystring ? '&' : '').$param.'='.GETPOST($param);
94 }
95}
96
97$special_report = false;
98if (isset($_REQUEST['extra_report']) && $_REQUEST['extra_report'] == 1) {
99 $special_report = true;
100}
101
102llxHeader('', $langs->trans("VATReport"), '', '', 0, 0, '', '', $morequerystring);
103
104$fsearch = '<!-- hidden fields for form -->';
105$fsearch .= '<input type="hidden" name="token" value="'.newToken().'">';
106$fsearch .= '<input type="hidden" name="modetax" value="'.$modetax.'">';
107$fsearch .= $langs->trans("SalesTurnoverMinimum").': ';
108$fsearch .= '<input type="text" name="min" id="min" value="'.$min.'" size="6">';
109
110// Show report header
111$name = $langs->trans("VATReportByThirdParties");
112$calcmode = '';
113if ($modetax == 0) {
114 $calcmode = $langs->trans('OptionVATDefault');
115}
116if ($modetax == 1) {
117 $calcmode = $langs->trans('OptionVATDebitOption');
118}
119if ($modetax == 2) {
120 $calcmode = $langs->trans('OptionPaymentForProductAndServices');
121}
122$calcmode .= ' <span class="opacitymedium">('.$langs->trans("TaxModuleSetupToModifyRules", DOL_URL_ROOT.'/admin/taxes.php').')</span>';
123// Set period
124$period = $form->selectDate($date_start, 'date_start', 0, 0, 0, '', 1, 0).' - '.$form->selectDate($date_end, 'date_end', 0, 0, 0, '', 1, 0);
125$prevyear = $date_start_year;
126$q = 0;
127$prevquarter = $q;
128if ($prevquarter > 1) {
129 $prevquarter--;
130} else {
131 $prevquarter = 4;
132 $prevyear--;
133}
134$nextyear = $date_start_year;
135$nextquarter = $q;
136if ($nextquarter < 4) {
137 $nextquarter++;
138} else {
139 $nextquarter = 1;
140 $nextyear++;
141}
142$builddate = dol_now();
143
144if (getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'invoice') {
145 $description = $langs->trans("RulesVATDueProducts");
146}
147if (getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'payment') {
148 $description .= $langs->trans("RulesVATInProducts");
149}
150if (getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'invoice') {
151 $description .= '<br>'.$langs->trans("RulesVATDueServices");
152}
153if (getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'payment') {
154 $description .= '<br>'.$langs->trans("RulesVATInServices");
155}
156if (getDolGlobalString('FACTURE_DEPOSITS_ARE_JUST_PAYMENTS')) {
157 $description .= '<br>'.$langs->trans("DepositsAreNotIncluded");
158}
159if (getDolGlobalString('FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS')) {
160 $description .= $langs->trans("SupplierDepositsAreNotIncluded");
161}
162if (isModEnabled('accounting')) {
163 $description .= '<br>'.$langs->trans("ThisIsAnEstimatedValue");
164}
165
166//$periodlink=($year_start?"<a href='".$_SERVER["PHP_SELF"]."?year=".($year_start-1)."&modetax=".$modetax."'>".img_previous()."</a> <a href='".$_SERVER["PHP_SELF"]."?year=".($year_start+1)."&modetax=".$modetax."'>".img_next()."</a>":"");
167$description .= ($description ? '<br>' : '').$fsearch;
168if (getDolGlobalString('TAX_REPORT_EXTRA_REPORT')) {
169 $description .= '<br>';
170 $description .= '<input type="radio" name="extra_report" value="0" '.($special_report ? '' : 'checked="checked"').'> ';
171 $description .= $langs->trans('SimpleReport');
172 $description .= '</input>';
173 $description .= '<br>';
174 $description .= '<input type="radio" name="extra_report" value="1" '.($special_report ? 'checked="checked"' : '').'> ';
175 $description .= $langs->trans('AddExtraReport');
176 $description .= '</input>';
177 $description .= '<br>';
178}
179
180$elementcust = $langs->trans("CustomersInvoices");
181$productcust = $langs->trans("Description");
182$namerate = $langs->trans("VATRate");
183$amountcust = $langs->trans("AmountHT");
184if ($mysoc->tva_assuj) {
185 $vatcust = ' ('.$langs->trans("StatusToPay").')';
186}
187$elementsup = $langs->trans("SuppliersInvoices");
188$productsup = $langs->trans("Description");
189$amountsup = $langs->trans("AmountHT");
190if ($mysoc->tva_assuj) {
191 $vatsup = ' ('.$langs->trans("ToGetBack").')';
192}
193$periodlink = '';
194$exportlink = '';
195
196report_header($name, '', $period, $periodlink, $description, $builddate, $exportlink, array(), $calcmode);
197
198$vatcust = $langs->trans("VATReceived");
199$vatsup = $langs->trans("VATPaid");
200
201
202// VAT Received
203print '<div class="div-table-responsive">';
204print "<table class=\"noborder\" width=\"100%\">";
205
206$y = $year_current;
207$total = 0;
208$i = 0;
209$columns = 5;
210$span = $columns;
211if ($modetax != 1) {
212 $span += 2;
213}
214
215// Load arrays of datas
216$x_coll = tax_by_thirdparty('vat', $db, 0, $date_start, $date_end, $modetax, 'sell');
217$x_paye = tax_by_thirdparty('vat', $db, 0, $date_start, $date_end, $modetax, 'buy');
218
219if (!is_array($x_coll) || !is_array($x_paye)) {
220 $langs->load("errors");
221 if ($x_coll == -1) {
222 print '<tr><td colspan="'.$columns.'">'.$langs->trans("ErrorNoAccountancyModuleLoaded").'</td></tr>';
223 } elseif ($x_coll == -2) {
224 print '<tr><td colspan="'.$columns.'">'.$langs->trans("FeatureNotYetAvailable").'</td></tr>';
225 } else {
226 print '<tr><td colspan="'.$columns.'">'.$langs->trans("Error").'</td></tr>';
227 }
228} else {
229 $x_both = array();
230 //now, from these two arrays, get another array with one rate per line
231 foreach (array_keys($x_coll) as $my_coll_thirdpartyid) {
232 $x_both[$my_coll_thirdpartyid]['coll']['totalht'] = $x_coll[$my_coll_thirdpartyid]['totalht'];
233 $x_both[$my_coll_thirdpartyid]['coll']['vat'] = $x_coll[$my_coll_thirdpartyid]['vat'];
234 $x_both[$my_coll_thirdpartyid]['paye']['totalht'] = 0;
235 $x_both[$my_coll_thirdpartyid]['paye']['vat'] = 0;
236 $x_both[$my_coll_thirdpartyid]['coll']['links'] = '';
237 $x_both[$my_coll_thirdpartyid]['coll']['detail'] = array();
238 foreach ($x_coll[$my_coll_thirdpartyid]['facid'] as $id => $dummy) {
239 $invoice_customer->id = $x_coll[$my_coll_thirdpartyid]['facid'][$id];
240 $invoice_customer->ref = $x_coll[$my_coll_thirdpartyid]['facnum'][$id];
241 $invoice_customer->type = $x_coll[$my_coll_thirdpartyid]['type'][$id];
242
243 //$company_static->fetch($x_coll[$my_coll_thirdpartyid]['company_id'][$id]);
244 $company_static->id = $x_coll[$my_coll_thirdpartyid]['company_id'][$id];
245 $company_static->name = $x_coll[$my_coll_thirdpartyid]['company_name'][$id];
246 $company_static->name_alias = $x_coll[$my_coll_thirdpartyid]['company_alias'][$id];
247 $company_static->email = $x_coll[$my_coll_thirdpartyid]['company_email'][$id];
248 $company_static->tva_intra = isset($x_coll[$my_coll_thirdpartyid]['tva_intra'][$id]) ? $x_coll[$my_coll_thirdpartyid]['tva_intra'][$id] : 0;
249 $company_static->client = $x_coll[$my_coll_thirdpartyid]['company_client'][$id];
250 $company_static->fournisseur = $x_coll[$my_coll_thirdpartyid]['company_fournisseur'][$id];
251 $company_static->status = $x_coll[$my_coll_thirdpartyid]['company_status'][$id];
252 $company_static->code_client = $x_coll[$my_coll_thirdpartyid]['company_customer_code'][$id];
253 $company_static->code_compta_client = $x_coll[$my_coll_thirdpartyid]['company_customer_accounting_code'][$id];
254 $company_static->code_fournisseur = $x_coll[$my_coll_thirdpartyid]['company_supplier_code'][$id];
255 $company_static->code_compta_fournisseur = $x_coll[$my_coll_thirdpartyid]['company_supplier_accounting_code'][$id];
256
257 $x_both[$my_coll_thirdpartyid]['coll']['detail'][] = array(
258 'id' => $x_coll[$my_coll_thirdpartyid]['facid'][$id],
259 'descr' => $x_coll[$my_coll_thirdpartyid]['descr'][$id],
260
261 'pid' => $x_coll[$my_coll_thirdpartyid]['pid'][$id],
262 'pref' => isset($x_coll[$my_coll_thirdpartyid]['pref'][$id]) ? $x_coll[$my_coll_thirdpartyid]['pref'][$id] : '',
263 'ptype' => $x_coll[$my_coll_thirdpartyid]['ptype'][$id],
264 'pstatus' => isset($x_paye[$my_coll_thirdpartyid]['pstatus'][$id]) ? $x_paye[$my_coll_thirdpartyid]['pstatus'][$id] : '',
265 'pstatusbuy' => isset($x_paye[$my_coll_thirdpartyid]['pstatusbuy'][$id]) ? $x_paye[$my_coll_thirdpartyid]['pstatusbuy'][$id] : '',
266
267 'payment_id' => $x_coll[$my_coll_thirdpartyid]['payment_id'][$id],
268 'payment_ref' => isset($x_coll[$my_coll_thirdpartyid]['payment_ref'][$id]) ? $x_coll[$my_coll_thirdpartyid]['payment_ref'][$id] : '',
269 'payment_amount' => $x_coll[$my_coll_thirdpartyid]['payment_amount'][$id],
270 'ftotal_ttc' => $x_coll[$my_coll_thirdpartyid]['ftotal_ttc'][$id],
271 'dtotal_ttc' => $x_coll[$my_coll_thirdpartyid]['dtotal_ttc'][$id],
272 'dtype' => $x_coll[$my_coll_thirdpartyid]['dtype'][$id],
273 'drate' => $x_coll[$my_coll_thirdpartyid]['drate'][$id],
274 'datef' => $x_coll[$my_coll_thirdpartyid]['datef'][$id],
275 'datep' => $x_coll[$my_coll_thirdpartyid]['datep'][$id],
276
277 'company_link' => $company_static->getNomUrl(1, '', 20),
278
279 'ddate_start' => $x_coll[$my_coll_thirdpartyid]['ddate_start'][$id],
280 'ddate_end' => $x_coll[$my_coll_thirdpartyid]['ddate_end'][$id],
281 'totalht' => $x_coll[$my_coll_thirdpartyid]['totalht_list'][$id],
282 'vat' => $x_coll[$my_coll_thirdpartyid]['vat_list'][$id],
283 'link' => $invoice_customer->getNomUrl(1, '', 12)
284 );
285 }
286 }
287 // tva paid
288 foreach (array_keys($x_paye) as $my_paye_thirdpartyid) {
289 $x_both[$my_paye_thirdpartyid]['paye']['totalht'] = $x_paye[$my_paye_thirdpartyid]['totalht'];
290 $x_both[$my_paye_thirdpartyid]['paye']['vat'] = $x_paye[$my_paye_thirdpartyid]['vat'];
291 if (!isset($x_both[$my_paye_thirdpartyid]['coll']['totalht'])) {
292 $x_both[$my_paye_thirdpartyid]['coll']['totalht'] = 0;
293 $x_both[$my_paye_thirdpartyid]['coll']['vat'] = 0;
294 }
295 $x_both[$my_paye_thirdpartyid]['paye']['links'] = '';
296 $x_both[$my_paye_thirdpartyid]['paye']['detail'] = array();
297
298 foreach ($x_paye[$my_paye_thirdpartyid]['facid'] as $id => $dummy) {
299 // ExpenseReport
300 if ($x_paye[$my_paye_thirdpartyid]['ptype'][$id] == 'ExpenseReportPayment') {
301 $expensereport->id = $x_paye[$my_paye_thirdpartyid]['facid'][$id];
302 $expensereport->ref = $x_paye[$my_paye_thirdpartyid]['facnum'][$id];
303 $expensereport->type = $x_paye[$my_paye_thirdpartyid]['type'][$id];
304
305 $x_both[$my_paye_thirdpartyid]['paye']['detail'][] = array(
306 'id' => $x_paye[$my_paye_thirdpartyid]['facid'][$id],
307 'descr' => $x_paye[$my_paye_thirdpartyid]['descr'][$id],
308
309 'pid' => $x_paye[$my_paye_thirdpartyid]['pid'][$id],
310 'pref' => $x_paye[$my_paye_thirdpartyid]['pref'][$id],
311 'ptype' => $x_paye[$my_paye_thirdpartyid]['ptype'][$id],
312 'pstatus' => $x_paye[$my_paye_thirdpartyid]['pstatus'][$id],
313 'pstatusbuy' => $x_paye[$my_paye_thirdpartyid]['pstatusbuy'][$id],
314
315 'payment_id' => $x_paye[$my_paye_thirdpartyid]['payment_id'][$id],
316 'payment_ref' => $x_paye[$my_paye_thirdpartyid]['payment_ref'][$id],
317 'payment_amount' => $x_paye[$my_paye_thirdpartyid]['payment_amount'][$id],
318 'ftotal_ttc' => price2num($x_paye[$my_paye_thirdpartyid]['ftotal_ttc'][$id]),
319 'dtotal_ttc' => price2num($x_paye[$my_paye_thirdpartyid]['dtotal_ttc'][$id]),
320 'dtype' => $x_paye[$my_paye_thirdpartyid]['dtype'][$id],
321 'drate' => $x_paye[$my_coll_thirdpartyid]['drate'][$id],
322 'ddate_start' => $x_paye[$my_paye_thirdpartyid]['ddate_start'][$id],
323 'ddate_end' => $x_paye[$my_paye_thirdpartyid]['ddate_end'][$id],
324 'totalht' => price2num($x_paye[$my_paye_thirdpartyid]['totalht_list'][$id]),
325 'vat' => $x_paye[$my_paye_thirdpartyid]['vat_list'][$id],
326 'link' => $expensereport->getNomUrl(1)
327 );
328 } else {
329 $invoice_supplier->id = $x_paye[$my_paye_thirdpartyid]['facid'][$id];
330 $invoice_supplier->ref = $x_paye[$my_paye_thirdpartyid]['facnum'][$id];
331 $invoice_supplier->type = $x_paye[$my_paye_thirdpartyid]['type'][$id];
332
333 //$company_static->fetch($x_paye[$my_paye_thirdpartyid]['company_id'][$id]);
334 $company_static->id = $x_paye[$my_paye_thirdpartyid]['company_id'][$id];
335 $company_static->name = $x_paye[$my_paye_thirdpartyid]['company_name'][$id];
336 $company_static->name_alias = $x_paye[$my_paye_thirdpartyid]['company_alias'][$id];
337 $company_static->email = $x_paye[$my_paye_thirdpartyid]['company_email'][$id];
338 $company_static->tva_intra = $x_paye[$my_paye_thirdpartyid]['tva_intra'][$id];
339 $company_static->client = $x_paye[$my_paye_thirdpartyid]['company_client'][$id];
340 $company_static->fournisseur = $x_paye[$my_paye_thirdpartyid]['company_fournisseur'][$id];
341 $company_static->status = $x_paye[$my_paye_thirdpartyid]['company_status'][$id];
342 $company_static->code_client = $x_paye[$my_paye_thirdpartyid]['company_customer_code'][$id];
343 $company_static->code_compta_client = $x_paye[$my_paye_thirdpartyid]['company_customer_accounting_code'][$id];
344 $company_static->code_fournisseur = $x_paye[$my_paye_thirdpartyid]['company_supplier_code'][$id];
345 $company_static->code_compta_fournisseur = $x_paye[$my_paye_thirdpartyid]['company_supplier_accounting_code'][$id];
346
347 $x_both[$my_paye_thirdpartyid]['paye']['detail'][] = array(
348 'id' => $x_paye[$my_paye_thirdpartyid]['facid'][$id],
349 'descr' => $x_paye[$my_paye_thirdpartyid]['descr'][$id],
350
351 'pid' => $x_paye[$my_paye_thirdpartyid]['pid'][$id],
352 'pref' => $x_paye[$my_paye_thirdpartyid]['pref'][$id],
353 'ptype' => $x_paye[$my_paye_thirdpartyid]['ptype'][$id],
354 'pstatus' => $x_paye[$my_paye_thirdpartyid]['pstatus'][$id],
355 'pstatusbuy' => $x_paye[$my_paye_thirdpartyid]['pstatusbuy'][$id],
356
357 'payment_id' => $x_paye[$my_paye_thirdpartyid]['payment_id'][$id],
358 'payment_ref' => $x_paye[$my_paye_thirdpartyid]['payment_ref'][$id],
359 'payment_amount' => $x_paye[$my_paye_thirdpartyid]['payment_amount'][$id],
360 'ftotal_ttc' => price2num($x_paye[$my_paye_thirdpartyid]['ftotal_ttc'][$id]),
361 'dtotal_ttc' => price2num($x_paye[$my_paye_thirdpartyid]['dtotal_ttc'][$id]),
362 'dtype' => $x_paye[$my_paye_thirdpartyid]['dtype'][$id],
363 'drate' => $x_paye[$my_coll_thirdpartyid]['drate'][$id],
364 'datef' => $x_paye[$my_paye_thirdpartyid]['datef'][$id],
365 'datep' => $x_paye[$my_paye_thirdpartyid]['datep'][$id],
366
367 'company_link' => $company_static->getNomUrl(1, '', 20),
368
369 'ddate_start' => $x_paye[$my_paye_thirdpartyid]['ddate_start'][$id],
370 'ddate_end' => $x_paye[$my_paye_thirdpartyid]['ddate_end'][$id],
371 'totalht' => price2num($x_paye[$my_paye_thirdpartyid]['totalht_list'][$id]),
372 'vat' => $x_paye[$my_paye_thirdpartyid]['vat_list'][$id],
373 'link' => $invoice_supplier->getNomUrl(1, '', 12)
374 );
375 }
376 }
377 }
378 //now we have an array (x_both) indexed by rates for coll and paye
379
380
381 //print table headers for this quadri - incomes first
382
383 $x_coll_sum = 0;
384 $x_coll_ht = 0;
385 $x_paye_sum = 0;
386 $x_paye_ht = 0;
387
388 //print '<tr><td colspan="'.($span+1).'">'..')</td></tr>';
389
390 // Customers invoices
391 print '<tr class="liste_titre">';
392 print '<td class="left">'.$elementcust.'</td>';
393 print '<td class="left">'.$langs->trans("DateInvoice").'</td>';
394 if (getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'payment' || getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'payment') {
395 print '<td class="left">'.$langs->trans("DatePayment").'</td>';
396 } else {
397 print '<td></td>';
398 }
399 print '<td class="right"></td>';
400 print '<td class="left">'.$productcust.'</td>';
401 if ($modetax != 1) {
402 print '<td class="right">'.$amountcust.'</td>';
403 print '<td class="right">'.$langs->trans("Payment").' ('.$langs->trans("PercentOfInvoice").')</td>';
404 }
405 print '<td class="right">'.$langs->trans("AmountHTVATRealReceived").'</td>';
406 print '<td class="right">'.$vatcust.'</td>';
407 print '</tr>';
408
409 $action = "tvadetail";
410 $parameters["mode"] = $modetax;
411 $parameters["start"] = $date_start;
412 $parameters["end"] = $date_end;
413 $parameters["type"] = 'vat';
414
415 $object = array(&$x_coll, &$x_paye, &$x_both);
416 // Initialize technical object to manage hooks of expenses. Note that conf->hooks_modules contains array array
417 $hookmanager->initHooks(array('externalbalance'));
418 $reshook = $hookmanager->executeHooks('addVatLine', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
419
420 foreach (array_keys($x_coll) as $thirdparty_id) {
421 $subtot_coll_total_ht = 0;
422 $subtot_coll_vat = 0;
423
424 if ($min == 0 || ($min > 0 && $x_both[$thirdparty_id]['coll']['totalht'] > $min)) {
425 if (is_array($x_both[$thirdparty_id]['coll']['detail'])) {
426 // VAT Rate
427 print "<tr>";
428 print '<td class="tax_rate">';
429 if (is_numeric($thirdparty_id)) {
430 $company_static->fetch($thirdparty_id);
431 print $langs->trans("ThirdParty").': '.$company_static->getNomUrl(1);
432 } else {
433 $tmpid = preg_replace('/userid_/', '', $thirdparty_id);
434 $user_static->fetch($tmpid);
435 print $langs->trans("User").': '.$user_static->getNomUrl(1);
436 }
437 print '</td><td colspan="'.($span + 1).'"></td>';
438 print '</tr>'."\n";
439
440 foreach ($x_both[$thirdparty_id]['coll']['detail'] as $index => $fields) {
441 // Define type
442 // We MUST use dtype (type in line). We can use something else, only if dtype is really unknown.
443 $type = (isset($fields['dtype']) ? $fields['dtype'] : $fields['ptype']);
444 // Try to enhance type detection using date_start and date_end for free lines where type
445 // was not saved.
446 if (!empty($fields['ddate_start'])) {
447 $type = 1;
448 }
449 if (!empty($fields['ddate_end'])) {
450 $type = 1;
451 }
452
453 print '<tr class="oddeven">';
454
455 // Ref
456 print '<td class="nowrap left">'.$fields['link'].'</td>';
457
458 // Invoice date
459 print '<td class="left">'.dol_print_date($fields['datef'], 'day').'</td>';
460
461 // Payment date
462 if (getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'payment' || getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'payment') {
463 print '<td class="left">'.dol_print_date($fields['datep'], 'day').'</td>';
464 } else {
465 print '<td></td>';
466 }
467
468 // Rate
469 print '<td class="right">'.$fields['drate'].'</td>';
470
471 // Description
472 print '<td class="left">';
473 if ($fields['pid']) {
474 $product_static->id = $fields['pid'];
475 $product_static->ref = $fields['pref'];
476 $product_static->type = $fields['dtype']; // We force with the type of line to have type how line is registered
477 $product_static->status = $fields['pstatus'];
478 $product_static->status_buy = $fields['pstatusbuy'];
479
480 print $product_static->getNomUrl(1);
481 if (dol_string_nohtmltag($fields['descr'])) {
482 print ' - '.dol_trunc(dol_string_nohtmltag($fields['descr']), 24);
483 }
484 } else {
485 if ($type) {
486 $text = img_object($langs->trans('Service'), 'service');
487 } else {
488 $text = img_object($langs->trans('Product'), 'product');
489 }
490 if (preg_match('/^\‍((.*)\‍)$/', $fields['descr'], $reg)) {
491 if ($reg[1] == 'DEPOSIT') {
492 $fields['descr'] = $langs->transnoentitiesnoconv('Deposit');
493 } elseif ($reg[1] == 'CREDIT_NOTE') {
494 $fields['descr'] = $langs->transnoentitiesnoconv('CreditNote');
495 } else {
496 $fields['descr'] = $langs->transnoentitiesnoconv($reg[1]);
497 }
498 }
499 print $text.' '.dol_trunc(dol_string_nohtmltag($fields['descr']), 24);
500
501 // Show range
502 print_date_range($fields['ddate_start'], $fields['ddate_end']);
503 }
504 print '</td>';
505
506 // Total HT
507 if ($modetax != 1) {
508 print '<td class="nowrap right"><span class="amount">';
509 print price($fields['totalht']);
510 if (price2num($fields['ftotal_ttc'])) {
511 //print $fields['dtotal_ttc']."/".$fields['ftotal_ttc']." - ";
512 $ratiolineinvoice = ($fields['dtotal_ttc'] / $fields['ftotal_ttc']);
513 //print ' ('.round($ratiolineinvoice*100,2).'%)';
514 }
515 print '</span></td>';
516 }
517
518 // Payment
519 $ratiopaymentinvoice = 1;
520 if ($modetax != 1) {
521 print '<td class="nowrap right">';
522 //print $fields['totalht']."-".$fields['payment_amount']."-".$fields['ftotal_ttc'];
523 if ($fields['payment_amount'] && $fields['ftotal_ttc']) {
524 $payment_static->id = $fields['payment_id'];
525 $payment_static->ref = $fields['payment_ref'];
526 print $payment_static->getNomUrl(2, '', '', 0).' ';
527 }
528 if (($type == 0 && getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'invoice')
529 || ($type == 1 && getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'invoice')) {
530 print $langs->trans("NA");
531 } else {
532 if (isset($fields['payment_amount']) && price2num($fields['ftotal_ttc'])) {
533 $ratiopaymentinvoice = ($fields['payment_amount'] / $fields['ftotal_ttc']);
534 }
535 print '<span class="amount">'.price(price2num($fields['payment_amount'], 'MT')).'</span>';
536 if (isset($fields['payment_amount'])) {
537 print ' ('.round($ratiopaymentinvoice * 100, 2).'%)';
538 }
539 }
540 print '</td>';
541 }
542
543 // Total collected
544 print '<td class="nowrap right"><span class="amount">';
545 $temp_ht = $fields['totalht'] * $ratiopaymentinvoice;
546 print price(price2num($temp_ht, 'MT'), 1);
547 print '</span></td>';
548
549 // VAT
550 print '<td class="nowrap right"><span class="amount">';
551 $temp_vat = $fields['vat'] * $ratiopaymentinvoice;
552 print price(price2num($temp_vat, 'MT'), 1);
553 //print price($fields['vat']);
554 print '</span></td>';
555 print '</tr>';
556
557 $subtot_coll_total_ht += $temp_ht;
558 $subtot_coll_vat += $temp_vat;
559 $x_coll_sum += $temp_vat;
560 }
561 }
562
563 // Total customers for this vat rate
564 print '<tr class="liste_total">';
565 print '<td colspan="4"></td>';
566 print '<td class="right">'.$langs->trans("Total").':</td>';
567 if ($modetax != 1) {
568 print '<td class="nowrap right">&nbsp;</td>';
569 print '<td class="right">&nbsp;</td>';
570 }
571 print '<td class="right"><span class="amount">'.price(price2num($subtot_coll_total_ht, 'MT')).'</span></td>';
572 print '<td class="nowrap right"><span class="amount">'.price(price2num($subtot_coll_vat, 'MT')).'</span></td>';
573 print '</tr>';
574 }
575 }
576
577 if (count($x_coll) == 0) { // Show a total line if nothing shown
578 print '<tr class="liste_total">';
579 print '<td colspan="4"></td>';
580 print '<td class="right">'.$langs->trans("Total").':</td>';
581 if ($modetax != 1) {
582 print '<td class="nowrap right">&nbsp;</td>';
583 print '<td class="right">&nbsp;</td>';
584 }
585 print '<td class="right">'.price(price2num(0, 'MT')).'</td>';
586 print '<td class="nowrap right">'.price(price2num(0, 'MT')).'</td>';
587 print '</tr>';
588 }
589
590 // Blank line
591 print '<tr><td colspan="'.($span + 1).'">&nbsp;</td></tr>';
592
593 // Print table headers for this quadri - expenses now
594 print '<tr class="liste_titre liste_titre_topborder">';
595 print '<td class="left">'.$elementsup.'</td>';
596 print '<td class="left">'.$langs->trans("DateInvoice").'</td>';
597 if (getDolGlobalString('TAX_MODE_BUY_PRODUCT') == 'payment' || getDolGlobalString('TAX_MODE_BUY_SERVICE') == 'payment') {
598 print '<td class="left">'.$langs->trans("DatePayment").'</td>';
599 } else {
600 print '<td></td>';
601 }
602 print '<td class="left"></td>';
603 print '<td class="left">'.$productsup.'</td>';
604 if ($modetax != 1) {
605 print '<td class="right">'.$amountsup.'</td>';
606 print '<td class="right">'.$langs->trans("Payment").' ('.$langs->trans("PercentOfInvoice").')</td>';
607 }
608 print '<td class="right">'.$langs->trans("AmountHTVATRealPaid").'</td>';
609 print '<td class="right">'.$vatsup.'</td>';
610 print '</tr>'."\n";
611
612 foreach (array_keys($x_paye) as $thirdparty_id) {
613 $subtot_paye_total_ht = 0;
614 $subtot_paye_vat = 0;
615
616 if ($min == 0 || ($min > 0 && $x_both[$thirdparty_id]['paye']['totalht'] > $min)) {
617 if (is_array($x_both[$thirdparty_id]['paye']['detail'])) {
618 print "<tr>";
619 print '<td class="tax_rate">';
620 if (is_numeric($thirdparty_id)) {
621 $company_static->fetch($thirdparty_id);
622 print $langs->trans("ThirdParty").': '.$company_static->getNomUrl(1);
623 } else {
624 $tmpid = preg_replace('/userid_/', '', $thirdparty_id);
625 $user_static->fetch($tmpid);
626 print $langs->trans("User").': '.$user_static->getNomUrl(1);
627 }
628 print '<td colspan="'.($span + 1).'"></td>';
629 print '</tr>'."\n";
630
631 foreach ($x_both[$thirdparty_id]['paye']['detail'] as $index => $fields) {
632 // Define type
633 // We MUST use dtype (type in line). We can use something else, only if dtype is really unknown.
634 $type = (isset($fields['dtype']) ? $fields['dtype'] : $fields['ptype']);
635 // Try to enhance type detection using date_start and date_end for free lines where type
636 // was not saved.
637 if (!empty($fields['ddate_start'])) {
638 $type = 1;
639 }
640 if (!empty($fields['ddate_end'])) {
641 $type = 1;
642 }
643
644
645 print '<tr class="oddeven">';
646
647 // Ref
648 print '<td class="nowrap left">'.$fields['link'].'</td>';
649
650 // Invoice date
651 print '<td class="left">'.dol_print_date($fields['datef'], 'day').'</td>';
652
653 // Payment date
654 if (getDolGlobalString('TAX_MODE_BUY_PRODUCT') == 'payment' || getDolGlobalString('TAX_MODE_BUY_SERVICE') == 'payment') {
655 print '<td class="left">'.dol_print_date($fields['datep'], 'day').'</td>';
656 } else {
657 print '<td></td>';
658 }
659
660 // Company name
661 print '<td class="tdmaxoverflow150">';
662 print $fields['company_link'];
663 print '</td>';
664
665 // Description
666 print '<td class="left">';
667 if ($fields['pid']) {
668 $product_static->id = $fields['pid'];
669 $product_static->ref = $fields['pref'];
670 $product_static->type = $fields['dtype']; // We force with the type of line to have type how line is registered
671 print $product_static->getNomUrl(1);
672 if (dol_string_nohtmltag($fields['descr'])) {
673 print ' - '.dol_trunc(dol_string_nohtmltag($fields['descr']), 24);
674 }
675 } else {
676 if ($type) {
677 $text = img_object($langs->trans('Service'), 'service');
678 } else {
679 $text = img_object($langs->trans('Product'), 'product');
680 }
681 if (preg_match('/^\‍((.*)\‍)$/', $fields['descr'], $reg)) {
682 if ($reg[1] == 'DEPOSIT') {
683 $fields['descr'] = $langs->transnoentitiesnoconv('Deposit');
684 } elseif ($reg[1] == 'CREDIT_NOTE') {
685 $fields['descr'] = $langs->transnoentitiesnoconv('CreditNote');
686 } else {
687 $fields['descr'] = $langs->transnoentitiesnoconv($reg[1]);
688 }
689 }
690 print $text.' '.dol_trunc(dol_string_nohtmltag($fields['descr']), 24);
691
692 // Show range
693 print_date_range($fields['ddate_start'], $fields['ddate_end']);
694 }
695 print '</td>';
696
697 // Total HT
698 if ($modetax != 1) {
699 print '<td class="nowrap right"><span class="amount">';
700 print price($fields['totalht']);
701 if (price2num($fields['ftotal_ttc'])) {
702 //print $fields['dtotal_ttc']."/".$fields['ftotal_ttc']." - ";
703 $ratiolineinvoice = ((float) $fields['dtotal_ttc'] / (float) $fields['ftotal_ttc']);
704 //print ' ('.round($ratiolineinvoice*100,2).'%)';
705 }
706 print '</span></td>';
707 }
708
709 // Payment
710 $ratiopaymentinvoice = 1;
711 if ($modetax != 1) {
712 print '<td class="nowrap right">';
713 if ($fields['payment_amount'] && $fields['ftotal_ttc']) {
714 $paymentfourn_static->id = $fields['payment_id'];
715 $paymentfourn_static->ref = $fields['payment_ref'];
716 print $paymentfourn_static->getNomUrl(2, '', '', 0);
717 }
718
719 if (($type == 0 && getDolGlobalString('TAX_MODE_BUY_PRODUCT') == 'invoice')
720 || ($type == 1 && getDolGlobalString('TAX_MODE_BUY_SERVICE') == 'invoice')) {
721 print $langs->trans("NA");
722 } else {
723 if (isset($fields['payment_amount']) && $fields['ftotal_ttc']) {
724 $ratiopaymentinvoice = ($fields['payment_amount'] / (float) $fields['ftotal_ttc']);
725 }
726 print '<span class="amount">'.price(price2num($fields['payment_amount'], 'MT')).'</span>';
727 if (isset($fields['payment_amount'])) {
728 print ' ('.round($ratiopaymentinvoice * 100, 2).'%)';
729 }
730 }
731 print '</td>';
732 }
733
734 // VAT paid
735 print '<td class="nowrap right"><span class="amount">';
736 $temp_ht = (float) $fields['totalht'] * $ratiopaymentinvoice;
737 print price(price2num($temp_ht, 'MT'), 1);
738 print '</span></td>';
739
740 // VAT
741 print '<td class="nowrap right"><span class="amount">';
742 $temp_vat = $fields['vat'] * $ratiopaymentinvoice;
743 print price(price2num($temp_vat, 'MT'), 1);
744 //print price($fields['vat']);
745 print '</span></td>';
746 print '</tr>';
747
748 $subtot_paye_total_ht += $temp_ht;
749 $subtot_paye_vat += $temp_vat;
750 $x_paye_sum += $temp_vat;
751 }
752 }
753 // Total suppliers for this vat rate
754 print '<tr class="liste_total">';
755 print '<td colspan="4"></td>';
756 print '<td class="right">'.$langs->trans("Total").':</td>';
757 if ($modetax != 1) {
758 print '<td class="nowrap right">&nbsp;</td>';
759 print '<td class="right">&nbsp;</td>';
760 }
761 print '<td class="right"><span class="amount">'.price(price2num($subtot_paye_total_ht, 'MT')).'</span></td>';
762 print '<td class="nowrap right"><span class="amount">'.price(price2num($subtot_paye_vat, 'MT')).'</span></td>';
763 print '</tr>';
764 }
765 }
766
767 if (count($x_paye) == 0) { // Show a total line if nothing shown
768 print '<tr class="liste_total">';
769 print '<td colspan="4"></td>';
770 print '<td class="right">'.$langs->trans("Total").':</td>';
771 if ($modetax != 1) {
772 print '<td class="nowrap right">&nbsp;</td>';
773 print '<td class="right">&nbsp;</td>';
774 }
775 print '<td class="right">'.price(price2num(0, 'MT')).'</td>';
776 print '<td class="nowrap right">'.price(price2num(0, 'MT')).'</td>';
777 print '</tr>';
778 }
779
780 // Total to pay
781 print '<tr><td colspan="'.($span + 2).'"></td></tr>';
782
783 $diff = $x_coll_sum - $x_paye_sum;
784 print '<tr class="liste_total">';
785 print '<td class="liste_total" colspan="'.($span + 1).'">'.$langs->trans("TotalToPay").($q ? ', '.$langs->trans("Quadri").' '.$q : '').'</td>';
786 print '<td class="liste_total nowrap right"><b>'.price(price2num($diff, 'MT'))."</b></td>\n";
787 print "</tr>\n";
788
789 $i++;
790}
791
792print '</table>';
793print '</div>';
794
795llxFooter();
796
797$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()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
Class to manage generation of HTML components Only common components must be here.
Class to manage payments for supplier invoices.
Class to manage payments of customer invoices.
Class to manage payments of expense report.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
report_header($reportname, $notused, $period, $periodlink, $description, $builddate, $exportlink='', $moreparam=array(), $calcmode='', $varlink='')
Show header of a report.
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_by_thirdparty($type, $db, $y, $date_start, $date_end, $modetax, $direction, $m=0, $q=0)
Look for collectable VAT clients in the chosen year (and month)
Definition tax.lib.php:112