dolibarr  20.0.0-beta
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
31 require '../../main.inc.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/tax.lib.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35 require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/compta/localtax/class/localtax.class.php';
37 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
38 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
39 require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
40 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
41 require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
42 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
43 require_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 
48 include DOL_DOCUMENT_ROOT.'/compta/tva/initdatesforvat.inc.php';
49 
50 $min = price2num(GETPOST("min", "alpha"));
51 if (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');
58 if (GETPOSTISSET("modetax")) {
59  $modetax = GETPOSTINT("modetax");
60 }
61 if (empty($modetax)) {
62  $modetax = 0;
63 }
64 
65 // Security check
66 $socid = GETPOSTINT('socid');
67 if ($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');
91 foreach ($listofparams as $param) {
92  if (GETPOST($param) != '') {
93  $morequerystring .= ($morequerystring ? '&' : '').$param.'='.GETPOST($param);
94  }
95 }
96 
97 $special_report = false;
98 if (isset($_REQUEST['extra_report']) && $_REQUEST['extra_report'] == 1) {
99  $special_report = true;
100 }
101 
102 llxHeader('', $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 = '';
113 if ($modetax == 0) {
114  $calcmode = $langs->trans('OptionVATDefault');
115 }
116 if ($modetax == 1) {
117  $calcmode = $langs->trans('OptionVATDebitOption');
118 }
119 if ($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;
128 if ($prevquarter > 1) {
129  $prevquarter--;
130 } else {
131  $prevquarter = 4;
132  $prevyear--;
133 }
134 $nextyear = $date_start_year;
135 $nextquarter = $q;
136 if ($nextquarter < 4) {
137  $nextquarter++;
138 } else {
139  $nextquarter = 1;
140  $nextyear++;
141 }
142 $builddate = dol_now();
143 
144 if (getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'invoice') {
145  $description = $langs->trans("RulesVATDueProducts");
146 }
147 if (getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'payment') {
148  $description .= $langs->trans("RulesVATInProducts");
149 }
150 if (getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'invoice') {
151  $description .= '<br>'.$langs->trans("RulesVATDueServices");
152 }
153 if (getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'payment') {
154  $description .= '<br>'.$langs->trans("RulesVATInServices");
155 }
156 if (getDolGlobalString('FACTURE_DEPOSITS_ARE_JUST_PAYMENTS')) {
157  $description .= '<br>'.$langs->trans("DepositsAreNotIncluded");
158 }
159 if (getDolGlobalString('FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS')) {
160  $description .= $langs->trans("SupplierDepositsAreNotIncluded");
161 }
162 if (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;
168 if (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");
184 if ($mysoc->tva_assuj) {
185  $vatcust = ' ('.$langs->trans("StatusToPay").')';
186 }
187 $elementsup = $langs->trans("SuppliersInvoices");
188 $productsup = $langs->trans("Description");
189 $amountsup = $langs->trans("AmountHT");
190 if ($mysoc->tva_assuj) {
191  $vatsup = ' ('.$langs->trans("ToGetBack").')';
192 }
193 $periodlink = '';
194 $exportlink = '';
195 
196 report_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
203 print '<div class="div-table-responsive">';
204 print "<table class=\"noborder\" width=\"100%\">";
205 
206 $y = $year_current;
207 $total = 0;
208 $i = 0;
209 $columns = 5;
210 $span = $columns;
211 if ($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 
219 if (!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 
792 print '</table>';
793 print '</div>';
794 
795 llxFooter();
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.
Definition: user.class.php:50
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
div float
Buy price without taxes.
Definition: style.css.php:960
report_header($reportname, $notused, $period, $periodlink, $description, $builddate, $exportlink='', $moreparam=array(), $calcmode='', $varlink='')
Show header of a report.
Definition: report.lib.php:41
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