dolibarr 25.0.0-alpha
accounting-files.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2017 Pierre-Henry Favre <support@atm-consulting.fr>
5 * Copyright (C) 2020 Maxime DEMAREST <maxime@indelog.fr>
6 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
7 * Copyright (C) 2022-2025 Alexandre Spangaro <alexandre@inovea-conseil.com>
8 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
9 * Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31if ((array_key_exists('action', $_GET) && $_GET['action'] == 'dl') || (array_key_exists('action', $_POST) && $_POST['action'] == 'dl')) { // To not replace token when downloading file. Keep $_GET and $_POST here
32 if (!defined('NOTOKENRENEWAL')) {
33 define('NOTOKENRENEWAL', '1');
34 }
35}
36
37// Load Dolibarr environment
38require '../main.inc.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
42require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
43require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
44require_once DOL_DOCUMENT_ROOT.'/salaries/class/paymentsalary.class.php';
45require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
46require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php';
47require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
48require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
49require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
50require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/paymentvarious.class.php';
51require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
52require_once DOL_DOCUMENT_ROOT.'/loan/class/paymentloan.class.php';
53
54if (isModEnabled('project')) {
55 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
56 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
57}
58
59// Constant to define payment sens
60const PAY_DEBIT = 0;
61const PAY_CREDIT = 1;
62
72$langs->loadLangs(array("accountancy", "bills", "companies", "salaries", "compta", "trips", "banks", "loan"));
73
74$date_start = GETPOST('date_start', 'alpha');
75$date_startDay = GETPOSTINT('date_startday');
76$date_startMonth = GETPOSTINT('date_startmonth');
77$date_startYear = GETPOSTINT('date_startyear');
78$date_start = dol_mktime(0, 0, 0, $date_startMonth, $date_startDay, $date_startYear, 'tzuserrel');
79$date_stop = GETPOST('date_stop', 'alpha');
80$date_stopDay = GETPOSTINT('date_stopday');
81$date_stopMonth = GETPOSTINT('date_stopmonth');
82$date_stopYear = GETPOSTINT('date_stopyear');
83$date_stop = dol_mktime(23, 59, 59, $date_stopMonth, $date_stopDay, $date_stopYear, 'tzuserrel');
84$action = GETPOST('action', 'aZ09');
85$projectid = GETPOSTINT('projectid');
86
87// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
88$hookmanager->initHooks(array('comptafileslist', 'globallist'));
89
90// Load variable for pagination
91$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
92$sortfield = GETPOST('sortfield', 'aZ09comma');
93$sortorder = GETPOST('sortorder', 'aZ09comma');
94$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
95if (empty($page) || $page == -1) {
96 $page = 0;
97} // If $page is not defined, or '' or -1
98$offset = $limit * $page;
99$pageprev = $page - 1;
100$pagenext = $page + 1;
101if (!$sortfield) {
102 $sortfield = "date,item"; // Set here default search field
103}
104if (!$sortorder) {
105 $sortorder = "DESC";
106}
107
108
109$arrayfields = array(
110 'type' => array('label' => "Type", 'checked' => 1),
111 'date' => array('label' => "Date", 'checked' => 1),
112 'date_due' => array('label' => "DateDue", 'checked' => 1),
113 'ref' => array('label' => "Ref", 'checked' => 1),
114 'documents' => array('label' => "Documents", 'checked' => 1),
115 'paid' => array('label' => "Paid", 'checked' => 1),
116 'total_ht' => array('label' => "TotalHT", 'checked' => 1),
117 'total_ttc' => array('label' => "TotalTTC", 'checked' => 1),
118 'total_vat' => array('label' => "TotalVAT", 'checked' => 1),
119 //...
120);
121
122// Security check
123if (!isModEnabled('comptabilite') && !isModEnabled('accounting')) {
125}
126if ($user->socid > 0) {
128}
129
130// Define $arrayofentities if multientity is set.
131$arrayofentities = array();
132if (isModEnabled('multicompany') && isset($mc) && is_object($mc)) {
133 $arrayofentities = $mc->getEntitiesList();
134}
135
136$entity = (GETPOSTISSET('entity') ? GETPOSTINT('entity') : (GETPOSTISSET('search_entity') ? GETPOSTINT('search_entity') : $conf->entity));
137if (isModEnabled('multicompany') && isset($mc) && is_object($mc)) {
138 if (empty($entity) && getDolGlobalString('MULTICOMPANY_ALLOW_EXPORT_ACCOUNTING_DOC_FOR_ALL_ENTITIES')) {
139 $entity = '0,'.implode(',', array_keys($arrayofentities));
140 }
141}
142if (empty($entity)) {
143 $entity = $conf->entity;
144}
145
146$error = 0;
147
148$listofchoices = array(
149 'selectinvoices' => array('label' => 'Invoices', 'picto' => 'bill', 'lang' => 'bills', 'enabled' => isModEnabled('invoice'), 'perms' => $user->hasRight('facture', 'lire')),
150 'selectsupplierinvoices' => array('label' => 'BillsSuppliers', 'picto' => 'supplier_invoice', 'lang' => 'bills', 'enabled' => isModEnabled('supplier_invoice'), 'perms' => $user->hasRight('fournisseur', 'facture', 'lire')),
151 'selectexpensereports' => array('label' => 'ExpenseReports', 'picto' => 'expensereport', 'lang' => 'trips', 'enabled' => isModEnabled('expensereport'), 'perms' => $user->hasRight('expensereport', 'lire')),
152 'selectdonations' => array('label' => 'Donations', 'picto' => 'donation', 'lang' => 'donation', 'enabled' => isModEnabled('don'), 'perms' => $user->hasRight('don', 'lire')),
153 'selectsocialcontributions' => array('label' => 'SocialContributions', 'picto' => 'bill', 'enabled' => isModEnabled('tax'), 'perms' => $user->hasRight('tax', 'charges', 'lire')),
154 'selectpaymentsofsalaries' => array('label' => 'SalariesPayments', 'picto' => 'salary', 'lang' => 'salaries', 'enabled' => isModEnabled('salaries'), 'perms' => $user->hasRight('salaries', 'read')),
155 'selectvariouspayment' => array('label' => 'VariousPayment', 'picto' => 'payment', 'enabled' => isModEnabled('bank'), 'perms' => $user->hasRight('banque', 'lire')),
156 'selectloanspayment' => array('label' => 'PaymentLoan','picto' => 'loan', 'enabled' => isModEnabled('don'), 'perms' => $user->hasRight('loan', 'read')),
157);
158
159
160
161/*
162 * Actions
163 */
164
165//$parameters = array('socid' => $id);
166//$reshook = $hookmanager->executeHooks('doActions', $parameters, $object); // Note that $object may have been modified by some hooks
167//if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
168
169$filesarray = array();
170
171'@phan-var-force array<string,array{id:string,entity:string,date:string,date_due:string,paid:float|int,amount_ht:float|int,amount_ttc:float|int,amount_vat:float|int,amount_localtax1:float|int,amount_localtax2:float|int,amount_revenuestamp:float|int,ref:string,fk:string,item:string,thirdparty_name:string,thirdparty_code:string,country_code:string,vatnum:string,sens:string,currency:string,line?:string,name?:string,files?:mixed}> $filesarray';
172
173$result = false;
174if ($action == 'searchfiles' || $action == 'dl') { // Test on permission not required here. Test is done per object type later.
175 if (empty($date_start)) {
176 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateStart")), null, 'errors');
177 $error++;
178 }
179 if (empty($date_stop)) {
180 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd")), null, 'errors');
181 $error++;
182 }
183
184 if (!$error) {
185 $sql = '';
186
187 $sanitizedwheretail = " '".$db->idate($date_start)."' AND '".$db->idate($date_stop)."'";
188
189 // Customer invoices
190 if (GETPOST('selectinvoices') && !empty($listofchoices['selectinvoices']['perms'])) {
191 if (!empty($sql)) {
192 $sql .= " UNION ALL";
193 }
194 $sql .= " SELECT t.rowid as id, t.entity, t.ref, t.paye as paid, t.total_ht, t.total_ttc, t.total_tva as total_vat,";
195 $sql .= " t.localtax1, t.localtax2, t.revenuestamp,";
196 $sql .= " t.multicurrency_code as currency, t.fk_soc, t.datef as date, t.date_lim_reglement as date_due, 'Invoice' as item, s.nom as thirdparty_name, s.code_client as thirdparty_code, c.code as country_code, s.tva_intra as vatnum, ".PAY_CREDIT." as sens";
197 $sql .= " FROM ".MAIN_DB_PREFIX."facture as t LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = t.fk_soc LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays";
198 $sql .= " WHERE datef between ".$sanitizedwheretail;
199 $sql .= " AND t.entity IN (".$db->sanitize($entity == 1 ? '0,1' : ((int) $entity)).')';
200 $sql .= " AND t.fk_statut <> ".Facture::STATUS_DRAFT;
201 if (!empty($projectid)) {
202 $sql .= " AND fk_projet = ".((int) $projectid);
203 }
204 }
205 // Vendor invoices
206 if (GETPOST('selectsupplierinvoices') && !empty($listofchoices['selectsupplierinvoices']['perms'])) {
207 if (!empty($sql)) {
208 $sql .= " UNION ALL";
209 }
210 $sql .= " SELECT t.rowid as id, t.entity, t.ref, t.paye as paid, t.total_ht, t.total_ttc, t.total_tva as total_vat,";
211 $sql .= " t.localtax1, t.localtax2, 0 as revenuestamp,";
212 $sql .= " t.multicurrency_code as currency, t.fk_soc, t.datef as date, t.date_lim_reglement as date_due, 'SupplierInvoice' as item, s.nom as thirdparty_name, s.code_fournisseur as thirdparty_code, c.code as country_code, s.tva_intra as vatnum, ".PAY_DEBIT." as sens";
213 $sql .= " FROM ".MAIN_DB_PREFIX."facture_fourn as t LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = t.fk_soc LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays";
214 $sql .= " WHERE datef between ".$sanitizedwheretail;
215 $sql .= " AND t.entity IN (".$db->sanitize($entity == 1 ? '0,1' : ((int) $entity)).')';
216 $sql .= " AND t.fk_statut <> ".FactureFournisseur::STATUS_DRAFT;
217 if (!empty($projectid)) {
218 $sql .= " AND fk_projet = ".((int) $projectid);
219 }
220 }
221 // Expense reports
222 if (GETPOST('selectexpensereports') && !empty($listofchoices['selectexpensereports']['perms'])) {
223 if (!empty($sql)) {
224 $sql .= " UNION ALL";
225 }
226 // if project filter is used on an expense report,
227 // show only total_ht/total_tva/total_ttc of the line considered by the project
228 if (!empty($projectid)) {
229 $sql .= " SELECT t.rowid as id, t.entity, t.ref, t.paid, SUM(td.total_ht) as total_ht, SUM(td.total_ttc) as total_ttc, SUM(td.total_tva) as total_vat,";
230 $sql .= " 0 as localtax1, 0 as localtax2, 0 as revenuestamp,";
231 $sql .= " td.multicurrency_code as currency, t.fk_user_author as fk_soc, t.date_fin as date, t.date_fin as date_due, 'ExpenseReport' as item, CONCAT(CONCAT(u.lastname, ' '), u.firstname) as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum, " . PAY_DEBIT . " as sens";
232 $sql .= " FROM " . MAIN_DB_PREFIX . "expensereport as t";
233 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "expensereport_det as td ON t.rowid = td.fk_expensereport";
234 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "user as u ON u.rowid = t.fk_user_author";
235 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_country as c ON c.rowid = u.fk_country";
236 $sql .= " WHERE date_fin between " . $sanitizedwheretail;
237 $sql .= " AND t.entity IN (" . $db->sanitize($entity == 1 ? '0,1' : ((int) $entity)) . ')';
238 $sql .= " AND t.fk_statut <> " . ExpenseReport::STATUS_DRAFT;
239 $sql .= " AND fk_projet = ".((int) $projectid);
240 } else {
241 $sql .= " SELECT t.rowid as id, t.entity, t.ref, t.paid, t.total_ht, t.total_ttc, t.total_tva as total_vat,";
242 $sql .= " 0 as localtax1, 0 as localtax2, 0 as revenuestamp,";
243 $sql .= " t.multicurrency_code as currency, t.fk_user_author as fk_soc, t.date_fin as date, t.date_fin as date_due, 'ExpenseReport' as item, CONCAT(CONCAT(u.lastname, ' '), u.firstname) as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum, " . PAY_DEBIT . " as sens";
244 $sql .= " FROM " . MAIN_DB_PREFIX . "expensereport as t LEFT JOIN " . MAIN_DB_PREFIX . "user as u ON u.rowid = t.fk_user_author LEFT JOIN " . MAIN_DB_PREFIX . "c_country as c ON c.rowid = u.fk_country";
245 $sql .= " WHERE date_fin between " . $sanitizedwheretail;
246 $sql .= " AND t.entity IN (" . $db->sanitize($entity == 1 ? '0,1' : ((int) $entity)) . ')';
247 $sql .= " AND t.fk_statut <> " . ExpenseReport::STATUS_DRAFT;
248 }
249 }
250 // Donations
251 if (GETPOST('selectdonations') && !empty($listofchoices['selectdonations']['perms'])) {
252 if (!empty($sql)) {
253 $sql .= " UNION ALL";
254 }
255 $sql .= " SELECT t.rowid as id, t.entity, t.ref, paid, amount as total_ht, amount as total_ttc, 0 as total_vat,";
256 $sql .= " 0 as localtax1, 0 as localtax2, 0 as revenuestamp,";
257 $sql .= " '".$db->escape($conf->currency)."' as currency, 0 as fk_soc, t.datedon as date, t.datedon as date_due, 'Donation' as item, t.societe as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum, ".PAY_CREDIT." as sens";
258 $sql .= " FROM ".MAIN_DB_PREFIX."don as t LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = t.fk_country";
259 $sql .= " WHERE datedon between ".$sanitizedwheretail;
260 $sql .= " AND t.entity IN (".$db->sanitize($entity == 1 ? '0,1' : ((int) $entity)).')';
261 $sql .= " AND t.fk_statut <> ".Don::STATUS_DRAFT;
262 if (!empty($projectid)) {
263 $sql .= " AND fk_projet = ".((int) $projectid);
264 }
265 }
266 // Payments of salaries
267 if (GETPOST('selectpaymentsofsalaries') && !empty($listofchoices['selectpaymentsofsalaries']['perms'])) {
268 if (!empty($sql)) {
269 $sql .= " UNION ALL";
270 }
271 $sql .= " SELECT t.rowid as id, t.entity, t.label as ref, 1 as paid, amount as total_ht, amount as total_ttc, 0 as total_vat,";
272 $sql .= " 0 as localtax1, 0 as localtax2, 0 as revenuestamp,";
273 $sql .= " '".$db->escape($conf->currency)."' as currency, t.fk_user as fk_soc, t.datep as date, t.dateep as date_due, 'SalaryPayment' as item, CONCAT(CONCAT(u.lastname, ' '), u.firstname) as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum, ".PAY_DEBIT." as sens";
274 $sql .= " FROM ".MAIN_DB_PREFIX."payment_salary as t LEFT JOIN ".MAIN_DB_PREFIX."user as u ON u.rowid = t.fk_user LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = u.fk_country";
275 $sql .= " WHERE datep between ".$sanitizedwheretail;
276 $sql .= " AND t.entity IN (".$db->sanitize($entity == 1 ? '0,1' : ((int) $entity)).')';
277 //$sql.=" AND fk_statut <> ".PaymentSalary::STATUS_DRAFT;
278 if (!empty($projectid)) {
279 $sql .= " AND fk_projet = ".((int) $projectid);
280 }
281 }
282 // Social contributions
283 if (GETPOST('selectsocialcontributions') && !empty($listofchoices['selectsocialcontributions']['perms'])) {
284 if (!empty($sql)) {
285 $sql .= " UNION ALL";
286 }
287 $sql .= " SELECT t.rowid as id, t.entity, t.libelle as ref, t.paye as paid, t.amount as total_ht, t.amount as total_ttc, 0 as total_vat,";
288 $sql .= " 0 as localtax1, 0 as localtax2, 0 as revenuestamp,";
289 $sql .= " '".$db->escape($conf->currency)."' as currency, 0 as fk_soc, t.date_ech as date, t.periode as date_due, 'SocialContributions' as item, '' as thirdparty_name, '' as thirdparty_code, '' as country_code, '' as vatnum, ".PAY_DEBIT." as sens";
290 $sql .= " FROM ".MAIN_DB_PREFIX."chargesociales as t";
291 $sql .= " WHERE t.date_ech between ".$sanitizedwheretail;
292 $sql .= " AND t.entity IN (".$db->sanitize($entity == 1 ? '0,1' : ((int) $entity)).')';
293 //$sql.=" AND fk_statut <> ".ChargeSociales::STATUS_UNPAID;
294 if (!empty($projectid)) {
295 $sql .= " AND fk_projet = ".((int) $projectid);
296 }
297 }
298 // Various payments
299 if (GETPOST('selectvariouspayment') && !empty($listofchoices['selectvariouspayment']['perms'])) {
300 if (!empty($sql)) {
301 $sql .= " UNION ALL";
302 }
303 $sql .= " SELECT t.rowid as id, t.entity, t.ref, 1 as paid, t.amount as total_ht, t.amount as total_ttc, 0 as total_vat,";
304 $sql .= " 0 as localtax1, 0 as localtax2, 0 as revenuestamp,";
305 $sql .= " '".$db->escape($conf->currency)."' as currency, 0 as fk_soc, t.datep as date, t.datep as date_due, 'VariousPayment' as item, '' as thirdparty_name, '' as thirdparty_code, '' as country_code, '' as vatnum, sens";
306 $sql .= " FROM ".MAIN_DB_PREFIX."payment_various as t";
307 $sql .= " WHERE datep between ".$sanitizedwheretail;
308 $sql .= " AND t.entity IN (".$db->sanitize($entity == 1 ? '0,1' : ((int) $entity)).')';
309 if (!empty($projectid)) {
310 $sql .= " AND fk_projet = ".((int) $projectid);
311 }
312 }
313 // Loan payments
314 if (GETPOST('selectloanspayment') && !empty($listofchoices['selectloanspayment']['perms']) && empty($projectid)) {
315 if (!empty($sql)) {
316 $sql .= " UNION ALL";
317 }
318 $sql .= " SELECT t.rowid as id, l.entity, l.label as ref, 1 as paid, (t.amount_capital+t.amount_insurance+t.amount_interest) as total_ht, (t.amount_capital+t.amount_insurance+t.amount_interest) as total_ttc, 0 as total_vat,";
319 $sql .= " 0 as localtax1, 0 as localtax2, 0 as revenuestamp,";
320 $sql .= " '".$db->escape($conf->currency)."' as currency, 0 as fk_soc, t.datep as date, t.datep as date_due, 'LoanPayment' as item, '' as thirdparty_name, '' as thirdparty_code, '' as country_code, '' as vatnum, ".PAY_DEBIT." as sens";
321 $sql .= " FROM ".MAIN_DB_PREFIX."payment_loan as t LEFT JOIN ".MAIN_DB_PREFIX."loan as l ON l.rowid = t.fk_loan";
322 $sql .= " WHERE datep between ".$sanitizedwheretail;
323 $sql .= " AND l.entity IN (".$db->sanitize($entity == 1 ? '0,1' : ((int) $entity)).')';
324 }
325
326 if ($sql) {
327 $sql .= $db->order($sortfield, $sortorder);
328 //print $sql;
329
330 $resd = $db->query($sql);
331 $files = array();
332 $link = '';
333
334 if ($resd) {
335 $numd = $db->num_rows($resd);
336
337 $tmpinvoice = new Facture($db);
338 $tmpinvoicesupplier = new FactureFournisseur($db);
339 $tmpdonation = new Don($db);
340
341 $upload_dir = '';
342 $i = 0;
343 while ($i < $numd) {
344 $objd = $db->fetch_object($resd);
345
346 switch ($objd->item) {
347 case "Invoice":
348 $subdir = '';
349 $subdir .= ($subdir ? '/' : '').dol_sanitizeFileName($objd->ref);
350 $upload_dir = $conf->facture->dir_output.'/'.$subdir;
351 $link = "document.php?modulepart=facture&file=".str_replace('/', '%2F', $subdir).'%2F';
352 $modulepart = "facture";
353 break;
354 case "SupplierInvoice":
355 $tmpinvoicesupplier->fetch($objd->id);
356 $subdir = get_exdir($tmpinvoicesupplier->id, 2, 0, 1, $tmpinvoicesupplier, 'invoice_supplier'); // TODO Use first file
357 $subdir .= ($subdir ? '/' : '').dol_sanitizeFileName($objd->ref);
358 $upload_dir = $conf->fournisseur->facture->dir_output.'/'.$subdir;
359 $link = "document.php?modulepart=facture_fournisseur&file=".str_replace('/', '%2F', $subdir).'%2F';
360 $modulepart = "facture_fournisseur";
361 break;
362 case "ExpenseReport":
363 $subdir = '';
364 $subdir .= ($subdir ? '/' : '').dol_sanitizeFileName($objd->ref);
365 $upload_dir = $conf->expensereport->dir_output.'/'.$subdir;
366 $link = "document.php?modulepart=expensereport&file=".str_replace('/', '%2F', $subdir).'%2F';
367 $modulepart = "expensereport";
368 break;
369 case "SalaryPayment":
370 $subdir = '';
371 $subdir .= ($subdir ? '/' : '').dol_sanitizeFileName($objd->id);
372 $upload_dir = $conf->salaries->dir_output.'/'.$subdir;
373 $link = "document.php?modulepart=salaries&file=".str_replace('/', '%2F', $subdir).'%2F';
374 $modulepart = "salaries";
375 break;
376 case "Donation":
377 $tmpdonation->fetch($objd->id);
378 $subdir = get_exdir(0, 0, 0, 0, $tmpdonation, 'donation');
379 $subdir .= ($subdir ? '/' : '').dol_sanitizeFileName($objd->id);
380 $upload_dir = $conf->don->dir_output.'/'.$subdir;
381 $link = "document.php?modulepart=don&file=".str_replace('/', '%2F', $subdir).'%2F';
382 $modulepart = "don";
383 break;
384 case "SocialContributions":
385 $subdir = '';
386 $subdir .= ($subdir ? '/' : '').dol_sanitizeFileName($objd->id);
387 $upload_dir = $conf->tax->dir_output.'/'.$subdir;
388 $link = "document.php?modulepart=tax&file=".str_replace('/', '%2F', $subdir).'%2F';
389 $modulepart = "tax";
390 break;
391 case "VariousPayment":
392 $subdir = '';
393 $subdir .= ($subdir ? '/' : '').dol_sanitizeFileName($objd->id);
394 $upload_dir = $conf->bank->dir_output.'/'.$subdir;
395 $link = "document.php?modulepart=banque&file=".str_replace('/', '%2F', $subdir).'%2F';
396 $modulepart = "banque";
397 break;
398 case "LoanPayment":
399 // Loan payment has no linked file
400 $subdir = '';
401 $upload_dir = $conf->loan->dir_output.'/'.$subdir;
402 $link = "";
403 $modulepart = "";
404 break;
405 default:
406 $subdir = '';
407 $upload_dir = '';
408 $link = '';
409 $modulepart = '';
410 break;
411 }
412
413 if (!empty($upload_dir)) {
414 $result = true;
415
416 $files = dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview.*\.png)$', '', SORT_ASC, 1);
417 //var_dump($upload_dir);
418 //var_dump($files);
419 if (count($files) < 1) {
420 $nofile = array();
421 $nofile['id'] = (int) $objd->id;
422 $nofile['entity'] = (int) $objd->entity;
423 $nofile['date'] = $db->jdate($objd->date);
424 $nofile['date_due'] = $db->jdate($objd->date_due);
425 $nofile['paid'] = (int) $objd->paid;
426 $nofile['amount_ht'] = $objd->total_ht;
427 $nofile['amount_ttc'] = $objd->total_ttc;
428 $nofile['amount_vat'] = $objd->total_vat;
429 $nofile['amount_localtax1'] = $objd->localtax1;
430 $nofile['amount_localtax2'] = $objd->localtax2;
431 $nofile['amount_revenuestamp'] = $objd->revenuestamp;
432 $nofile['ref'] = ($objd->ref ? $objd->ref : $objd->id);
433 $nofile['fk'] = $objd->fk_soc;
434 $nofile['item'] = $objd->item;
435 $nofile['thirdparty_name'] = $objd->thirdparty_name;
436 $nofile['thirdparty_code'] = $objd->thirdparty_code;
437 $nofile['country_code'] = $objd->country_code;
438 $nofile['vatnum'] = $objd->vatnum;
439 $nofile['sens'] = $objd->sens;
440 $nofile['currency'] = $objd->currency;
441 $nofile['link'] = '';
442 $nofile['name'] = '';
443
444
445 $filesarray[$nofile['item'].'_'.$nofile['id']] = $nofile;
446 } else {
447 foreach ($files as $key => $file) {
448 $file['id'] = (int) $objd->id;
449 $file['entity'] = (int) $objd->entity;
450 $file['date'] = $db->jdate($objd->date);
451 $file['date_due'] = $db->jdate($objd->date_due);
452 $file['paid'] = (int) $objd->paid;
453 $file['amount_ht'] = $objd->total_ht;
454 $file['amount_ttc'] = $objd->total_ttc;
455 $file['amount_vat'] = $objd->total_vat;
456 $file['amount_localtax1'] = $objd->localtax1;
457 $file['amount_localtax2'] = $objd->localtax2;
458 $file['amount_revenuestamp'] = $objd->revenuestamp;
459 $file['ref'] = ($objd->ref ? $objd->ref : $objd->id);
460 $file['fk'] = $objd->fk_soc;
461 $file['item'] = $objd->item;
462 $file['thirdparty_name'] = $objd->thirdparty_name;
463 $file['thirdparty_code'] = $objd->thirdparty_code;
464 $file['country_code'] = $objd->country_code;
465 $file['vatnum'] = $objd->vatnum;
466 $file['sens'] = $objd->sens;
467 $file['currency'] = $objd->currency;
468
469 // Save record into array (only the first time it is found)
470 if (empty($filesarray[$file['item'].'_'.$file['id']])) {
471 $filesarray[$file['item'].'_'.$file['id']] = $file;
472 }
473
474 // Add or concat file
475 if (empty($filesarray[$file['item'].'_'.$file['id']]['files'])) {
476 $filesarray[$file['item'].'_'.$file['id']]['files'] = array();
477 }
478 $filesarray[$file['item'].'_'.$file['id']]['files'][] = array(
479 'link' => $link.urlencode($file['name']),
480 'name' => $file['name'],
481 'ref' => $file['ref'],
482 'fullname' => $file['fullname'],
483 'relpath' => '/'.$file['name'],
484 'relpathnamelang' => $langs->trans($file['item']).'/'.$file['name'],
485 'modulepart' => $modulepart,
486 'subdir' => $subdir,
487 'currency' => $file['currency']
488 );
489 //var_dump($file['item'].'_'.$file['id']);
490 //var_dump($filesarray[$file['item'].'_'.$file['id']]['files']);
491 }
492 }
493 }
494
495 $i++;
496 }
497 } else {
499 }
500
501 $db->free($resd);
502 } else {
503 setEventMessages($langs->trans("ErrorSelectAtLeastOne"), null, 'errors');
504 $error++;
505 }
506 }
507}
508
509// zip creation
510
511$dirfortmpfile = (!empty($conf->accounting->dir_temp) ? $conf->accounting->dir_temp : $conf->comptabilite->dir_temp);
512if (empty($dirfortmpfile)) {
513 setEventMessages($langs->trans("ErrorNoAccountingModuleEnabled"), null, 'errors');
514 $error++;
515}
516
517if ($result && $action == "dl" && !$error) { // Test on permission not required here. Test is done per object type later.
518 if (!extension_loaded('zip')) {
519 setEventMessages('PHPZIPExtentionNotLoaded', null, 'errors');
520 } else {
521 dol_mkdir($dirfortmpfile);
522
523 // Tags of the exported documents, read with one query per document type for the whole
524 // batch: a month of activity holds hundreds of documents and one query per document
525 // would make the export crawl. Only customer and supplier invoices can carry tags,
526 // the other items of the export (various payments, expense reports, salaries,
527 // donations, social contributions, loan payments) have no category type in Dolibarr
528 // and keep an empty column.
529 $tagsofdocuments = array();
530 foreach (array('Invoice' => 'invoice', 'SupplierInvoice' => 'supplier_invoice') as $itemfortags => $tablefortags) {
531 $idsfortags = array();
532 foreach ($filesarray as $filefortags) {
533 if ($filefortags['item'] == $itemfortags) {
534 $idsfortags[] = (int) $filefortags['id'];
535 }
536 }
537 if (empty($idsfortags)) {
538 continue;
539 }
540
541 $sqltags = "SELECT ct.fk_".$db->sanitize($tablefortags)." as fk_object, c.label";
542 $sqltags .= " FROM ".MAIN_DB_PREFIX."categorie_".$db->sanitize($tablefortags)." as ct, ".MAIN_DB_PREFIX."categorie as c";
543 $sqltags .= " WHERE ct.fk_categorie = c.rowid";
544 $sqltags .= " AND ct.fk_".$db->sanitize($tablefortags)." IN (".$db->sanitize(implode(',', $idsfortags)).")";
545 $sqltags .= " AND c.entity IN (".getEntity('category').")";
546 $sqltags .= " ORDER BY c.label";
547
548 $resqltags = $db->query($sqltags);
549 if ($resqltags) {
550 while ($objtags = $db->fetch_object($resqltags)) {
551 $keyfortags = $itemfortags.'_'.$objtags->fk_object;
552 if (empty($tagsofdocuments[$keyfortags])) {
553 $tagsofdocuments[$keyfortags] = array();
554 }
555 $tagsofdocuments[$keyfortags][] = $objtags->label;
556 }
557 $db->free($resqltags);
558 } else {
560 }
561 }
562
563 $log = $langs->transnoentitiesnoconv("Type");
564 if (isModEnabled('multicompany') && isset($mc) && is_object($mc)) {
565 $log .= ','.$langs->transnoentitiesnoconv("Entity");
566 }
567 $log .= ','.$langs->transnoentitiesnoconv("Date");
568 $log .= ','.$langs->transnoentitiesnoconv("DateDue");
569 $log .= ','.$langs->transnoentitiesnoconv("Ref");
570 $log .= ','.$langs->transnoentitiesnoconv("TotalHT");
571 $log .= ','.$langs->transnoentitiesnoconv("TotalTTC");
572 $log .= ','.$langs->transnoentitiesnoconv("TotalVAT");
573 $log .= ','.$langs->transcountrynoentities("TotalLT1", $mysoc->country_code);
574 $log .= ','.$langs->transcountrynoentities("TotalLT2", $mysoc->country_code);
575 $log .= ','.$langs->transnoentitiesnoconv("RevenueStamp");
576 $log .= ','.$langs->transnoentitiesnoconv("Paid");
577 $log .= ','.$langs->transnoentitiesnoconv("Document");
578 $log .= ','.$langs->transnoentitiesnoconv("ItemID");
579 $log .= ','.$langs->transnoentitiesnoconv("ThirdParty");
580 $log .= ','.$langs->transnoentitiesnoconv("Code");
581 $log .= ','.$langs->transnoentitiesnoconv("Country");
582 $log .= ','.$langs->transnoentitiesnoconv("VATIntra");
583 $log .= ','.$langs->transnoentitiesnoconv("Sens");
584 $log .= ','.$langs->transnoentitiesnoconv("Categories")."\n";
585 $zipname = $dirfortmpfile.'/'.dol_print_date($date_start, 'dayrfc', 'tzuserrel')."-".dol_print_date($date_stop, 'dayrfc', 'tzuserrel');
586 if (!empty($projectid)) {
587 $project = new Project($db);
588 $project->fetch($projectid);
589 if ($project->ref) {
590 $zipname .= '_'.$project->ref;
591 }
592 }
593 $zipname .= '_export.zip';
594
595 dol_delete_file($zipname);
596
597 $zip = new ZipArchive();
598 $res = $zip->open($zipname, ZipArchive::OVERWRITE | ZipArchive::CREATE);
599 if ($res) {
600 foreach ($filesarray as $key => $file) {
601 if (!empty($file['files'])) {
602 foreach ($file['files'] as $filecursor) {
603 if (file_exists($filecursor["fullname"])) {
604 $zip->addFile($filecursor["fullname"], $filecursor["relpathnamelang"]);
605 }
606 }
607 }
608
609 $log .= '"'.$langs->transnoentitiesnoconv($file['item']).'"';
610 if (isModEnabled('multicompany') && isset($mc) && is_object($mc)) {
611 $log .= ',"'.(empty($arrayofentities[$file['entity']]) ? $file['entity'] : $arrayofentities[$file['entity']]).'"';
612 }
613 $log .= ','.dol_print_date($file['date'], 'dayrfc');
614 $log .= ','.dol_print_date($file['date_due'], 'dayrfc');
615 $log .= ',"'.$file['ref'].'"';
616 $log .= ','.$file['amount_ht'];
617 $log .= ','.$file['amount_ttc'];
618 $log .= ','.$file['amount_vat'];
619 $log .= ','.$file['amount_localtax1'];
620 $log .= ','.$file['amount_localtax2'];
621 $log .= ','.$file['amount_revenuestamp'];
622 $log .= ','.$file['paid'];
623 $log .= ',"'.$file["name"].'"';
624 $log .= ','.$file['fk'];
625 $log .= ',"'.$file['thirdparty_name'].'"';
626 $log .= ',"'.$file['thirdparty_code'].'"';
627 $log .= ',"'.$file['country_code'].'"';
628 $log .= ',"'.$file['vatnum'].'"';
629 $log .= ',"'.$file['sens'].'"';
630 $keyfortags = $file['item'].'_'.$file['id'];
631 $log .= ',"'.(empty($tagsofdocuments[$keyfortags]) ? '' : implode(',', $tagsofdocuments[$keyfortags])).'"';
632 $log .= "\n";
633 }
634 $zip->addFromString('transactions.csv', $log);
635 $zip->close();
636
637 // Then download the zipped file.
638 header('Content-Type: application/zip');
639 header('Content-disposition: attachment; filename='.basename($zipname));
640 header('Content-Length: '.filesize($zipname));
641 readfile($zipname);
642
643 dol_delete_file($zipname);
644
645 exit();
646 } else {
647 setEventMessages($langs->trans("FailedToOpenFile", $zipname), null, 'errors');
648 }
649 }
650}
651
652
653/*
654 * View
655 */
656
657$form = new Form($db);
658$formfile = new FormFile($db);
659$userstatic = new User($db);
660$invoice = new Facture($db);
661$supplier_invoice = new FactureFournisseur($db);
662$expensereport = new ExpenseReport($db);
663$don = new Don($db);
664$salary_payment = new PaymentSalary($db);
665$charge_sociales = new ChargeSociales($db);
666$various_payment = new PaymentVarious($db);
667$payment_loan = new PaymentLoan($db);
668
669$title = $langs->trans("AccountantFiles").' - '.$langs->trans("List");
670$help_url = '';
671
672llxHeader('', $title, $help_url);
673
674$h = 0;
675$head = array();
676$head[$h][0] = $_SERVER["PHP_SELF"];
677$head[$h][1] = $langs->trans("AccountantFiles");
678$head[$h][2] = 'AccountancyFiles';
679
680print dol_get_fiche_head($head, 'AccountancyFiles', '', -1);
681
682
683print '<form name="searchfiles" action="?action=searchfiles" method="POST">'."\n";
684print '<input type="hidden" name="token" value="'.newToken().'">';
685
686print '<div class="neutral">';
687
688print '<span class="opacitylow">'.$langs->trans("ExportAccountingSourceDocHelp");
689if (isModEnabled('accounting')) {
690 print ' '.$langs->trans("ExportAccountingSourceDocHelp2", $langs->transnoentitiesnoconv("Accounting"), $langs->transnoentitiesnoconv("Journals"));
691}
692print '</span><br>';
693print '<br>';
694
695print $langs->trans("ReportPeriod").': ';
696print $form->selectDate($date_start, 'date_start', 0, 0, 0, "", 1, 1, 0, '', '', '', '', 1, '', '', 'tzuserrel');
697print ' - ';
698print $form->selectDate($date_stop, 'date_stop', 0, 0, 0, "", 1, 1, 0, '', '', '', '', 1, '', '', 'tzuserrel');
699print "\n";
700
701// Export is for current company only
702$socid = 0;
703if (isModEnabled('multicompany') && isset($mc) && is_object($mc)) {
704 $mc->getInfo($conf->entity);
705 print ' &nbsp; <span class="marginleftonly marginrightonly'.(!getDolGlobalString('MULTICOMPANY_ALLOW_EXPORT_ACCOUNTING_DOC_FOR_ALL_ENTITIES') ? ' opacitymedium' : '').'">'.$langs->trans("Entity").' : ';
706 if (getDolGlobalString('MULTICOMPANY_ALLOW_EXPORT_ACCOUNTING_DOC_FOR_ALL_ENTITIES')) {
707 $socid = $mc->id;
708 print $mc->select_entities(GETPOSTISSET('search_entity') ? GETPOSTINT('search_entity') : $mc->id, 'search_entity', '', false, false, false, false, true);
709 } else {
710 print $mc->label;
711 }
712 print "</span>\n";
713}
714
715print '<br>';
716
717// Project filter
718if (isModEnabled('project')) {
719 $formproject = new FormProjets($db);
720 $langs->load('projects');
721 print '<div class="paddingtop">';
722 print '<span class="marginrightonly">'.$langs->trans('Project').":</span>";
723 print img_picto('', 'project', 'class="pictofixedwidth"').$formproject->select_projects(($socid > 0 ? $socid : -1), (string) $projectid, 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 1, 0, '');
724 print '<span class="classfortooltip" style="padding: 0px; padding: 0px; padding-right: 3px !important;" title="'.$langs->trans('ExportAccountingProjectHelp').'"><span class="fas fa-info-circle em088 opacityhigh" style=" vertical-align: middle; cursor: help"></span></span>';
725 print '<br>';
726 print '</div>';
727}
728
729$i = 0;
730foreach ($listofchoices as $choice => $val) {
731 if (empty($val['enabled'])) {
732 continue; // list not qualified
733 }
734 $disabled = '';
735 if (empty($val['perms'])) {
736 $disabled = ' disabled';
737 }
738 $checked = (((!GETPOSTISSET('search') && $action != 'searchfiles') || GETPOST($choice)) ? ' checked="checked"' : '');
739 print '<div class="inline-block marginrightonlylarge paddingright margintoponly"><input type="checkbox" id="'.$choice.'" name="'.$choice.'" value="1"'.$checked.$disabled.'><label for="'.$choice.'"> ';
740 print img_picto($langs->trans($val['label']), $val['picto'], 'class=""').' '.$langs->trans($val['label']);
741 print '</label></div>';
742 $i++;
743}
744
745print '<br><br><center><input type="submit" class="button small nomarginleft margintoponly" name="search" value="'.$langs->trans("Search").'"></center>';
746
747print '</div>';
748
749print '</form>'."\n";
750
751print dol_get_fiche_end();
752
753$param = '';
754if (!empty($date_start) && !empty($date_stop)) {
755 $param .= '&date_startday='.GETPOSTINT('date_startday');
756 $param .= '&date_startmonth='.GETPOSTINT('date_startmonth');
757 $param .= '&date_startyear='.GETPOSTINT('date_startyear');
758 $param .= '&date_stopday='.GETPOSTINT('date_stopday');
759 $param .= '&date_stopmonth='.GETPOSTINT('date_stopmonth');
760 $param .= '&date_stopyear='.GETPOSTINT('date_stopyear');
761 foreach ($listofchoices as $choice => $val) {
762 if (GETPOSTINT($choice)) {
763 $param .= '&'.$choice.'=1';
764 }
765 }
766
767 $TData = dol_sort_array($filesarray, $sortfield, $sortorder);
768 '@phan-var-force array<string,array{id:string,entity:string,date:string,date_due:string,paid:float|int,amount_ht:float|int,amount_ttc:float|int,amount_vat:float|int,amount_localtax1:float|int,amount_localtax2:float|int,amount_revenuestamp:float|int,ref:string,fk:string,item:string,thirdparty_name:string,thirdparty_code:string,country_code:string,vatnum:string,sens:string,currency:string,line?:string,name?:string,files?:mixed}> $TData';
769
770
771 $filename = dol_print_date($date_start, 'dayrfc', 'tzuserrel')."-".dol_print_date($date_stop, 'dayrfc', 'tzuserrel').'_export.zip';
772
773 echo dol_print_date($date_start, 'day', 'tzuserrel')." - ".dol_print_date($date_stop, 'day', 'tzuserrel');
774
775 print '<a class="marginleftonly small'.(empty($TData) ? ' butActionRefused' : ' butAction').'" href="'.$_SERVER["PHP_SELF"].'?action=dl&token='.currentToken().'&projectid='.((int) $projectid).'&output=file&file='.urlencode($filename).$param.'"';
776 if (empty($TData)) {
777 print " disabled";
778 }
779 print '>'."\n";
780 print $langs->trans("Download");
781 print '</a><br>';
782
783 $param .= '&action=searchfiles';
784
785 /*
786 print '<input type="hidden" name="token" value="'.currentToken().'">';
787 print '<input type="hidden" name="date_startday" value="'.GETPOST('date_startday', 'int').'" />';
788 print '<input type="hidden" name="date_startmonth" value="'.GETPOST('date_startmonth', 'int').'" />';
789 print '<input type="hidden" name="date_startyear" value="'.GETPOST('date_startyear', 'int').'" />';
790 print '<input type="hidden" name="date_stopday" value="'.GETPOST('date_stopday', 'int').'" />';
791 print '<input type="hidden" name="date_stopmonth" value="'.GETPOST('date_stopmonth', 'int').'" />';
792 print '<input type="hidden" name="date_stopyear" value="'.GETPOST('date_stopyear', 'int').'" />';
793 foreach ($listofchoices as $choice => $val) {
794 print '<input type="hidden" name="'.$choice.'" value="'.GETPOST($choice).'">';
795 }
796
797 print '<input class="butAction butDownload small marginleftonly" type="submit" value="'.$langs->trans("Download").'"';
798 if (empty($TData)) {
799 print " disabled";
800 }
801 print '/>';
802 print '</form>'."\n";
803 */
804
805 print '<br>';
806
807 print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
808 print '<table class="noborder centpercent">';
809 print '<tr class="liste_titre">';
810 print_liste_field_titre($arrayfields['type']['label'], $_SERVER["PHP_SELF"], "item", "", $param, '', $sortfield, $sortorder, 'nowrap ');
811 print_liste_field_titre($arrayfields['date']['label'], $_SERVER["PHP_SELF"], "date", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
812 print_liste_field_titre($arrayfields['date_due']['label'], $_SERVER["PHP_SELF"], "date_due", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
813 print_liste_field_titre($arrayfields['ref']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'nowraponall ');
814 print '<th>'.$langs->trans("Document").'</th>';
815 print '<th>'.$langs->trans("Paid").'</th>';
816 print '<th class="right">'.$langs->trans("TotalHT").(isModEnabled('multicurrency') ? ' ('.$langs->getCurrencySymbol($conf->currency).')' : '').'</th>';
817 print '<th class="right">'.$langs->trans("TotalTTC").(isModEnabled('multicurrency') ? ' ('.$langs->getCurrencySymbol($conf->currency).')' : '').'</th>';
818 print '<th class="right">'.$langs->trans("TotalVAT").(isModEnabled('multicurrency') ? ' ('.$langs->getCurrencySymbol($conf->currency).')' : '').'</th>';
819
820 print '<th>'.$langs->trans("ThirdParty").'</th>';
821 print '<th class="center">'.$langs->trans("Code").'</th>';
822 print '<th class="center">'.$langs->trans("Country").'</th>';
823 print '<th class="center">'.$langs->trans("VATIntra").'</th>';
824 if (isModEnabled('multicurrency')) {
825 print '<th class="center">'.$langs->trans("Currency").'</th>';
826 }
827 print '</tr>';
828
829 if (empty($TData)) {
830 print '<tr class="oddeven"><td colspan="13"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td>';
831 if (isModEnabled('multicurrency')) {
832 print '<td></td>';
833 }
834 print '</tr>';
835 } else {
836 // Sort array by date ASC to calculate balance
837
838 $totalET_debit = 0;
839 $totalIT_debit = 0;
840 $totalVAT_debit = 0;
841 $totalET_credit = 0;
842 $totalIT_credit = 0;
843 $totalVAT_credit = 0;
844
845 // Display array
846 foreach ($TData as $data) {
847 $html_class = '';
848 //if (!empty($data['fk_facture'])) $html_class = 'facid-'.$data['fk_facture'];
849 //elseif (!empty($data['fk_paiement'])) $html_class = 'payid-'.$data['fk_paiement'];
850 print '<tr class="oddeven '.$html_class.'">';
851
852 // Type
853 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($langs->trans($data['item'])).'">'.$langs->trans($data['item']).'</td>';
854
855 // Date
856 print '<td class="center">';
857 print dol_print_date($data['date'], 'day');
858 print "</td>\n";
859
860 // Date due
861 print '<td class="center">';
862 print dol_print_date($data['date_due'], 'day');
863 print "</td>\n";
864
865 // Ref
866 print '<td class="nowraponall tdoverflowmax150">';
867
868 if ($data['item'] == 'Invoice') {
869 $invoice->id = (int) $data['id'];
870 $invoice->ref = $data['ref'];
871 $invoice->total_ht = $data['amount_ht'];
872 $invoice->total_ttc = $data['amount_ttc'];
873 $invoice->total_tva = $data['amount_vat'];
874 $invoice->total_localtax1 = $data['amount_localtax1'];
875 $invoice->total_localtax2 = $data['amount_localtax2'];
876 $invoice->revenuestamp = $data['amount_revenuestamp'];
877 $invoice->multicurrency_code = $data['currency'];
878 print $invoice->getNomUrl(1, '', 0, 0, '', 0, 0, 0);
879 } elseif ($data['item'] == 'SupplierInvoice') {
880 $supplier_invoice->id = (int) $data['id'];
881 $supplier_invoice->ref = $data['ref'];
882 $supplier_invoice->total_ht = $data['amount_ht'];
883 $supplier_invoice->total_ttc = $data['amount_ttc'];
884 $supplier_invoice->total_tva = $data['amount_vat'];
885 $supplier_invoice->total_localtax1 = $data['amount_localtax1'];
886 $supplier_invoice->total_localtax2 = $data['amount_localtax2'];
887 $supplier_invoice->revenuestamp = $data['amount_revenuestamp'];
888 $supplier_invoice->multicurrency_code = $data['currency'];
889 print $supplier_invoice->getNomUrl(1, '', 0, 0, '', 0, 0, 0);
890 } elseif ($data['item'] == 'ExpenseReport') {
891 $expensereport->id = (int) $data['id'];
892 $expensereport->ref = $data['ref'];
893 print $expensereport->getNomUrl(1, '0', 0, 0, '0', 0);
894 } elseif ($data['item'] == 'SalaryPayment') {
895 $salary_payment->id = (int) $data['id'];
896 $salary_payment->ref = $data['ref'];
897 print $salary_payment->getNomUrl(1);
898 } elseif ($data['item'] == 'Donation') {
899 $don->id = (int) $data['id'];
900 $don->ref = $data['ref'];
901 print $don->getNomUrl(1, 0, '', 0);
902 } elseif ($data['item'] == 'SocialContributions') {
903 $charge_sociales->id = (int) $data['id'];
904 $charge_sociales->ref = $data['ref'];
905 print $charge_sociales->getNomUrl(1, '0', 0, 0, 0);
906 } elseif ($data['item'] == 'VariousPayment') {
907 $various_payment->id = (int) $data['id'];
908 $various_payment->ref = $data['ref'];
909 print $various_payment->getNomUrl(1, '', 0, 0);
910 } elseif ($data['item'] == 'LoanPayment') {
911 $payment_loan->id = (int) $data['id'];
912 $payment_loan->ref = $data['ref'];
913 print $payment_loan->getNomUrl(1, 0, 0, '', 0);
914 } else {
915 print $data['ref'];
916 }
917 print '</td>';
918
919 // File link
920 print '<td class="tdoverflowmax150">';
921 if (!empty($data['files'])) {
922 foreach ($data['files'] as $id => $filecursor) {
923 $tmppreview = $formfile->showPreview($filecursor, $filecursor['modulepart'], $filecursor['subdir'].'/'.$filecursor['name'], 0);
924 if ($tmppreview) {
925 print $tmppreview;
926 }
927 $filename = ($filecursor['name'] ? $filecursor['name'] : $filecursor['ref']);
928 print '<a href='.DOL_URL_ROOT.'/'.$filecursor['link'].' target="_blank" rel="noopener noreferrer" title="'.dol_escape_htmltag($filename).'">';
929 if (empty($tmppreview)) {
930 print img_picto('', 'generic', '', 0, 0, 0, '', 'pictonopreview pictofixedwidth paddingright');
931 }
932 print $filename;
933 print '</a><br>';
934 }
935 }
936 print "</td>\n";
937
938 // Paid
939 print '<td class="center">'.($data['paid'] ? yn($data['paid']) : '').'</td>';
940
941 // Total WOT
942 print '<td class="right"><span class="amount">'.price(price2num($data['sens'] ? $data['amount_ht'] : -$data['amount_ht'], 'MT'))."</span></td>\n";
943 // Total INCT
944 print '<td class="right"><span class="amount">';
945 $tooltip = $langs->trans("TotalVAT").' : '.price(price2num($data['sens'] ? $data['amount_vat'] : -$data['amount_vat'], 'MT'));
946 if (!empty($data['amount_localtax1'])) {
947 $tooltip .= '<br>'.$langs->transcountrynoentities("TotalLT1", $mysoc->country_code).' : '.price(price2num($data['sens'] ? $data['amount_localtax1'] : -$data['amount_localtax1'], 'MT'));
948 }
949 if (!empty($data['amount_localtax2'])) {
950 $tooltip .= '<br>'.$langs->transcountrynoentities("TotalLT2", $mysoc->country_code).' : '.price(price2num($data['sens'] ? $data['amount_localtax2'] : -$data['amount_localtax2'], 'MT'));
951 }
952 if (!empty($data['amount_revenuestamp'])) {
953 $tooltip .= '<br>'.$langs->trans("RevenueStamp").' : '.price(price2num($data['sens'] ? $data['amount_revenuestamp'] : -$data['amount_revenuestamp'], 'MT'));
954 }
955 print '<span class="classfortooltip" title="'.dol_escape_htmltag($tooltip).'">'.price(price2num($data['sens'] ? $data['amount_ttc'] : -$data['amount_ttc'], 'MT')).'</span>';
956 print "</span></td>\n";
957 // Total VAT
958 print '<td class="right"><span class="amount">'.price(price2num($data['sens'] ? $data['amount_vat'] : -$data['amount_vat'], 'MT'))."</span></td>\n";
959
960 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($data['thirdparty_name']).'">'.dol_escape_htmltag($data['thirdparty_name'])."</td>\n";
961
962 print '<td class="center">'.$data['thirdparty_code']."</td>\n";
963
964 print '<td class="center">'.$data['country_code']."</td>\n";
965
966 // VAT number
967 print '<td class="tdoverflowmax150 right" title="'.dol_escape_htmltag($data['vatnum']).'">'.dol_escape_htmltag($data['vatnum'])."</td>\n";
968
969 if ($data['sens']) {
970 $totalET_credit += $data['amount_ht'];
971 $totalIT_credit += $data['amount_ttc'];
972 $totalVAT_credit += $data['amount_vat'];
973 } else {
974 $totalET_debit -= $data['amount_ht'];
975 $totalIT_debit -= $data['amount_ttc'];
976 $totalVAT_debit -= $data['amount_vat'];
977 }
978
979 if (isModEnabled('multicurrency')) {
980 print '<td class="center">'.$data['currency']."</td>\n";
981 }
982
983 print "</tr>\n";
984 }
985
986 // Total credits
987 print '<tr class="liste_total">';
988 print '<td colspan="6" class="right">'.$langs->trans('Total').' '.$langs->trans('Income').'</td>';
989 print '<td class="right">'.price(price2num($totalET_credit, 'MT')).'</td>';
990 print '<td class="right">'.price(price2num($totalIT_credit, 'MT')).'</td>';
991 print '<td class="right">'.price(price2num($totalVAT_credit, 'MT')).'</td>';
992 print '<td colspan="4"></td>';
993 if (isModEnabled('multicurrency')) {
994 print '<td></td>';
995 }
996 print "</tr>\n";
997 // Total debits
998 print '<tr class="liste_total">';
999 print '<td colspan="6" class="right">'.$langs->trans('Total').' '.$langs->trans('Outcome').'</td>';
1000 print '<td class="right">'.price(price2num($totalET_debit, 'MT')).'</td>';
1001 print '<td class="right">'.price(price2num($totalIT_debit, 'MT')).'</td>';
1002 print '<td class="right">'.price(price2num($totalVAT_debit, 'MT')).'</td>';
1003 print '<td colspan="4"></td>';
1004 if (isModEnabled('multicurrency')) {
1005 print '<td></td>';
1006 }
1007 print "</tr>\n";
1008 // Balance
1009 print '<tr class="liste_total">';
1010 print '<td colspan="6" class="right">'.$langs->trans('Total').'</td>';
1011 print '<td class="right">'.price(price2num($totalET_credit + $totalET_debit, 'MT')).'</td>';
1012 print '<td class="right">'.price(price2num($totalIT_credit + $totalIT_debit, 'MT')).'</td>';
1013 print '<td class="right">'.price(price2num($totalVAT_credit + $totalVAT_debit, 'MT')).'</td>';
1014 print '<td colspan="4"></td>';
1015 if (isModEnabled('multicurrency')) {
1016 print '<td></td>';
1017 }
1018 print "</tr>\n";
1019 }
1020
1021 print "</table>";
1022 print '</div>';
1023}
1024
1025
1026llxFooter();
1027$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class for managing the social charges.
Class to manage donations.
Definition don.class.php:41
Class to manage Trips and Expenses.
const STATUS_DRAFT
Draft status.
Class to manage suppliers invoices.
Class to manage invoices.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class to manage payments of loans.
Class to manage payments of salaries.
Class to manage various payments.
Class to manage projects.
Class to manage Dolibarr users.
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition files.lib.php:65
$date_start
Variables from include:
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
Definition html.lib.php:519
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition html.lib.php:717
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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 html.lib.php:172
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.