dolibarr  19.0.0-dev
remx.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2008 Raphael Bertrand (Resultic) <raphael.bertrand@resultic.fr>
5  * Copyright (C) 2019 Frédéric France <frederic.france@netlogic.fr>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <https://www.gnu.org/licenses/>.
19  */
20 
27 if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
28 
29 // Load Dolibarr environment
30 require '../main.inc.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
32 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
35 
36 // Load translation files required by the page
37 $langs->loadLangs(array('orders', 'bills', 'companies'));
38 
39 $id = GETPOST('id', 'int');
40 
41 $action = GETPOST('action', 'aZ09');
42 $backtopage = GETPOST('backtopage', 'alpha');
43 
44 // Security check
45 $socid = GETPOST('id', 'int') ?GETPOST('id', 'int') : GETPOST('socid', 'int');
46 if ($user->socid > 0) {
47  $socid = $user->socid;
48 }
49 
50 // Security check
51 if ($user->socid > 0) {
52  $id = $user->socid;
53 }
54 $result = restrictedArea($user, 'societe', $id, '&societe', '', 'fk_soc', 'rowid', 0);
55 
56 $permissiontocreate = ($user->rights->societe->creer || $user->rights->facture->creer);
57 
58 
59 
60 /*
61  * Actions
62  */
63 
64 if (GETPOST('cancel', 'alpha') && !empty($backtopage)) {
65  header("Location: ".$backtopage);
66  exit;
67 }
68 
69 if ($action == 'confirm_split' && GETPOST("confirm", "alpha") == 'yes' && $permissiontocreate) {
70  //if ($user->rights->societe->creer)
71  //if ($user->hasRight('facture', 'creer'))
72 
73  $amount_ttc_1 = GETPOST('amount_ttc_1', 'alpha');
74  $amount_ttc_1 = price2num($amount_ttc_1);
75  $amount_ttc_2 = GETPOST('amount_ttc_2', 'alpha');
76  $amount_ttc_2 = price2num($amount_ttc_2);
77 
78  $error = 0;
79  $remid = (GETPOST("remid", 'int') ? GETPOST("remid", 'int') : 0);
80  $discount = new DiscountAbsolute($db);
81  $res = $discount->fetch($remid);
82  if (!($res > 0)) {
83  $error++;
84  setEventMessages($langs->trans("ErrorFailedToLoadDiscount"), null, 'errors');
85  }
86  if (!$error && price2num($amount_ttc_1 + $amount_ttc_2) != $discount->amount_ttc) {
87  $error++;
88  setEventMessages($langs->trans("TotalOfTwoDiscountMustEqualsOriginal"), null, 'errors');
89  }
90  if (!$error && $discount->fk_facture_line) {
91  $error++;
92  setEventMessages($langs->trans("ErrorCantSplitAUsedDiscount"), null, 'errors');
93  }
94  if (!$error) {
95  $newdiscount1 = new DiscountAbsolute($db);
96  $newdiscount2 = new DiscountAbsolute($db);
97  $newdiscount1->fk_facture_source = $discount->fk_facture_source;
98  $newdiscount2->fk_facture_source = $discount->fk_facture_source;
99  $newdiscount1->fk_facture = $discount->fk_facture;
100  $newdiscount2->fk_facture = $discount->fk_facture;
101  $newdiscount1->fk_facture_line = $discount->fk_facture_line;
102  $newdiscount2->fk_facture_line = $discount->fk_facture_line;
103  $newdiscount1->fk_invoice_supplier_source = $discount->fk_invoice_supplier_source;
104  $newdiscount2->fk_invoice_supplier_source = $discount->fk_invoice_supplier_source;
105  $newdiscount1->fk_invoice_supplier = $discount->fk_invoice_supplier;
106  $newdiscount2->fk_invoice_supplier = $discount->fk_invoice_supplier;
107  $newdiscount1->fk_invoice_supplier_line = $discount->fk_invoice_supplier_line;
108  $newdiscount2->fk_invoice_supplier_line = $discount->fk_invoice_supplier_line;
109  if ($discount->description == '(CREDIT_NOTE)' || $discount->description == '(DEPOSIT)') {
110  $newdiscount1->description = $discount->description;
111  $newdiscount2->description = $discount->description;
112  } else {
113  $newdiscount1->description = $discount->description.' (1)';
114  $newdiscount2->description = $discount->description.' (2)';
115  }
116 
117  $newdiscount1->fk_user = $discount->fk_user;
118  $newdiscount2->fk_user = $discount->fk_user;
119  $newdiscount1->fk_soc = $discount->fk_soc;
120  $newdiscount2->fk_soc = $discount->fk_soc;
121  $newdiscount1->discount_type = $discount->discount_type;
122  $newdiscount2->discount_type = $discount->discount_type;
123  $newdiscount1->datec = $discount->datec;
124  $newdiscount2->datec = $discount->datec;
125  $newdiscount1->tva_tx = $discount->tva_tx;
126  $newdiscount2->tva_tx = $discount->tva_tx;
127  $newdiscount1->vat_src_code = $discount->vat_src_code;
128  $newdiscount2->vat_src_code = $discount->vat_src_code;
129  $newdiscount1->amount_ttc = $amount_ttc_1;
130  $newdiscount2->amount_ttc = price2num($discount->amount_ttc - $newdiscount1->amount_ttc);
131  $newdiscount1->amount_ht = price2num($newdiscount1->amount_ttc / (1 + $newdiscount1->tva_tx / 100), 'MT');
132  $newdiscount2->amount_ht = price2num($newdiscount2->amount_ttc / (1 + $newdiscount2->tva_tx / 100), 'MT');
133  $newdiscount1->amount_tva = price2num($newdiscount1->amount_ttc - $newdiscount1->amount_ht);
134  $newdiscount2->amount_tva = price2num($newdiscount2->amount_ttc - $newdiscount2->amount_ht);
135 
136  $newdiscount1->multicurrency_amount_ttc = $amount_ttc_1 * ($discount->multicurrency_amount_ttc / $discount->amount_ttc);
137  $newdiscount2->multicurrency_amount_ttc = price2num($discount->multicurrency_amount_ttc - $newdiscount1->multicurrency_amount_ttc);
138  $newdiscount1->multicurrency_amount_ht = price2num($newdiscount1->multicurrency_amount_ttc / (1 + $newdiscount1->tva_tx / 100), 'MT');
139  $newdiscount2->multicurrency_amount_ht = price2num($newdiscount2->multicurrency_amount_ttc / (1 + $newdiscount2->tva_tx / 100), 'MT');
140  $newdiscount1->multicurrency_amount_tva = price2num($newdiscount1->multicurrency_amount_ttc - $newdiscount1->multicurrency_amount_ht);
141  $newdiscount2->multicurrency_amount_tva = price2num($newdiscount2->multicurrency_amount_ttc - $newdiscount2->multicurrency_amount_ht);
142 
143  $db->begin();
144  $discount->fk_facture_source = 0; // This is to delete only the require record (that we will recreate with two records) and not all family with same fk_facture_source
145  // This is to delete only the require record (that we will recreate with two records) and not all family with same fk_invoice_supplier_source
146  $discount->fk_invoice_supplier_source = 0;
147  $res = $discount->delete($user);
148  $newid1 = $newdiscount1->create($user);
149  $newid2 = $newdiscount2->create($user);
150  if ($res > 0 && $newid1 > 0 && $newid2 > 0) {
151  $db->commit();
152  header("Location: ".$_SERVER["PHP_SELF"].'?id='.$id.($backtopage ? '&backtopage='.urlencode($backtopage) : '')); // To avoid pb whith back
153  exit;
154  } else {
155  $db->rollback();
156  }
157  }
158 }
159 
160 if ($action == 'setremise' && $permissiontocreate) {
161  //if ($user->rights->societe->creer)
162  //if ($user->hasRight('facture', 'creer'))
163 
164  $amount = price2num(GETPOST('amount', 'alpha'), '', 2);
165  $desc = GETPOST('desc', 'alpha');
166  $tva_tx = GETPOST('tva_tx', 'alpha');
167  $discount_type = GETPOSTISSET('discount_type') ? GETPOST('discount_type', 'alpha') : 0;
168  $price_base_type = GETPOST('price_base_type', 'alpha');
169 
170  if ($amount > 0) {
171  $error = 0;
172  if (empty($desc)) {
173  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ReasonDiscount")), null, 'errors');
174  $error++;
175  }
176 
177  if (!$error) {
178  $soc = new Societe($db);
179  $soc->fetch($id);
180  $discountid = $soc->set_remise_except($amount, $user, $desc, $tva_tx, $discount_type, $price_base_type);
181 
182  if ($discountid > 0) {
183  if (!empty($backtopage)) {
184  header("Location: ".$backtopage.'&discountid='.((int) $discountid));
185  exit;
186  } else {
187  header("Location: remx.php?id=".((int) $id));
188  exit;
189  }
190  } else {
191  $error++;
192  setEventMessages($soc->error, $soc->errors, 'errors');
193  }
194  }
195  } else {
196  setEventMessages($langs->trans("ErrorFieldFormat", $langs->transnoentitiesnoconv("AmountHT")), null, 'errors');
197  }
198 }
199 
200 if (GETPOST('action', 'aZ09') == 'confirm_remove' && GETPOST("confirm") == 'yes' && $permissiontocreate) {
201  //if ($user->rights->societe->creer)
202  //if ($user->hasRight('facture', 'creer'))
203 
204  $db->begin();
205 
206  $discount = new DiscountAbsolute($db);
207  $result = $discount->fetch(GETPOST("remid"));
208  $result = $discount->delete($user);
209  if ($result > 0) {
210  $db->commit();
211  header("Location: ".$_SERVER["PHP_SELF"].'?id='.$id); // To avoid pb whith back
212  exit;
213  } else {
214  setEventMessages($discount->error, $discount->errors, 'errors');
215  $db->rollback();
216  }
217 }
218 
219 
220 /*
221  * View
222  */
223 
224 $form = new Form($db);
225 $facturestatic = new Facture($db);
226 $facturefournstatic = new FactureFournisseur($db);
227 
228 llxHeader('', $langs->trans("GlobalDiscount"));
229 
230 if ($socid > 0) {
231  // On recupere les donnees societes par l'objet
232  $object = new Societe($db);
233  $object->fetch($socid);
234 
235  $isCustomer = $object->client == 1 || $object->client == 3;
236  $isSupplier = $object->fournisseur == 1;
237 
238  // Display tabs
239 
240  $head = societe_prepare_head($object);
241 
242  print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'">';
243  print '<input type="hidden" name="token" value="'.newToken().'">';
244  print '<input type="hidden" name="action" value="setremise">';
245  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
246 
247  print dol_get_fiche_head($head, 'absolutediscount', $langs->trans("ThirdParty"), -1, 'company');
248 
249  $linkback = '<a href="'.DOL_URL_ROOT.'/societe/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
250 
251  dol_banner_tab($object, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom');
252 
253  print '<div class="fichecenter">';
254 
255  print '<div class="underbanner clearboth"></div>';
256 
257  if (!$isCustomer && !$isSupplier) {
258  print '<p class="opacitymedium">'.$langs->trans('ThirdpartyIsNeitherCustomerNorClientSoCannotHaveDiscounts').'</p>';
259 
260  print dol_get_fiche_end();
261 
262  print '</form>';
263 
264  llxFooter();
265  $db->close();
266  exit;
267  }
268 
269 
270  print '<div class="div-table-responsive-no-min">';
271  print '<table class="border centpercent tableforfield borderbottom">';
272 
273  if ($isCustomer) { // Calcul avoirs client en cours
274  $remise_all = $remise_user = 0;
275  $sql = "SELECT SUM(rc.amount_ht) as amount, rc.fk_user";
276  $sql .= " FROM ".MAIN_DB_PREFIX."societe_remise_except as rc";
277  $sql .= " WHERE rc.fk_soc = ".((int) $object->id);
278  $sql .= " AND rc.entity = ".((int) $conf->entity);
279  $sql .= " AND discount_type = 0"; // Exclude supplier discounts
280  $sql .= " AND (fk_facture_line IS NULL AND fk_facture IS NULL)";
281  $sql .= " GROUP BY rc.fk_user";
282  $resql = $db->query($sql);
283  if ($resql) {
284  $obj = $db->fetch_object($resql);
285  $remise_all += (!empty($obj->amount) ? $obj->amount : 0);
286  if (!empty($obj->fk_user) && $obj->fk_user == $user->id) {
287  $remise_user += (!empty($obj->amount) ? $obj->amount : 0);
288  }
289  } else {
290  dol_print_error($db);
291  }
292 
293  print '<tr><td>'.$langs->trans("CustomerAbsoluteDiscountAllUsers").'</td>';
294  print '<td class="amount">'.price($remise_all, 1, $langs, 1, -1, -1, $conf->currency).' '.$langs->trans("HT");
295  if (empty($user->fk_soc)) { // No need to show this for external users
296  print $form->textwithpicto('', $langs->trans("CustomerAbsoluteDiscountMy").': '.price($remise_user, 1, $langs, 1, -1, -1, $conf->currency).' '.$langs->trans("HT"));
297  }
298  print '</td></tr>';
299  }
300 
301  if ($isSupplier) {
302  // Calcul avoirs fournisseur en cours
303  $remise_all = $remise_user = 0;
304  $sql = "SELECT SUM(rc.amount_ht) as amount, rc.fk_user";
305  $sql .= " FROM ".MAIN_DB_PREFIX."societe_remise_except as rc";
306  $sql .= " WHERE rc.fk_soc = ".((int) $object->id);
307  $sql .= " AND rc.entity = ".((int) $conf->entity);
308  $sql .= " AND discount_type = 1"; // Exclude customer discounts
309  $sql .= " AND (fk_invoice_supplier_line IS NULL AND fk_invoice_supplier IS NULL)";
310  $sql .= " GROUP BY rc.fk_user";
311  $resql = $db->query($sql);
312  if ($resql) {
313  $obj = $db->fetch_object($resql);
314  $remise_all += (!empty($obj->amount) ? $obj->amount : 0);
315  if (!empty($obj->fk_user) && $obj->fk_user == $user->id) {
316  $remise_user += (!empty($obj->amount) ? $obj->amount : 0);
317  }
318  } else {
319  dol_print_error($db);
320  }
321 
322  print '<tr><td>'.$langs->trans("SupplierAbsoluteDiscountAllUsers").'</td>';
323  print '<td class="amount">'.price($remise_all, 1, $langs, 1, -1, -1, $conf->currency).' '.$langs->trans("HT");
324  if (empty($user->fk_soc)) { // No need to show this for external users
325  print $form->textwithpicto('', $langs->trans("SupplierAbsoluteDiscountMy").' : '.price($remise_user, 1, $langs, 1, -1, -1, $conf->currency).' '.$langs->trans("HT"));
326  }
327  print '</td></tr>';
328  }
329 
330  print '</table>';
331  print '</div>';
332 
333  print '</div>'; // close fichecenter
334 
335  print dol_get_fiche_end();
336 
337 
338  if ($action == 'create_remise') {
339  if ($user->rights->societe->creer) {
340  print '<br>';
341 
342  $discount_type = GETPOSTISSET('discount_type') ? GETPOST('discount_type', 'alpha') : 0;
343  if ($isCustomer && $isSupplier) {
344  $discounttypelabel = $discount_type == 1 ? 'NewSupplierGlobalDiscount' : 'NewClientGlobalDiscount';
345  } else {
346  $discounttypelabel = 'NewGlobalDiscount';
347  }
348 
349  print load_fiche_titre($langs->trans($discounttypelabel), '', '');
350 
351  if ($isSupplier && $discount_type == 1) {
352  print '<input type="hidden" name="discount_type" value="1" />';
353  } else {
354  print '<input type="hidden" name="discount_type" value="0" />';
355  }
356 
357  print dol_get_fiche_head();
358 
359 
360  print '<div class="div-table-responsive-no-min">';
361  print '<table class="border centpercent">';
362  /*if ($isCustomer && $isSupplier) {
363  print '<tr><td class="titlefield fieldrequired">'.$langs->trans('DiscountType').'</td>';
364  print '<td><input type="radio" name="discount_type" id="discount_type_0" '.($discount_type != 1 ? 'checked="checked" ' : '').'value="0"/> <label for="discount_type_0">'.$langs->trans('Customer').'</label>';
365  print ' &nbsp; <input type="radio" name="discount_type" id="discount_type_1" '.($discount_type == 1 ? 'checked="checked" ' : '').'value="1"/> <label for="discount_type_1">'.$langs->trans('Supplier').'</label>';
366  print '</td></tr>';
367  }*/
368 
369  // Amount
370  print '<tr><td class="titlefield fieldrequired">'.$langs->trans("Amount").'</td>';
371  print '<td><input type="text" size="5" name="amount" value="'.price2num(GETPOST("amount")).'" autofocus>';
372  print '<span class="hideonsmartphone">&nbsp;'.$langs->trans("Currency".$conf->currency).'</span></td></tr>';
373 
374  // Price base (HT / TTC)
375  print '<tr><td class="titlefield">'.$langs->trans("PriceBase").'</td>';
376  print '<td>';
377  print $form->selectPriceBaseType(GETPOST("price_base_type"), "price_base_type");
378  print '</td></tr>';
379 
380  // VAT
381  print '<tr><td>'.$langs->trans("VAT").'</td>';
382  print '<td>';
383  print $form->load_tva('tva_tx', GETPOSTISSET('tva_tx') ? GETPOST('tva_tx', 'alpha') : 0, $mysoc, $object, 0, 0, '', 0, 1);
384  print '</td></tr>';
385  print '<tr><td class="fieldrequired" >'.$langs->trans("NoteReason").'</td>';
386  print '<td><input type="text" class="quatrevingtpercent" name="desc" value="'.GETPOST('desc', 'alphanohtml').'"></td></tr>';
387 
388  print "</table>";
389  print '</div>';
390 
391  print dol_get_fiche_end();
392  }
393 
394  if ($user->rights->societe->creer) {
395  print '<div class="center">';
396  print '<input type="submit" class="button" name="submit" value="'.$langs->trans("AddGlobalDiscount").'">';
397  if (!empty($backtopage)) {
398  print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
399  print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
400  }
401  print '</div>';
402  }
403  }
404 
405  print '</form>';
406 
407 
408  print '<br>';
409 
410  if ($action == 'remove') {
411  print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&remid='.GETPOST('remid'), $langs->trans('RemoveDiscount'), $langs->trans('ConfirmRemoveDiscount'), 'confirm_remove', '', 0, 1);
412  }
413 
414 
415  /*
416  * List not consumed available credits (= linked to no invoice and no invoice line)
417  */
418 
419  if ($isCustomer && !$isSupplier) {
420  $newcardbutton = dolGetButtonTitle($langs->trans("NewGlobalDiscount"), '', 'fa fa-plus-circle', $_SERVER['PHP_SELF'].'?action=create_remise&id='.$id.'&discount_type=0&backtopage='.$_SERVER["PHP_SELF"].'?id='.$id.'&token='.newToken());
421  } elseif (!$isCustomer && $isSupplier) {
422  $newcardbutton = dolGetButtonTitle($langs->trans("NewGlobalDiscount"), '', 'fa fa-plus-circle', $_SERVER['PHP_SELF'].'?action=create_remise&id='.$id.'&discount_type=1&backtopage='.$_SERVER["PHP_SELF"].'?id='.$id.'&token='.newToken());
423  } else {
424  $newcardbutton = '';
425  }
426 
427  print load_fiche_titre($langs->trans("DiscountStillRemaining"), $newcardbutton);
428 
429  if ($isCustomer) {
430  $newcardbutton = dolGetButtonTitle($langs->trans("NewClientGlobalDiscount"), '', 'fa fa-plus-circle', $_SERVER['PHP_SELF'].'?action=create_remise&id='.$id.'&discount_type=0&backtopage='.$_SERVER["PHP_SELF"].'?id='.$id.'&token='.newToken());
431  if ($isSupplier) {
432  print '<div class="fichecenter">';
433  print '<div class="fichehalfleft fichehalfleft-lg">';
434  print load_fiche_titre($langs->trans("CustomerDiscounts"), $newcardbutton, '');
435  }
436 
437  $sql = "SELECT rc.rowid, rc.amount_ht, rc.amount_tva, rc.amount_ttc, rc.tva_tx, rc.vat_src_code,";
438  $sql .= " rc.multicurrency_amount_ht, rc.multicurrency_amount_tva, rc.multicurrency_amount_ttc,";
439  $sql .= " rc.datec as dc, rc.description,";
440  $sql .= " rc.fk_facture_source,";
441  $sql .= " u.login, u.rowid as user_id,";
442  $sql .= " fa.ref as ref, fa.type as type";
443  $sql .= " FROM ".MAIN_DB_PREFIX."user as u, ".MAIN_DB_PREFIX."societe_remise_except as rc";
444  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture as fa ON rc.fk_facture_source = fa.rowid";
445  $sql .= " WHERE rc.fk_soc = ".((int) $object->id);
446  $sql .= " AND rc.entity = ".((int) $conf->entity);
447  $sql .= " AND u.rowid = rc.fk_user";
448  $sql .= " AND rc.discount_type = 0"; // Eliminate supplier discounts
449  $sql .= " AND (rc.fk_facture_line IS NULL AND rc.fk_facture IS NULL)";
450  $sql .= " ORDER BY rc.datec DESC";
451 
452  $resql = $db->query($sql);
453  if ($resql) {
454  print '<div class="div-table-responsive-no-min">';
455  print '<table class="noborder centpercent">';
456  print '<tr class="liste_titre">';
457  print '<td class="widthdate">'.$langs->trans("Date").'</td>'; // Need 120+ for format with AM/PM
458  print '<td>'.$langs->trans("ReasonDiscount").'</td>';
459  print '<td class="nowrap">'.$langs->trans("ConsumedBy").'</td>';
460  print '<td class="right">'.$langs->trans("AmountHT").'</td>';
461  if (isModEnabled('multicompany')) {
462  print '<td class="right tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans("MulticurrencyAmountHT")).'">'.$langs->trans("MulticurrencyAmountHT").'</td>';
463  }
464  print '<td class="right">'.$langs->trans("VATRate").'</td>';
465  print '<td class="right">'.$langs->trans("AmountTTC").'</td>';
466  if (isModEnabled('multicompany')) {
467  print '<td class="right tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans("MulticurrencyAmountTTC")).'">'.$langs->trans("MulticurrencyAmountTTC").'</td>';
468  }
469  print '<td width="100" class="center">'.$langs->trans("DiscountOfferedBy").'</td>';
470  print '<td width="50">&nbsp;</td>';
471  print '</tr>';
472 
473  $showconfirminfo = array();
474 
475  $i = 0;
476  $num = $db->num_rows($resql);
477  if ($num > 0) {
478  while ($i < $num) {
479  $obj = $db->fetch_object($resql);
480 
481  print '<tr class="oddeven">';
482 
483  print '<td>'.dol_print_date($db->jdate($obj->dc), 'dayhour', 'tzuserrel').'</td>';
484 
485  if (preg_match('/\(CREDIT_NOTE\)/', $obj->description)) {
486  print '<td class="tdoverflowmax100">';
487  $facturestatic->id = $obj->fk_facture_source;
488  $facturestatic->ref = $obj->ref;
489  $facturestatic->type = $obj->type;
490  print preg_replace('/\(CREDIT_NOTE\)/', $langs->trans("CreditNote"), $obj->description).' '.$facturestatic->getNomURl(1);
491  print '</td>';
492  } elseif (preg_match('/\(DEPOSIT\)/', $obj->description)) {
493  print '<td class="tdoverflowmax100">';
494  $facturestatic->id = $obj->fk_facture_source;
495  $facturestatic->ref = $obj->ref;
496  $facturestatic->type = $obj->type;
497  print preg_replace('/\(DEPOSIT\)/', $langs->trans("InvoiceDeposit"), $obj->description).' '.$facturestatic->getNomURl(1);
498  print '</td>';
499  } elseif (preg_match('/\(EXCESS RECEIVED\)/', $obj->description)) {
500  print '<td class="tdoverflowmax100">';
501  $facturestatic->id = $obj->fk_facture_source;
502  $facturestatic->ref = $obj->ref;
503  $facturestatic->type = $obj->type;
504  print preg_replace('/\(EXCESS RECEIVED\)/', $langs->trans("ExcessReceived"), $obj->description).' '.$facturestatic->getNomURl(1);
505  print '</td>';
506  } else {
507  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->description).'">';
508  print dol_escape_htmltag($obj->description);
509  print '</td>';
510  }
511 
512  print '<td class="nowrap"><span class="opacitymedium">'.$langs->trans("NotConsumed").'</span></td>';
513 
514  print '<td class="right nowraponall amount">'.price($obj->amount_ht).'</td>';
515 
516  if (isModEnabled('multicompany')) {
517  print '<td class="right nowraponall amount">'.price($obj->multicurrency_amount_ht).'</td>';
518  }
519  print '<td class="right nowraponall">'.vatrate($obj->tva_tx.($obj->vat_src_code ? ' ('.$obj->vat_src_code.')' : ''), true).'</td>';
520  print '<td class="right nowraponall amount">'.price($obj->amount_ttc).'</td>';
521  if (isModEnabled('multicompany')) {
522  print '<td class="right nowraponall amount">'.price($obj->multicurrency_amount_ttc).'</td>';
523  }
524  print '<td class="center">';
525  print '<a href="'.DOL_URL_ROOT.'/user/card.php?id='.$obj->user_id.'">'.img_object($langs->trans("ShowUser"), 'user').' '.$obj->login.'</a>';
526  print '</td>';
527  if ($user->rights->societe->creer || $user->rights->facture->creer) {
528  print '<td class="center nowrap">';
529  print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=split&token='.newToken().'&remid='.$obj->rowid.($backtopage ? '&backtopage='.urlencode($backtopage) : '').'">'.img_split($langs->trans("SplitDiscount")).'</a>';
530  print '<a class="reposition marginleftonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=remove&token='.newToken().'&remid='.$obj->rowid.($backtopage ? '&backtopage='.urlencode($backtopage) : '').'">'.img_delete($langs->trans("RemoveDiscount")).'</a>';
531  print '</td>';
532  } else {
533  print '<td>&nbsp;</td>';
534  }
535  print '</tr>';
536 
537  if ($action == 'split' && GETPOST('remid') == $obj->rowid) {
538  $showconfirminfo['rowid'] = $obj->rowid;
539  $showconfirminfo['amount_ttc'] = $obj->amount_ttc;
540  }
541  $i++;
542  }
543  } else {
544  $colspan = 8;
545  if (isModEnabled('multicompany')) {
546  $colspan += 2;
547  }
548  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
549  }
550  $db->free($resql);
551  print "</table>";
552  print '</div>';
553 
554  if (count($showconfirminfo)) {
555  $amount1 = price2num($showconfirminfo['amount_ttc'] / 2, 'MT');
556  $amount2 = ($showconfirminfo['amount_ttc'] - $amount1);
557  $formquestion = array(
558  'text' => $langs->trans('TypeAmountOfEachNewDiscount'),
559  array('type' => 'text', 'name' => 'amount_ttc_1', 'label' => $langs->trans("AmountTTC").' 1', 'value' => $amount1, 'size' => '5'),
560  array('type' => 'text', 'name' => 'amount_ttc_2', 'label' => $langs->trans("AmountTTC").' 2', 'value' => $amount2, 'size' => '5')
561  );
562  $langs->load("dict");
563  print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&remid='.$showconfirminfo['rowid'].($backtopage ? '&backtopage='.urlencode($backtopage) : ''), $langs->trans('SplitDiscount'), $langs->trans('ConfirmSplitDiscount', price($showconfirminfo['amount_ttc']), $langs->transnoentities("Currency".$conf->currency)), 'confirm_split', $formquestion, '', 0);
564  }
565  } else {
566  dol_print_error($db);
567  }
568  }
569 
570  if ($isSupplier) {
571  if ($isCustomer) {
572  $newcardbutton = dolGetButtonTitle($langs->trans("NewSupplierGlobalDiscount"), '', 'fa fa-plus-circle', $_SERVER['PHP_SELF'].'?action=create_remise&id='.$id.'&discount_type=1&backtopage='.$_SERVER["PHP_SELF"].'?id='.$id.'&token='.newToken());
573  print '</div>'; // class="fichehalfleft"
574  print '<div class="fichehalfright fichehalfright-lg">';
575  print load_fiche_titre($langs->trans("SupplierDiscounts"), $newcardbutton, '');
576  }
577 
578  /*
579  * Liste remises fixes fournisseur restant en cours (= liees a aucune facture ni ligne de facture)
580  */
581  $sql = "SELECT rc.rowid, rc.amount_ht, rc.amount_tva, rc.amount_ttc, rc.tva_tx, rc.vat_src_code,";
582  $sql .= " rc.multicurrency_amount_ht, rc.multicurrency_amount_tva, rc.multicurrency_amount_ttc,";
583  $sql .= " rc.datec as dc, rc.description,";
584  $sql .= " rc.fk_invoice_supplier_source,";
585  $sql .= " u.login, u.rowid as user_id,";
586  $sql .= " fa.ref, fa.type as type";
587  $sql .= " FROM ".MAIN_DB_PREFIX."user as u, ".MAIN_DB_PREFIX."societe_remise_except as rc";
588  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture_fourn as fa ON rc.fk_invoice_supplier_source = fa.rowid";
589  $sql .= " WHERE rc.fk_soc = ".((int) $object->id);
590  $sql .= " AND rc.entity = ".((int) $conf->entity);
591  $sql .= " AND u.rowid = rc.fk_user";
592  $sql .= " AND rc.discount_type = 1"; // Eliminate customer discounts
593  $sql .= " AND (rc.fk_invoice_supplier IS NULL AND rc.fk_invoice_supplier_line IS NULL)";
594  $sql .= " ORDER BY rc.datec DESC";
595 
596  $resql = $db->query($sql);
597  if ($resql) {
598  print '<div class="div-table-responsive-no-min">';
599  print '<table class="noborder centpercent">';
600  print '<tr class="liste_titre">';
601  print '<td class="widthdate">'.$langs->trans("Date").'</td>'; // Need 120+ for format with AM/PM
602  print '<td>'.$langs->trans("ReasonDiscount").'</td>';
603  print '<td class="nowrap">'.$langs->trans("ConsumedBy").'</td>';
604  print '<td class="right">'.$langs->trans("AmountHT").'</td>';
605  if (isModEnabled('multicompany')) {
606  print '<td class="right tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans("MulticurrencyAmountHT")).'">'.$langs->trans("MulticurrencyAmountHT").'</td>';
607  }
608  print '<td class="right">'.$langs->trans("VATRate").'</td>';
609  print '<td class="right">'.$langs->trans("AmountTTC").'</td>';
610  if (isModEnabled('multicompany')) {
611  print '<td class="right tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans("MulticurrencyAmountTTC")).'">'.$langs->trans("MulticurrencyAmountTTC").'</td>';
612  }
613  print '<td width="100" class="center">'.$langs->trans("DiscountOfferedBy").'</td>';
614  print '<td width="50">&nbsp;</td>';
615  print '</tr>';
616 
617  $showconfirminfo = array();
618 
619  $i = 0;
620  $num = $db->num_rows($resql);
621  if ($num > 0) {
622  while ($i < $num) {
623  $obj = $db->fetch_object($resql);
624 
625  print '<tr class="oddeven">';
626  print '<td>'.dol_print_date($db->jdate($obj->dc), 'dayhour', 'tzuserrel').'</td>';
627  if (preg_match('/\(CREDIT_NOTE\)/', $obj->description)) {
628  print '<td class="tdoverflowmax100">';
629  $facturefournstatic->id = $obj->fk_invoice_supplier_source;
630  $facturefournstatic->ref = $obj->ref;
631  $facturefournstatic->type = $obj->type;
632  print preg_replace('/\(CREDIT_NOTE\)/', $langs->trans("CreditNote"), $obj->description).' '.$facturefournstatic->getNomURl(1);
633  print '</td>';
634  } elseif (preg_match('/\(DEPOSIT\)/', $obj->description)) {
635  print '<td class="tdoverflowmax100">';
636  $facturefournstatic->id = $obj->fk_invoice_supplier_source;
637  $facturefournstatic->ref = $obj->ref;
638  $facturefournstatic->type = $obj->type;
639  print preg_replace('/\(DEPOSIT\)/', $langs->trans("InvoiceDeposit"), $obj->description).' '.$facturefournstatic->getNomURl(1);
640  print '</td>';
641  } elseif (preg_match('/\(EXCESS PAID\)/', $obj->description)) {
642  print '<td class="tdoverflowmax100">';
643  $facturefournstatic->id = $obj->fk_invoice_supplier_source;
644  $facturefournstatic->ref = $obj->ref;
645  $facturefournstatic->type = $obj->type;
646  print preg_replace('/\(EXCESS PAID\)/', $langs->trans("ExcessPaid"), $obj->description).' '.$facturefournstatic->getNomURl(1);
647  print '</td>';
648  } else {
649  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->description).'">';
650  print dol_escape_htmltag($obj->description);
651  print '</td>';
652  }
653  print '<td class="nowrap"><span class="opacitymedium">'.$langs->trans("NotConsumed").'</span></td>';
654  print '<td class="right nowraponall amount">'.price($obj->amount_ht).'</td>';
655  if (isModEnabled('multicompany')) {
656  print '<td class="right nowraponall amount">'.price($obj->multicurrency_amount_ht).'</td>';
657  }
658  print '<td class="right">'.vatrate($obj->tva_tx.($obj->vat_src_code ? ' ('.$obj->vat_src_code.')' : ''), true).'</td>';
659  print '<td class="right nowraponall amount">'.price($obj->amount_ttc).'</td>';
660  if (isModEnabled('multicompany')) {
661  print '<td class="right nowraponall amount">'.price($obj->multicurrency_amount_ttc).'</td>';
662  }
663  print '<td class="center">';
664  print '<a href="'.DOL_URL_ROOT.'/user/card.php?id='.$obj->user_id.'">'.img_object($langs->trans("ShowUser"), 'user').' '.$obj->login.'</a>';
665  print '</td>';
666  if ($user->rights->societe->creer || $user->rights->facture->creer) {
667  print '<td class="center nowrap">';
668  print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=split&token='.newToken().'&remid='.$obj->rowid.($backtopage ? '&backtopage='.urlencode($backtopage) : '').'">'.img_split($langs->trans("SplitDiscount")).'</a>';
669  print '<a class="reposition marginleftonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=remove&token='.newToken().'&remid='.$obj->rowid.($backtopage ? '&backtopage='.urlencode($backtopage) : '').'">'.img_delete($langs->trans("RemoveDiscount")).'</a>';
670  print '</td>';
671  } else {
672  print '<td>&nbsp;</td>';
673  }
674  print '</tr>';
675 
676  if ($action == 'split' && GETPOST('remid') == $obj->rowid) {
677  $showconfirminfo['rowid'] = $obj->rowid;
678  $showconfirminfo['amount_ttc'] = $obj->amount_ttc;
679  }
680  $i++;
681  }
682  } else {
683  $colspan = 8;
684  if (isModEnabled('multicompany')) {
685  $colspan += 2;
686  }
687  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
688  }
689  $db->free($resql);
690  print "</table>";
691  print '</div>';
692 
693  if (count($showconfirminfo)) {
694  $amount1 = price2num($showconfirminfo['amount_ttc'] / 2, 'MT');
695  $amount2 = ($showconfirminfo['amount_ttc'] - $amount1);
696  $formquestion = array(
697  'text' => $langs->trans('TypeAmountOfEachNewDiscount'),
698  array('type' => 'text', 'name' => 'amount_ttc_1', 'label' => $langs->trans("AmountTTC").' 1', 'value' => $amount1, 'size' => '5'),
699  array('type' => 'text', 'name' => 'amount_ttc_2', 'label' => $langs->trans("AmountTTC").' 2', 'value' => $amount2, 'size' => '5')
700  );
701  $langs->load("dict");
702  print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&remid='.$showconfirminfo['rowid'].($backtopage ? '&backtopage='.urlencode($backtopage) : ''), $langs->trans('SplitDiscount'), $langs->trans('ConfirmSplitDiscount', price($showconfirminfo['amount_ttc']), $langs->transnoentities("Currency".$conf->currency)), 'confirm_split', $formquestion, 0, 0);
703  }
704  } else {
705  dol_print_error($db);
706  }
707 
708  if ($isCustomer) {
709  print '</div>'; // class="fichehalfright"
710  print '</div>'; // class="fichecenter"
711  }
712  }
713 
714  print '<div class="clearboth"></div><br><br>';
715 
716  /*
717  * List discount consumed (=liees a une ligne de facture ou facture)
718  */
719 
720  print load_fiche_titre($langs->trans("DiscountAlreadyCounted"));
721 
722  if ($isCustomer) {
723  if ($isSupplier) {
724  print '<div class="fichecenter">';
725  print '<div class="fichehalfleft fichehalfleft-lg">';
726  print load_fiche_titre($langs->trans("CustomerDiscounts"), '', '');
727  }
728 
729  // Discount linked to invoice lines
730  $sql = "SELECT rc.rowid, rc.amount_ht, rc.amount_tva, rc.amount_ttc, rc.tva_tx, rc.vat_src_code,";
731  $sql .= " rc.multicurrency_amount_ht, rc.multicurrency_amount_tva, rc.multicurrency_amount_ttc,";
732  $sql .= " rc.datec as dc, rc.description, rc.fk_facture_line, rc.fk_facture_source,";
733  $sql .= " u.login, u.rowid as user_id,";
734  $sql .= " f.rowid as invoiceid, f.ref,";
735  $sql .= " fa.ref as invoice_source_ref, fa.type as type";
736  $sql .= " FROM ".MAIN_DB_PREFIX."facture as f";
737  $sql .= " , ".MAIN_DB_PREFIX."user as u";
738  $sql .= " , ".MAIN_DB_PREFIX."facturedet as fc";
739  $sql .= " , ".MAIN_DB_PREFIX."societe_remise_except as rc";
740  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture as fa ON rc.fk_facture_source = fa.rowid";
741  $sql .= " WHERE rc.fk_soc = ".((int) $object->id);
742  $sql .= " AND rc.fk_facture_line = fc.rowid";
743  $sql .= " AND fc.fk_facture = f.rowid";
744  $sql .= " AND rc.fk_user = u.rowid";
745  $sql .= " AND rc.discount_type = 0"; // Eliminate supplier discounts
746  $sql .= " ORDER BY dc DESC";
747  //$sql.= " UNION ";
748  // Discount linked to invoices
749  $sql2 = "SELECT rc.rowid, rc.amount_ht, rc.amount_tva, rc.amount_ttc, rc.tva_tx, rc.vat_src_code,";
750  $sql2 .= " rc.multicurrency_amount_ht, rc.multicurrency_amount_tva, rc.multicurrency_amount_ttc,";
751  $sql2 .= " rc.datec as dc, rc.description, rc.fk_facture, rc.fk_facture_source,";
752  $sql2 .= " u.login, u.rowid as user_id,";
753  $sql2 .= " f.rowid as invoiceid, f.ref,";
754  $sql2 .= " fa.ref as invoice_source_ref, fa.type as type";
755  $sql2 .= " FROM ".MAIN_DB_PREFIX."facture as f";
756  $sql2 .= " , ".MAIN_DB_PREFIX."user as u";
757  $sql2 .= " , ".MAIN_DB_PREFIX."societe_remise_except as rc";
758  $sql2 .= " LEFT JOIN ".MAIN_DB_PREFIX."facture as fa ON rc.fk_facture_source = fa.rowid";
759  $sql2 .= " WHERE rc.fk_soc = ".((int) $object->id);
760  $sql2 .= " AND rc.fk_facture = f.rowid";
761  $sql2 .= " AND rc.fk_user = u.rowid";
762  $sql2 .= " AND rc.discount_type = 0"; // Eliminate supplier discounts
763  $sql2 .= " ORDER BY dc DESC";
764 
765  $resql = $db->query($sql);
766  $resql2 = null;
767  if ($resql) {
768  $resql2 = $db->query($sql2);
769  }
770  if ($resql2) {
771  print '<div class="div-table-responsive-no-min">';
772  print '<table class="noborder centpercent">';
773  print '<tr class="liste_titre">';
774  print '<td class="widthdate">'.$langs->trans("Date").'</td>'; // Need 120+ for format with AM/PM
775  print '<td>'.$langs->trans("ReasonDiscount").'</td>';
776  print '<td class="nowrap">'.$langs->trans("ConsumedBy").'</td>';
777  print '<td class="right">'.$langs->trans("AmountHT").'</td>';
778  if (isModEnabled('multicompany')) {
779  print '<td class="right tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans("MulticurrencyAmountHT")).'">'.$langs->trans("MulticurrencyAmountHT").'</td>';
780  }
781  print '<td class="right">'.$langs->trans("VATRate").'</td>';
782  print '<td class="right">'.$langs->trans("AmountTTC").'</td>';
783  if (isModEnabled('multicompany')) {
784  print '<td class="right tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans("MulticurrencyAmountTTC")).'">'.$langs->trans("MulticurrencyAmountTTC").'</td>';
785  }
786  print '<td width="100" class="center">'.$langs->trans("Author").'</td>';
787  print '<td width="50">&nbsp;</td>';
788  print '</tr>';
789 
790  $tab_sqlobj = array();
791  $tab_sqlobjOrder = array();
792  $num = $db->num_rows($resql);
793  if ($num > 0) {
794  for ($i = 0; $i < $num; $i++) {
795  $sqlobj = $db->fetch_object($resql);
796  $tab_sqlobj[] = $sqlobj;
797  $tab_sqlobjOrder[] = $db->jdate($sqlobj->dc);
798  }
799  }
800  $db->free($resql);
801 
802  $num = $db->num_rows($resql2);
803  for ($i = 0; $i < $num; $i++) {
804  $sqlobj = $db->fetch_object($resql2);
805  $tab_sqlobj[] = $sqlobj;
806  $tab_sqlobjOrder[] = $db->jdate($sqlobj->dc);
807  }
808  $db->free($resql2);
809  $array1_sort_order = SORT_DESC;
810  array_multisort($tab_sqlobjOrder, $array1_sort_order, $tab_sqlobj);
811 
812  $num = count($tab_sqlobj);
813  if ($num > 0) {
814  $i = 0;
815  while ($i < $num) {
816  $obj = array_shift($tab_sqlobj);
817  print '<tr class="oddeven">';
818  print '<td>'.dol_print_date($db->jdate($obj->dc), 'dayhour').'</td>';
819  if (preg_match('/\(CREDIT_NOTE\)/', $obj->description)) {
820  print '<td class="tdoverflowmax100">';
821  $facturestatic->id = $obj->fk_facture_source;
822  $facturestatic->ref = $obj->invoice_source_ref;
823  $facturestatic->type = $obj->type;
824  print preg_replace('/\(CREDIT_NOTE\)/', $langs->trans("CreditNote"), $obj->description).' '.$facturestatic->getNomURl(1);
825  print '</td>';
826  } elseif (preg_match('/\(DEPOSIT\)/', $obj->description)) {
827  print '<td class="tdoverflowmax100">';
828  $facturestatic->id = $obj->fk_facture_source;
829  $facturestatic->ref = $obj->invoice_source_ref;
830  $facturestatic->type = $obj->type;
831  print preg_replace('/\(DEPOSIT\)/', $langs->trans("InvoiceDeposit"), $obj->description).' '.$facturestatic->getNomURl(1);
832  print '</td>';
833  } elseif (preg_match('/\(EXCESS RECEIVED\)/', $obj->description)) {
834  print '<td class="tdoverflowmax100">';
835  $facturestatic->id = $obj->fk_facture_source;
836  $facturestatic->ref = $obj->invoice_source_ref;
837  $facturestatic->type = $obj->type;
838  print preg_replace('/\(EXCESS RECEIVED\)/', $langs->trans("Invoice"), $obj->description).' '.$facturestatic->getNomURl(1);
839  print '</td>';
840  } else {
841  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->description).'">';
842  print dol_escape_htmltag($obj->description);
843  print '</td>';
844  }
845  print '<td class="left nowrap">';
846  if ($obj->invoiceid) {
847  print '<a href="'.DOL_URL_ROOT.'/compta/facture/card.php?facid='.$obj->invoiceid.'">'.img_object($langs->trans("ShowBill"), 'bill').' '.$obj->ref.'</a>';
848  }
849  print '</td>';
850  print '<td class="right nowraponall amount">'.price($obj->amount_ht).'</td>';
851  if (isModEnabled('multicompany')) {
852  print '<td class="right nowraponall amount">'.price($obj->multicurrency_amount_ht).'</td>';
853  }
854  print '<td class="right nowraponall">'.vatrate($obj->tva_tx.($obj->vat_src_code ? ' ('.$obj->vat_src_code.')' : ''), true).'</td>';
855  print '<td class="right nowraponall amount">'.price($obj->amount_ttc).'</td>';
856  if (isModEnabled('multicompany')) {
857  print '<td class="right">'.price($obj->multicurrency_amount_ttc).'</td>';
858  }
859  print '<td class="center">';
860  print '<a href="'.DOL_URL_ROOT.'/user/card.php?id='.$obj->user_id.'">'.img_object($langs->trans("ShowUser"), 'user').' '.$obj->login.'</a>';
861  print '</td>';
862  print '<td>&nbsp;</td>';
863  print '</tr>';
864  $i++;
865  }
866  } else {
867  $colspan = 8;
868  if (isModEnabled('multicompany')) {
869  $colspan += 2;
870  }
871  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
872  }
873 
874  print "</table>";
875  print '</div>';
876  } else {
877  dol_print_error($db);
878  }
879  }
880 
881  if ($isSupplier) {
882  if ($isCustomer) {
883  print '</div>'; // class="fichehalfleft"
884  print '<div class="fichehalfright fichehalfright-lg">';
885  print load_fiche_titre($langs->trans("SupplierDiscounts"), '', '');
886  }
887 
888  // Discount linked to invoice lines
889  $sql = "SELECT rc.rowid, rc.amount_ht, rc.amount_tva, rc.amount_ttc, rc.tva_tx, rc.vat_src_code,";
890  $sql .= " rc.multicurrency_amount_ht, rc.multicurrency_amount_tva, rc.multicurrency_amount_ttc,";
891  $sql .= " rc.datec as dc, rc.description, rc.fk_invoice_supplier_line,";
892  $sql .= " rc.fk_invoice_supplier_source,";
893  $sql .= " u.login, u.rowid as user_id,";
894  $sql .= " f.rowid as invoiceid, f.ref as ref,";
895  $sql .= " fa.ref as invoice_source_ref, fa.type as type";
896  $sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
897  $sql .= " , ".MAIN_DB_PREFIX."user as u";
898  $sql .= " , ".MAIN_DB_PREFIX."facture_fourn_det as fc";
899  $sql .= " , ".MAIN_DB_PREFIX."societe_remise_except as rc";
900  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture_fourn as fa ON rc.fk_invoice_supplier_source = fa.rowid";
901  $sql .= " WHERE rc.fk_soc = ".((int) $object->id);
902  $sql .= " AND rc.fk_invoice_supplier_line = fc.rowid";
903  $sql .= " AND fc.fk_facture_fourn = f.rowid";
904  $sql .= " AND rc.fk_user = u.rowid";
905  $sql .= " AND rc.discount_type = 1"; // Eliminate customer discounts
906  $sql .= " ORDER BY dc DESC";
907  //$sql.= " UNION ";
908  // Discount linked to invoices
909  $sql2 = "SELECT rc.rowid, rc.amount_ht, rc.amount_tva, rc.amount_ttc, rc.tva_tx, rc.vat_src_code,";
910  $sql2 .= " rc.multicurrency_amount_ht, rc.multicurrency_amount_tva, rc.multicurrency_amount_ttc,";
911  $sql2 .= " rc.datec as dc, rc.description, rc.fk_invoice_supplier,";
912  $sql2 .= " rc.fk_invoice_supplier_source,";
913  $sql2 .= " u.login, u.rowid as user_id,";
914  $sql2 .= " f.rowid as invoiceid, f.ref as ref,";
915  $sql2 .= " fa.ref as invoice_source_ref, fa.type as type";
916  $sql2 .= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
917  $sql2 .= " , ".MAIN_DB_PREFIX."user as u";
918  $sql2 .= " , ".MAIN_DB_PREFIX."societe_remise_except as rc";
919  $sql2 .= " LEFT JOIN ".MAIN_DB_PREFIX."facture_fourn as fa ON rc.fk_invoice_supplier_source = fa.rowid";
920  $sql2 .= " WHERE rc.fk_soc = ".((int) $object->id);
921  $sql2 .= " AND rc.fk_invoice_supplier = f.rowid";
922  $sql2 .= " AND rc.fk_user = u.rowid";
923  $sql2 .= " AND rc.discount_type = 1"; // Eliminate customer discounts
924  $sql2 .= " ORDER BY dc DESC";
925 
926  $resql = $db->query($sql);
927  $resql2 = null;
928  if ($resql) {
929  $resql2 = $db->query($sql2);
930  }
931  if ($resql2) {
932  print '<div class="div-table-responsive-no-min">';
933  print '<table class="noborder centpercent">';
934  print '<tr class="liste_titre">';
935  print '<td class="widthdate">'.$langs->trans("Date").'</td>'; // Need 120+ for format with AM/PM
936  print '<td>'.$langs->trans("ReasonDiscount").'</td>';
937  print '<td class="nowrap">'.$langs->trans("ConsumedBy").'</td>';
938  print '<td class="right">'.$langs->trans("AmountHT").'</td>';
939  if (isModEnabled('multicompany')) {
940  print '<td class="right toverflowmax125" title="'.dol_escape_htmltag($langs->trans("MulticurrencyAmountHT")).'">'.$langs->trans("MulticurrencyAmountHT").'</td>';
941  }
942  print '<td class="right">'.$langs->trans("VATRate").'</td>';
943  print '<td class="right">'.$langs->trans("AmountTTC").'</td>';
944  if (isModEnabled('multicompany')) {
945  print '<td class="right tdoverflowmax125" title="'.dol_escape_htmltag($langs->trans("MulticurrencyAmountTTC")).'">'.$langs->trans("MulticurrencyAmountTTC").'</td>';
946  }
947  print '<td width="100" class="center">'.$langs->trans("Author").'</td>';
948  print '<td width="50">&nbsp;</td>';
949  print '</tr>';
950 
951  $tab_sqlobj = array();
952  $tab_sqlobjOrder = array();
953  $num = $db->num_rows($resql);
954  if ($num > 0) {
955  for ($i = 0; $i < $num; $i++) {
956  $sqlobj = $db->fetch_object($resql);
957  $tab_sqlobj[] = $sqlobj;
958  $tab_sqlobjOrder[] = $db->jdate($sqlobj->dc);
959  }
960  }
961  $db->free($resql);
962 
963  $num = $db->num_rows($resql2);
964  for ($i = 0; $i < $num; $i++) {
965  $sqlobj = $db->fetch_object($resql2);
966  $tab_sqlobj[] = $sqlobj;
967  $tab_sqlobjOrder[] = $db->jdate($sqlobj->dc);
968  }
969  $db->free($resql2);
970  $array1_sort_order = SORT_DESC;
971  array_multisort($tab_sqlobjOrder, $array1_sort_order, $tab_sqlobj);
972 
973  $num = count($tab_sqlobj);
974  if ($num > 0) {
975  $i = 0;
976  while ($i < $num) {
977  $obj = array_shift($tab_sqlobj);
978  print '<tr class="oddeven">';
979  print '<td>'.dol_print_date($db->jdate($obj->dc), 'dayhour').'</td>';
980  if (preg_match('/\(CREDIT_NOTE\)/', $obj->description)) {
981  print '<td class="tdoverflowmax100">';
982  $facturefournstatic->id = $obj->fk_invoice_supplier_source;
983  $facturefournstatic->ref = $obj->invoice_source_ref;
984  $facturefournstatic->type = $obj->type;
985  print preg_replace('/\(CREDIT_NOTE\)/', $langs->trans("CreditNote"), $obj->description).' '.$facturefournstatic->getNomURl(1);
986  print '</td>';
987  } elseif (preg_match('/\(DEPOSIT\)/', $obj->description)) {
988  print '<td class="tdoverflowmax100">';
989  $facturefournstatic->id = $obj->fk_invoice_supplier_source;
990  $facturefournstatic->ref = $obj->invoice_source_ref;
991  $facturefournstatic->type = $obj->type;
992  print preg_replace('/\(DEPOSIT\)/', $langs->trans("InvoiceDeposit"), $obj->description).' '.$facturefournstatic->getNomURl(1);
993  print '</td>';
994  } elseif (preg_match('/\(EXCESS PAID\)/', $obj->description)) {
995  print '<td class="tdoverflowmax100">';
996  $facturefournstatic->id = $obj->fk_invoice_supplier_source;
997  $facturefournstatic->ref = $obj->invoice_source_ref;
998  $facturefournstatic->type = $obj->type;
999  print preg_replace('/\(EXCESS PAID\)/', $langs->trans("Invoice"), $obj->description).' '.$facturefournstatic->getNomURl(1);
1000  print '</td>';
1001  } else {
1002  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->description).'">';
1003  print dol_escape_htmltag($obj->description);
1004  print '</td>';
1005  }
1006  print '<td class="left nowrap">';
1007  if ($obj->invoiceid) {
1008  print '<a href="'.DOL_URL_ROOT.'/fourn/facture/card.php?facid='.$obj->invoiceid.'">'.img_object($langs->trans("ShowBill"), 'bill').' '.$obj->ref.'</a>';
1009  }
1010  print '</td>';
1011  print '<td class="right nowraponall amount">'.price($obj->amount_ht).'</td>';
1012  if (isModEnabled('multicompany')) {
1013  print '<td class="right nowraponall amount">'.price($obj->multicurrency_amount_ht).'</td>';
1014  }
1015  print '<td class="right">'.vatrate($obj->tva_tx.($obj->vat_src_code ? ' ('.$obj->vat_src_code.')' : ''), true).'</td>';
1016  print '<td class="right nowraponall amount">'.price($obj->amount_ttc).'</td>';
1017  if (isModEnabled('multicompany')) {
1018  print '<td class="right nowraponall amount">'.price($obj->multicurrency_amount_ttc).'</td>';
1019  }
1020  print '<td class="center">';
1021  print '<a href="'.DOL_URL_ROOT.'/user/card.php?id='.$obj->user_id.'">'.img_object($langs->trans("ShowUser"), 'user').' '.$obj->login.'</a>';
1022  print '</td>';
1023  print '<td>&nbsp;</td>';
1024  print '</tr>';
1025  $i++;
1026  }
1027  } else {
1028  $colspan = 8;
1029  if (isModEnabled('multicompany')) {
1030  $colspan += 2;
1031  }
1032  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
1033  }
1034 
1035  print "</table>";
1036  print '</div>';
1037  } else {
1038  dol_print_error($db);
1039  }
1040 
1041  if ($isCustomer) {
1042  print '</div>'; // class="fichehalfright"
1043  print '</div>'; // class="fichecenter"
1044  }
1045  }
1046 }
1047 
1048 // End of page
1049 llxFooter();
1050 $db->close();
Societe
Class to manage third parties objects (customers, suppliers, prospects...)
Definition: societe.class.php:51
llxFooter
llxFooter()
Empty footer.
Definition: wrapper.php:70
dol_escape_htmltag
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
Definition: functions.lib.php:1600
load_fiche_titre
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
Definition: functions.lib.php:5477
GETPOST
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
Definition: functions.lib.php:609
FactureFournisseur
Class to manage suppliers invoices.
Definition: fournisseur.facture.class.php:51
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:5107
img_split
img_split($titlealt='default', $other='class="pictosplit"')
Show split logo.
Definition: functions.lib.php:4726
$form
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
Facture
Class to manage invoices.
Definition: facture.class.php:60
dol_banner_tab
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
Definition: functions.lib.php:2205
price2num
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
Definition: functions.lib.php:5955
llxHeader
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
img_delete
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
Definition: functions.lib.php:4692
dolGetButtonTitle
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
Definition: functions.lib.php:11263
DiscountAbsolute
Class to manage absolute discounts.
Definition: discount.class.php:29
setEventMessages
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
Definition: functions.lib.php:8673
societe_prepare_head
societe_prepare_head(Societe $object)
Return array of tabs to used on pages for third parties cards.
Definition: company.lib.php:42
$sql
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
restrictedArea
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.
Definition: security.lib.php:353
newToken
newToken()
Return the value of token currently saved into session with name 'newtoken'.
Definition: functions.lib.php:11654
dol_get_fiche_end
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition: functions.lib.php:2177
isModEnabled
isModEnabled($module)
Is Dolibarr module enabled.
Definition: functions.lib.php:207
dol_get_fiche_head
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
Definition: functions.lib.php:1979
GETPOSTISSET
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
Definition: functions.lib.php:509
Form
Class to manage generation of HTML components Only common components must be here.
Definition: html.form.class.php:53
img_object
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
Definition: functions.lib.php:4473
price
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.
Definition: functions.lib.php:5829