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&amp;modulepart='.$modulepart.'&amp;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>&nbsp;</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>&nbsp;</td>';
330		print '<td>&nbsp;</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