dolibarr  18.0.6
quadri_detail.php
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-2013 Laurent Destailleur <eldy@users.sourceforge.net>
5  * Copyright (C) 2006-2007 Yannick Warnier <ywarnier@beeznest.org>
6  * Copyright (C) 2014-2016 Juanjo Menent <jmenent@2byte.es>
7  * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <https://www.gnu.org/licenses/>.
21  */
22 
28 global $mysoc;
29 
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 $local = GETPOST('localTaxType', 'int');
49 // Date range
50 $year = GETPOST("year", "int");
51 if (empty($year)) {
52  $year_current = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
53  $year_start = $year_current;
54 } else {
55  $year_current = $year;
56  $year_start = $year;
57 }
58 $date_start = dol_mktime(0, 0, 0, GETPOST("date_startmonth"), GETPOST("date_startday"), GETPOST("date_startyear"));
59 $date_end = dol_mktime(23, 59, 59, GETPOST("date_endmonth"), GETPOST("date_endday"), GETPOST("date_endyear"));
60 // Quarter
61 if (empty($date_start) || empty($date_end)) { // We define date_start and date_end
62  $q = GETPOST("q", "int");
63  if (empty($q)) {
64  if (GETPOST("month", "int")) {
65  $date_start = dol_get_first_day($year_start, GETPOST("month", "int"), false);
66  $date_end = dol_get_last_day($year_start, GETPOST("month", "int"), false);
67  } else {
68  $date_start = dol_get_first_day($year_start, empty($conf->global->SOCIETE_FISCAL_MONTH_START) ? 1 : $conf->global->SOCIETE_FISCAL_MONTH_START, false);
69  if (empty($conf->global->MAIN_INFO_VAT_RETURN) || $conf->global->MAIN_INFO_VAT_RETURN == 2) {
70  $date_end = dol_time_plus_duree($date_start, 3, 'm') - 1;
71  } elseif ($conf->global->MAIN_INFO_VAT_RETURN == 3) {
72  $date_end = dol_time_plus_duree($date_start, 1, 'y') - 1;
73  } elseif ($conf->global->MAIN_INFO_VAT_RETURN == 1) {
74  $date_end = dol_time_plus_duree($date_start, 1, 'm') - 1;
75  }
76  }
77  } else {
78  if ($q == 1) {
79  $date_start = dol_get_first_day($year_start, 1, false);
80  $date_end = dol_get_last_day($year_start, 3, false);
81  }
82  if ($q == 2) {
83  $date_start = dol_get_first_day($year_start, 4, false);
84  $date_end = dol_get_last_day($year_start, 6, false);
85  }
86  if ($q == 3) {
87  $date_start = dol_get_first_day($year_start, 7, false);
88  $date_end = dol_get_last_day($year_start, 9, false);
89  }
90  if ($q == 4) {
91  $date_start = dol_get_first_day($year_start, 10, false);
92  $date_end = dol_get_last_day($year_start, 12, false);
93  }
94  }
95 }
96 
97 $min = price2num(GETPOST("min", "alpha"));
98 if (empty($min)) {
99  $min = 0;
100 }
101 
102 // Define modetax (0 or 1)
103 // 0=normal, 1=option vat for services is on debit, 2=option on payments for products
104 //$modetax = $conf->global->TAX_MODE;
105 $calc = getDolGlobalString('MAIN_INFO_LOCALTAX_CALC').$local;
106 $modetax = getDolGlobalInt('TAX_MODE');
107 if (GETPOSTISSET("modetax")) {
108  $modetax = GETPOST("modetax", 'int');
109 }
110 if (empty($modetax)) {
111  $modetax = 0;
112 }
113 
114 // Security check
115 $socid = GETPOST('socid', 'int');
116 if ($user->socid) {
117  $socid = $user->socid;
118 }
119 $result = restrictedArea($user, 'tax', '', '', 'charges');
120 
121 if (empty($local)) {
122  accessforbidden('Parameter localTaxType is missing');
123  exit;
124 }
125 
126 
127 
128 /*
129  * View
130  */
131 
132 $form = new Form($db);
133 $company_static = new Societe($db);
134 $invoice_customer = new Facture($db);
135 $invoice_supplier = new FactureFournisseur($db);
136 $expensereport = new ExpenseReport($db);
137 $product_static = new Product($db);
138 $payment_static = new Paiement($db);
139 $paymentfourn_static = new PaiementFourn($db);
140 $paymentexpensereport_static = new PaymentExpenseReport($db);
141 
142 $morequerystring = '';
143 $listofparams = array('date_startmonth', 'date_startyear', 'date_startday', 'date_endmonth', 'date_endyear', 'date_endday');
144 foreach ($listofparams as $param) {
145  if (GETPOST($param) != '') {
146  $morequerystring .= ($morequerystring ? '&' : '').$param.'='.GETPOST($param);
147  }
148 }
149 
150 llxHeader('', $langs->trans("LocalTaxReport"), '', '', 0, 0, '', '', $morequerystring);
151 
152 $fsearch = '<!-- hidden fields for form -->';
153 $fsearch .= '<input type="hidden" name="token" value="'.newToken().'">';
154 $fsearch .= '<input type="hidden" name="modetax" value="'.$modetax.'">';
155 $fsearch .= '<input type="hidden" name="localTaxType" value="'.$local.'">';
156 
157 $name = $langs->transcountry($local == 1 ? "LT1ReportByQuarters" : "LT2ReportByQuarters", $mysoc->country_code);
158 $calcmode = '';
159 if ($modetax == 0) {
160  $calcmode = $langs->trans('OptionVATDefault');
161 }
162 if ($modetax == 1) {
163  $calcmode = $langs->trans('OptionVATDebitOption');
164 }
165 if ($modetax == 2) {
166  $calcmode = $langs->trans('OptionPaymentForProductAndServices');
167 }
168 $calcmode .= ' <span class="opacitymedium">('.$langs->trans("TaxModuleSetupToModifyRules", DOL_URL_ROOT.'/admin/taxes.php').')</span>';
169 // Set period
170 $period = $form->selectDate($date_start, 'date_start', 0, 0, 0, '', 1, 0).' - '.$form->selectDate($date_end, 'date_end', 0, 0, 0, '', 1, 0);
171 $prevyear = $year_start;
172 $q=0;
173 $prevquarter = $q;
174 if ($prevquarter > 1) {
175  $prevquarter--;
176 } else {
177  $prevquarter = 4;
178  $prevyear--;
179 }
180 $nextyear = $year_start;
181 $nextquarter = $q;
182 if ($nextquarter < 4) {
183  $nextquarter++;
184 } else {
185  $nextquarter = 1;
186  $nextyear++;
187 }
188 $description = $fsearch;
189 $builddate = dol_now();
190 
191 /*if (getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'invoice') $description.=$langs->trans("RulesVATDueProducts");
192 if (getDolGlobalString('TAX_MODE_SELL_PRODUCT') == 'payment') $description.=$langs->trans("RulesVATInProducts");
193 if (getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'invoice') $description.='<br>'.$langs->trans("RulesVATDueServices");
194 if (getDolGlobalString('TAX_MODE_SELL_SERVICE') == 'payment') $description.='<br>'.$langs->trans("RulesVATInServices");
195 if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
196  $description.='<br>'.$langs->trans("DepositsAreNotIncluded");
197 }
198 if (! empty($conf->global->FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS)) {
199  $description.='<br>'.$langs->trans("SupplierDepositsAreNotIncluded");
200 }
201 */
202 if (!empty($conf->global->MAIN_MODULE_ACCOUNTING)) {
203  $description .= $langs->trans("ThisIsAnEstimatedValue");
204 }
205 
206 // Customers invoices
207 $elementcust = $langs->trans("CustomersInvoices");
208 $productcust = $langs->trans("ProductOrService");
209 $amountcust = $langs->trans("AmountHT");
210 $vatcust = $langs->trans("VATReceived");
211 $namecust = $langs->trans("Name");
212 if ($mysoc->tva_assuj) {
213  $vatcust .= ' ('.$langs->trans("StatusToPay").')';
214 }
215 
216 // Suppliers invoices
217 $elementsup = $langs->trans("SuppliersInvoices");
218 $productsup = $productcust;
219 $amountsup = $amountcust;
220 $vatsup = $langs->trans("VATPaid");
221 $namesup = $namecust;
222 if ($mysoc->tva_assuj) {
223  $vatsup .= ' ('.$langs->trans("ToGetBack").')';
224 }
225 
226 $periodlink = '';
227 $exportlink = '';
228 
229 report_header($name, '', $period, $periodlink, $description, $builddate, $exportlink, array(), $calcmode);
230 
231 if ($local == 1) {
232  $vatcust = $langs->transcountry("LT1", $mysoc->country_code);
233  $vatsup = $langs->transcountry("LT1", $mysoc->country_code);
234  $vatexpensereport = $langs->transcountry("LT1", $mysoc->country_code);
235 } else {
236  $vatcust = $langs->transcountry("LT2", $mysoc->country_code);
237  $vatsup = $langs->transcountry("LT2", $mysoc->country_code);
238  $vatexpensereport = $langs->transcountry("LT2", $mysoc->country_code);
239 }
240 
241 // VAT Received and paid
242 print '<div class="div-table-responsive">';
243 echo '<table class="noborder centpercent">';
244 
245 $y = $year_current;
246 $total = 0;
247 $i = 0;
248 $columns = 4;
249 
250 // Load arrays of datas
251 $x_coll = tax_by_rate('localtax'.$local, $db, 0, 0, $date_start, $date_end, $modetax, 'sell');
252 $x_paye = tax_by_rate('localtax'.$local, $db, 0, 0, $date_start, $date_end, $modetax, 'buy');
253 
254 if (!is_array($x_coll) || !is_array($x_paye)) {
255  $langs->load("errors");
256  if ($x_coll == -1) {
257  print '<tr><td colspan="'.$columns.'">'.$langs->trans("ErrorNoAccountancyModuleLoaded").'</td></tr>';
258  } elseif ($x_coll == -2) {
259  print '<tr><td colspan="'.$columns.'">'.$langs->trans("FeatureNotYetAvailable").'</td></tr>';
260  } else {
261  print '<tr><td colspan="'.$columns.'">'.$langs->trans("Error").'</td></tr>';
262  }
263 } else {
264  $x_both = array();
265 
266  //now, from these two arrays, get another array with one rate per line
267  foreach (array_keys($x_coll) as $my_coll_rate) {
268  $x_both[$my_coll_rate]['coll']['totalht'] = $x_coll[$my_coll_rate]['totalht'];
269  $x_both[$my_coll_rate]['coll']['localtax'.$local] = $x_coll[$my_coll_rate]['localtax'.$local];
270  $x_both[$my_coll_rate]['paye']['totalht'] = 0;
271  $x_both[$my_coll_rate]['paye']['localtax'.$local] = 0;
272  $x_both[$my_coll_rate]['coll']['links'] = '';
273  $x_both[$my_coll_rate]['coll']['detail'] = array();
274  foreach ($x_coll[$my_coll_rate]['facid'] as $id => $dummy) {
275  $invoice_customer->id = $x_coll[$my_coll_rate]['facid'][$id];
276  $invoice_customer->ref = $x_coll[$my_coll_rate]['facnum'][$id];
277  $invoice_customer->type = $x_coll[$my_coll_rate]['type'][$id];
278  $company_static->fetch($x_coll[$my_coll_rate]['company_id'][$id]);
279  $x_both[$my_coll_rate]['coll']['detail'][] = array(
280  'id' =>$x_coll[$my_coll_rate]['facid'][$id],
281  'descr' =>$x_coll[$my_coll_rate]['descr'][$id],
282  'pid' =>$x_coll[$my_coll_rate]['pid'][$id],
283  'pref' =>$x_coll[$my_coll_rate]['pref'][$id],
284  'ptype' =>$x_coll[$my_coll_rate]['ptype'][$id],
285  'payment_id'=>$x_coll[$my_coll_rate]['payment_id'][$id],
286  'payment_amount'=>$x_coll[$my_coll_rate]['payment_amount'][$id],
287  'ftotal_ttc'=>$x_coll[$my_coll_rate]['ftotal_ttc'][$id],
288  'dtotal_ttc'=>$x_coll[$my_coll_rate]['dtotal_ttc'][$id],
289  'dtype' =>$x_coll[$my_coll_rate]['dtype'][$id],
290  'datef' =>$x_coll[$my_coll_rate]['datef'][$id],
291  'datep' =>$x_coll[$my_coll_rate]['datep'][$id],
292  'company_link'=>$company_static->getNomUrl(1, '', 20),
293  'ddate_start'=>$x_coll[$my_coll_rate]['ddate_start'][$id],
294  'ddate_end' =>$x_coll[$my_coll_rate]['ddate_end'][$id],
295  'totalht' =>$x_coll[$my_coll_rate]['totalht_list'][$id],
296  'localtax1'=> $x_coll[$my_coll_rate]['localtax1_list'][$id],
297  'localtax2'=> $x_coll[$my_coll_rate]['localtax2_list'][$id],
298  'vat' =>$x_coll[$my_coll_rate]['vat_list'][$id],
299  'link' =>$invoice_customer->getNomUrl(1, '', 12)
300  );
301  }
302  }
303  // tva paid
304  foreach (array_keys($x_paye) as $my_paye_rate) {
305  $x_both[$my_paye_rate]['paye']['totalht'] = $x_paye[$my_paye_rate]['totalht'];
306  $x_both[$my_paye_rate]['paye']['vat'] = $x_paye[$my_paye_rate]['vat'];
307  if (!isset($x_both[$my_paye_rate]['coll']['totalht'])) {
308  $x_both[$my_paye_rate]['coll']['totalht'] = 0;
309  $x_both[$my_paye_rate]['coll']['vat'] = 0;
310  }
311  $x_both[$my_paye_rate]['paye']['links'] = '';
312  $x_both[$my_paye_rate]['paye']['detail'] = array();
313 
314  foreach ($x_paye[$my_paye_rate]['facid'] as $id => $dummy) {
315  $invoice_supplier->id = $x_paye[$my_paye_rate]['facid'][$id];
316  $invoice_supplier->ref = $x_paye[$my_paye_rate]['facnum'][$id];
317  $invoice_supplier->type = $x_paye[$my_paye_rate]['type'][$id];
318  $x_both[$my_paye_rate]['paye']['detail'][] = array(
319  'id' =>$x_paye[$my_paye_rate]['facid'][$id],
320  'descr' =>$x_paye[$my_paye_rate]['descr'][$id],
321  'pid' =>$x_paye[$my_paye_rate]['pid'][$id],
322  'pref' =>$x_paye[$my_paye_rate]['pref'][$id],
323  'ptype' =>$x_paye[$my_paye_rate]['ptype'][$id],
324  'payment_id'=>$x_paye[$my_paye_rate]['payment_id'][$id],
325  'payment_amount'=>$x_paye[$my_paye_rate]['payment_amount'][$id],
326  'ftotal_ttc'=>price2num($x_paye[$my_paye_rate]['ftotal_ttc'][$id]),
327  'dtotal_ttc'=>price2num($x_paye[$my_paye_rate]['dtotal_ttc'][$id]),
328  'dtype' =>$x_paye[$my_paye_rate]['dtype'][$id],
329  'datef' =>$x_paye[$my_paye_rate]['datef'][$id],
330  'datep' =>$x_paye[$my_paye_rate]['datep'][$id],
331  'company_link'=>$company_static->getNomUrl(1, '', 20),
332  'ddate_start'=>$x_paye[$my_paye_rate]['ddate_start'][$id],
333  'ddate_end' =>$x_paye[$my_paye_rate]['ddate_end'][$id],
334  'totalht' =>price2num($x_paye[$my_paye_rate]['totalht_list'][$id]),
335  'localtax1'=> $x_paye[$my_paye_rate]['localtax1_list'][$id],
336  'localtax2'=> $x_paye[$my_paye_rate]['localtax2_list'][$id],
337  'vat' =>$x_paye[$my_paye_rate]['vat_list'][$id],
338  'link' =>$invoice_supplier->getNomUrl(1, '', 12)
339  );
340  }
341  }
342  //now we have an array (x_both) indexed by rates for coll and paye
343 
344  //print table headers for this quadri - incomes first
345 
346  $x_coll_sum = 0;
347  $x_coll_ht = 0;
348  $x_paye_sum = 0;
349  $x_paye_ht = 0;
350 
351  $span = $columns - 1;
352  if ($modetax != 2) {
353  $span += 1;
354  }
355  if ($modetax != 1) {
356  $span += 1;
357  }
358 
359  // Customers invoices
360  print '<tr class="liste_titre">';
361  print '<td class="left">'.$elementcust.'</td>';
362  print '<td class="left">'.$productcust.'</td>';
363  if ($modetax != 2) {
364  print '<td class="right">'.$amountcust.'</td>';
365  }
366  if ($modetax != 1) {
367  print '<td class="right">'.$langs->trans("Payment").' ('.$langs->trans("PercentOfInvoice").')</td>';
368  }
369  print '<td class="right">'.$langs->trans("BI").'</td>';
370  print '<td class="right">'.$vatcust.'</td>';
371  print '</tr>';
372 
373 
374  $LT = 0;
375  $sameLT = false;
376  foreach (array_keys($x_coll) as $rate) {
377  $subtot_coll_total_ht = 0;
378  $subtot_coll_vat = 0;
379 
380  if (is_array($x_both[$rate]['coll']['detail'])) {
381  // VAT Rate
382  if ($rate != 0) {
383  print "<tr>";
384  print '<td class="tax_rate">'.$langs->trans("Rate").': '.vatrate($rate).'%</td><td colspan="'.$span.'"></td>';
385  print '</tr>'."\n";
386  }
387  foreach ($x_both[$rate]['coll']['detail'] as $index => $fields) {
388  if (($local == 1 && $fields['localtax1'] != 0) || ($local == 2 && $fields['localtax2'] != 0)) {
389  // Define type
390  $type = ($fields['dtype'] ? $fields['dtype'] : $fields['ptype']);
391  // Try to enhance type detection using date_start and date_end for free lines where type
392  // was not saved.
393  if (!empty($fields['ddate_start'])) {
394  $type = 1;
395  }
396  if (!empty($fields['ddate_end'])) {
397  $type = 1;
398  }
399 
400 
401  print '<tr class="oddeven">';
402 
403  // Ref
404  print '<td class="nowrap left">'.$fields['link'].'</td>';
405 
406  // Description
407  print '<td class="left">';
408  if ($fields['pid']) {
409  $product_static->id = $fields['pid'];
410  $product_static->ref = $fields['pref'];
411  $product_static->type = $fields['ptype'];
412  print $product_static->getNomUrl(1);
413  if (dol_string_nohtmltag($fields['descr'])) {
414  print ' - '.dol_trunc(dol_string_nohtmltag($fields['descr']), 16);
415  }
416  } else {
417  if ($type) {
418  $text = img_object($langs->trans('Service'), 'service');
419  } else {
420  $text = img_object($langs->trans('Product'), 'product');
421  }
422  if (preg_match('/^\‍((.*)\‍)$/', $fields['descr'], $reg)) {
423  if ($reg[1] == 'DEPOSIT') {
424  $fields['descr'] = $langs->transnoentitiesnoconv('Deposit');
425  } elseif ($reg[1] == 'CREDIT_NOTE') {
426  $fields['descr'] = $langs->transnoentitiesnoconv('CreditNote');
427  } else {
428  $fields['descr'] = $langs->transnoentitiesnoconv($reg[1]);
429  }
430  }
431  print $text.' '.dol_trunc(dol_string_nohtmltag($fields['descr']), 16);
432 
433  // Show range
434  print_date_range($fields['ddate_start'], $fields['ddate_end']);
435  }
436  print '</td>';
437 
438  // Total HT
439  if ($modetax != 2) {
440  print '<td class="nowrap right">';
441  print price($fields['totalht']);
442  if (price2num($fields['ftotal_ttc'])) {
443  $ratiolineinvoice = ($fields['dtotal_ttc'] / $fields['ftotal_ttc']);
444  }
445  print '</td>';
446  }
447 
448  // Payment
449  $ratiopaymentinvoice = 1;
450  if ($modetax != 1) {
451  if (isset($fields['payment_amount']) && $fields['ftotal_ttc']) {
452  $ratiopaymentinvoice = ($fields['payment_amount'] / $fields['ftotal_ttc']);
453  }
454  print '<td class="nowrap right">';
455  if ($fields['payment_amount'] && $fields['ftotal_ttc']) {
456  $payment_static->id = $fields['payment_id'];
457  print $payment_static->getNomUrl(2);
458  }
459  if ($type == 0) {
460  print $langs->trans("NotUsedForGoods");
461  } else {
462  print price($fields['payment_amount']);
463  if (isset($fields['payment_amount'])) {
464  print ' ('.round($ratiopaymentinvoice * 100, 2).'%)';
465  }
466  }
467  print '</td>';
468  }
469 
470  // Total collected
471  print '<td class="nowrap right">';
472  $temp_ht = $fields['totalht'];
473  if ($type == 1) {
474  $temp_ht = $fields['totalht'] * $ratiopaymentinvoice;
475  }
476  print price(price2num($temp_ht, 'MT'));
477  print '</td>';
478 
479  // Localtax
480  print '<td class="nowrap right">';
481  $temp_vat = $local == 1 ? $fields['localtax1'] : $fields['localtax2'];
482  print price(price2num($temp_vat, 'MT'));
483  //print price($fields['vat']);
484  print '</td>';
485  print '</tr>';
486 
487  $subtot_coll_total_ht += $temp_ht;
488  $subtot_coll_vat += $temp_vat;
489  $x_coll_sum += $temp_vat;
490  }
491  }
492  }
493 
494  // Total customers for this vat rate
495  print '<tr class="liste_total">';
496  print '<td></td>';
497  print '<td class="right">'.$langs->trans("Total").':</td>';
498  if ($modetax != 1) {
499  print '<td class="nowrap right">&nbsp;</td>';
500  print '<td class="right">&nbsp;</td>';
501  }
502  print '<td class="right"><span class="amount">'.price(price2num($subtot_coll_total_ht, 'MT')).'</span></td>';
503  print '<td class="nowrap right"><span class="amount">'.price(price2num($subtot_coll_vat, 'MT')).'</span></td>';
504  print '</tr>';
505  }
506 
507  if (count($x_coll) == 0) { // Show a total ine if nothing shown
508  print '<tr class="liste_total">';
509  print '<td>&nbsp;</td>';
510  print '<td class="right">'.$langs->trans("Total").':</td>';
511  if ($modetax == 0) {
512  print '<td class="nowrap right">&nbsp;</td>';
513  print '<td class="right">&nbsp;</td>';
514  }
515  print '<td class="right"><span class="amount">'.price(price2num(0, 'MT')).'</span></td>';
516  print '<td class="nowrap right"><span class="amount">'.price(price2num(0, 'MT')).'</span></td>';
517  print '</tr>';
518  }
519 
520  // Blank line
521  print '<tr><td colspan="'.($span + 1).'">&nbsp;</td></tr>';
522  //print '</table>';
523  $diff = $x_coll_sum;
524 
525  //echo '<table class="noborder centpercent">';
526  //print table headers for this quadri - expenses now
527  print '<tr class="liste_titre">';
528  print '<td class="left">'.$elementsup.'</td>';
529  print '<td class="left">'.$productsup.'</td>';
530  if ($modetax != 1) {
531  print '<td class="right">'.$amountsup.'</td>';
532  print '<td class="right">'.$langs->trans("Payment").' ('.$langs->trans("PercentOfInvoice").')</td>';
533  }
534  print '<td class="right">'.$langs->trans("BI").'</td>';
535  print '<td class="right">'.$vatsup.'</td>';
536  print '</tr>'."\n";
537 
538  foreach (array_keys($x_paye) as $rate) {
539  $subtot_paye_total_ht = 0;
540  $subtot_paye_vat = 0;
541 
542  if (is_array($x_both[$rate]['paye']['detail'])) {
543  if ($rate != 0) {
544  print "<tr>";
545  print '<td class="tax_rate">'.$langs->trans("Rate").': '.vatrate($rate).'%</td><td colspan="'.$span.'"></td>';
546  print '</tr>'."\n";
547  }
548  foreach ($x_both[$rate]['paye']['detail'] as $index => $fields) {
549  if (($local == 1 && $fields['localtax1'] != 0) || ($local == 2 && $fields['localtax2'] != 0)) {
550  // Define type
551  $type = ($fields['dtype'] ? $fields['dtype'] : $fields['ptype']);
552  // Try to enhance type detection using date_start and date_end for free lines where type
553  // was not saved.
554  if (!empty($fields['ddate_start'])) {
555  $type = 1;
556  }
557  if (!empty($fields['ddate_end'])) {
558  $type = 1;
559  }
560 
561 
562  print '<tr class="oddeven">';
563 
564  // Ref
565  print '<td class="nowrap left">'.$fields['link'].'</td>';
566 
567  // Description
568  print '<td class="left">';
569  if ($fields['pid']) {
570  $product_static->id = $fields['pid'];
571  $product_static->ref = $fields['pref'];
572  $product_static->type = $fields['ptype'];
573  print $product_static->getNomUrl(1);
574  if (dol_string_nohtmltag($fields['descr'])) {
575  print ' - '.dol_trunc(dol_string_nohtmltag($fields['descr']), 16);
576  }
577  } else {
578  if ($type) {
579  $text = img_object($langs->trans('Service'), 'service');
580  } else {
581  $text = img_object($langs->trans('Product'), 'product');
582  }
583  print $text.' '.dol_trunc(dol_string_nohtmltag($fields['descr']), 16);
584 
585  // Show range
586  print_date_range($fields['ddate_start'], $fields['ddate_end']);
587  }
588  print '</td>';
589 
590  // Total HT
591  if ($modetax != 2) {
592  print '<td class="nowrap right">';
593  print price($fields['totalht']);
594  if (price2num($fields['ftotal_ttc'])) {
595  //print $fields['dtotal_ttc']."/".$fields['ftotal_ttc']." - ";
596  $ratiolineinvoice = ($fields['dtotal_ttc'] / $fields['ftotal_ttc']);
597  //print ' ('.round($ratiolineinvoice*100,2).'%)';
598  }
599  print '</td>';
600  }
601 
602  // Payment
603  $ratiopaymentinvoice = 1;
604  if ($modetax != 1) {
605  print '<td class="nowrap right">';
606  if (isset($fields['payment_amount']) && $fields['ftotal_ttc']) {
607  $ratiopaymentinvoice = ($fields['payment_amount'] / $fields['ftotal_ttc']);
608  }
609  if ($fields['payment_amount'] && $fields['ftotal_ttc']) {
610  $paymentfourn_static->id = $fields['payment_id'];
611  print $paymentfourn_static->getNomUrl(2);
612  }
613  if ($type == 0) {
614  print $langs->trans("NA");
615  } else {
616  print price(price2num($fields['payment_amount'], 'MT'));
617  if (isset($fields['payment_amount'])) {
618  print ' ('.round($ratiopaymentinvoice * 100, 2).'%)';
619  }
620  }
621  print '</td>';
622  }
623 
624  // VAT paid
625  print '<td class="nowrap right">';
626  $temp_ht = $fields['totalht'] * $ratiopaymentinvoice;
627  print price(price2num($temp_ht, 'MT'), 1);
628  print '</td>';
629 
630  // Localtax
631  print '<td class="nowrap right">';
632  $temp_vat = ($local == 1 ? $fields['localtax1'] : $fields['localtax2']) * $ratiopaymentinvoice;
633  print price(price2num($temp_vat, 'MT'), 1);
634  //print price($fields['vat']);
635  print '</td>';
636  print '</tr>';
637 
638  $subtot_paye_total_ht += $temp_ht;
639  $subtot_paye_vat += $temp_vat;
640  $x_paye_sum += $temp_vat;
641  }
642  }
643  }
644 
645  // Total suppliers for this vat rate
646  print '<tr class="liste_total">';
647  print '<td>&nbsp;</td>';
648  print '<td class="right">'.$langs->trans("Total").':</td>';
649  if ($modetax != 1) {
650  print '<td class="nowrap right">&nbsp;</td>';
651  print '<td class="right">&nbsp;</td>';
652  }
653  print '<td class="right"><span class="amount">'.price(price2num($subtot_paye_total_ht, 'MT')).'</span></td>';
654  print '<td class="nowrap right"><span class="amount">'.price(price2num($subtot_paye_vat, 'MT')).'</span></td>';
655  print '</tr>';
656  }
657 
658  if (count($x_paye) == 0) { // Show a total line if nothing shown
659  print '<tr class="liste_total">';
660  print '<td>&nbsp;</td>';
661  print '<td class="right">'.$langs->trans("Total").':</td>';
662  if ($modetax != 1) {
663  print '<td class="nowrap right">&nbsp;</td>';
664  print '<td class="right">&nbsp;</td>';
665  }
666  print '<td class="right"><span class="amount">'.price(price2num(0, 'MT')).'</span></td>';
667  print '<td class="nowrap right"><span class="amount">'.price(price2num(0, 'MT')).'</span></td>';
668  print '</tr>';
669  }
670 
671  // Total to pay
672  $diff = $x_coll_sum - $x_paye_sum;
673  print '<tr class="liste_total">';
674  print '<td class="liste_total" colspan="'.$span.'">'.$langs->trans("TotalToPay").($q ? ', '.$langs->trans("Quadri").' '.$q : '').'</td>';
675  print '<td class="liste_total nowrap right"><b>'.price(price2num($diff, 'MT'))."</b></td>\n";
676  print "</tr>\n";
677 
678  $i++;
679 }
680 
681 print '</table>';
682 print '</div>';
683 
684 // End of page
685 llxFooter();
686 $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:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
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...)
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition: date.lib.php:577
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition: date.lib.php:122
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition: date.lib.php:596
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formated for view output Used into pdf and HTML pages.
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 '.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
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_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
print_date_range($date_start, $date_end, $format='', $outputlangs='')
Format output for start and end date.
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.
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
tax_by_rate($type, $db, $y, $q, $date_start, $date_end, $modetax, $direction, $m=0)
Gets Tax to collect for the given year (and given quarter or month) The function gets the Tax in spli...
Definition: tax.lib.php:701