1<?php 2/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org> 3 * Copyright (C) 2005-2017 Laurent Destailleur <eldy@users.sourceforge.net> 4 * Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com> 5 * Copyright (C) 2010-2012 Juanjo Menent <jmenent@2byte.es> 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 21/** 22 * \file htdocs/compta/prelevement/factures.php 23 * \ingroup prelevement 24 * \brief Page liste des factures prelevees 25 */ 26 27require '../../main.inc.php'; 28require_once DOL_DOCUMENT_ROOT.'/core/lib/prelevement.lib.php'; 29require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/bonprelevement.class.php'; 30require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/rejetprelevement.class.php'; 31require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; 32require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; 33 34// Load translation files required by the page 35$langs->loadLangs(array('banks', 'categories', 'bills', 'companies', 'withdrawals')); 36 37// Securite acces client 38if ($user->socid > 0) { 39 accessforbidden(); 40} 41 42// Get supervariables 43$id = GETPOST('id', 'int'); 44$ref = GETPOST('ref', 'alpha'); 45$socid = GETPOST('socid', 'int'); 46$type = GETPOST('type', 'aZ09'); 47 48// Load variable for pagination 49$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit; 50$sortfield = GETPOST('sortfield', 'aZ09comma'); 51$sortorder = GETPOST('sortorder', 'aZ09comma'); 52$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); 53if (empty($page) || $page == -1) { 54 $page = 0; 55} // If $page is not defined, or '' or -1 56$offset = $limit * $page; 57$pageprev = $page - 1; 58$pagenext = $page + 1; 59if (!$sortfield) { 60 $sortfield = 'p.ref'; 61} 62if (!$sortorder) { 63 $sortorder = 'DESC'; 64} 65 66$object = new BonPrelevement($db); 67 68// Load object 69include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals 70 71$hookmanager->initHooks(array('directdebitprevcard', 'globalcard', 'directdebitprevlist')); 72 73if (!$user->rights->prelevement->bons->lire && $object->type != 'bank-transfer') { 74 accessforbidden(); 75} 76if (!$user->rights->paymentbybanktransfer->read && $object->type == 'bank-transfer') { 77 accessforbidden(); 78} 79 80 81/* 82 * View 83 */ 84 85$invoicetmp = new Facture($db); 86$thirdpartytmp = new Societe($db); 87 88llxHeader('', $langs->trans("WithdrawalsReceipts")); 89 90if ($id > 0 || $ref) { 91 if ($object->fetch($id, $ref) >= 0) { 92 $head = prelevement_prepare_head($object); 93 print dol_get_fiche_head($head, 'invoices', $langs->trans("WithdrawalsReceipts"), -1, 'payment'); 94 95 $linkback = '<a href="'.DOL_URL_ROOT.'/compta/prelevement/orders_list.php?restore_lastsearch_values=1'.($object->type != 'bank-transfer' ? '' : '&type=bank-transfer').'">'.$langs->trans("BackToList").'</a>'; 96 97 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref'); 98 99 print '<div class="fichecenter">'; 100 print '<div class="underbanner clearboth"></div>'; 101 print '<table class="border centpercent tableforfield">'."\n"; 102 103 //print '<tr><td class="titlefield">'.$langs->trans("Ref").'</td><td>'.$object->getNomUrl(1).'</td></tr>'; 104 print '<tr><td class="titlefield">'.$langs->trans("Date").'</td><td>'.dol_print_date($object->datec, 'day').'</td></tr>'; 105 print '<tr><td>'.$langs->trans("Amount").'</td><td>'.price($object->amount).'</td></tr>'; 106 107 if ($object->date_trans <> 0) { 108 $muser = new User($db); 109 $muser->fetch($object->user_trans); 110 111 print '<tr><td>'.$langs->trans("TransData").'</td><td>'; 112 print dol_print_date($object->date_trans, 'day'); 113 print ' <span class="opacitymedium">'.$langs->trans("By").'</span> '.$muser->getFullName($langs).'</td></tr>'; 114 print '<tr><td>'.$langs->trans("TransMetod").'</td><td>'; 115 print $object->methodes_trans[$object->method_trans]; 116 print '</td></tr>'; 117 } 118 if ($object->date_credit <> 0) { 119 print '<tr><td>'.$langs->trans('CreditDate').'</td><td>'; 120 print dol_print_date($object->date_credit, 'day'); 121 print '</td></tr>'; 122 } 123 124 print '</table>'; 125 126 print '<br>'; 127 128 print '<div class="underbanner clearboth"></div>'; 129 print '<table class="border centpercent tableforfield">'; 130 131 $acc = new Account($db); 132 $result = $acc->fetch($conf->global->PRELEVEMENT_ID_BANKACCOUNT); 133 134 print '<tr><td class="titlefield">'; 135 $labelofbankfield = "BankToReceiveWithdraw"; 136 if ($object->type == 'bank-transfer') { 137 $labelofbankfield = 'BankToPayCreditTransfer'; 138 } 139 print $langs->trans($labelofbankfield); 140 print '</td>'; 141 print '<td>'; 142 if ($acc->id > 0) { 143 print $acc->getNomUrl(1); 144 } 145 print '</td>'; 146 print '</tr>'; 147 148 print '<tr><td class="titlefield">'; 149 $labelfororderfield = 'WithdrawalFile'; 150 if ($object->type == 'bank-transfer') { 151 $labelfororderfield = 'CreditTransferFile'; 152 } 153 print $langs->trans($labelfororderfield).'</td><td>'; 154 $relativepath = 'receipts/'.$object->ref.'.xml'; 155 $modulepart = 'prelevement'; 156 if ($object->type == 'bank-transfer') { 157 $modulepart = 'paymentbybanktransfer'; 158 } 159 print '<a data-ajax="false" href="'.DOL_URL_ROOT.'/document.php?type=text/plain&modulepart='.$modulepart.'&file='.urlencode($relativepath).'">'.$relativepath.'</a>'; 160 print '</td></tr></table>'; 161 162 print '</div>'; 163 164 print dol_get_fiche_end(); 165 } else { 166 dol_print_error($db); 167 } 168} 169 170 171// List of invoices 172$sql = "SELECT pf.rowid, p.type,"; 173$sql .= " f.rowid as facid, f.ref as ref, f.total_ttc,"; 174$sql .= " s.rowid as socid, s.nom as name, pl.statut, pl.amount as amount_requested"; 175$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p"; 176$sql .= ", ".MAIN_DB_PREFIX."prelevement_lignes as pl"; 177$sql .= ", ".MAIN_DB_PREFIX."prelevement_facture as pf"; 178if ($object->type != 'bank-transfer') { 179 $sql .= ", ".MAIN_DB_PREFIX."facture as f"; 180} else { 181 $sql .= ", ".MAIN_DB_PREFIX."facture_fourn as f"; 182} 183$sql .= ", ".MAIN_DB_PREFIX."societe as s"; 184$sql .= " WHERE pf.fk_prelevement_lignes = pl.rowid"; 185$sql .= " AND pl.fk_prelevement_bons = p.rowid"; 186$sql .= " AND f.fk_soc = s.rowid"; 187if ($object->type != 'bank-transfer') { 188 $sql .= " AND pf.fk_facture = f.rowid"; 189} else { 190 $sql .= " AND pf.fk_facture_fourn = f.rowid"; 191} 192if ($object->type != 'bank-transfer') { 193 $sql .= " AND f.entity IN (".getEntity('invoice').")"; 194} else { 195 $sql .= " AND f.entity IN (".getEntity('supplier_invoice').")"; 196} 197if ($object->id > 0) { 198 $sql .= " AND p.rowid = ".((int) $object->id); 199} 200if ($socid) { 201 $sql .= " AND s.rowid = ".((int) $socid); 202} 203$sql .= $db->order($sortfield, $sortorder); 204 205// Count total nb of records 206$nbtotalofrecords = ''; 207if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { 208 $resql = $db->query($sql); 209 $nbtotalofrecords = $db->num_rows($resql); 210 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0 211 $page = 0; 212 $offset = 0; 213 } 214} 215 216$sql .= $db->plimit($limit + 1, $offset); 217 218$resql = $db->query($sql); 219if ($resql) { 220 $num = $db->num_rows($resql); 221 $i = 0; 222 223 $param = "&id=".urlencode($id); 224 225 // Lines of title fields 226 print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'; 227 if ($optioncss != '') { 228 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">'; 229 } 230 print '<input type="hidden" name="token" value="'.newToken().'">'; 231 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">'; 232 print '<input type="hidden" name="action" value="list">'; 233 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">'; 234 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">'; 235 print '<input type="hidden" name="page" value="'.$page.'">'; 236 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">'; 237 print '<input type="hidden" name="id" value="'.$id.'">'; 238 239 $massactionbutton = ''; 240 241 print_barre_liste($langs->trans("Invoices"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, '', 0, '', '', $limit); 242 243 print"\n<!-- debut table -->\n"; 244 print '<div class="div-table-responsive-no-min">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table 245 print '<table class="liste centpercent">'; 246 print '<tr class="liste_titre">'; 247 print_liste_field_titre("Bill", $_SERVER["PHP_SELF"], "p.ref", '', $param, '', $sortfield, $sortorder); 248 print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", '', $param, '', $sortfield, $sortorder); 249 print_liste_field_titre("AmountInvoice", $_SERVER["PHP_SELF"], "f.total_ttc", "", $param, 'class="right"', $sortfield, $sortorder); 250 print_liste_field_titre("AmountRequested", $_SERVER["PHP_SELF"], "pl.amount", "", $param, 'class="right"', $sortfield, $sortorder); 251 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "", "", $param, 'align="center"', $sortfield, $sortorder); 252 print_liste_field_titre(''); 253 print "</tr>\n"; 254 255 $totalinvoices = 0; 256 $totalamount_requested = 0; 257 258 $invoicetmpcustomer = new Facture($db); 259 $invoicetmpsupplier = new FactureFournisseur($db); 260 261 while ($i < min($num, $limit)) { 262 $obj = $db->fetch_object($resql); 263 264 if ($obj->type == 'bank-transfer') { 265 $invoicetmp = $invoicetmpsupplier; 266 } else { 267 $invoicetmp = $invoicetmpcustomer; 268 } 269 $invoicetmp->fetch($obj->facid); 270 271 $thirdpartytmp->fetch($obj->socid); 272 273 print '<tr class="oddeven">'; 274 275 print "<td>"; 276 print $invoicetmp->getNomUrl(1); 277 print "</td>\n"; 278 279 print '<td>'; 280 print $thirdpartytmp->getNomUrl(1); 281 print "</td>\n"; 282 283 // Amount of invoice 284 print '<td class="right"><span class="amount">'.price($obj->total_ttc)."</span></td>\n"; 285 286 // Amount requested 287 print '<td class="right"><span class="amount">'.price($obj->amount_requested)."</span></td>\n"; 288 289 // Status of requests 290 print '<td class="center">'; 291 292 if ($obj->statut == 0) { 293 print '-'; 294 } elseif ($obj->statut == 2) { 295 if ($obj->type == 'bank-transfer') { 296 print $langs->trans("StatusDebited"); 297 } else { 298 print $langs->trans("StatusCredited"); 299 } 300 } elseif ($obj->statut == 3) { 301 print '<b>'.$langs->trans("StatusRefused").'</b>'; 302 } 303 304 print "</td>"; 305 306 print "<td></td>"; 307 308 print "</tr>\n"; 309 310 $totalinvoices += $obj->total_ttc; 311 $totalamount_requested += $obj->amount_requested; 312 313 $i++; 314 } 315 316 if ($num > 0) { 317 print '<tr class="liste_total">'; 318 print '<td>'.$langs->trans("Total").'</td>'; 319 print '<td> </td>'; 320 print '<td class="right">'; 321 //if ($totalinvoices != $object->amount) print img_warning("AmountOfFileDiffersFromSumOfInvoices"); // It is normal to have total that differs. For an amount of invoice of 100, request to pay may be 50 only. 322 if ($totalamount_requested != $object->amount) { 323 print img_warning("AmountOfFileDiffersFromSumOfInvoices"); 324 } 325 print "</td>\n"; 326 print '<td class="right">'; 327 print price($totalamount_requested); 328 print "</td>\n"; 329 print '<td> </td>'; 330 print '<td> </td>'; 331 print "</tr>\n"; 332 } 333 334 print "</table>"; 335 print '</div>'; 336 337 $db->free($result); 338} else { 339 dol_print_error($db); 340} 341 342// End of page 343llxFooter(); 344$db->close(); 345