dolibarr 20.0.5
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2020 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2004 Christophe Combelles <ccomb@free.fr>
5 * Copyright (C) 2005 Marc Barilley <marc@ocebo.fr>
6 * Copyright (C) 2005-2013 Regis Houssin <regis.houssin@inodbox.com>
7 * Copyright (C) 2010-2023 Juanjo Menent <jmenent@simnandez.es>
8 * Copyright (C) 2013-2022 Philippe Grand <philippe.grand@atoo-net.com>
9 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
10 * Copyright (C) 2014-2016 Marcos García <marcosgdf@gmail.com>
11 * Copyright (C) 2016-2023 Alexandre Spangaro <aspangaro@open-dsi.fr>
12 * Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
13 * Copyright (C) 2019 Ferran Marcet <fmarcet@2byte.es>
14 * Copyright (C) 2022 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
15 * Copyright (C) 2023 Nick Fragoulis
16 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
17 *
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 3 of the License, or
21 * (at your option) any later version.
22 *
23 * This program is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
27 *
28 * You should have received a copy of the GNU General Public License
29 * along with this program. If not, see <https://www.gnu.org/licenses/>.
30 */
31
38// Load Dolibarr environment
39require '../../main.inc.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
41require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_invoice/modules_facturefournisseur.php';
43require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
44require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture-rec.class.php';
45require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
46require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
47require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php';
48require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
49require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
50require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
51if (isModEnabled("product")) {
52 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
53 require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
54}
55if (isModEnabled('project')) {
56 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
57 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
58}
59
60if (isModEnabled('variants')) {
61 require_once DOL_DOCUMENT_ROOT.'/variants/class/ProductCombination.class.php';
62}
63if (isModEnabled('accounting')) {
64 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
65}
66
67
68$langs->loadLangs(array('bills', 'compta', 'suppliers', 'companies', 'products', 'banks', 'admin'));
69if (isModEnabled('incoterm')) {
70 $langs->load('incoterm');
71}
72
73$id = (GETPOSTINT('facid') ? GETPOSTINT('facid') : GETPOSTINT('id'));
74
75$action = GETPOST('action', 'aZ09');
76$confirm = GETPOST("confirm");
77$ref = GETPOST('ref', 'alpha');
78$cancel = GETPOST('cancel', 'alpha');
79$backtopage = GETPOST('backtopage', 'alpha');
80$backtopageforcancel = '';
81
82$lineid = GETPOSTINT('lineid');
83$projectid = GETPOSTINT('projectid');
84$origin = GETPOST('origin', 'alpha');
85$originid = GETPOSTINT('originid');
86$fac_recid = GETPOSTINT('fac_rec');
87$rank = (GETPOSTINT('rank') > 0) ? GETPOSTINT('rank') : -1;
88
89// PDF
90$hidedetails = (GETPOSTINT('hidedetails') ? GETPOSTINT('hidedetails') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS') ? 1 : 0));
91$hidedesc = (GETPOSTINT('hidedesc') ? GETPOSTINT('hidedesc') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DESC') ? 1 : 0));
92$hideref = (GETPOSTINT('hideref') ? GETPOSTINT('hideref') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_REF') ? 1 : 0));
93
94// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
95$hookmanager->initHooks(array('invoicesuppliercard', 'globalcard'));
96
98$extrafields = new ExtraFields($db);
99
100// fetch optionals attributes and labels
101$extrafields->fetch_name_optionals_label($object->table_element);
102
103// Load object
104if ($id > 0 || !empty($ref)) {
105 $ret = $object->fetch($id, $ref);
106 if ($ret < 0) {
107 dol_print_error($db, $object->error);
108 }
109 $ret = $object->fetch_thirdparty();
110 if ($ret < 0) {
111 dol_print_error($db, $object->error);
112 }
113}
114
115// Security check
116$socid = GETPOSTINT('socid');
117if (!empty($user->socid)) {
118 $socid = $user->socid;
119}
120
121$isdraft = (($object->status == FactureFournisseur::STATUS_DRAFT) ? 1 : 0);
122$result = restrictedArea($user, 'fournisseur', $id, 'facture_fourn', 'facture', 'fk_soc', 'rowid', $isdraft);
123
124// Common permissions
125$usercanread = ($user->hasRight("fournisseur", "facture", "lire") || $user->hasRight("supplier_invoice", "lire"));
126$usercancreate = ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"));
127$usercandelete = ($user->hasRight("fournisseur", "facture", "supprimer") || $user->hasRight("supplier_invoice", "supprimer"));
128$usercancreatecontract = $user->hasRight("contrat", "creer");
129
130// Advanced permissions
131$usercanvalidate = ((!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !empty($usercancreate)) || (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight("fournisseur", "supplier_invoice_advance", "validate")));
132$usercansend = (!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') || $user->hasRight("fournisseur", "supplier_invoice_advance", "send"));
133
134// Permissions for includes
135$permissionnote = $usercancreate; // Used by the include of actions_setnotes.inc.php
136$permissiondellink = $usercancreate; // Used by the include of actions_dellink.inc.php
137$permissiontoedit = $usercancreate; // Used by the include of actions_lineupdown.inc.php
138$permissiontoadd = $usercancreate; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
139$permissiontodelete = $usercandelete;
140
141$error = 0;
142
143
144/*
145 * Actions
146 */
147
148$parameters = array('socid' => $socid);
149$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
150if ($reshook < 0) {
151 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
152}
153
154if (empty($reshook)) {
155 $backurlforlist = DOL_URL_ROOT.'/fourn/facture/list.php';
156
157 if (empty($backtopage) || ($cancel && empty($id))) {
158 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
159 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
160 $backtopage = $backurlforlist;
161 } else {
162 $backtopage = DOL_URL_ROOT.'/fourn/facture/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
163 }
164 }
165 }
166
167 if ($cancel) {
168 if (!empty($backtopageforcancel)) {
169 header("Location: ".$backtopageforcancel);
170 exit;
171 } elseif (!empty($backtopage)) {
172 header("Location: ".$backtopage);
173 exit;
174 }
175 $action = '';
176 }
177
178 include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once
179
180 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once
181
182 include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once
183
184 // Link invoice to order
185 if (GETPOST('linkedOrder') && empty($cancel) && $id > 0 && $permissiontoadd) {
186 $object->fetch($id);
187 $object->fetch_thirdparty();
188 $result = $object->add_object_linked('order_supplier', GETPOST('linkedOrder'));
189 }
190
191 // Action clone object
192 if ($action == 'confirm_clone' && $confirm == 'yes' && $permissiontoadd) {
193 $objectutil = dol_clone($object, 1); // To avoid to denaturate loaded object when setting some properties for clone. We use native clone to keep this->db valid.
194 '@phan-var-force FactureFournisseur $objectutil'; // Same object type for cloned object
195
196 if (GETPOST('newsupplierref', 'alphanohtml')) {
197 $objectutil->ref_supplier = GETPOST('newsupplierref', 'alphanohtml');
198 }
199 $objectutil->date = dol_mktime(12, 0, 0, GETPOSTINT('newdatemonth'), GETPOSTINT('newdateday'), GETPOSTINT('newdateyear'));
200
201 $result = $objectutil->createFromClone($user, $id);
202 if ($result > 0) {
203 header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
204 exit;
205 } else {
206 $langs->load("errors");
207 setEventMessages($objectutil->error, $objectutil->errors, 'errors');
208 $action = '';
209 }
210 } elseif ($action == 'confirm_valid' && $confirm == 'yes' && $usercanvalidate) {
211 $idwarehouse = GETPOST('idwarehouse');
212
213 $object->fetch($id);
214 $object->fetch_thirdparty();
215
216 $qualified_for_stock_change = 0;
217 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
218 $qualified_for_stock_change = $object->hasProductsOrServices(2);
219 } else {
220 $qualified_for_stock_change = $object->hasProductsOrServices(1);
221 }
222
223 // Check parameters
224 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_BILL') && $qualified_for_stock_change) {
225 $langs->load("stocks");
226 if (!$idwarehouse || $idwarehouse == -1) {
227 $error++;
228 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors');
229 $action = '';
230 }
231 }
232
233 if (!$error) {
234 $db->begin();
235
236 $result = $object->validate($user, '', $idwarehouse);
237 if ($result < 0) {
238 $db->rollback();
239
240 setEventMessages($object->error, $object->errors, 'errors');
241 } else {
242 $db->commit();
243
244 // Define output language
245 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
246 $outputlangs = $langs;
247 $newlang = '';
248 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
249 $newlang = GETPOST('lang_id', 'aZ09');
250 }
251 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
252 $newlang = $object->thirdparty->default_lang;
253 }
254 if (!empty($newlang)) {
255 $outputlangs = new Translate("", $conf);
256 $outputlangs->setDefaultLang($newlang);
257 }
258 $model = $object->model_pdf;
259 $ret = $object->fetch($id); // Reload to get new records
260
261 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
262 if ($result < 0) {
263 dol_print_error($db, $result);
264 }
265 }
266 }
267 }
268 } elseif ($action == 'confirm_delete' && $confirm == 'yes' && $permissiontodelete) {
269 $object->fetch($id);
270 $object->fetch_thirdparty();
271
272 $isErasable = $object->is_erasable();
273
274 if (($usercandelete && $isErasable > 0) || ($usercancreate && $isErasable == 1)) {
275 $revertstock = GETPOST('revertstock');
276
277 if ($revertstock) {
278 $idwarehouse = GETPOST('idwarehouse');
279
280 $qualified_for_stock_change = 0;
281 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
282 $qualified_for_stock_change = $object->hasProductsOrServices(2);
283 } else {
284 $qualified_for_stock_change = $object->hasProductsOrServices(1);
285 }
286
287 // Check parameters
288 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_BILL') && $qualified_for_stock_change) {
289 $langs->load("stocks");
290 if (!$idwarehouse || $idwarehouse == -1) {
291 $error++;
292 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors');
293 $action = 'delete';
294 } else {
295 $result = $object->setDraft($user, $idwarehouse);
296 if ($result < 0) {
297 $error++;
298 }
299 }
300 }
301 }
302
303 if (!$error) {
304 $result = $object->delete($user);
305 if ($result > 0) {
306 header('Location: list.php?restore_lastsearch_values=1');
307 exit;
308 } else {
309 setEventMessages($object->error, $object->errors, 'errors');
310 }
311 }
312 }
313 } elseif ($action == 'confirm_deleteline' && $confirm == 'yes' && $usercancreate) {
314 // Remove a product line
315 $result = $object->deleteLine($lineid);
316 if ($result > 0) {
317 // reorder lines
318 $object->line_order(true);
319 // Define output language
320 /*$outputlangs = $langs;
321 $newlang = '';
322 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id','aZ09'))
323 $newlang = GETPOST('lang_id','aZ09');
324 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang))
325 $newlang = $object->thirdparty->default_lang;
326 if (!empty($newlang)) {
327 $outputlangs = new Translate("", $conf);
328 $outputlangs->setDefaultLang($newlang);
329 }
330 if (!getDolGlobalStringempty('MAIN_DISABLE_PDF_AUTOUPDATE')) {
331 $ret = $object->fetch($object->id); // Reload to get new records
332 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
333 }*/
334
335 header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
336 exit;
337 } else {
338 setEventMessages($object->error, $object->errors, 'errors');
339 /* Fix bug 1485 : Reset action to avoid asking again confirmation on failure */
340 $action = '';
341 }
342 } elseif ($action == 'unlinkdiscount' && $usercancreate) {
343 // Delete link of credit note to invoice
344 $discount = new DiscountAbsolute($db);
345 $result = $discount->fetch(GETPOSTINT("discountid"));
346 $discount->unlink_invoice();
347 } elseif ($action == 'confirm_paid' && $confirm == 'yes' && $usercancreate) {
348 $object->fetch($id);
349 $result = $object->setPaid($user);
350 if ($result < 0) {
351 setEventMessages($object->error, $object->errors, 'errors');
352 }
353 } elseif ($action == 'confirm_paid_partially' && $confirm == 'yes' && $usercancreate) {
354 // Classif "paid partially"
355 $object->fetch($id);
356 $close_code = GETPOST("close_code", 'restricthtml');
357 $close_note = GETPOST("close_note", 'restricthtml');
358 if ($close_code) {
359 $result = $object->setPaid($user, $close_code, $close_note);
360 if ($result < 0) {
361 setEventMessages($object->error, $object->errors, 'errors');
362 }
363 } else {
364 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Reason")), null, 'errors');
365 }
366 } elseif ($action == 'confirm_canceled' && $confirm == 'yes' && $usercancreate) {
367 // Classify "abandoned"
368 $object->fetch($id);
369 $close_code = GETPOST("close_code", 'restricthtml');
370 $close_note = GETPOST("close_note", 'restricthtml');
371 if ($close_code) {
372 $result = $object->setCanceled($user, $close_code, $close_note);
373 if ($result < 0) {
374 setEventMessages($object->error, $object->errors, 'errors');
375 }
376 } else {
377 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Reason")), null, 'errors');
378 }
379 }
380
381 // Set supplier ref
382 if ($action == 'setref_supplier' && $usercancreate) {
383 $object->ref_supplier = GETPOST('ref_supplier', 'alpha');
384
385 if ($object->update($user) < 0) {
386 setEventMessages($object->error, $object->errors, 'errors');
387 } else {
388 // Define output language
389 $outputlangs = $langs;
390 $newlang = '';
391 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
392 $newlang = GETPOST('lang_id', 'aZ09');
393 }
394 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
395 $newlang = $object->thirdparty->default_lang;
396 }
397 if (!empty($newlang)) {
398 $outputlangs = new Translate("", $conf);
399 $outputlangs->setDefaultLang($newlang);
400 }
401 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
402 $ret = $object->fetch($object->id); // Reload to get new records
403 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
404 }
405 }
406 }
407
408 // payments conditions
409 if ($action == 'setconditions' && $usercancreate) {
410 $object->fetch($id);
411 $object->cond_reglement_code = 0; // To clean property
412 $object->cond_reglement_id = 0; // To clean property
413
414 $error = 0;
415
416 $db->begin();
417
418 if (!$error) {
419 $result = $object->setPaymentTerms(GETPOSTINT('cond_reglement_id'));
420 if ($result < 0) {
421 $error++;
422 setEventMessages($object->error, $object->errors, 'errors');
423 }
424 }
425
426 if (!$error) {
427 $new_date_echeance = $object->calculate_date_lim_reglement();
428 if ($new_date_echeance) {
429 $object->date_echeance = $new_date_echeance;
430 }
431 if ($object->date_echeance < $object->date) {
432 $object->date_echeance = $object->date;
433 }
434 $result = $object->update($user);
435 if ($result < 0) {
436 $error++;
437 setEventMessages($object->error, $object->errors, 'errors');
438 }
439 }
440
441 if ($error) {
442 $db->rollback();
443 } else {
444 $db->commit();
445 }
446 } elseif ($action == 'set_incoterms' && isModEnabled('incoterm') && $usercancreate) {
447 // Set incoterm
448 $result = $object->setIncoterms(GETPOSTINT('incoterm_id'), GETPOST('location_incoterms'));
449 } elseif ($action == 'setmode' && $usercancreate) {
450 // payment mode
451 $result = $object->setPaymentMethods(GETPOSTINT('mode_reglement_id'));
452 } elseif ($action == 'setmulticurrencycode' && $usercancreate) {
453 // Multicurrency Code
454 $result = $object->setMulticurrencyCode(GETPOST('multicurrency_code', 'alpha'));
455 } elseif ($action == 'setmulticurrencyrate' && $usercancreate) {
456 // Multicurrency rate
457 $result = $object->setMulticurrencyRate(price2num(GETPOST('multicurrency_tx', 'alpha')), GETPOSTINT('calculation_mode'));
458 } elseif ($action == 'setbankaccount' && $usercancreate) {
459 // bank account
460 $result = $object->setBankAccount(GETPOSTINT('fk_account'));
461 } elseif ($action == 'setvatreversecharge' && $usercancreate) {
462 // vat reverse charge
463 $vatreversecharge = GETPOST('vat_reverse_charge') == 'on' ? 1 : 0;
464 $result = $object->setVATReverseCharge($vatreversecharge);
465 }
466
467 if ($action == 'settransportmode' && $usercancreate) {
468 // transport mode
469 $result = $object->setTransportMode(GETPOSTINT('transport_mode_id'));
470 } elseif ($action == 'setlabel' && $usercancreate) {
471 // Set label
472 $object->fetch($id);
473 $object->label = GETPOST('label');
474 $result = $object->update($user);
475 if ($result < 0) {
476 dol_print_error($db);
477 }
478 } elseif ($action == 'setdatef' && $usercancreate) {
479 $newdate = dol_mktime(0, 0, 0, GETPOSTINT('datefmonth'), GETPOSTINT('datefday'), GETPOSTINT('datefyear'), 'tzserver');
480 if ($newdate > (dol_now('tzuserrel') + getDolGlobalInt('INVOICE_MAX_FUTURE_DELAY'))) {
481 if (!getDolGlobalString('INVOICE_MAX_FUTURE_DELAY')) {
482 setEventMessages($langs->trans("WarningInvoiceDateInFuture"), null, 'warnings');
483 } else {
484 setEventMessages($langs->trans("WarningInvoiceDateTooFarInFuture"), null, 'warnings');
485 }
486 }
487
488 $object->fetch($id);
489
490 $object->date = $newdate;
491 $date_echence_calc = $object->calculate_date_lim_reglement();
492 if (!empty($object->date_echeance)) {
493 $object->date_echeance = $date_echence_calc;
494 }
495 if ($object->date_echeance && $object->date_echeance < $object->date) {
496 $object->date_echeance = $object->date;
497 }
498
499 $result = $object->update($user);
500 if ($result < 0) {
501 dol_print_error($db, $object->error);
502 }
503 } elseif ($action == 'setdate_lim_reglement' && $usercancreate) {
504 $object->fetch($id);
505 $object->date_echeance = dol_mktime(12, 0, 0, GETPOSTINT('date_lim_reglementmonth'), GETPOSTINT('date_lim_reglementday'), GETPOSTINT('date_lim_reglementyear'));
506 if (!empty($object->date_echeance) && $object->date_echeance < $object->date) {
507 $object->date_echeance = $object->date;
508 setEventMessages($langs->trans("DatePaymentTermCantBeLowerThanObjectDate"), null, 'warnings');
509 }
510 $result = $object->update($user);
511 if ($result < 0) {
512 dol_print_error($db, $object->error);
513 }
514 } elseif ($action == "setabsolutediscount" && $usercancreate) {
515 $db->begin();
516 // We use the credit to reduce amount of invoice
517 if (GETPOSTINT("remise_id")) {
518 $ret = $object->fetch($id);
519 if ($ret > 0) {
520 $result = $object->insert_discount(GETPOSTINT("remise_id"));
521 if ($result < 0) {
522 setEventMessages($object->error, $object->errors, 'errors');
523 }
524 } else {
525 dol_print_error($db, $object->error);
526 }
527 }
528 // We use the credit to reduce remain to pay
529 if (GETPOSTINT("remise_id_for_payment")) {
530 require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
531 $discount = new DiscountAbsolute($db);
532 $discount->fetch(GETPOSTINT("remise_id_for_payment"));
533
534 //var_dump($object->getRemainToPay(0));
535 //var_dump($discount->amount_ttc);exit;
536 $remaintopay = $object->getRemainToPay(0);
537 if (price2num($discount->amount_ttc) > price2num($remaintopay)) {
538 // TODO Split the discount in 2 automatically
539 $error++;
540 setEventMessages($langs->trans("ErrorDiscountLargerThanRemainToPaySplitItBefore"), null, 'errors');
541 }
542
543 if (!$error) {
544 $result = $discount->link_to_invoice(0, $id);
545 if ($result < 0) {
546 $error++;
547 setEventMessages($discount->error, $discount->errors, 'errors');
548 }
549 }
550 if (!$error) {
551 $newremaintopay = $object->getRemainToPay(0);
552 if ($newremaintopay == 0) {
553 $object->setPaid($user);
554 }
555 }
556 }
557 if (!$error) {
558 $db->commit();
559 } else {
560 $db->rollback();
561 }
562 if (empty($error) && !getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
563 $outputlangs = $langs;
564 $newlang = '';
565 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
566 $newlang = GETPOST('lang_id', 'aZ09');
567 }
568 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
569 $newlang = $object->thirdparty->default_lang;
570 }
571 if (!empty($newlang)) {
572 $outputlangs = new Translate("", $conf);
573 $outputlangs->setDefaultLang($newlang);
574 }
575 $ret = $object->fetch($id); // Reload to get new records
576
577 $result = $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
578 if ($result < 0) {
579 setEventMessages($object->error, $object->errors, 'errors');
580 }
581 }
582 } elseif ($action == 'confirm_converttoreduc' && $confirm == 'yes' && $usercancreate) {
583 // Convertir en reduc
584 $object->fetch($id);
585 $object->fetch_thirdparty();
586 //$object->fetch_lines(); // Already done into fetch
587
588 // Check if there is already a discount (protection to avoid duplicate creation when resubmit post)
589 $discountcheck = new DiscountAbsolute($db);
590 $result = $discountcheck->fetch(0, 0, $object->id);
591
592 $canconvert = 0;
593 if ($object->type == FactureFournisseur::TYPE_DEPOSIT && empty($discountcheck->id)) {
594 $canconvert = 1; // we can convert deposit into discount if deposit is paid (completely, partially or not at all) and not already converted (see real condition into condition used to show button converttoreduc)
595 }
596 if (($object->type == FactureFournisseur::TYPE_CREDIT_NOTE || $object->type == FactureFournisseur::TYPE_STANDARD) && $object->paid == 0 && empty($discountcheck->id)) {
597 $canconvert = 1; // we can convert credit note into discount if credit note is not refunded completely and not already converted and amount of payment is 0 (see also the real condition used as the condition to show button converttoreduc)
598 }
599 if ($canconvert) {
600 $db->begin();
601
602 $amount_ht = $amount_tva = $amount_ttc = array();
603 $multicurrency_amount_ht = $multicurrency_amount_tva = $multicurrency_amount_ttc = array();
604
605 // Loop on each vat rate
606 $i = 0;
607 foreach ($object->lines as $line) {
608 if ($line->product_type < 9 && $line->total_ht != 0) { // Remove lines with product_type greater than or equal to 9 and no need to create discount if amount is null
609 $keyforvatrate = $line->tva_tx.($line->vat_src_code ? ' ('.$line->vat_src_code.')' : '');
610
611 $amount_ht[$keyforvatrate] += $line->total_ht;
612 $amount_tva[$keyforvatrate] += $line->total_tva;
613 $amount_ttc[$keyforvatrate] += $line->total_ttc;
614 $multicurrency_amount_ht[$keyforvatrate] += $line->multicurrency_total_ht;
615 $multicurrency_amount_tva[$keyforvatrate] += $line->multicurrency_total_tva;
616 $multicurrency_amount_ttc[$keyforvatrate] += $line->multicurrency_total_ttc;
617 $i++;
618 }
619 }
620 '@phan-var-force array<string,float> $amount_ht
621 @phan-var-force array<string,float> $amount_tva
622 @phan-var-force array<string,float> $amount_ttc
623 @phan-var-force array<string,float> $multicurrency_amount_ht
624 @phan-var-force array<string,float> $multicurrency_amount_tva
625 @phan-var-force array<string,float> $multicurrency_amount_ttc';
626
627 // If some payments were already done, we change the amount to pay using same prorate
628 if (getDolGlobalString('SUPPLIER_INVOICE_ALLOW_REUSE_OF_CREDIT_WHEN_PARTIALLY_REFUNDED') && $object->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
629 $alreadypaid = $object->getSommePaiement(); // This can be not 0 if we allow to create credit to reuse from credit notes partially refunded.
630 if ($alreadypaid && abs($alreadypaid) < abs($object->total_ttc)) {
631 $ratio = abs(($object->total_ttc - $alreadypaid) / $object->total_ttc);
632 foreach ($amount_ht as $vatrate => $val) {
633 $amount_ht[$vatrate] = price2num($amount_ht[$vatrate] * $ratio, 'MU');
634 $amount_tva[$vatrate] = price2num($amount_tva[$vatrate] * $ratio, 'MU');
635 $amount_ttc[$vatrate] = price2num($amount_ttc[$vatrate] * $ratio, 'MU');
636 $multicurrency_amount_ht[$vatrate] = price2num($multicurrency_amount_ht[$vatrate] * $ratio, 'MU');
637 $multicurrency_amount_tva[$vatrate] = price2num($multicurrency_amount_tva[$vatrate] * $ratio, 'MU');
638 $multicurrency_amount_ttc[$vatrate] = price2num($multicurrency_amount_ttc[$vatrate] * $ratio, 'MU');
639 }
640 }
641 }
642 //var_dump($amount_ht);var_dump($amount_tva);var_dump($amount_ttc);exit;
643
644 // Insert one discount by VAT rate category
645 $discount = new DiscountAbsolute($db);
647 $discount->description = '(CREDIT_NOTE)';
648 } elseif ($object->type == FactureFournisseur::TYPE_DEPOSIT) {
649 $discount->description = '(DEPOSIT)';
651 $discount->description = '(EXCESS PAID)';
652 } else {
653 setEventMessages($langs->trans('CantConvertToReducAnInvoiceOfThisType'), null, 'errors');
654 }
655 $discount->discount_type = 1; // Supplier discount
656 $discount->fk_soc = $object->socid;
657 $discount->socid = $object->socid;
658 $discount->fk_invoice_supplier_source = $object->id;
659
660 $error = 0;
661
663 // If we're on a standard invoice, we have to get excess paid to create a discount in TTC without VAT
664
665 // Total payments
666 $sql = 'SELECT SUM(pf.amount) as total_paiements';
667 $sql .= ' FROM '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf, '.MAIN_DB_PREFIX.'paiementfourn as p';
668 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as c ON p.fk_paiement = c.id AND c.entity IN ('.getEntity('c_paiement').')';
669 $sql .= ' WHERE pf.fk_facturefourn = '.((int) $object->id);
670 $sql .= ' AND pf.fk_paiementfourn = p.rowid';
671 $sql .= ' AND p.entity IN ('.getEntity('invoice').')';
672
673 $resql = $db->query($sql);
674 if (!$resql) {
675 dol_print_error($db);
676 }
677
678 $res = $db->fetch_object($resql);
679 $total_paiements = $res->total_paiements;
680
681 // Total credit note and deposit
682 $total_creditnote_and_deposit = 0;
683 $sql = "SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc,";
684 $sql .= " re.description, re.fk_invoice_supplier_source";
685 $sql .= " FROM ".MAIN_DB_PREFIX."societe_remise_except as re";
686 $sql .= " WHERE fk_invoice_supplier = ".((int) $object->id);
687 $resql = $db->query($sql);
688 if (!empty($resql)) {
689 while ($obj = $db->fetch_object($resql)) {
690 $total_creditnote_and_deposit += $obj->amount_ttc;
691 }
692 } else {
693 dol_print_error($db);
694 }
695
696 $discount->amount_ht = $discount->amount_ttc = $total_paiements + $total_creditnote_and_deposit - $object->total_ttc;
697 $discount->amount_tva = 0;
698 $discount->tva_tx = 0;
699 $discount->vat_src_code = '';
700
701 $result = $discount->create($user);
702 if ($result < 0) {
703 $error++;
704 }
705 }
707 foreach ($amount_ht as $tva_tx => $xxx) {
708 $discount->amount_ht = abs((float) $amount_ht[$tva_tx]);
709 $discount->amount_tva = abs((float) $amount_tva[$tva_tx]);
710 $discount->amount_ttc = abs((float) $amount_ttc[$tva_tx]);
711 $discount->multicurrency_amount_ht = abs((float) $multicurrency_amount_ht[$tva_tx]);
712 $discount->multicurrency_amount_tva = abs((float) $multicurrency_amount_tva[$tva_tx]);
713 $discount->multicurrency_amount_ttc = abs((float) $multicurrency_amount_ttc[$tva_tx]);
714
715 // Clean vat code
716 $reg = array();
717 $vat_src_code = '';
718 if (preg_match('/\‍((.*)\‍)/', $tva_tx, $reg)) {
719 $vat_src_code = $reg[1];
720 $tva_tx = preg_replace('/\s*\‍(.*\‍)/', '', $tva_tx); // Remove code into vatrate.
721 }
722
723 $discount->tva_tx = abs((float) $tva_tx);
724 $discount->vat_src_code = $vat_src_code;
725
726 $result = $discount->create($user);
727 if ($result < 0) {
728 $error++;
729 break;
730 }
731 }
732 }
733
734 if (empty($error)) {
736 // Set invoice as paid
737 $result = $object->setPaid($user);
738 if ($result >= 0) {
739 $db->commit();
740 } else {
741 setEventMessages($object->error, $object->errors, 'errors');
742 $db->rollback();
743 }
744 } else {
745 $db->commit();
746 }
747 } else {
748 setEventMessages($discount->error, $discount->errors, 'errors');
749 $db->rollback();
750 }
751 }
752 } elseif ($action == 'confirm_delete_paiement' && $confirm == 'yes' && $usercancreate) {
753 // Delete payment
754 $object->fetch($id);
755 if ($object->status == FactureFournisseur::STATUS_VALIDATED && $object->paid == 0) {
756 $paiementfourn = new PaiementFourn($db);
757 $result = $paiementfourn->fetch(GETPOST('paiement_id'));
758 if ($result > 0) {
759 $result = $paiementfourn->delete($user);
760 if ($result > 0) {
761 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
762 exit;
763 }
764 }
765 if ($result < 0) {
766 setEventMessages($paiementfourn->error, $paiementfourn->errors, 'errors');
767 }
768 }
769 } elseif ($action == 'add' && $usercancreate) {
770 // Insert new invoice in database
771 if ($socid > 0) {
772 $object->socid = GETPOSTINT('socid');
773 }
774 $selectedLines = GETPOST('toselect', 'array');
775
776 $db->begin();
777
778 $error = 0;
779 $tmpproject = 0; // Ensure a value
780
781 // Fill array 'array_options' with data from add form
782 $ret = $extrafields->setOptionalsFromPost(null, $object);
783 if ($ret < 0) {
784 $error++;
785 }
786
787 $dateinvoice = dol_mktime(0, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'), 'tzserver'); // If we enter the 02 january, we need to save the 02 january for server
788 $datedue = dol_mktime(0, 0, 0, GETPOSTINT('echmonth'), GETPOSTINT('echday'), GETPOSTINT('echyear'), 'tzserver');
789 //var_dump($dateinvoice.' '.dol_print_date($dateinvoice, 'dayhour'));
790 //var_dump(dol_now('tzuserrel').' '.dol_get_last_hour(dol_now('tzuserrel')).' '.dol_print_date(dol_now('tzuserrel'),'dayhour').' '.dol_print_date(dol_get_last_hour(dol_now('tzuserrel')), 'dayhour'));
791 //var_dump($db->idate($dateinvoice));
792 //exit;
793
794 // Replacement invoice
795 if (GETPOSTINT('type') === '') {
796 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors');
797 $error++;
798 }
799
801 if (empty($dateinvoice)) {
802 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('DateInvoice')), null, 'errors');
803 $action = 'create';
804 //$_GET['socid'] = $_POST['socid'];
805 $error++;
806 } elseif ($dateinvoice > (dol_get_last_hour(dol_now('tzuserrel')) + getDolGlobalInt('INVOICE_MAX_FUTURE_DELAY'))) {
807 $error++;
808 setEventMessages($langs->trans("ErrorDateIsInFuture"), null, 'errors');
809 $action = 'create';
810 }
811
812 if (!(GETPOSTINT('fac_replacement') > 0)) {
813 $error++;
814 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ReplaceInvoice")), null, 'errors');
815 }
816
817 if (!$error) {
818 // This is a replacement invoice
819 $result = $object->fetch(GETPOSTINT('fac_replacement'));
820 $object->fetch_thirdparty();
821
822 $object->ref = GETPOST('ref', 'alphanohtml');
823 $object->ref_supplier = GETPOST('ref_supplier', 'alpha');
824 $object->socid = GETPOSTINT('socid');
825 $object->label = GETPOST('label', 'alphanohtml');
826 $object->libelle = $object->label; // deprecated
827 $object->date = $dateinvoice;
828 $object->date_echeance = $datedue;
829 $object->note_public = GETPOST('note_public', 'restricthtml');
830 $object->note_private = GETPOST('note_private', 'restricthtml');
831 $object->cond_reglement_id = GETPOSTINT('cond_reglement_id');
832 $object->mode_reglement_id = GETPOSTINT('mode_reglement_id');
833 $object->fk_account = GETPOSTINT('fk_account');
834 $object->vat_reverse_charge = GETPOST('vat_reverse_charge') == 'on' ? 1 : 0;
835 $object->fk_project = ($tmpproject > 0) ? $tmpproject : null;
836 $object->fk_incoterms = GETPOSTINT('incoterm_id');
837 $object->location_incoterms = GETPOST('location_incoterms', 'alpha');
838 $object->multicurrency_code = GETPOST('multicurrency_code', 'alpha');
839 $object->multicurrency_tx = GETPOSTFLOAT('originmulticurrency_tx');
840 $object->transport_mode_id = GETPOSTINT('transport_mode_id');
841
842 // Proprietes particulieres a facture de replacement
843 $object->fk_facture_source = GETPOSTINT('fac_replacement');
845
846 $id = $object->createFromCurrent($user);
847 if ($id <= 0) {
848 $error++;
849 setEventMessages($object->error, $object->errors, 'errors');
850 }
851 }
852 }
853
854 // Credit note invoice
856 $sourceinvoice = GETPOSTINT('fac_avoir');
857 if (!($sourceinvoice > 0) && !getDolGlobalString('INVOICE_CREDIT_NOTE_STANDALONE')) {
858 $error++;
859 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CorrectInvoice")), null, 'errors');
860 }
861 if (GETPOSTINT('socid') < 1) {
862 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('Supplier')), null, 'errors');
863 $action = 'create';
864 $error++;
865 }
866
867 if (empty($dateinvoice)) {
868 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('DateInvoice')), null, 'errors');
869 $action = 'create';
870 //$_GET['socid'] = $_POST['socid'];
871 $error++;
872 } elseif ($dateinvoice > (dol_get_last_hour(dol_now('tzuserrel')) + getDolGlobalInt('INVOICE_MAX_FUTURE_DELAY'))) {
873 $error++;
874 setEventMessages($langs->trans("ErrorDateIsInFuture"), null, 'errors');
875 $action = 'create';
876 }
877
878 if (!GETPOST('ref_supplier')) {
879 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('RefSupplierBill')), null, 'errors');
880 $action = 'create';
881 //$_GET['socid'] = $_POST['socid'];
882 $error++;
883 }
884
885 if (getDolGlobalInt('INVOICE_SUBTYPE_ENABLED') && empty(GETPOST("subtype"))) {
886 $error++;
887 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("InvoiceSubtype")), null, 'errors');
888 $action = 'create';
889 }
890
891 if (!$error) {
892 $tmpproject = GETPOSTINT('projectid');
893
894 // Creation facture
895 $object->ref = GETPOST('ref', 'alphanohtml');
896 $object->ref_supplier = GETPOST('ref_supplier', 'alphanohtml');
897 $object->subtype = GETPOST('subtype', 'alphanohtml');
898 $object->socid = GETPOSTINT('socid');
899 $object->label = GETPOST('label', 'alphanohtml');
900 $object->libelle = $object->label; // Deprecated
901 $object->date = $dateinvoice;
902 $object->date_echeance = $datedue;
903 $object->note_public = GETPOST('note_public', 'restricthtml');
904 $object->note_private = GETPOST('note_private', 'restricthtml');
905 $object->cond_reglement_id = GETPOST('cond_reglement_id');
906 $object->mode_reglement_id = GETPOST('mode_reglement_id');
907 $object->fk_account = GETPOSTINT('fk_account');
908 $object->vat_reverse_charge = GETPOST('vat_reverse_charge') == 'on' ? 1 : 0;
909 $object->fk_project = ($tmpproject > 0) ? $tmpproject : null;
910 $object->fk_incoterms = GETPOSTINT('incoterm_id');
911 $object->location_incoterms = GETPOST('location_incoterms', 'alpha');
912 $object->multicurrency_code = GETPOST('multicurrency_code', 'alpha');
913 $object->multicurrency_tx = GETPOSTFLOAT('originmulticurrency_tx');
914 $object->transport_mode_id = GETPOSTINT('transport_mode_id');
915
916 // Proprietes particulieres a facture avoir
917 $object->fk_facture_source = $sourceinvoice > 0 ? $sourceinvoice : '';
919
920 $id = $object->create($user);
921
922 if ($id <= 0) {
923 $error++;
924 }
925
926 if (GETPOSTINT('invoiceAvoirWithLines') == 1 && $id > 0) {
927 $facture_source = new FactureFournisseur($db); // fetch origin object
928 if ($facture_source->fetch($object->fk_facture_source) > 0) {
929 $fk_parent_line = 0;
930
931 foreach ($facture_source->lines as $line) {
932 // Reset fk_parent_line for no child products and special product
933 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
934 $fk_parent_line = 0;
935 }
936
937 $line->fk_facture_fourn = $object->id;
938 $line->fk_parent_line = $fk_parent_line;
939
940 $line->subprice = -$line->subprice; // invert price for object
941 $line->pa_ht = -$line->pa_ht;
942 $line->total_ht = -$line->total_ht;
943 $line->total_tva = -$line->total_tva;
944 $line->total_ttc = -$line->total_ttc;
945 $line->total_localtax1 = -$line->total_localtax1;
946 $line->total_localtax2 = -$line->total_localtax2;
947
948 $result = $line->insert();
949
950 $object->lines[] = $line; // insert new line in current object
951
952 // Defined the new fk_parent_line
953 if ($result > 0 && $line->product_type == 9) {
954 $fk_parent_line = $result;
955 }
956 }
957
958 $object->update_price(1);
959 }
960 }
961
962 if (GETPOSTINT('invoiceAvoirWithPaymentRestAmount') == 1 && $id > 0) {
963 $facture_source = new FactureFournisseur($db); // fetch origin object if not previously defined
964 if ($facture_source->fetch($object->fk_facture_source) > 0) {
965 $totalpaid = $facture_source->getSommePaiement();
966 $totalcreditnotes = $facture_source->getSumCreditNotesUsed();
967 $totaldeposits = $facture_source->getSumDepositsUsed();
968 $remain_to_pay = abs($facture_source->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits);
969 $desc = $langs->trans('invoiceAvoirLineWithPaymentRestAmount');
970 $retAddLine = $object->addline($desc, $remain_to_pay, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 'TTC');
971
972 if ($retAddLine < 0) {
973 $error++;
974 }
975 }
976 }
977 }
978 } elseif ($fac_recid > 0 && (GETPOST('type') == FactureFournisseur::TYPE_STANDARD || GETPOST('type') == FactureFournisseur::TYPE_DEPOSIT)) {
979 // Standard invoice or Deposit invoice, created from a Predefined template invoice
980 if (empty($dateinvoice)) {
981 $error++;
982 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors');
983 $action = 'create';
984 } elseif ($dateinvoice > (dol_get_last_hour(dol_now('tzuserrel')) + getDolGlobalInt('INVOICE_MAX_FUTURE_DELAY'))) {
985 $error++;
986 setEventMessages($langs->trans("ErrorDateIsInFuture"), null, 'errors');
987 $action = 'create';
988 }
989
990 if (getDolGlobalInt('INVOICE_SUBTYPE_ENABLED') && empty(GETPOST("subtype"))) {
991 $error++;
992 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("InvoiceSubtype")), null, 'errors');
993 $action = 'create';
994 }
995
996 if (!$error) {
997 $object->socid = GETPOSTINT('socid');
998 $object->type = GETPOST('type', 'alphanohtml');
999 $object->subtype = GETPOSTINT('subtype');
1000 $object->ref = GETPOST('ref', 'alphanohtml');
1001 $object->date = $dateinvoice;
1002 $object->note_public = trim(GETPOST('note_public', 'restricthtml'));
1003 $object->note_private = trim(GETPOST('note_private', 'restricthtml'));
1004 $object->ref_supplier = GETPOST('ref_supplier', 'alphanohtml');
1005 $object->model_pdf = GETPOST('model', 'alphanohtml');
1006 $object->fk_project = GETPOSTINT('projectid');
1007 $object->cond_reglement_id = (GETPOSTINT('type') == 3 ? 1 : GETPOST('cond_reglement_id'));
1008 $object->mode_reglement_id = GETPOSTINT('mode_reglement_id');
1009 $object->fk_account = GETPOSTINT('fk_account');
1010 $object->amount = (float) price2num(GETPOST('amount')); // FIXME: FactureFournisseur::$amount is deprecated and not used?
1011 //$object->remise_absolue = price2num(GETPOST('remise_absolue'), 'MU');
1012 //$object->remise_percent = price2num(GETPOST('remise_percent'), '', 2);
1013 $object->fk_incoterms = GETPOSTINT('incoterm_id');
1014 $object->location_incoterms = GETPOST('location_incoterms', 'alpha');
1015 $object->multicurrency_code = GETPOST('multicurrency_code', 'alpha');
1016 $object->multicurrency_tx = GETPOSTFLOAT('originmulticurrency_tx');
1017
1018 // Source facture
1019 $object->fac_rec = $fac_recid;
1020 $fac_rec = new FactureFournisseurRec($db);
1021 $fac_rec->fetch($object->fac_rec);
1022 $fac_rec->fetch_lines();
1023 $object->lines = $fac_rec->lines;
1024
1025 $id = $object->create($user); // This include recopy of links from recurring invoice and recurring invoice lines
1026 }
1027 } elseif ($fac_recid <= 0 && (GETPOST('type') == FactureFournisseur::TYPE_STANDARD || GETPOST('type') == FactureFournisseur::TYPE_DEPOSIT)) {
1028 // Standard invoice or Deposit invoice, not from a Predefined template invoice
1029 if (GETPOSTINT('socid') < 1) {
1030 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('Supplier')), null, 'errors');
1031 $action = 'create';
1032 $error++;
1033 }
1034
1035 if (empty($dateinvoice)) {
1036 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('DateInvoice')), null, 'errors');
1037 $action = 'create';
1038 //$_GET['socid'] = $_POST['socid'];
1039 $error++;
1040 } elseif ($dateinvoice > (dol_get_last_hour(dol_now('tzuserrel')) + getDolGlobalInt('INVOICE_MAX_FUTURE_DELAY'))) {
1041 $error++;
1042 setEventMessages($langs->trans("ErrorDateIsInFuture"), null, 'errors');
1043 $action = 'create';
1044 }
1045
1046 if (!GETPOST('ref_supplier')) {
1047 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('RefSupplierBill')), null, 'errors');
1048 $action = 'create';
1049 //$_GET['socid'] = $_POST['socid'];
1050 $error++;
1051 }
1052
1053 if (getDolGlobalInt('INVOICE_SUBTYPE_ENABLED') && empty(GETPOST("subtype"))) {
1054 $error++;
1055 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("InvoiceSubtype")), null, 'errors');
1056 $action = 'create';
1057 }
1058
1059 if (!$error) {
1060 $tmpproject = GETPOSTINT('projectid');
1061
1062 // Creation invoice
1063 $object->socid = GETPOSTINT('socid');
1064 $object->type = GETPOST('type', 'alphanohtml');
1065 $object->subtype = GETPOSTINT('subtype');
1066 $object->ref = GETPOST('ref', 'alphanohtml');
1067 $object->ref_supplier = GETPOST('ref_supplier', 'alphanohtml');
1068 $object->socid = GETPOSTINT('socid');
1069 $object->label = GETPOST('label', 'alphanohtml');
1070 $object->libelle = $object->label; // deprecated
1071 $object->date = $dateinvoice;
1072 $object->date_echeance = $datedue;
1073 $object->note_public = GETPOST('note_public', 'restricthtml');
1074 $object->note_private = GETPOST('note_private', 'restricthtml');
1075 $object->cond_reglement_id = GETPOST('cond_reglement_id');
1076 $object->mode_reglement_id = GETPOST('mode_reglement_id');
1077 $object->fk_account = GETPOSTINT('fk_account');
1078 $object->vat_reverse_charge = GETPOST('vat_reverse_charge') == 'on' ? 1 : 0;
1079 $object->fk_project = ($tmpproject > 0) ? $tmpproject : null;
1080 $object->fk_incoterms = GETPOSTINT('incoterm_id');
1081 $object->location_incoterms = GETPOST('location_incoterms', 'alpha');
1082 $object->multicurrency_code = GETPOST('multicurrency_code', 'alpha');
1083 $object->multicurrency_tx = GETPOSTFLOAT('originmulticurrency_tx');
1084 $object->transport_mode_id = GETPOSTINT('transport_mode_id');
1085
1086 // Auto calculation of date due if not filled by user
1087 if (empty($object->date_echeance)) {
1088 $object->date_echeance = $object->calculate_date_lim_reglement();
1089 }
1090
1091 $object->fetch_thirdparty();
1092
1093 // If creation from another object of another module
1094 if (!$error && GETPOST('origin', 'alpha') && GETPOST('originid')) {
1095 // Parse element/subelement (ex: project_task)
1096 $element = $subelement = GETPOST('origin', 'alpha');
1097 /*if (preg_match('/^([^_]+)_([^_]+)/i', GETPOST('origin'),$regs))
1098 {
1099 $element = $regs[1];
1100 $subelement = $regs[2];
1101 }*/
1102
1103 // For compatibility
1104 if ($element == 'order') {
1105 $element = $subelement = 'commande';
1106 }
1107 if ($element == 'propal') {
1108 $element = 'comm/propal';
1109 $subelement = 'propal';
1110 }
1111 if ($element == 'contract') {
1112 $element = $subelement = 'contrat';
1113 }
1114 if ($element == 'order_supplier') {
1115 $element = 'fourn';
1116 $subelement = 'fournisseur.commande';
1117 }
1118 if ($element == 'project') {
1119 $element = 'projet';
1120 }
1121 $object->origin = GETPOST('origin', 'alpha');
1122 $object->origin_id = GETPOSTINT('originid');
1123
1124
1125 dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
1126 $classname = ucfirst($subelement);
1127 if ($classname == 'Fournisseur.commande') {
1128 $classname = 'CommandeFournisseur';
1129 }
1130 $objectsrc = new $classname($db);
1131 $objectsrc->fetch($originid);
1132 $objectsrc->fetch_thirdparty();
1133
1134 if (!empty($object->origin) && !empty($object->origin_id)) {
1135 $object->linkedObjectsIds[$object->origin] = $object->origin_id;
1136 }
1137
1138 // Add also link with order if object is reception
1139 if ($object->origin == 'reception') {
1140 $objectsrc->fetchObjectLinked();
1141
1142 if (count($objectsrc->linkedObjectsIds['order_supplier']) > 0) {
1143 foreach ($objectsrc->linkedObjectsIds['order_supplier'] as $key => $value) {
1144 $object->linkedObjectsIds['order_supplier'] = $value;
1145 }
1146 }
1147 }
1148
1149 $id = $object->create($user);
1150
1151 // Add lines
1152 if ($id > 0) {
1153 dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
1154 $classname = ucfirst($subelement);
1155 if ($classname == 'Fournisseur.commande') {
1156 $classname = 'CommandeFournisseur';
1157 }
1158 $srcobject = new $classname($db);
1159
1160 $result = $srcobject->fetch(GETPOSTINT('originid'));
1161
1162 // If deposit invoice - down payment with 1 line (fixed amount or percent)
1163 $typeamount = GETPOST('typedeposit', 'alpha');
1164 if (GETPOST('type') == FactureFournisseur::TYPE_DEPOSIT && in_array($typeamount, array('amount', 'variable'))) {
1165 $valuedeposit = price2num(GETPOST('valuedeposit', 'alpha'), 'MU');
1166
1167 // Define the array $amountdeposit
1168 $amountdeposit = array();
1169 if (getDolGlobalString('MAIN_DEPOSIT_MULTI_TVA')) {
1170 if ($typeamount == 'amount') {
1171 $amount = $valuedeposit;
1172 } else {
1173 $amount = $srcobject->total_ttc * ((float) $valuedeposit / 100);
1174 }
1175
1176 $TTotalByTva = array();
1177 foreach ($srcobject->lines as &$line) {
1178 if (!empty($line->special_code)) {
1179 continue;
1180 }
1181 $TTotalByTva[$line->tva_tx] += $line->total_ttc;
1182 }
1183 '@phan-var-force array<string,float> $TTotalByTva';
1184
1185 $amount_ttc_diff = 0.;
1186 foreach ($TTotalByTva as $tva => &$total) {
1187 $coef = $total / $srcobject->total_ttc; // Calc coef
1188 $am = $amount * $coef;
1189 $amount_ttc_diff += $am;
1190 $amountdeposit[$tva] += $am / (1 + $tva / 100); // Convert into HT for the addline
1191 }
1192 } else {
1193 if ($typeamount == 'amount') {
1194 $amountdeposit[0] = $valuedeposit;
1195 } elseif ($typeamount == 'variable') {
1196 if ($result > 0) {
1197 $totalamount = 0;
1198 $lines = $srcobject->lines;
1199 $numlines = count($lines);
1200 for ($i = 0; $i < $numlines; $i++) {
1201 $qualified = 1;
1202 if (empty($lines[$i]->qty)) {
1203 $qualified = 0; // We discard qty=0, it is an option
1204 }
1205 if (!empty($lines[$i]->special_code)) {
1206 $qualified = 0; // We discard special_code (frais port, ecotaxe, option, ...)
1207 }
1208 if ($qualified) {
1209 $totalamount += $lines[$i]->total_ht; // Fixme : is it not for the customer ? Shouldn't we take total_ttc ?
1210 $tva_tx = $lines[$i]->tva_tx;
1211 $amountdeposit[$tva_tx] += ($lines[$i]->total_ht * (float) $valuedeposit) / 100;
1212 }
1213 }
1214
1215 if ($totalamount == 0) {
1216 $amountdeposit[0] = 0;
1217 }
1218 } else {
1219 setEventMessages($srcobject->error, $srcobject->errors, 'errors');
1220 $error++;
1221 $amountdeposit[0] = 0;
1222 }
1223 }
1224
1225 $amount_ttc_diff = $amountdeposit[0];
1226 }
1227
1228 foreach ($amountdeposit as $tva => $amount) {
1229 if (empty($amount)) {
1230 continue;
1231 }
1232
1233 $arraylist = array(
1234 'amount' => 'FixAmount',
1235 'variable' => 'VarAmount'
1236 );
1237 $descline = '(DEPOSIT)';
1238 //$descline.= ' - '.$langs->trans($arraylist[$typeamount]);
1239 if ($typeamount == 'amount') {
1240 $descline .= ' ('.price($valuedeposit, 0, $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).')';
1241 } elseif ($typeamount == 'variable') {
1242 $descline .= ' ('.$valuedeposit.'%)';
1243 }
1244
1245 $descline .= ' - '.$srcobject->ref;
1246 $result = $object->addline(
1247 $descline,
1248 $amount, // subprice
1249 $tva, // vat rate
1250 0, // localtax1_tx
1251 0, // localtax2_tx
1252 1, // quantity
1253 getDolGlobalInt('SUPPLIER_INVOICE_PRODUCTID_DEPOSIT', getDolGlobalInt('INVOICE_PRODUCTID_DEPOSIT')), // fk_product
1254 0, // remise_percent
1255 0, // date_start
1256 0, // date_end
1257 0,
1258 0, // info_bits
1259 'HT',
1260 0, // product_type
1261 1,
1262 0,
1263 array(), // array_options
1264 null,
1265 $object->origin,
1266 0,
1267 '',
1268 '0', // special_code
1269 0,
1270 0
1271 //,$langs->trans('Deposit') //Deprecated
1272 );
1273 }
1274
1275 $diff = $object->total_ttc - $amount_ttc_diff;
1276
1277 if (getDolGlobalString('MAIN_DEPOSIT_MULTI_TVA') && $diff != 0) {
1278 $object->fetch_lines();
1279 $subprice_diff = $object->lines[0]->subprice - $diff / (1 + $object->lines[0]->tva_tx / 100);
1280 $object->updateline(
1281 $object->lines[0]->id,
1282 $object->lines[0]->desc,
1283 $subprice_diff,
1284 $object->lines[0]->tva_tx,
1285 $object->lines[0]->localtax1_tx,
1286 $object->lines[0]->localtax2_tx,
1287 $object->lines[0]->qty,
1288 $object->lines[0]->fk_product,
1289 'HT',
1290 $object->lines[0]->info_bits,
1291 $object->lines[0]->product_type,
1292 $object->lines[0]->remise_percent,
1293 0,
1294 $object->lines[0]->date_start,
1295 $object->lines[0]->date_end,
1296 array(), // array_options
1297 0,
1298 0,
1299 '',
1300 100
1301 );
1302 }
1303 } elseif ($result > 0) {
1304 $lines = $srcobject->lines;
1305 if (empty($lines) && method_exists($srcobject, 'fetch_lines')) {
1306 $srcobject->fetch_lines();
1307 $lines = $srcobject->lines;
1308 }
1309
1310 $num = count($lines);
1311 for ($i = 0; $i < $num; $i++) { // TODO handle subprice < 0
1312 if (!in_array($lines[$i]->id, $selectedLines)) {
1313 continue; // Skip unselected lines
1314 }
1315
1316 $desc = ($lines[$i]->desc ? $lines[$i]->desc : $lines[$i]->product_label);
1317 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
1318
1319 // Extrafields
1320 if (method_exists($lines[$i], 'fetch_optionals')) {
1321 $lines[$i]->fetch_optionals();
1322 }
1323
1324 // Dates
1325 // TODO mutualiser
1326 $date_start = $lines[$i]->date_debut_prevue;
1327 if ($lines[$i]->date_debut_reel) {
1328 $date_start = $lines[$i]->date_debut_reel;
1329 }
1330 if ($lines[$i]->date_start) {
1331 $date_start = $lines[$i]->date_start;
1332 }
1333 $date_end = $lines[$i]->date_fin_prevue;
1334 if ($lines[$i]->date_fin_reel) {
1335 $date_end = $lines[$i]->date_fin_reel;
1336 }
1337 if ($lines[$i]->date_end) {
1338 $date_end = $lines[$i]->date_end;
1339 }
1340
1341 $tva_tx = $lines[$i]->tva_tx;
1342 // @phan-suppress-next-line PhanTypeMismatchArgumentInternal
1343 if (!empty($lines[$i]->vat_src_code) && !preg_match('/\‍(/', (string) $tva_tx)) {
1344 $tva_tx .= ' ('.$lines[$i]->vat_src_code.')';
1345 }
1346
1347 // FIXME Missing special_code into addline and updateline methods
1348 $object->special_code = $lines[$i]->special_code;
1349
1350 // FIXME If currency different from main currency, take multicurrency price
1351 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
1352 $pu = 0;
1353 $pu_currency = $lines[$i]->multicurrency_subprice;
1354 } else {
1355 $pu = $lines[$i]->subprice;
1356 $pu_currency = 0;
1357 }
1358
1359 // FIXME Missing $lines[$i]->ref_supplier and $lines[$i]->label into addline and updateline methods. They are filled when coming from order for example.
1360 $result = $object->addline(
1361 $desc,
1362 $pu,
1363 $tva_tx,
1364 $lines[$i]->localtax1_tx,
1365 $lines[$i]->localtax2_tx,
1366 $lines[$i]->qty,
1367 $lines[$i]->fk_product,
1368 $lines[$i]->remise_percent,
1369 $date_start,
1370 $date_end,
1371 0,
1372 $lines[$i]->info_bits,
1373 'HT',
1374 $product_type,
1375 $lines[$i]->rang,
1376 0,
1377 $lines[$i]->array_options,
1378 $lines[$i]->fk_unit,
1379 $lines[$i]->id,
1380 $pu_currency,
1381 $lines[$i]->ref_supplier,
1382 $lines[$i]->special_code
1383 );
1384
1385 if ($result < 0) {
1386 $error++;
1387 break;
1388 }
1389 }
1390
1391 // Now reload line
1392 $object->fetch_lines();
1393 } else {
1394 $error++;
1395 }
1396 } else {
1397 $error++;
1398 }
1399 } elseif (!$error) {
1400 $id = $object->create($user);
1401 if ($id < 0) {
1402 $error++;
1403 }
1404 }
1405 }
1406 }
1407
1408 if ($error) {
1409 $langs->load("errors");
1410 $db->rollback();
1411
1412 setEventMessages($object->error, $object->errors, 'errors');
1413 $action = 'create';
1414 //$_GET['socid'] = $_POST['socid'];
1415 } else {
1416 $db->commit();
1417
1418 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1419 $outputlangs = $langs;
1420 $result = $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1421 if ($result < 0) {
1422 dol_print_error($db, $object->error, $object->errors);
1423 exit;
1424 }
1425 }
1426
1427 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
1428 exit;
1429 }
1430 } elseif ($action == 'updateline' && $usercancreate) {
1431 // Edit line
1432 $db->begin();
1433
1434 if (! $object->fetch($id) > 0) {
1435 dol_print_error($db);
1436 }
1437 $object->fetch_thirdparty();
1438
1439 $tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0);
1440 $tva_tx = str_replace('*', '', $tva_tx);
1441
1442 if (GETPOST('price_ht') != '' || GETPOST('multicurrency_subprice') != '') {
1443 $up = price2num(GETPOST('price_ht'), '', 2);
1444 $price_base_type = 'HT';
1445 } else {
1446 $up = price2num(GETPOST('price_ttc'), '', 2);
1447 $price_base_type = 'TTC';
1448 }
1449
1450 if (GETPOST('productid') > 0) {
1451 $productsupplier = new ProductFournisseur($db);
1452 if (getDolGlobalString('SUPPLIER_INVOICE_WITH_PREDEFINED_PRICES_ONLY')) {
1453 if (GETPOST('productid') > 0 && $productsupplier->get_buyprice(0, price2num(GETPOST('qty')), GETPOSTINT('productid'), 'restricthtml', GETPOSTINT('socid')) < 0) {
1454 setEventMessages($langs->trans("ErrorQtyTooLowForThisSupplier"), null, 'warnings');
1455 }
1456 }
1457
1458 $prod = new Product($db);
1459 $prod->fetch(GETPOST('productid'));
1460 $label = $prod->description;
1461 if (trim(GETPOST('product_desc', 'restricthtml')) != trim($label)) {
1462 $label = GETPOST('product_desc', 'restricthtml');
1463 }
1464
1465 $type = $prod->type;
1466 } else {
1467 $label = GETPOST('product_desc', 'restricthtml');
1468 $type = GETPOST("type") ? GETPOST("type") : 0;
1469 }
1470
1471 $date_start = dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), GETPOST('date_startsec'), GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear'));
1472 $date_end = dol_mktime(GETPOST('date_endhour'), GETPOST('date_endmin'), GETPOST('date_endsec'), GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear'));
1473
1474 // Define info_bits
1475 $info_bits = 0;
1476 if (preg_match('/\*/', $tva_tx)) {
1477 $info_bits |= 0x01;
1478 }
1479
1480 // Define vat_rate
1481 $tva_tx = str_replace('*', '', $tva_tx);
1482 $localtax1_tx = get_localtax($tva_tx, 1, $mysoc, $object->thirdparty);
1483 $localtax2_tx = get_localtax($tva_tx, 2, $mysoc, $object->thirdparty);
1484
1485 $remise_percent = price2num(GETPOST('remise_percent'), '', 2);
1486 $pu_devise = price2num(GETPOST('multicurrency_subprice'), 'MU', 2);
1487
1488 // Extrafields Lines
1489 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
1490 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
1491 // Unset extrafield POST Data
1492 if (is_array($extralabelsline)) {
1493 foreach ($extralabelsline as $key => $value) {
1494 unset($_POST["options_".$key]);
1495 }
1496 }
1497
1498 $result = $object->updateline(
1499 GETPOSTINT('lineid'),
1500 $label,
1501 $up,
1502 $tva_tx,
1503 $localtax1_tx,
1504 $localtax2_tx,
1505 price2num(GETPOST('qty'), 'MS'),
1506 GETPOSTINT('productid'),
1507 $price_base_type,
1508 $info_bits,
1509 $type,
1510 $remise_percent,
1511 0,
1512 $date_start,
1513 $date_end,
1514 $array_options,
1515 GETPOST('units', 'alpha'),
1516 $pu_devise,
1517 GETPOST('fourn_ref', 'alpha')
1518 );
1519 if ($result >= 0) {
1520 unset($_POST['label']);
1521 unset($_POST['fourn_ref']);
1522 unset($_POST['date_starthour']);
1523 unset($_POST['date_startmin']);
1524 unset($_POST['date_startsec']);
1525 unset($_POST['date_startday']);
1526 unset($_POST['date_startmonth']);
1527 unset($_POST['date_startyear']);
1528 unset($_POST['date_endhour']);
1529 unset($_POST['date_endmin']);
1530 unset($_POST['date_endsec']);
1531 unset($_POST['date_endday']);
1532 unset($_POST['date_endmonth']);
1533 unset($_POST['date_endyear']);
1534 unset($_POST['price_ttc']);
1535 unset($_POST['price_ht']);
1536
1537 $db->commit();
1538 } else {
1539 $db->rollback();
1540 setEventMessages($object->error, $object->errors, 'errors');
1541 }
1542 } elseif ($action == 'addline' && GETPOST('submitforalllines', 'aZ09') && (GETPOST('alldate_start', 'alpha') || GETPOST('alldate_end', 'alpha')) && $usercancreate) {
1543 // Define date start and date end for all line
1544 $alldate_start = dol_mktime(GETPOST('alldate_starthour'), GETPOST('alldate_startmin'), 0, GETPOST('alldate_startmonth'), GETPOST('alldate_startday'), GETPOST('alldate_startyear'));
1545 $alldate_end = dol_mktime(GETPOST('alldate_endhour'), GETPOST('alldate_endmin'), 0, GETPOST('alldate_endmonth'), GETPOST('alldate_endday'), GETPOST('alldate_endyear'));
1546 foreach ($object->lines as $line) {
1547 if ($line->product_type == 1) { // only service line
1548 $result = $object->updateline($line->id, $line->desc, $line->subprice, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, $line->qty, $line->fk_product, 'HT', $line->info_bits, $line->product_type, $line->remise_percent, 0, $alldate_start, $alldate_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice, $line->ref_supplier, $line->rang);
1549 }
1550 }
1551 } elseif ($action == 'addline' && GETPOST('submitforalllines', 'aZ09') && GETPOST('vatforalllines', 'alpha') != '' && $usercancreate) {
1552 // Define vat_rate
1553 $vat_rate = (GETPOST('vatforalllines') ? GETPOST('vatforalllines') : 0);
1554 $vat_rate = str_replace('*', '', $vat_rate);
1555 $localtax1_rate = get_localtax($vat_rate, 1, $object->thirdparty, $mysoc);
1556 $localtax2_rate = get_localtax($vat_rate, 2, $object->thirdparty, $mysoc);
1557 foreach ($object->lines as $line) {
1558 $result = $object->updateline($line->id, $line->desc, $line->subprice, $vat_rate, $localtax1_rate, $localtax2_rate, $line->qty, $line->fk_product, 'HT', $line->info_bits, $line->product_type, $line->remise_percent, 0, $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice, $line->ref_supplier, $line->rang);
1559 }
1560 } elseif ($action == 'addline' && $usercancreate) {
1561 // Add a product line
1562 $db->begin();
1563
1564 $ret = $object->fetch($id);
1565 if ($ret < 0) {
1566 dol_print_error($db, $object->error);
1567 exit;
1568 }
1569 $ret = $object->fetch_thirdparty();
1570
1571 $langs->load('errors');
1572 $error = 0;
1573
1574 // Set if we used free entry or predefined product
1575 $predef = '';
1576 $product_desc = (GETPOSTISSET('dp_desc') ? GETPOST('dp_desc', 'restricthtml') : '');
1577 $date_start = dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), GETPOST('date_start'.$predef.'sec'), GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year'));
1578 $date_end = dol_mktime(GETPOST('date_end'.$predef.'hour'), GETPOST('date_end'.$predef.'min'), GETPOST('date_end'.$predef.'sec'), GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year'));
1579
1580 $prod_entry_mode = GETPOST('prod_entry_mode');
1581 if ($prod_entry_mode == 'free') {
1582 $idprod = 0;
1583 } else {
1584 $idprod = GETPOSTINT('idprod');
1585 }
1586
1587 $tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0); // Can be '1.2' or '1.2 (CODE)'
1588
1589 $price_ht = price2num(GETPOST('price_ht'), 'MU', 2);
1590 $price_ht_devise = price2num(GETPOST('multicurrency_price_ht'), 'CU', 2);
1591 $price_ttc = price2num(GETPOST('price_ttc'), 'MU', 2);
1592 $price_ttc_devise = price2num(GETPOST('multicurrency_price_ttc'), 'CU', 2);
1593 $qty = price2num(GETPOST('qty'.$predef, 'alpha'), 'MS');
1594
1595 $remise_percent = (GETPOSTISSET('remise_percent'.$predef) ? price2num(GETPOST('remise_percent'.$predef, 'alpha'), '', 2) : 0);
1596 if (empty($remise_percent)) {
1597 $remise_percent = 0;
1598 }
1599
1600 // Extrafields
1601 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
1602 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
1603 // Unset extrafield
1604 if (is_array($extralabelsline)) {
1605 // Get extra fields
1606 foreach ($extralabelsline as $key => $value) {
1607 unset($_POST["options_".$key]);
1608 }
1609 }
1610
1611 if ($prod_entry_mode == 'free' && GETPOST('price_ht') < 0 && $qty < 0) {
1612 setEventMessages($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPrice'), $langs->transnoentitiesnoconv('Qty')), null, 'errors');
1613 $error++;
1614 }
1615 if ($prod_entry_mode == 'free' && !GETPOST('idprodfournprice') && GETPOST('type') < 0) {
1616 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), null, 'errors');
1617 $error++;
1618 }
1619 if ($prod_entry_mode == 'free' && GETPOST('price_ht') === '' && GETPOST('price_ttc') === '' && $price_ht_devise === '') { // Unit price can be 0 but not ''
1620 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('UnitPrice')), null, 'errors');
1621 $error++;
1622 }
1623 if ($prod_entry_mode == 'free' && !GETPOST('dp_desc')) {
1624 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), null, 'errors');
1625 $error++;
1626 }
1627 if (!GETPOST('qty', 'alpha')) { // 0 is NOT allowed for invoices
1628 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), null, 'errors');
1629 $error++;
1630 }
1631
1632 if (!$error && isModEnabled('variants') && $prod_entry_mode != 'free') {
1633 if ($combinations = GETPOST('combinations', 'array')) {
1634 //Check if there is a product with the given combination
1635 $prodcomb = new ProductCombination($db);
1636
1637 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1638 $idprod = $res->fk_product_child;
1639 } else {
1640 setEventMessages($langs->trans('ErrorProductCombinationNotFound'), null, 'errors');
1641 $error++;
1642 }
1643 }
1644 }
1645
1646 if ($prod_entry_mode != 'free' && empty($error)) { // With combolist mode idprodfournprice is > 0 or -1. With autocomplete, idprodfournprice is > 0 or ''
1647 $productsupplier = new ProductFournisseur($db);
1648
1649 $idprod = 0;
1650 if (GETPOST('idprodfournprice', 'alpha') == -1 || GETPOST('idprodfournprice', 'alpha') == '') {
1651 $idprod = -99; // Same behaviour than with combolist. When not select idprodfournprice is now -99 (to avoid conflict with next action that may return -1, -2, ...)
1652 }
1653
1654 $reg = array();
1655 if (preg_match('/^idprod_([0-9]+)$/', GETPOST('idprodfournprice', 'alpha'), $reg)) {
1656 $idprod = $reg[1];
1657 $res = $productsupplier->fetch($idprod); // Load product from its id
1658 // Call to init some price properties of $productsupplier
1659 // So if a supplier price already exists for another thirdparty (first one found), we use it as reference price
1660 if (getDolGlobalString('SUPPLIER_TAKE_FIRST_PRICE_IF_NO_PRICE_FOR_CURRENT_SUPPLIER')) {
1661 $fksoctosearch = 0;
1662 $productsupplier->get_buyprice(0, -1, $idprod, 'none', $fksoctosearch); // We force qty to -1 to be sure to find if a supplier price exist
1663 if ($productsupplier->fourn_socid != $socid) { // The price we found is for another supplier, so we clear supplier price
1664 $productsupplier->ref_supplier = '';
1665 }
1666 } else {
1667 $fksoctosearch = $object->thirdparty->id;
1668 $productsupplier->get_buyprice(0, -1, $idprod, 'none', $fksoctosearch); // We force qty to -1 to be sure to find if a supplier price exist
1669 }
1670 } elseif (GETPOST('idprodfournprice', 'alpha') > 0) {
1671 $qtytosearch = $qty; // Just to see if a price exists for the quantity. Not used to found vat.
1672 //$qtytosearch=-1; // We force qty to -1 to be sure to find if a supplier price exist
1673 $idprod = $productsupplier->get_buyprice(GETPOST('idprodfournprice', 'alpha'), $qtytosearch);
1674 $res = $productsupplier->fetch($idprod);
1675 }
1676
1677 if ($idprod > 0) {
1678 $label = $productsupplier->label;
1679 // Define output language
1680 if (getDolGlobalInt('MAIN_MULTILANGS') && getDolGlobalString('PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE')) {
1681 $outputlangs = $langs;
1682 $newlang = '';
1683 if (empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1684 $newlang = GETPOST('lang_id', 'aZ09');
1685 }
1686 if (empty($newlang)) {
1687 $newlang = $object->thirdparty->default_lang;
1688 }
1689 if (!empty($newlang)) {
1690 $outputlangs = new Translate("", $conf);
1691 $outputlangs->setDefaultLang($newlang);
1692 }
1693 $desc = (!empty($productsupplier->multilangs[$outputlangs->defaultlang]["description"])) ? $productsupplier->multilangs[$outputlangs->defaultlang]["description"] : $productsupplier->description;
1694 } else {
1695 $desc = $productsupplier->description;
1696 }
1697 // if we use supplier description of the products
1698 if (!empty($productsupplier->desc_supplier) && getDolGlobalString('PRODUIT_FOURN_TEXTS')) {
1699 $desc = $productsupplier->desc_supplier;
1700 }
1701
1702 //If text set in desc is the same as product descpription (as now it's preloaded) we add it only one time
1703 if (trim($product_desc) == trim($desc) && getDolGlobalString('PRODUIT_AUTOFILL_DESC')) {
1704 $product_desc = '';
1705 }
1706 if (!empty($product_desc) && getDolGlobalString('MAIN_NO_CONCAT_DESCRIPTION')) {
1707 $desc = $product_desc;
1708 }
1709 if (!empty($product_desc) && trim($product_desc) != trim($desc)) {
1710 $desc = dol_concatdesc($desc, $product_desc, '', getDolGlobalString('MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION'));
1711 }
1712
1713 $ref_supplier = $productsupplier->ref_supplier;
1714
1715 // Get vat rate
1716 if (!GETPOSTISSET('tva_tx')) { // If vat rate not provided from the form (the form has the priority)
1717 $tva_tx = get_default_tva($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice', 'alpha'));
1718 $tva_npr = get_default_npr($object->thirdparty, $mysoc, $productsupplier->id, GETPOST('idprodfournprice', 'alpha'));
1719 }
1720 if (empty($tva_tx) || empty($tva_npr)) {
1721 $tva_npr = 0;
1722 }
1723 $localtax1_tx = get_localtax($tva_tx, 1, $mysoc, $object->thirdparty, $tva_npr);
1724 $localtax2_tx = get_localtax($tva_tx, 2, $mysoc, $object->thirdparty, $tva_npr);
1725
1726 $type = $productsupplier->type;
1727 if (GETPOST('price_ht') != '' || GETPOST('multicurrency_price_ht') != '') {
1728 $price_base_type = 'HT';
1729 $pu = price2num($price_ht, 'MU');
1730 $pu_devise = price2num($price_ht_devise, 'CU');
1731 } elseif (GETPOST('price_ttc') != '' || GETPOST('multicurrency_price_ttc') != '') {
1732 $price_base_type = 'TTC';
1733 $pu = price2num($price_ttc, 'MU');
1734 $pu_devise = price2num($price_ttc_devise, 'CU');
1735 } else {
1736 $price_base_type = ($productsupplier->fourn_price_base_type ? $productsupplier->fourn_price_base_type : 'HT');
1737 if (empty($object->multicurrency_code) || ($productsupplier->fourn_multicurrency_code != $object->multicurrency_code)) { // If object is in a different currency and price not in this currency
1738 $pu = $productsupplier->fourn_pu;
1739 $pu_devise = 0;
1740 } else {
1741 $pu = $productsupplier->fourn_pu;
1742 $pu_devise = $productsupplier->fourn_multicurrency_unitprice;
1743 }
1744 }
1745
1746 $ref_supplier = $productsupplier->ref_supplier;
1747
1748 if (empty($pu)) {
1749 $pu = 0; // If pu is '' or null, we force to have a numeric value
1750 }
1751
1752 $result = $object->addline(
1753 $desc,
1754 $pu,
1755 $tva_tx,
1756 $localtax1_tx,
1757 $localtax2_tx,
1758 $qty,
1759 $idprod,
1760 $remise_percent,
1761 $date_start,
1762 $date_end,
1763 0,
1764 $tva_npr,
1765 $price_base_type,
1766 $type,
1767 min($rank, count($object->lines) + 1),
1768 0,
1769 $array_options,
1770 $productsupplier->fk_unit,
1771 0,
1772 $pu_devise,
1773 GETPOST('fourn_ref', 'alpha'),
1774 0
1775 );
1776 }
1777 if ($idprod == -99 || $idprod == 0) {
1778 // Product not selected
1779 $error++;
1780 $langs->load("errors");
1781 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ProductOrService")), null, 'errors');
1782 }
1783 if ($idprod == -1) {
1784 // Quantity too low
1785 $error++;
1786 $langs->load("errors");
1787 setEventMessages($langs->trans("ErrorQtyTooLowForThisSupplier"), null, 'errors');
1788 }
1789 } elseif (empty($error)) { // $price_ht is already set
1790 $tva_npr = (preg_match('/\*/', $tva_tx) ? 1 : 0);
1791 $tva_tx = str_replace('*', '', $tva_tx);
1792 $label = (GETPOST('product_label') ? GETPOST('product_label') : '');
1793 $desc = $product_desc;
1794 $type = GETPOST('type');
1795 $ref_supplier = GETPOST('fourn_ref', 'alpha');
1796
1797 $fk_unit = GETPOST('units', 'alpha');
1798
1799 if (!preg_match('/\‍((.*)\‍)/', $tva_tx)) {
1800 $tva_tx = price2num($tva_tx); // $txtva can have format '5,1' or '5.1' or '5.1(XXX)', we must clean only if '5,1'
1801 }
1802
1803 // Local Taxes
1804 $localtax1_tx = get_localtax($tva_tx, 1, $mysoc, $object->thirdparty);
1805 $localtax2_tx = get_localtax($tva_tx, 2, $mysoc, $object->thirdparty);
1806
1807 if (GETPOST('price_ht') != '' || GETPOST('multicurrency_price_ht') != '') {
1808 $pu_ht = price2num($price_ht, 'MU'); // $pu_ht must be rounded according to settings
1809 } else {
1810 $pu_ttc = price2num(GETPOST('price_ttc'), 'MU');
1811 $pu_ht = price2num((float) $pu_ttc / (1 + ((float) $tva_tx / 100)), 'MU'); // $pu_ht must be rounded according to settings
1812 }
1813 $price_base_type = 'HT';
1814 $pu_devise = price2num($price_ht_devise, 'CU');
1815
1816 $result = $object->addline($product_desc, $pu_ht, $tva_tx, $localtax1_tx, $localtax2_tx, $qty, 0, $remise_percent, $date_start, $date_end, 0, $tva_npr, $price_base_type, $type, -1, 0, $array_options, $fk_unit, 0, $pu_devise, $ref_supplier);
1817 }
1818
1819 //print "xx".$tva_tx; exit;
1820 if (!$error && $result > 0) {
1821 $db->commit();
1822
1823 // Define output language
1824 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1825 $outputlangs = $langs;
1826 $newlang = '';
1827 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1828 $newlang = GETPOST('lang_id', 'aZ09');
1829 }
1830 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1831 $newlang = $object->thirdparty->default_lang;
1832 }
1833 if (!empty($newlang)) {
1834 $outputlangs = new Translate("", $conf);
1835 $outputlangs->setDefaultLang($newlang);
1836 }
1837 $model = $object->model_pdf;
1838 $ret = $object->fetch($id); // Reload to get new records
1839
1840 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1841 if ($result < 0) {
1842 dol_print_error($db, $result);
1843 }
1844 }
1845
1846 unset($_POST ['prod_entry_mode']);
1847
1848 unset($_POST['qty']);
1849 unset($_POST['type']);
1850 unset($_POST['remise_percent']);
1851 unset($_POST['pu']);
1852 unset($_POST['price_ht']);
1853 unset($_POST['multicurrency_price_ht']);
1854 unset($_POST['price_ttc']);
1855 unset($_POST['fourn_ref']);
1856 unset($_POST['tva_tx']);
1857 unset($_POST['label']);
1858 unset($localtax1_tx);
1859 unset($localtax2_tx);
1860 unset($_POST['np_marginRate']);
1861 unset($_POST['np_markRate']);
1862 unset($_POST['dp_desc']);
1863 unset($_POST['idprodfournprice']);
1864 unset($_POST['units']);
1865
1866 unset($_POST['date_starthour']);
1867 unset($_POST['date_startmin']);
1868 unset($_POST['date_startsec']);
1869 unset($_POST['date_startday']);
1870 unset($_POST['date_startmonth']);
1871 unset($_POST['date_startyear']);
1872 unset($_POST['date_endhour']);
1873 unset($_POST['date_endmin']);
1874 unset($_POST['date_endsec']);
1875 unset($_POST['date_endday']);
1876 unset($_POST['date_endmonth']);
1877 unset($_POST['date_endyear']);
1878 } else {
1879 $db->rollback();
1880 setEventMessages($object->error, $object->errors, 'errors');
1881 }
1882
1883 $action = '';
1884 } elseif ($action == 'classin' && $usercancreate) {
1885 $object->fetch($id);
1886 $result = $object->setProject($projectid);
1887 } elseif ($action == 'confirm_edit' && $confirm == 'yes' && $usercancreate) {
1888 // Set invoice to draft status
1889 $object->fetch($id);
1890
1891 $totalpaid = $object->getSommePaiement();
1892 $resteapayer = $object->total_ttc - $totalpaid;
1893
1894 // We check that lines of invoices are exported in accountancy
1895 $ventilExportCompta = $object->getVentilExportCompta();
1896
1897 if (!$ventilExportCompta) {
1898 // We verify that no payment was done
1899 if ($resteapayer == price2num($object->total_ttc, 'MT', 1) && $object->status == FactureFournisseur::STATUS_VALIDATED) {
1900 $idwarehouse = GETPOST('idwarehouse');
1901
1902 $object->fetch_thirdparty();
1903
1904 $qualified_for_stock_change = 0;
1905 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
1906 $qualified_for_stock_change = $object->hasProductsOrServices(2);
1907 } else {
1908 $qualified_for_stock_change = $object->hasProductsOrServices(1);
1909 }
1910
1911 // Check parameters
1912 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_BILL') && $qualified_for_stock_change) {
1913 $langs->load("stocks");
1914 if (!$idwarehouse || $idwarehouse == -1) {
1915 $error++;
1916 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors');
1917 $action = '';
1918 }
1919 }
1920
1921 $object->setDraft($user, $idwarehouse);
1922
1923 // Define output language
1924 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1925 $outputlangs = $langs;
1926 $newlang = '';
1927 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1928 $newlang = GETPOST('lang_id', 'aZ09');
1929 }
1930 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1931 $newlang = $object->thirdparty->default_lang;
1932 }
1933 if (!empty($newlang)) {
1934 $outputlangs = new Translate("", $conf);
1935 $outputlangs->setDefaultLang($newlang);
1936 }
1937 $model = $object->model_pdf;
1938 $ret = $object->fetch($id); // Reload to get new records
1939
1940 $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1941 if ($result < 0) {
1942 dol_print_error($db, $result);
1943 }
1944 }
1945
1946 $action = '';
1947 }
1948 }
1949 } elseif ($action == 'reopen' && $usercancreate) {
1950 // Set invoice to validated/unpaid status
1951 $result = $object->fetch($id);
1953 || ($object->status == FactureFournisseur::STATUS_ABANDONED && $object->close_code != 'replaced')) {
1954 $result = $object->setUnpaid($user);
1955 if ($result > 0) {
1956 header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id);
1957 exit;
1958 } else {
1959 setEventMessages($object->error, $object->errors, 'errors');
1960 }
1961 }
1962 }
1963
1964 // Actions when printing a doc from card
1965 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
1966
1967 // Actions to send emails
1968 $triggersendname = 'BILL_SUPPLIER_SENTBYMAIL';
1969 $paramname = 'id';
1970 $autocopy = 'MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO';
1971 $trackid = 'sinv'.$object->id;
1972 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
1973
1974 // Actions to build doc
1975 $upload_dir = $conf->fournisseur->facture->dir_output;
1976 $permissiontoadd = $usercancreate;
1977 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
1978
1979 // Make calculation according to calculationrule
1980 if ($action == 'calculate' && $usercancreate) {
1981 $calculationrule = GETPOST('calculationrule');
1982
1983 $object->fetch($id);
1984 $object->fetch_thirdparty();
1985 $result = $object->update_price(0, (($calculationrule == 'totalofround') ? '0' : '1'), 0, $object->thirdparty);
1986 if ($result <= 0) {
1987 dol_print_error($db, $result);
1988 exit;
1989 }
1990 }
1991 if ($action == 'update_extras' && $usercancreate) {
1992 $object->oldcopy = dol_clone($object, 2);
1993
1994 // Fill array 'array_options' with data from add form
1995 $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
1996 if ($ret < 0) {
1997 $error++;
1998 }
1999
2000 // Actions on extra fields
2001 if (!$error) {
2002 $result = $object->insertExtraFields('BILL_SUPPLIER_MODIFY');
2003 if ($result < 0) {
2004 $error++;
2005 setEventMessages($object->error, $object->errors, 'errors');
2006 }
2007 }
2008
2009 if ($error) {
2010 $action = 'edit_extras';
2011 }
2012 }
2013
2014 if (getDolGlobalString('MAIN_DISABLE_CONTACTS_TAB') && $usercancreate) {
2015 if ($action == 'addcontact') {
2016 $result = $object->fetch($id);
2017
2018 if ($result > 0 && $id > 0) {
2019 $contactid = (GETPOST('userid') ? GETPOST('userid') : GETPOST('contactid'));
2020 $typeid = (GETPOST('typecontact') ? GETPOST('typecontact') : GETPOST('type'));
2021 $result = $object->add_contact($contactid, $typeid, GETPOST("source", 'aZ09'));
2022 }
2023
2024 if ($result >= 0) {
2025 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
2026 exit;
2027 } else {
2028 if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
2029 $langs->load("errors");
2030 setEventMessages($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), null, 'errors');
2031 } else {
2032 setEventMessages($object->error, $object->errors, 'errors');
2033 }
2034 }
2035 } elseif ($action == 'swapstatut') {
2036 // bascule du statut d'un contact
2037 if ($object->fetch($id)) {
2038 $result = $object->swapContactStatus(GETPOSTINT('ligne'));
2039 } else {
2040 dol_print_error($db);
2041 }
2042 } elseif ($action == 'deletecontact') {
2043 // Efface un contact
2044 $object->fetch($id);
2045 $result = $object->delete_contact(GETPOSTINT("lineid"));
2046
2047 if ($result >= 0) {
2048 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
2049 exit;
2050 } else {
2051 dol_print_error($db);
2052 }
2053 }
2054 }
2055}
2056
2057
2058/*
2059 * View
2060 */
2061
2062$form = new Form($db);
2063$formfile = new FormFile($db);
2064$bankaccountstatic = new Account($db);
2065$paymentstatic = new PaiementFourn($db);
2066if (isModEnabled('project')) {
2067 $formproject = new FormProjets($db);
2068}
2069
2070$now = dol_now();
2071
2072$title = $object->ref." - ".$langs->trans('Card');
2073if ($action == 'create') {
2074 $title = $langs->trans("NewSupplierInvoice");
2075}
2076$help_url = 'EN:Module_Suppliers_Invoices|FR:Module_Fournisseurs_Factures|ES:Módulo_Facturas_de_proveedores|DE:Modul_Lieferantenrechnungen';
2077llxHeader('', $title, $help_url);
2078
2079// Mode creation
2080if ($action == 'create') {
2081 $facturestatic = new FactureFournisseur($db);
2082 $selectedLines = array(); // Ensure initialised
2083
2084 print load_fiche_titre($langs->trans('NewSupplierInvoice'), '', 'supplier_invoice');
2085
2087
2088 $currency_code = $conf->currency;
2089
2090 $societe = '';
2091 if (GETPOSTINT('socid') > 0) {
2092 $societe = new Societe($db);
2093 $societe->fetch(GETPOSTINT('socid'));
2094 if (isModEnabled("multicurrency") && !empty($societe->multicurrency_code)) {
2095 $currency_code = $societe->multicurrency_code;
2096 }
2097 }
2098
2099 if (!empty($origin) && !empty($originid)) {
2100 // Parse element/subelement (ex: project_task)
2101 $element = $subelement = $origin;
2102
2103 if ($element == 'project') {
2104 $projectid = $originid;
2105 $element = 'projet';
2106 }
2107
2108 // For compatibility
2109 if ($element == 'order') {
2110 $element = $subelement = 'commande';
2111 }
2112 if ($element == 'propal') {
2113 $element = 'comm/propal';
2114 $subelement = 'propal';
2115 }
2116 if ($element == 'contract') {
2117 $element = $subelement = 'contrat';
2118 }
2119 if ($element == 'order_supplier') {
2120 $element = 'fourn';
2121 $subelement = 'fournisseur.commande';
2122 }
2123
2124 dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
2125 $classname = ucfirst($subelement);
2126 if ($classname == 'Fournisseur.commande') {
2127 $classname = 'CommandeFournisseur';
2128 }
2129 $objectsrc = new $classname($db);
2130 '@phan-var-force Project|Commande|Propal|Facture|Contrat|CommandeFournisseur|CommonObject $objectsrc';
2131 $objectsrc->fetch($originid);
2132 $objectsrc->fetch_thirdparty();
2133
2134 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : '');
2135 //$ref_client = (!empty($objectsrc->ref_client)?$object->ref_client:'');
2136 $soc = $objectsrc->thirdparty;
2137
2138 $cond_reglement_id = 0;
2139 $mode_reglement_id = 0;
2140 $fk_account = 0;
2141 //$remise_percent = 0;
2142 //$remise_absolue = 0;
2143 $transport_mode_id = 0;
2144
2145 // set from object source
2146 if (!empty($objectsrc->cond_reglement_id)) {
2147 $cond_reglement_id = $objectsrc->cond_reglement_id;
2148 }
2149 if (!empty($objectsrc->mode_reglement_id)) {
2150 $mode_reglement_id = $objectsrc->mode_reglement_id;
2151 }
2152 if (!empty($objectsrc->fk_account)) {
2153 $fk_account = $objectsrc->fk_account;
2154 }
2155 if (!empty($objectsrc->transport_mode_id)) {
2156 $transport_mode_id = $objectsrc->transport_mode_id;
2157 }
2158
2159 if (empty($cond_reglement_id)
2160 || empty($mode_reglement_id)
2161 || empty($fk_account)
2162 || empty($transport_mode_id)
2163 ) {
2164 if ($origin == 'reception') {
2165 // try to get from source of reception (supplier order)
2166 if (!isset($objectsrc->supplier_order)) {
2167 $objectsrc->fetch_origin();
2168 }
2169
2170 if (!empty($objectsrc->origin_object)) {
2171 $originObject = $objectsrc->origin_object;
2172 if (empty($cond_reglement_id) && !empty($originObject->cond_reglement_id)) {
2173 $cond_reglement_id = $originObject->cond_reglement_id;
2174 }
2175 if (empty($mode_reglement_id) && !empty($originObject->mode_reglement_id)) {
2176 $mode_reglement_id = $originObject->mode_reglement_id;
2177 }
2178 if (empty($fk_account) && !empty($originObject->fk_account)) {
2179 $fk_account = $originObject->fk_account;
2180 }
2181 if (empty($transport_mode_id) && !empty($originObject->transport_mode_id)) {
2182 $transport_mode_id = $originObject->transport_mode_id;
2183 }
2184 }
2185 }
2186
2187 // try to get from third-party of source object
2188 if (!empty($soc)) {
2189 if (empty($cond_reglement_id) && !empty($soc->cond_reglement_supplier_id)) {
2190 $cond_reglement_id = $soc->cond_reglement_supplier_id;
2191 }
2192 if (empty($mode_reglement_id) && !empty($soc->mode_reglement_supplier_id)) {
2193 $mode_reglement_id = $soc->mode_reglement_supplier_id;
2194 }
2195 if (empty($fk_account) && !empty($soc->fk_account)) {
2196 $fk_account = $soc->fk_account;
2197 }
2198 if (empty($transport_mode_id) && !empty($soc->transport_mode_id)) {
2199 $transport_mode_id = $soc->transport_mode_id;
2200 }
2201 }
2202 }
2203
2204 if (isModEnabled("multicurrency")) {
2205 if (!empty($objectsrc->multicurrency_code)) {
2206 $currency_code = $objectsrc->multicurrency_code;
2207 }
2208 if (getDolGlobalString('MULTICURRENCY_USE_ORIGIN_TX') && !empty($objectsrc->multicurrency_tx)) {
2209 $currency_tx = $objectsrc->multicurrency_tx;
2210 }
2211 }
2212
2213 $datetmp = dol_mktime(12, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
2214 $dateinvoice = ($datetmp == '' ? (!getDolGlobalString('MAIN_AUTOFILL_DATE') ? -1 : '') : $datetmp);
2215 $datetmp = dol_mktime(12, 0, 0, GETPOSTINT('echmonth'), GETPOSTINT('echday'), GETPOSTINT('echyear'));
2216 $datedue = ($datetmp == '' ? -1 : $datetmp);
2217
2218 // Replicate extrafields
2219 $objectsrc->fetch_optionals();
2220 $object->array_options = $objectsrc->array_options;
2221 } else {
2222 $cond_reglement_id = !empty($societe->cond_reglement_supplier_id) ? $societe->cond_reglement_supplier_id : 0;
2223 $mode_reglement_id = !empty($societe->mode_reglement_supplier_id) ? $societe->mode_reglement_supplier_id : 0;
2224 $vat_reverse_charge = (empty($societe) ? '' : $societe->vat_reverse_charge);
2225 $transport_mode_id = !empty($societe->transport_mode_supplier_id) ? $societe->transport_mode_supplier_id : 0;
2226 $fk_account = !empty($societe->fk_account) ? $societe->fk_account : 0;
2227 $datetmp = dol_mktime(12, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
2228 $dateinvoice = ($datetmp == '' ? (getDolGlobalInt('MAIN_AUTOFILL_DATE') ? '' : -1) : $datetmp);
2229 $datetmp = dol_mktime(12, 0, 0, GETPOSTINT('echmonth'), GETPOSTINT('echday'), GETPOSTINT('echyear'));
2230 $datedue = ($datetmp == '' ? -1 : $datetmp);
2231
2232 if (isModEnabled("multicurrency") && !empty($societe->multicurrency_code)) {
2233 $currency_code = $societe->multicurrency_code;
2234 }
2235 }
2236
2237 // when payment condition is empty (means not override by payment condition form a other object, like third-party), try to use default value
2238 if (empty($cond_reglement_id)) {
2239 $cond_reglement_id = GETPOST("cond_reglement_id");
2240 }
2241
2242 // when payment mode is empty (means not override by payment condition form a other object, like third-party), try to use default value
2243 if (empty($mode_reglement_id)) {
2244 $mode_reglement_id = GETPOST("mode_reglement_id");
2245 }
2246
2247 // If form was posted (but error returned), we must reuse the value posted in priority (standard Dolibarr behaviour)
2248 if (!GETPOST('changecompany')) {
2249 if (GETPOSTISSET('cond_reglement_id')) {
2250 $cond_reglement_id = GETPOSTINT('cond_reglement_id');
2251 }
2252 if (GETPOSTISSET('mode_reglement_id')) {
2253 $mode_reglement_id = GETPOSTINT('mode_reglement_id');
2254 }
2255 if (GETPOSTISSET('cond_reglement_id')) {
2256 $fk_account = GETPOSTINT('fk_account');
2257 }
2258 }
2259
2260 $note_public = $object->getDefaultCreateValueFor('note_public', ((!empty($origin) && !empty($originid) && is_object($objectsrc) && getDolGlobalString('FACTUREFOURN_REUSE_NOTES_ON_CREATE_FROM')) ? $objectsrc->note_public : null));
2261 $note_private = $object->getDefaultCreateValueFor('note_private', ((!empty($origin) && !empty($originid) && is_object($objectsrc) && getDolGlobalString('FACTUREFOURN_REUSE_NOTES_ON_CREATE_FROM')) ? $objectsrc->note_private : null));
2262
2263 if ($origin == 'contrat') {
2264 $langs->load("admin");
2265 $text = $langs->trans("ToCreateARecurringInvoice");
2266 $text .= ' '.$langs->trans("ToCreateARecurringInvoiceGene", $langs->transnoentitiesnoconv("MenuFinancial"), $langs->transnoentitiesnoconv("SupplierBills"), $langs->transnoentitiesnoconv("ListOfTemplates"));
2267 if (!getDolGlobalString('INVOICE_DISABLE_AUTOMATIC_RECURRING_INVOICE')) {
2268 $text .= ' '.$langs->trans("ToCreateARecurringInvoiceGeneAuto", $langs->transnoentitiesnoconv('Module2300Name'));
2269 }
2270 print info_admin($text, 0, 0, 0, 'opacitymedium').'<br>';
2271 }
2272
2273 print '<form name="add" action="'.$_SERVER["PHP_SELF"].'" method="post">';
2274 print '<input type="hidden" name="token" value="'.newToken().'">';
2275 print '<input type="hidden" name="action" value="add">';
2276 print '<input type="hidden" name="changecompany" value="0">'; // will be set to 1 by javascript so we know post is done after a company change
2277
2278 if (!empty($societe->id) && $societe->id > 0) {
2279 print '<input type="hidden" name="socid" value="'.$societe->id.'">'."\n";
2280 }
2281 print '<input type="hidden" name="origin" value="'.$origin.'">';
2282 print '<input type="hidden" name="originid" value="'.$originid.'">';
2283 if (!empty($currency_tx)) {
2284 print '<input type="hidden" name="originmulticurrency_tx" value="'.$currency_tx.'">';
2285 }
2286 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
2287
2288 print dol_get_fiche_head();
2289
2290 // Call Hook tabContentCreateSupplierInvoice
2291 $parameters = array();
2292 // Note that $action and $object may be modified by hook
2293 $reshook = $hookmanager->executeHooks('tabContentCreateSupplierInvoice', $parameters, $object, $action);
2294 if (empty($reshook)) {
2295 print '<table class="border centpercent">';
2296
2297 // Ref
2298 print '<tr><td class="titlefieldcreate">'.$langs->trans('Ref').'</td><td>'.$langs->trans('Draft').'</td></tr>';
2299
2300 $exampletemplateinvoice = new FactureFournisseurRec($db);
2301 $invoice_predefined = new FactureFournisseurRec($db);
2302 if (empty($origin) && empty($originid) && $fac_recid > 0) {
2303 $invoice_predefined->fetch($fac_recid);
2304 }
2305
2306 // Third party
2307 print '<tr><td class="fieldrequired">'.$langs->trans('Supplier').'</td>';
2308 print '<td>';
2309
2310 if (!empty($societe->id) && $societe->id > 0 && ($fac_recid <= 0 || !empty($invoice_predefined->frequency))) {
2311 $absolute_discount = $societe->getAvailableDiscounts(null, '', 0, 1);
2312 print $societe->getNomUrl(1, 'supplier');
2313 print '<input type="hidden" name="socid" value="'.$societe->id.'">';
2314 } else {
2315 $filter = '((s.fournisseur:=:1) AND (s.status:=:1))';
2316 print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(empty($societe->id) ? 0 : $societe->id, 'socid', $filter, 'SelectThirdParty', 1, 0, array(), 0, 'minwidth175 widthcentpercentminusxx maxwidth500');
2317 // reload page to retrieve supplier information
2318 if (!getDolGlobalString('RELOAD_PAGE_ON_SUPPLIER_CHANGE_DISABLED')) {
2319 print '<script type="text/javascript">
2320 $(document).ready(function() {
2321 $("#socid").change(function() {
2322 console.log("We have changed the company - Reload page");
2323 // reload page
2324 $("input[name=action]").val("create");
2325 $("input[name=changecompany]").val("1");
2326 $("form[name=add]").submit();
2327 });
2328 });
2329 </script>';
2330 }
2331 if ($fac_recid <= 0) {
2332 print ' <a href="'.DOL_URL_ROOT.'/societe/card.php?action=create&client=0&fournisseur=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create').'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddThirdParty").'"></span></a>';
2333 }
2334 }
2335 print '</td></tr>';
2336
2337 // Overwrite some values if creation of invoice is from a predefined invoice
2338 if (empty($origin) && empty($originid) && $fac_recid > 0) {
2339 $invoice_predefined->fetch($fac_recid);
2340
2341 $dateinvoice = $invoice_predefined->date_when; // To use next gen date by default later
2342 if (empty($projectid)) {
2343 $projectid = $invoice_predefined->fk_project;
2344 }
2345 $cond_reglement_id = $invoice_predefined->cond_reglement_id;
2346 $mode_reglement_id = $invoice_predefined->mode_reglement_id;
2347 $fk_account = $invoice_predefined->fk_account;
2348 $note_public = $invoice_predefined->note_public;
2349 $note_private = $invoice_predefined->note_private;
2350
2351 if (!empty($invoice_predefined->multicurrency_code)) {
2352 $currency_code = $invoice_predefined->multicurrency_code;
2353 }
2354 if (!empty($invoice_predefined->multicurrency_tx)) {
2355 $currency_tx = $invoice_predefined->multicurrency_tx;
2356 }
2357
2358 $sql = 'SELECT r.rowid, r.titre as title, r.total_ttc';
2359 $sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn_rec as r';
2360 $sql .= ' WHERE r.fk_soc = '. (int) $invoice_predefined->socid;
2361
2362 $resql = $db->query($sql);
2363 if ($resql) {
2364 $num = $db->num_rows($resql);
2365 $i = 0;
2366
2367 if ($num > 0) {
2368 print '<tr><td>'.$langs->trans('CreateFromRepeatableInvoice').'</td><td>';
2369 //print '<input type="hidden" name="fac_rec" id="fac_rec" value="'.$fac_recid.'">';
2370 print '<select class="flat" id="fac_rec" name="fac_rec">'; // We may want to change the template to use
2371 print '<option value="0" selected></option>';
2372 while ($i < $num) {
2373 $objp = $db->fetch_object($resql);
2374 print '<option value="'.$objp->rowid.'"';
2375 if ($fac_recid == $objp->rowid) {
2376 print ' selected';
2377 $exampletemplateinvoice->fetch($fac_recid);
2378 }
2379 print '>'.$objp->title.' ('.price($objp->total_ttc).' '.$langs->trans("TTC").')</option>';
2380 $i++;
2381 }
2382 print '</select>';
2383 // Option to reload page to retrieve customer information. Note, this clear other input
2384 if (!getDolGlobalString('RELOAD_PAGE_ON_TEMPLATE_CHANGE_DISABLED')) {
2385 print '<script type="text/javascript">
2386 $(document).ready(function() {
2387 $("#fac_rec").change(function() {
2388 console.log("We have changed the template invoice - Reload page");
2389 // reload page
2390 $("input[name=action]").val("create");
2391 $("form[name=add]").submit();
2392 });
2393 });
2394 </script>';
2395 }
2396 print '</td></tr>';
2397 }
2398 $db->free($resql);
2399 } else {
2400 dol_print_error($db);
2401 }
2402 }
2403
2404 // Ref supplier
2405 print '<tr><td class="fieldrequired">'.$langs->trans('RefSupplierBill').'</td><td><input name="ref_supplier" value="'.(GETPOSTISSET('ref_supplier') ? GETPOST('ref_supplier') : (!empty($objectsrc->ref_supplier) ? $objectsrc->ref_supplier : '')).'" type="text"';
2406 if (!empty($societe->id) && $societe->id > 0) {
2407 print ' autofocus';
2408 }
2409 print '></td>';
2410 print '</tr>';
2411
2412 print '<tr><td class="tdtop fieldrequired">'.$langs->trans('Type').'</td><td>';
2413
2414 print '<div class="tagtable">'."\n";
2415
2416 // Standard invoice
2417 print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
2418 $tmp = '<input type="radio" id="radio_standard" name="type" value="0"'.(GETPOSTINT('type') ? '' : 'checked').'> ';
2419 $desc = $form->textwithpicto($tmp.'<label for="radio_standard">'.$langs->trans("InvoiceStandardAsk").'</label>', $langs->transnoentities("InvoiceStandardDesc"), 1, 'help', '', 0, 3);
2420 print $desc;
2421 print '</div></div>';
2422
2423 if (empty($origin) || ($origin == 'order_supplier' && !empty($originid))) {
2424 // Deposit - Down payment
2425 if (!getDolGlobalString('INVOICE_DISABLE_DEPOSIT')) {
2426 print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
2427 $tmp = '<input type="radio" id="radio_deposit" name="type" value="3"' . (GETPOSTINT('type') == 3 ? ' checked' : '') . '> ';
2428 print '<script type="text/javascript">
2429 jQuery(document).ready(function() {
2430 jQuery("#typestandardinvoice, #valuestandardinvoice").click(function() {
2431 jQuery("#radio_standard").prop("checked", true);
2432 });
2433 jQuery("#typedeposit, #valuedeposit").click(function() {
2434 jQuery("#radio_deposit").prop("checked", true);
2435 });
2436 jQuery("#typedeposit").change(function() {
2437 console.log("We change type of down payment");
2438 jQuery("#radio_deposit").prop("checked", true);
2439 setRadioForTypeOfInvoice();
2440 });
2441 jQuery("#radio_standard, #radio_deposit, #radio_replacement, #radio_template").change(function() {
2442 setRadioForTypeOfInvoice();
2443 });
2444 function setRadioForTypeOfInvoice() {
2445 console.log("Change radio");
2446 if (jQuery("#radio_deposit").prop("checked") && (jQuery("#typedeposit").val() == \'amount\' || jQuery("#typedeposit").val() == \'variable\')) {
2447 jQuery(".checkforselect").prop("disabled", true);
2448 jQuery(".checkforselect").prop("checked", false);
2449 } else {
2450 jQuery(".checkforselect").prop("disabled", false);
2451 jQuery(".checkforselect").prop("checked", true);
2452 }
2453 }
2454 });
2455 </script>';
2456
2457 $tmp = $tmp.'<label for="radio_deposit" >'.$langs->trans("InvoiceDeposit").'</label>';
2458 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
2459 $desc = $form->textwithpicto($tmp, $langs->transnoentities("InvoiceDepositDesc"), 1, 'help', '', 0, 3);
2460 print '<table class="nobordernopadding"><tr>';
2461 print '<td>';
2462 print $desc;
2463 print '</td>';
2464 if ($origin == 'order_supplier') {
2465 print '<td class="nowrap" style="padding-left: 15px">';
2466 $arraylist = array(
2467 'amount' => $langs->transnoentitiesnoconv('FixAmount', $langs->transnoentitiesnoconv('Deposit')),
2468 'variable' => $langs->transnoentitiesnoconv('VarAmountOneLine', $langs->transnoentitiesnoconv('Deposit')),
2469 'variablealllines' => $langs->transnoentitiesnoconv('VarAmountAllLines')
2470 );
2471 print $form->selectarray('typedeposit', $arraylist, GETPOST('typedeposit', 'aZ09'), 0, 0, 0, '', 1);
2472 print '</td>';
2473 print '<td class="nowrap" style="padding-left: 5px">';
2474 print '<span class="opacitymedium paddingleft">'.$langs->trans("AmountOrPercent").'</span><input type="text" id="valuedeposit" name="valuedeposit" class="width75 right" value="' . GETPOSTINT('valuedeposit') . '"/>';
2475 print '</td>';
2476 }
2477 print '</tr></table>';
2478
2479 print '</div></div>';
2480 }
2481 }
2482
2483 /* Not yet supported for supplier
2484 if ($societe->id > 0)
2485 {
2486 // Replacement
2487 if (empty($conf->global->INVOICE_DISABLE_REPLACEMENT))
2488 {
2489 // Type invoice
2490 $facids = $facturestatic->list_replacable_supplier_invoices($societe->id);
2491 if ($facids < 0) {
2492 dol_print_error($db, $facturestatic->error, $facturestatic->errors);
2493 exit();
2494 }
2495 $options = "";
2496 foreach ($facids as $facparam)
2497 {
2498 $options .= '<option value="' . $facparam ['id'] . '"';
2499 if ($facparam ['id'] == GETPOST('fac_replacement') {
2500 $options .= ' selected';
2501 }
2502 $options .= '>' . $facparam ['ref'];
2503 $options .= ' (' . $facturestatic->LibStatut(0, $facparam ['status']) . ')';
2504 $options .= '</option>';
2505 }
2506
2507 print '<!-- replacement line -->';
2508 print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
2509 $tmp='<input type="radio" name="type" id="radio_replacement" value="1"' . (GETPOST('type') == 1 ? ' checked' : '');
2510 if (! $options) $tmp.=' disabled';
2511 $tmp.='> ';
2512 print '<script type="text/javascript">
2513 jQuery(document).ready(function() {
2514 jQuery("#fac_replacement").change(function() {
2515 jQuery("#radio_replacement").prop("checked", true);
2516 });
2517 });
2518 </script>';
2519 $text = $tmp.$langs->trans("InvoiceReplacementAsk") . ' ';
2520 $text .= '<select class="flat" name="fac_replacement" id="fac_replacement"';
2521 if (! $options)
2522 $text .= ' disabled';
2523 $text .= '>';
2524 if ($options) {
2525 $text .= '<option value="-1">&nbsp;</option>';
2526 $text .= $options;
2527 } else {
2528 $text .= '<option value="-1">' . $langs->trans("NoReplacableInvoice") . '</option>';
2529 }
2530 $text .= '</select>';
2531 $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceReplacementDesc"), 1, 'help', '', 0, 3);
2532 print $desc;
2533 print '</div></div>';
2534 }
2535 }
2536 else
2537 {
2538 print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
2539 $tmp='<input type="radio" name="type" id="radio_replacement" value="0" disabled> ';
2540 $text = $tmp.$langs->trans("InvoiceReplacement") . ' ';
2541 $text.= '('.$langs->trans("YouMustCreateInvoiceFromSupplierThird").') ';
2542 $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceReplacementDesc"), 1, 'help', '', 0, 3);
2543 print $desc;
2544 print '</div></div>';
2545 }
2546 */
2547
2548 if (empty($origin)) {
2549 if (!empty($societe->id) && $societe->id > 0) {
2550 // Credit note
2551 if (!getDolGlobalString('INVOICE_DISABLE_CREDIT_NOTE')) {
2552 // Show link for credit note
2553 $facids = $facturestatic->list_qualified_avoir_supplier_invoices($societe->id);
2554 if ($facids < 0) {
2555 dol_print_error($db, $facturestatic->error, $facturestatic->errors);
2556 exit;
2557 }
2558 $optionsav = "";
2559 $newinvoice_static = new FactureFournisseur($db);
2560 foreach ($facids as $key => $valarray) {
2561 $newinvoice_static->id = $key;
2562 $newinvoice_static->ref = $valarray ['ref'];
2563 $newinvoice_static->status = $valarray ['status'];
2564 $newinvoice_static->statut = $valarray ['status'];
2565 $newinvoice_static->type = $valarray ['type'];
2566 $newinvoice_static->paid = $valarray ['paye'];
2567 $newinvoice_static->paye = $valarray ['paye'];
2568
2569 $optionsav .= '<option value="'.$key.'"';
2570 if ($key == GETPOSTINT('fac_avoir')) {
2571 $optionsav .= ' selected';
2572 }
2573 $optionsav .= '>';
2574 $optionsav .= $newinvoice_static->ref;
2575 $optionsav .= ' ('.$newinvoice_static->getLibStatut(1, $valarray ['paymentornot']).')';
2576 $optionsav .= '</option>';
2577 }
2578
2579 print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
2580 $tmp = '<input type="radio" id="radio_creditnote" name="type" value="2"'.(GETPOST('type') == 2 ? ' checked' : '');
2581 if (!$optionsav && !getDolGlobalString('INVOICE_CREDIT_NOTE_STANDALONE')) {
2582 $tmp .= ' disabled';
2583 }
2584 $tmp .= '> ';
2585 // Show credit note options only if we checked credit note
2586 print '<script type="text/javascript">
2587 jQuery(document).ready(function() {
2588 if (! jQuery("#radio_creditnote").is(":checked"))
2589 {
2590 jQuery("#credit_note_options").hide();
2591 }
2592 jQuery("#radio_creditnote").click(function() {
2593 jQuery("#credit_note_options").show();
2594 });
2595 jQuery("#radio_standard, #radio_replacement, #radio_deposit").click(function() {
2596 jQuery("#credit_note_options").hide();
2597 });
2598 });
2599 </script>';
2600 $text = $tmp.'<label for="radio_creditnote">'.$langs->transnoentities("InvoiceAvoirAsk").'</label> ';
2601 // $text.='<input type="text" value="">';
2602 $text .= '<select class="flat valignmiddle" name="fac_avoir" id="fac_avoir"';
2603 if (!$optionsav) {
2604 $text .= ' disabled';
2605 }
2606 $text .= '>';
2607 if ($optionsav) {
2608 $text .= '<option value="-1"></option>';
2609 $text .= $optionsav;
2610 } else {
2611 $text .= '<option value="-1">'.$langs->trans("NoInvoiceToCorrect").'</option>';
2612 }
2613 $text .= '</select>';
2614 $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceAvoirDesc"), 1, 'help', '', 0, 3);
2615 print $desc;
2616
2617 print '<div id="credit_note_options" class="clearboth">';
2618 print '&nbsp;&nbsp;&nbsp; <input type="checkbox" name="invoiceAvoirWithLines" id="invoiceAvoirWithLines" value="1" onclick="if($(this).is(\':checked\') ) { $(\'#radio_creditnote\').prop(\'checked\', true); $(\'#invoiceAvoirWithPaymentRestAmount\').removeAttr(\'checked\'); }" '.(GETPOSTINT('invoiceAvoirWithLines') > 0 ? 'checked' : '').' /> ';
2619 print '<label for="invoiceAvoirWithLines">'.$langs->trans('invoiceAvoirWithLines')."</label>";
2620 print '<br>&nbsp;&nbsp;&nbsp; <input type="checkbox" name="invoiceAvoirWithPaymentRestAmount" id="invoiceAvoirWithPaymentRestAmount" value="1" onclick="if($(this).is(\':checked\') ) { $(\'#radio_creditnote\').prop(\'checked\', true); $(\'#invoiceAvoirWithLines\').removeAttr(\'checked\'); }" '.(GETPOSTINT('invoiceAvoirWithPaymentRestAmount') > 0 ? 'checked' : '').' /> ';
2621 print '<label for="invoiceAvoirWithPaymentRestAmount">'.$langs->trans('invoiceAvoirWithPaymentRestAmount')."</label>";
2622 print '</div>';
2623
2624 print '</div></div>';
2625 }
2626 } else {
2627 print '<div class="tagtr listofinvoicetype"><div class="tagtd listofinvoicetype">';
2628 if (!getDolGlobalString('INVOICE_CREDIT_NOTE_STANDALONE')) {
2629 $tmp = '<input type="radio" name="type" id="radio_creditnote" value="0" disabled> ';
2630 } else {
2631 $tmp = '<input type="radio" name="type" id="radio_creditnote" value="2"> ';
2632 }
2633 $text = $tmp.$langs->trans("InvoiceAvoir").' ';
2634 $text .= '<span class="opacitymedium">('.$langs->trans("YouMustCreateInvoiceFromSupplierThird").')</span> ';
2635 $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceAvoirDesc"), 1, 'help', '', 0, 3);
2636 print $desc;
2637 print '</div></div>'."\n";
2638 }
2639 }
2640
2641 print '</div>';
2642
2643 print '</td></tr>';
2644
2645
2646 // Invoice Subtype
2647 if (getDolGlobalInt('INVOICE_SUBTYPE_ENABLED')) {
2648 print '<tr><td class="fieldrequired">'.$langs->trans('InvoiceSubtype').'</td><td colspan="2">';
2649 print $form->getSelectInvoiceSubtype(GETPOST('subtype'), 'subtype', 1, 0, '');
2650 print '</td></tr>';
2651 }
2652
2653 if (!empty($societe->id) && $societe->id > 0) {
2654 // Discounts for third party
2655 print '<tr><td>'.$langs->trans('Discounts').'</td><td>';
2656
2657 $thirdparty = $societe;
2658 $discount_type = 1;
2659 $backtopage = urlencode($_SERVER["PHP_SELF"].'?socid='.$societe->id.'&action='.$action.'&origin='.GETPOST('origin').'&originid='.GETPOST('originid'));
2660 include DOL_DOCUMENT_ROOT.'/core/tpl/object_discounts.tpl.php';
2661
2662 print '</td></tr>';
2663 }
2664
2665 // Label
2666 print '<tr><td>'.$langs->trans('Label').'</td><td><input class="minwidth200" name="label" value="'.dol_escape_htmltag(GETPOST('label')).'" type="text"></td></tr>';
2667
2668 // Date invoice
2669 print '<tr><td class="fieldrequired">'.$langs->trans('DateInvoice').'</td><td>';
2670 print img_picto('', 'action', 'class="pictofixedwidth"');
2671 print $form->selectDate($dateinvoice, '', 0, 0, 0, "add", 1, 1);
2672 print '</td></tr>';
2673
2674 // Payment term
2675 print '<tr><td class="nowrap">'.$langs->trans('PaymentConditionsShort').'</td><td>';
2676 print img_picto('', 'payment', 'class="pictofixedwidth"');
2677 print $form->getSelectConditionsPaiements($cond_reglement_id, 'cond_reglement_id', -1, 1);
2678
2679 print '</td></tr>';
2680
2681 // Due date
2682 print '<tr><td>'.$langs->trans('DateMaxPayment').'</td><td>';
2683 print img_picto('', 'action', 'class="pictofixedwidth"');
2684 print $form->selectDate($datedue, 'ech', 0, 0, 0, "add", 1, 1);
2685 print '</td></tr>';
2686
2687 // Payment mode
2688 print '<tr><td>'.$langs->trans('PaymentMode').'</td><td>';
2689 print img_picto('', 'bank', 'class="pictofixedwidth"');
2690 $form->select_types_paiements($mode_reglement_id, 'mode_reglement_id', 'DBIT', 0, 1, 0, 0, 1, 'maxwidth200 widthcentpercentminusx');
2691 print '</td></tr>';
2692
2693 // Bank Account
2694 if (isModEnabled("bank")) {
2695 print '<tr><td>'.$langs->trans('BankAccount').'</td><td>';
2696 // when bank account is empty (means not override by payment mode form a other object, like third-party), try to use default value
2697 print img_picto('', 'bank_account', 'class="pictofixedwidth"').$form->select_comptes($fk_account, 'fk_account', 0, '', 1, '', 0, 'maxwidth200 widthcentpercentminusx', 1);
2698 print '</td></tr>';
2699 }
2700
2701 // Project
2702 if (isModEnabled('project')) {
2703 $formproject = new FormProjets($db);
2704
2705 $langs->load('projects');
2706 print '<tr><td>'.$langs->trans('Project').'</td><td>';
2707 print img_picto('', 'project', 'class="pictofixedwidth"').$formproject->select_projects((!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ? $societe->id : -1), $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx');
2708 print ' <a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.(!empty($soc->id) ? $soc->id : 0).'&action=create&status=1&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create&socid='.(!empty($soc->id) ? $soc->id : 0).($fac_recid > 0 ? '&fac_rec='.$fac_recid : '')).'"><span class="fa fa-plus-circle valignmiddle" title="'.$langs->trans("AddProject").'"></span></a>';
2709 print '</td></tr>';
2710 }
2711
2712 // Incoterms
2713 if (isModEnabled('incoterm')) {
2714 print '<tr>';
2715 print '<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans("IncotermLabel"), !empty($objectsrc->label_incoterms) ? $objectsrc->label_incoterms : '', 1).'</label></td>';
2716 print '<td colspan="3" class="maxwidthonsmartphone">';
2717 print img_picto('', 'incoterm', 'class="pictofixedwidth"');
2718 print $form->select_incoterms(GETPOSTISSET('incoterm_id') ? GETPOST('incoterm_id', 'alphanohtml') : (!empty($objectsrc->fk_incoterms) ? $objectsrc->fk_incoterms : ''), GETPOSTISSET('location_incoterms') ? GETPOST('location_incoterms', 'alphanohtml') : (!empty($objectsrc->location_incoterms) ? $objectsrc->location_incoterms : ''));
2719 print '</td></tr>';
2720 }
2721
2722 // Vat reverse-charge by default
2723 if (getDolGlobalString('ACCOUNTING_FORCE_ENABLE_VAT_REVERSE_CHARGE')) {
2724 require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php';
2725 print '<tr><td>' . $langs->trans('VATReverseCharge') . '</td><td>';
2726 // Try to propose to use VAT reverse charge even if the VAT reverse charge is not activated in the supplier card, if this corresponds to the context of use, the activation is proposed
2727 if (GETPOSTISSET('vat_reverse_charge')) { // Check if form was submitted previously
2728 $vat_reverse_charge = (GETPOST('vat_reverse_charge', 'alpha') == 'on' || GETPOST('vat_reverse_charge', 'alpha') == '1') ? 1 : 0;
2729 } elseif ($vat_reverse_charge == 1 || $societe->vat_reverse_charge == 1 || ($societe->country_code != 'FR' && isInEEC($societe) && !empty($societe->tva_intra))) {
2730 $vat_reverse_charge = 1;
2731 } else {
2732 $vat_reverse_charge = 0;
2733 }
2734
2735 print '<input type="checkbox" name="vat_reverse_charge"'. (!empty($vat_reverse_charge) ? ' checked ' : '') . '>';
2736 print '</td></tr>';
2737 }
2738
2739 // Multicurrency
2740 if (isModEnabled("multicurrency")) {
2741 print '<tr>';
2742 print '<td>'.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).'</td>';
2743 print '<td class="maxwidthonsmartphone">';
2744 print img_picto('', 'currency', 'class="pictofixedwidth"');
2745 $used_currency_code = $currency_code;
2746 if (!GETPOST('changecompany')) {
2747 $used_currency_code = GETPOSTISSET('multicurrency_code') ? GETPOST('multicurrency_code', 'alpha') : $currency_code;
2748 }
2749 print $form->selectMultiCurrency($used_currency_code, 'multicurrency_code');
2750 print '</td></tr>';
2751 }
2752
2753 // Help of substitution key
2754 $htmltext = '';
2755 if ($fac_recid > 0) {
2756 $dateexample = $dateinvoice;
2757 if (empty($dateexample)) {
2758 $dateexample = dol_now();
2759 }
2760 $substitutionarray = array(
2761 '__TOTAL_HT__' => $langs->trans("AmountHT").' ('.$langs->trans("Example").': '.price($exampletemplateinvoice->total_ht).')',
2762 '__TOTAL_TTC__' => $langs->trans("AmountTTC").' ('.$langs->trans("Example").': '.price($exampletemplateinvoice->total_ttc).')',
2763 '__INVOICE_PREVIOUS_MONTH__' => $langs->trans("PreviousMonthOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($dateexample, -1, 'm'), '%m').')',
2764 '__INVOICE_MONTH__' => $langs->trans("MonthOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date($dateexample, '%m').')',
2765 '__INVOICE_NEXT_MONTH__' => $langs->trans("NextMonthOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($dateexample, 1, 'm'), '%m').')',
2766 '__INVOICE_PREVIOUS_MONTH_TEXT__' => $langs->trans("TextPreviousMonthOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($dateexample, -1, 'm'), '%B').')',
2767 '__INVOICE_MONTH_TEXT__' => $langs->trans("TextMonthOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date($dateexample, '%B').')',
2768 '__INVOICE_NEXT_MONTH_TEXT__' => $langs->trans("TextNextMonthOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($dateexample, 1, 'm'), '%B').')',
2769 '__INVOICE_PREVIOUS_YEAR__' => $langs->trans("PreviousYearOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($dateexample, -1, 'y'), '%Y').')',
2770 '__INVOICE_YEAR__' => $langs->trans("YearOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date($dateexample, '%Y').')',
2771 '__INVOICE_NEXT_YEAR__' => $langs->trans("NextYearOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($dateexample, 1, 'y'), '%Y').')'
2772 );
2773
2774 $htmltext = '<i>'.$langs->trans("FollowingConstantsWillBeSubstituted").':<br>';
2775 foreach ($substitutionarray as $key => $val) {
2776 $htmltext .= $key.' = '.$langs->trans($val).'<br>';
2777 }
2778 $htmltext .= '</i>';
2779 }
2780
2781 // Intracomm report
2782 if (isModEnabled('intracommreport')) {
2783 $langs->loadLangs(array("intracommreport"));
2784 print '<!-- If module intracomm on -->'."\n";
2785 print '<tr><td>'.$langs->trans('IntracommReportTransportMode').'</td><td>';
2786 $form->selectTransportMode(GETPOSTISSET('transport_mode_id') ? GETPOST('transport_mode_id') : $transport_mode_id, 'transport_mode_id');
2787 print '</td></tr>';
2788 }
2789
2790 if (empty($reshook)) {
2791 print $object->showOptionals($extrafields, 'create');
2792 }
2793
2794 // Public note
2795 print '<tr><td>'.$langs->trans('NotePublic').'</td>';
2796 print '<td>';
2797 $doleditor = new DolEditor('note_public', (GETPOSTISSET('note_public') ? GETPOST('note_public', 'restricthtml') : $note_public), '', 80, 'dolibarr_notes', 'In', 0, false, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3, '90%');
2798 print $doleditor->Create(1);
2799 print '</td>';
2800 // print '<td><textarea name="note" wrap="soft" cols="60" rows="'.ROWS_5.'"></textarea></td>';
2801 print '</tr>';
2802
2803 // Private note
2804 print '<tr><td>'.$langs->trans('NotePrivate').'</td>';
2805 print '<td>';
2806 $doleditor = new DolEditor('note_private', (GETPOSTISSET('note_private') ? GETPOST('note_private', 'restricthtml') : $note_private), '', 80, 'dolibarr_notes', 'In', 0, false, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3, '90%');
2807 print $doleditor->Create(1);
2808 print '</td>';
2809 // print '<td><textarea name="note" wrap="soft" cols="60" rows="'.ROWS_5.'"></textarea></td>';
2810 print '</tr>';
2811
2812
2813 if (!empty($objectsrc) && is_object($objectsrc)) {
2814 print "\n<!-- ".$classname." info -->";
2815 print "\n";
2816 print '<input type="hidden" name="amount" value="'.$objectsrc->total_ht.'">'."\n";
2817 print '<input type="hidden" name="total" value="'.$objectsrc->total_ttc.'">'."\n";
2818 print '<input type="hidden" name="tva" value="'.$objectsrc->total_tva.'">'."\n";
2819 print '<input type="hidden" name="origin" value="'.$objectsrc->element.'">';
2820 print '<input type="hidden" name="originid" value="'.$objectsrc->id.'">';
2821
2822 $txt = $langs->trans($classname);
2823 if ($classname == 'CommandeFournisseur') {
2824 $langs->load('orders');
2825 $txt = $langs->trans("SupplierOrder");
2826 }
2827 print '<tr><td>'.$txt.'</td><td>'.$objectsrc->getNomUrl(1);
2828 // We check if Origin document (id and type is known) has already at least one invoice attached to it
2829 $objectsrc->fetchObjectLinked($originid, $origin, null, 'invoice_supplier');
2830
2831 $invoice_supplier = $objectsrc->linkedObjects['invoice_supplier'];
2832 '@phan-var-force null|FactureFournisseur[] $invoice_supplier';
2833
2834 // count function need a array as argument (Note: the array must implement Countable too)
2835 if (is_array($invoice_supplier)) {
2836 $cntinvoice = count($invoice_supplier);
2837
2838 if ($cntinvoice >= 1) {
2839 setEventMessages('WarningBillExist', null, 'warnings');
2840 echo ' ('.$langs->trans('LatestRelatedBill').end($invoice_supplier)->getNomUrl(1).')';
2841 }
2842 }
2843
2844 print '</td></tr>';
2845 print '<tr><td>'.$langs->trans('AmountHT').'</td><td>'.price($objectsrc->total_ht).'</td></tr>';
2846 print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($objectsrc->total_tva)."</td></tr>";
2847 if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) { //Localtax1
2848 print '<tr><td>'.$langs->transcountry("AmountLT1", $mysoc->country_code).'</td><td>'.price($objectsrc->total_localtax1)."</td></tr>";
2849 }
2850
2851 if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) { //Localtax2
2852 print '<tr><td>'.$langs->transcountry("AmountLT2", $mysoc->country_code).'</td><td>'.price($objectsrc->total_localtax2)."</td></tr>";
2853 }
2854 print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($objectsrc->total_ttc)."</td></tr>";
2855
2856 if (isModEnabled("multicurrency")) {
2857 print '<tr><td>'.$langs->trans('MulticurrencyAmountHT').'</td><td>'.price($objectsrc->multicurrency_total_ht).'</td></tr>';
2858 print '<tr><td>'.$langs->trans('MulticurrencyAmountVAT').'</td><td>'.price($objectsrc->multicurrency_total_tva)."</td></tr>";
2859 print '<tr><td>'.$langs->trans('MulticurrencyAmountTTC').'</td><td>'.price($objectsrc->multicurrency_total_ttc)."</td></tr>";
2860 }
2861 }
2862
2863 // Other options
2864 $parameters = array();
2865 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2866 print $hookmanager->resPrint;
2867
2868
2869 print "</table>\n";
2870 }
2871
2872 print dol_get_fiche_end();
2873
2874 print $form->buttonsSaveCancel("CreateDraft");
2875
2876 // Show origin lines
2877 if (!empty($objectsrc) && is_object($objectsrc)) {
2878 print '<br>';
2879
2880 $title = $langs->trans('ProductsAndServices');
2881 print load_fiche_titre($title);
2882
2883 print '<div class="div-table-responsive-no-min">';
2884 print '<table class="noborder centpercent">';
2885
2886 $objectsrc->printOriginLinesList('', $selectedLines);
2887
2888 print '</table>';
2889 print '</div>';
2890 }
2891
2892 print "</form>\n";
2893} else {
2894 if ($id > 0 || !empty($ref)) {
2895 //
2896 // View or edit mode
2897 //
2898 $now = dol_now();
2899
2900 $productstatic = new Product($db);
2901
2902 $result = $object->fetch($id, $ref);
2903 if ($result <= 0) {
2904 $langs->load("errors");
2905 print $langs->trans("ErrorRecordNotFound");
2906 llxFooter();
2907 $db->close();
2908 exit;
2909 }
2910
2911 $result = $object->fetch_thirdparty();
2912 if ($result < 0) {
2913 dol_print_error($db, $object->error, $object->errors);
2914 exit;
2915 }
2916
2917 $societe = $object->thirdparty;
2918
2919 $totalpaid = $object->getSommePaiement();
2920 $totalcreditnotes = $object->getSumCreditNotesUsed();
2921 $totaldeposits = $object->getSumDepositsUsed();
2922 // print "totalpaid=".$totalpaid." totalcreditnotes=".$totalcreditnotes." totaldeposts=".$totaldeposits."
2923 // selleruserrevenuestamp=".$selleruserevenustamp;
2924
2925 // We can also use bcadd to avoid pb with floating points
2926 // For example print 239.2 - 229.3 - 9.9; does not return 0.
2927 // $resteapayer=bcadd($object->total_ttc,$totalpaid,$conf->global->MAIN_MAX_DECIMALS_TOT);
2928 // $resteapayer=bcadd($resteapayer,$totalavoir,$conf->global->MAIN_MAX_DECIMALS_TOT);
2929 $resteapayer = price2num($object->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits, 'MT');
2930
2931 // Multicurrency
2932 $multicurrency_resteapayer = 0;
2933 if (isModEnabled("multicurrency")) {
2934 $multicurrency_totalpaid = $object->getSommePaiement(1);
2935 $multicurrency_totalcreditnotes = $object->getSumCreditNotesUsed(1);
2936 $multicurrency_totaldeposits = $object->getSumDepositsUsed(1);
2937 $multicurrency_resteapayer = price2num($object->multicurrency_total_ttc - $multicurrency_totalpaid - $multicurrency_totalcreditnotes - $multicurrency_totaldeposits, 'MT');
2938 // Code to fix case of corrupted data
2939 // TODO We should not need this. Also data comes from not reliable value of $object->multicurrency_total_ttc that may be wrong if it was
2940 // calculated by summing lines that were in a currency for some of them and into another for others (lines from discount/down payment into another currency for example)
2941 if ($resteapayer == 0 && $multicurrency_resteapayer != 0 && $object->multicurrency_code != $conf->currency) {
2942 $resteapayer = price2num((float) $multicurrency_resteapayer / $object->multicurrency_tx, 'MT');
2943 }
2944 }
2945
2946 if ($object->paid) {
2947 $resteapayer = 0;
2948 }
2949 $resteapayeraffiche = $resteapayer;
2950
2951 if (getDolGlobalString('FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS')) { // Never use this
2952 $filterabsolutediscount = "fk_invoice_supplier_source IS NULL"; // If we want deposit to be subtracted to payments only and not to total of final invoice
2953 $filtercreditnote = "fk_invoice_supplier_source IS NOT NULL"; // If we want deposit to be subtracted to payments only and not to total of final invoice
2954 } else {
2955 $filterabsolutediscount = "fk_invoice_supplier_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS PAID)%')";
2956 $filtercreditnote = "fk_invoice_supplier_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS PAID)%')";
2957 }
2958
2959 $absolute_discount = $societe->getAvailableDiscounts(null, $filterabsolutediscount, 0, 1);
2960 $absolute_creditnote = $societe->getAvailableDiscounts(null, $filtercreditnote, 0, 1);
2961 $absolute_discount = price2num($absolute_discount, 'MT');
2962 $absolute_creditnote = price2num($absolute_creditnote, 'MT');
2963
2964 /*
2965 * View card
2966 */
2967 $objectidnext = $object->getIdReplacingInvoice();
2968
2970 $titre = $langs->trans('SupplierInvoice');
2971
2972 print dol_get_fiche_head($head, 'card', $titre, -1, 'supplier_invoice', 0, '', '', 0, '', 1);
2973
2974 $formconfirm = '';
2975
2976 // Confirmation de la conversion de l'avoir en reduc
2977 if ($action == 'converttoreduc') {
2978 $type_fac = '';
2980 $type_fac = 'ExcessPaid';
2981 } elseif ($object->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
2982 $type_fac = 'CreditNote';
2983 } elseif ($object->type == FactureFournisseur::TYPE_DEPOSIT) {
2984 $type_fac = 'Deposit';
2985 }
2986 $text = $langs->trans('ConfirmConvertToReducSupplier', strtolower($langs->transnoentities($type_fac)));
2987 $text .= '<br>'.$langs->trans('ConfirmConvertToReducSupplier2');
2988 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?facid='.$object->id, $langs->trans('ConvertToReduc'), $text, 'confirm_converttoreduc', '', "yes", 2);
2989 }
2990
2991 // Clone confirmation
2992 if ($action == 'clone') {
2993 // Create an array for form
2994 $formquestion = array(
2995 array('type' => 'text', 'name' => 'newsupplierref', 'label' => $langs->trans("RefSupplierBill"), 'value' => $langs->trans("CopyOf").' '.$object->ref_supplier),
2996 array('type' => 'date', 'name' => 'newdate', 'label' => $langs->trans("Date"), 'value' => dol_now())
2997 );
2998 // Ask confirmation to clone
2999 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneInvoice', $object->ref), 'confirm_clone', $formquestion, 'yes', 1, 250);
3000 }
3001
3002 // Confirmation of validation
3003 if ($action == 'valid') {
3004 // We check if number is temporary number
3005 if (preg_match('/^[\‍(]?PROV/i', $object->ref) || empty($object->ref)) {
3006 // empty should not happened, but when it occurs, the test save life
3007 $numref = $object->getNextNumRef($societe);
3008 } else {
3009 $numref = $object->ref;
3010 }
3011
3012 if ($numref < 0) {
3013 setEventMessages($object->error, $object->errors, 'errors');
3014 $action = '';
3015 } else {
3016 $text = $langs->trans('ConfirmValidateBill', $numref);
3017 /*if (isModEnabled('notification'))
3018 {
3019 require_once DOL_DOCUMENT_ROOT .'/core/class/notify.class.php';
3020 $notify=new Notify($db);
3021 $text.='<br>';
3022 $text.=$notify->confirmMessage('BILL_SUPPLIER_VALIDATE',$object->socid, $object);
3023 }*/
3024 $formquestion = array();
3025
3026 $qualified_for_stock_change = 0;
3027 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
3028 $qualified_for_stock_change = $object->hasProductsOrServices(2);
3029 } else {
3030 $qualified_for_stock_change = $object->hasProductsOrServices(1);
3031 }
3032
3033 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_BILL') && $qualified_for_stock_change) {
3034 $langs->load("stocks");
3035 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
3036 $formproduct = new FormProduct($db);
3037 $warehouse = new Entrepot($db);
3038 $warehouse_array = $warehouse->list_array();
3039 if (count($warehouse_array) == 1) {
3040 $label = $object->type == FactureFournisseur::TYPE_CREDIT_NOTE ? $langs->trans("WarehouseForStockDecrease", current($warehouse_array)) : $langs->trans("WarehouseForStockIncrease", current($warehouse_array));
3041 $value = '<input type="hidden" id="idwarehouse" name="idwarehouse" value="'.key($warehouse_array).'">';
3042 } else {
3043 $label = $object->type == FactureFournisseur::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockDecrease") : $langs->trans("SelectWarehouseForStockIncrease");
3044 $value = $formproduct->selectWarehouses(GETPOST('idwarehouse') ? GETPOST('idwarehouse') : 'ifone', 'idwarehouse', '', 1);
3045 }
3046 $formquestion = array(
3047 array('type' => 'other', 'name' => 'idwarehouse', 'label' => $label, 'value' => $value)
3048 );
3049 }
3050
3051 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateBill'), $text, 'confirm_valid', $formquestion, 1, 1);
3052 }
3053 }
3054
3055 // Confirmation edit (back to draft)
3056 if ($action == 'edit') {
3057 $formquestion = array();
3058
3059 $qualified_for_stock_change = 0;
3060 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
3061 $qualified_for_stock_change = $object->hasProductsOrServices(2);
3062 } else {
3063 $qualified_for_stock_change = $object->hasProductsOrServices(1);
3064 }
3065 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_BILL') && $qualified_for_stock_change) {
3066 $langs->load("stocks");
3067 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
3068 $formproduct = new FormProduct($db);
3069 $warehouse = new Entrepot($db);
3070 $warehouse_array = $warehouse->list_array();
3071 if (count($warehouse_array) == 1) {
3072 $label = $object->type == FactureFournisseur::TYPE_CREDIT_NOTE ? $langs->trans("WarehouseForStockIncrease", current($warehouse_array)) : $langs->trans("WarehouseForStockDecrease", current($warehouse_array));
3073 $value = '<input type="hidden" id="idwarehouse" name="idwarehouse" value="'.key($warehouse_array).'">';
3074 } else {
3075 $label = $object->type == FactureFournisseur::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockIncrease") : $langs->trans("SelectWarehouseForStockDecrease");
3076 $value = $formproduct->selectWarehouses(GETPOST('idwarehouse') ? GETPOST('idwarehouse') : 'ifone', 'idwarehouse', '', 1);
3077 }
3078 $formquestion = array(
3079 array('type' => 'other', 'name' => 'idwarehouse', 'label' => $label, 'value' => $value)
3080 );
3081 }
3082 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('UnvalidateBill'), $langs->trans('ConfirmUnvalidateBill', $object->ref), 'confirm_edit', $formquestion, 1, 1);
3083 }
3084
3085 // Confirmation set paid
3086 if ($action == 'paid' && ($resteapayer <= 0 || (getDolGlobalString('SUPPLIER_INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID') && $resteapayer == $object->total_ttc))) {
3087 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ClassifyPaid'), $langs->trans('ConfirmClassifyPaidBill', $object->ref), 'confirm_paid', '', 0, 1);
3088 }
3089
3090 if ($action == 'paid' && $resteapayer > 0 && (!getDolGlobalString('SUPPLIER_INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID') || $resteapayer != $object->total_ttc)) {
3091 $close = array();
3092 // Code
3093 $i = 0;
3094 $close[$i]['code'] = 'discount_vat'; // escompte
3095 $i++;
3096 $close[$i]['code'] = 'badsupplier';
3097 $i++;
3098 $close[$i]['code'] = 'other';
3099 $i++;
3100 // Help
3101 $i = 0;
3102 $close[$i]['label'] = $langs->trans("HelpEscompte").'<br><br>'.$langs->trans("ConfirmClassifyPaidPartiallyReasonDiscountVatDesc");
3103 $i++;
3104 $close[$i]['label'] = $langs->trans("ConfirmClassifyPaidPartiallyReasonBadSupplierDesc");
3105 $i++;
3106 $close[$i]['label'] = $langs->trans("Other");
3107 $i++;
3108 // Text
3109 $i = 0;
3110 $close[$i]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonDiscount", $resteapayer, $langs->trans("Currency".$conf->currency)), $close[$i]['label'], 1);
3111 $i++;
3112 $close[$i]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonBadCustomer", $resteapayer, $langs->trans("Currency".$conf->currency)), $close[$i]['label'], 1);
3113 $i++;
3114 $close[$i]['reason'] = $form->textwithpicto($langs->transnoentities("Other"), $close[$i]['label'], 1);
3115 $i++;
3116 // arrayreasons[code]=reason
3117 $arrayreasons = array();
3118 foreach ($close as $key => $val) {
3119 $arrayreasons[$close[$key]['code']] = $close[$key]['reason'];
3120 }
3121
3122 // Create a form table
3123 $formquestion = array('text' => $langs->trans("ConfirmClassifyPaidPartiallyQuestion"), 0 => array('type' => 'radio', 'name' => 'close_code', 'label' => $langs->trans("Reason"), 'values' => $arrayreasons), 1 => array('type' => 'text', 'name' => 'close_note', 'label' => $langs->trans("Comment"), 'value' => '', 'morecss' => 'minwidth300'));
3124 // Incomplete payment. We ask if the reason is discount or other
3125 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?facid='.$object->id, $langs->trans('ClassifyPaid'), $langs->trans('ConfirmClassifyPaidPartially', $object->ref), 'confirm_paid_partially', $formquestion, "yes", 1, 310);
3126 }
3127
3128 // Confirmation of the abandoned classification
3129 if ($action == 'canceled') {
3130 // Code
3131 $close[1]['code'] = 'badsupplier';
3132 $close[2]['code'] = 'abandon';
3133 // Help
3134 $close[1]['label'] = $langs->trans("ConfirmClassifyPaidPartiallyReasonBadSupplierDesc");
3135 $close[2]['label'] = $langs->trans("ConfirmClassifyAbandonReasonOtherDesc");
3136 // Text
3137 $close[1]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyPaidPartiallyReasonBadSupplier", $object->ref), $close[1]['label'], 1);
3138 $close[2]['reason'] = $form->textwithpicto($langs->transnoentities("ConfirmClassifyAbandonReasonOther"), $close[2]['label'], 1);
3139 // arrayreasons
3140 $arrayreasons[$close[1]['code']] = $close[1]['reason'];
3141 $arrayreasons[$close[2]['code']] = $close[2]['reason'];
3142
3143 // Create a form table
3144 $formquestion = array('text' => $langs->trans("ConfirmCancelBillQuestion"), 0 => array('type' => 'radio', 'name' => 'close_code', 'label' => $langs->trans("Reason"), 'values' => $arrayreasons), 1 => array('type' => 'text', 'name' => 'close_note', 'label' => $langs->trans("Comment"), 'value' => '', 'morecss' => 'minwidth300'));
3145
3146 $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('CancelBill'), $langs->trans('ConfirmCancelBill', $object->ref), 'confirm_canceled', $formquestion, "yes", 1, 280);
3147 }
3148
3149 // Confirmation de la suppression de la facture fournisseur
3150 if ($action == 'delete') {
3151 $formquestion = array();
3152
3153 $qualified_for_stock_change = 0;
3154 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
3155 $qualified_for_stock_change = $object->hasProductsOrServices(2);
3156 } else {
3157 $qualified_for_stock_change = $object->hasProductsOrServices(1);
3158 }
3159
3160 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_BILL') && $qualified_for_stock_change) {
3161 $langs->load("stocks");
3162 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
3163 $formproduct = new FormProduct($db);
3164 $warehouse = new Entrepot($db);
3165 $warehouse_array = $warehouse->list_array();
3166
3167 $selectwarehouse = '<span class="questionrevertstock hidden">';
3168 if (count($warehouse_array) == 1) {
3169 $label = $object->type == FactureFournisseur::TYPE_CREDIT_NOTE ? $langs->trans("WarehouseForStockIncrease", current($warehouse_array)) : $langs->trans("WarehouseForStockDecrease", current($warehouse_array));
3170 $selectwarehouse .= '<input type="hidden" id="idwarehouse" name="idwarehouse" value="'.key($warehouse_array).'">';
3171 } else {
3172 $label = $object->type == FactureFournisseur::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockIncrease") : $langs->trans("SelectWarehouseForStockDecrease");
3173 $selectwarehouse .= $formproduct->selectWarehouses(GETPOST('idwarehouse') ? GETPOST('idwarehouse') : 'ifone', 'idwarehouse', '', 1);
3174 }
3175 $selectwarehouse .= '</span>';
3176
3177 $selectyesno = array(0 => $langs->trans('No'), 1 => $langs->trans('Yes'));
3178
3179 print '<script type="text/javascript">
3180 $(document).ready(function() {
3181 $("#revertstock").change(function() {
3182 if(this.value > 0) {
3183 $(".questionrevertstock").removeClass("hidden");
3184 } else {
3185 $(".questionrevertstock").addClass("hidden");
3186 }
3187 });
3188 });
3189 </script>';
3190
3191 $formquestion = array(
3192 array('type' => 'select', 'name' => 'revertstock', 'label' => $langs->trans("RevertProductsToStock"), 'select_show_empty' => 0, 'values' => $selectyesno),
3193 array('type' => 'other', 'name' => 'idwarehouse', 'label' => $label, 'value' => $selectwarehouse, 'tdclass' => 'questionrevertstock hidden')
3194 );
3195 }
3196
3197 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteBill'), $langs->trans('ConfirmDeleteBill'), 'confirm_delete', $formquestion, 1, 1);
3198 }
3199 if ($action == 'deletepayment') {
3200 $payment_id = GETPOST('paiement_id');
3201 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&paiement_id='.$payment_id, $langs->trans('DeletePayment'), $langs->trans('ConfirmDeletePayment'), 'confirm_delete_paiement', '', 0, 1);
3202 }
3203
3204 // Confirmation to delete line
3205 if ($action == 'ask_deleteline') {
3206 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteline', '', 0, 1);
3207 }
3208
3209 $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
3210 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
3211 if (empty($reshook)) {
3212 $formconfirm .= $hookmanager->resPrint;
3213 } elseif ($reshook > 0) {
3214 $formconfirm = $hookmanager->resPrint;
3215 }
3216
3217 // Print form confirm
3218 print $formconfirm;
3219
3220
3221 // Supplier invoice card
3222 $linkback = '<a href="'.DOL_URL_ROOT.'/fourn/facture/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
3223
3224 $morehtmlref = '<div class="refidno">';
3225 // Ref supplier
3226 $morehtmlref .= $form->editfieldkey("RefSupplierBill", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string', '', 0, 1);
3227 $morehtmlref .= $form->editfieldval("RefSupplierBill", 'ref_supplier', $object->ref_supplier, $object, $usercancreate, 'string', '', null, null, '', 1);
3228 // Thirdparty
3229 $morehtmlref .= '<br>'.$object->thirdparty->getNomUrl(1, 'supplier');
3230 if (!getDolGlobalString('MAIN_DISABLE_OTHER_LINK') && $object->thirdparty->id > 0) {
3231 $morehtmlref .= ' <div class="inline-block valignmiddle">(<a class="valignmiddle" href="'.DOL_URL_ROOT.'/fourn/facture/list.php?socid='.((int) $object->thirdparty->id).'&search_company='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherBills").'</a>)</div>';
3232 }
3233 // Project
3234 if (isModEnabled('project')) {
3235 $langs->load("projects");
3236 $morehtmlref .= '<br>';
3237 if ($permissiontoadd) {
3238 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
3239 if ($action != 'classify') {
3240 $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.((int) $object->id).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
3241 }
3242 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, (!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ? $object->socid : -1), $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
3243 } else {
3244 if (!empty($object->fk_project)) {
3245 $proj = new Project($db);
3246 $proj->fetch($object->fk_project);
3247 $morehtmlref .= $proj->getNomUrl(1);
3248 if ($proj->title) {
3249 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
3250 }
3251 }
3252 }
3253 }
3254 $morehtmlref .= '</div>';
3255
3256 $object->totalpaid = $totalpaid; // To give a chance to dol_banner_tab to use already paid amount to show correct status
3257
3258 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
3259
3260 // Call Hook tabContentViewSupplierInvoice
3261 $parameters = array();
3262 // Note that $action and $object may be modified by hook
3263 $reshook = $hookmanager->executeHooks('tabContentViewSupplierInvoice', $parameters, $object, $action);
3264 if (empty($reshook)) {
3265 print '<div class="fichecenter">';
3266 print '<div class="fichehalfleft">';
3267 print '<div class="underbanner clearboth"></div>';
3268
3269 print '<table class="border tableforfield centpercent">';
3270
3271 // Type
3272 print '<tr><td class="titlefield">'.$langs->trans('Type').'</td><td>';
3273 print '<span class="badgeneutral">';
3274 print $object->getLibType();
3275 print '</span>';
3276 if ($object->subtype > 0) {
3277 print ' '.$object->getSubtypeLabel('facture_fourn');
3278 }
3280 $facreplaced = new FactureFournisseur($db);
3281 $facreplaced->fetch($object->fk_facture_source);
3282 print ' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities("ReplaceInvoice", $facreplaced->getNomUrl(1)).'</span>';
3283 }
3285 if ($object->fk_facture_source > 0) {
3286 $facusing = new FactureFournisseur($db);
3287 $facusing->fetch($object->fk_facture_source);
3288 print ' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities("CorrectInvoice", $facusing->getNomUrl(1)).'</span>';
3289 } else {
3290 $langs->load("errors");
3291 print ' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities("WarningCorrectedInvoiceNotFound").'</span>';
3292 }
3293 }
3294
3295 $facidavoir = $object->getListIdAvoirFromInvoice();
3296 if (count($facidavoir) > 0) {
3297 $invoicecredits = array();
3298 foreach ($facidavoir as $id) {
3299 $facavoir = new FactureFournisseur($db);
3300 $facavoir->fetch($id);
3301 $invoicecredits[] = $facavoir->getNomUrl(1);
3302 }
3303 print ' <span class="opacitymediumbycolor paddingleft">'.$langs->transnoentities("InvoiceHasAvoir") . (count($invoicecredits) ? ' ' : '') . implode(',', $invoicecredits);
3304 print '</span>';
3305 }
3306 if (isset($objectidnext) && $objectidnext > 0) {
3307 $facthatreplace = new FactureFournisseur($db);
3308
3309 $facthatreplace->fetch($objectidnext);
3310 print ' <span class="opacitymediumbycolor paddingleft">'.str_replace('{s1}', $facthatreplace->getNomUrl(1), $langs->transnoentities("ReplacedByInvoice", '{s1}')).'</span>';
3311 }
3313 $discount = new DiscountAbsolute($db);
3314 $result = $discount->fetch(0, 0, $object->id);
3315 if ($result > 0) {
3316 print ' <span class="opacitymediumbycolor paddingleft">';
3317 $s = $langs->trans("CreditNoteConvertedIntoDiscount", '{s1}', '{s2}');
3318 $s = str_replace('{s1}', $object->getLibType(1), $s);
3319 $s = str_replace('{s2}', $discount->getNomUrl(1, 'discount'), $s);
3320 print $s;
3321 print '</span><br>';
3322 }
3323 }
3324
3325 if ($object->fk_fac_rec_source > 0) {
3326 $tmptemplate = new FactureFournisseurRec($db);
3327 $result = $tmptemplate->fetch($object->fk_fac_rec_source);
3328 if ($result > 0) {
3329 print ' <span class="opacitymediumbycolor paddingleft">';
3330 $link = '<a href="'.DOL_URL_ROOT.'/fourn/facture/card-rec.php?facid='.$tmptemplate->id.'">'.dol_escape_htmltag($tmptemplate->title).'</a>';
3331 $s = $langs->transnoentities("GeneratedFromSupplierTemplate", $link);
3332
3333 print $s;
3334 print '</span>';
3335 }
3336 }
3337 print '</td></tr>';
3338
3339
3340 // Relative and absolute discounts
3341 print '<!-- Discounts -->'."\n";
3342 print '<tr><td>'.$langs->trans('DiscountStillRemaining');
3343 print '</td><td>';
3344
3345 $thirdparty = $societe;
3346 $discount_type = 1;
3347 include DOL_DOCUMENT_ROOT.'/core/tpl/object_discounts.tpl.php';
3348
3349 print '</td></tr>';
3350
3351 // Label
3352 print '<tr>';
3353 print '<td>'.$form->editfieldkey("Label", 'label', $object->label, $object, $usercancreate).'</td>';
3354 print '<td>'.$form->editfieldval("Label", 'label', $object->label, $object, $usercancreate).'</td>';
3355 print '</tr>';
3356
3357 //$form_permission = ($object->status < FactureFournisseur::STATUS_CLOSED) && $usercancreate && ($object->getSommePaiement() <= 0);
3358 $form_permission = ($object->status < FactureFournisseur::STATUS_CLOSED) && $usercancreate;
3359
3360 // Date
3361 print '<tr><td>';
3362 print $form->editfieldkey("DateInvoice", 'datef', $object->date, $object, $form_permission, 'datepicker');
3363 print '</td><td colspan="3">';
3364 print $form->editfieldval("Date", 'datef', $object->date, $object, $form_permission, 'datepicker');
3365 print '</td>';
3366
3367 // Default terms of the settlement
3368 $langs->load('bills');
3369 print '<tr><td class="nowrap">';
3370 print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
3371 print $langs->trans('PaymentConditions');
3372 print '<td>';
3373 if ($action != 'editconditions' && $form_permission) {
3374 print '<td class="right"><a class="editfielda reposition" href="'.$_SERVER["PHP_SELF"].'?action=editconditions&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetConditions'), 1).'</a></td>';
3375 }
3376 print '</tr></table>';
3377 print '</td><td>';
3378 if ($action == 'editconditions') {
3379 $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'cond_reglement_id');
3380 } else {
3381 $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'none');
3382 }
3383 print "</td>";
3384 print '</tr>';
3385
3386 // Due date
3387 print '<tr><td>';
3388 print $form->editfieldkey("DateMaxPayment", 'date_lim_reglement', $object->date_echeance, $object, $form_permission, 'datepicker');
3389 print '</td><td>';
3390 print $form->editfieldval("DateMaxPayment", 'date_lim_reglement', $object->date_echeance, $object, $form_permission, 'datepicker');
3391 if ($action != 'editdate_lim_reglement' && $object->hasDelay()) {
3392 print img_warning($langs->trans('Late'));
3393 }
3394 print '</td>';
3395
3396 // Mode of payment
3397 $langs->load('bills');
3398 print '<tr><td class="nowrap">';
3399 print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
3400 print $langs->trans('PaymentMode');
3401 print '</td>';
3402 if ($action != 'editmode' && $form_permission) {
3403 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmode&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetMode'), 1).'</a></td>';
3404 }
3405 print '</tr></table>';
3406 print '</td><td>';
3407 if ($action == 'editmode') {
3408 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'mode_reglement_id', 'DBIT', 1, 1);
3409 } else {
3410 $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->mode_reglement_id, 'none');
3411 }
3412 print '</td></tr>';
3413
3414 // Multicurrency
3415 if (isModEnabled("multicurrency")) {
3416 // Multicurrency code
3417 print '<tr>';
3418 print '<td>';
3419 print '<table class="nobordernopadding" width="100%"><tr><td>';
3420 print $form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0);
3421 print '</td>';
3422 if ($action != 'editmulticurrencycode' && $object->status == $object::STATUS_DRAFT) {
3423 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmulticurrencycode&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1).'</a></td>';
3424 }
3425 print '</tr></table>';
3426 print '</td><td>';
3427 if ($action == 'editmulticurrencycode') {
3428 $form->form_multicurrency_code($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_code, 'multicurrency_code');
3429 } else {
3430 $form->form_multicurrency_code($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_code, 'none');
3431 }
3432 print '</td></tr>';
3433
3434 // Multicurrency rate
3435 if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
3436 print '<tr>';
3437 print '<td>';
3438 print '<table class="nobordernopadding centpercent"><tr><td>';
3439 print $form->editfieldkey('CurrencyRate', 'multicurrency_tx', '', $object, 0);
3440 print '</td>';
3441 if ($action != 'editmulticurrencyrate' && $object->status == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
3442 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmulticurrencyrate&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetMultiCurrencyCode'), 1).'</a></td>';
3443 }
3444 print '</tr></table>';
3445 print '</td><td>';
3446 if ($action == 'editmulticurrencyrate' || $action == 'actualizemulticurrencyrate') {
3447 if ($action == 'actualizemulticurrencyrate') {
3448 list($object->fk_multicurrency, $object->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($object->db, $object->multicurrency_code);
3449 }
3450 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_tx, 'multicurrency_tx', $object->multicurrency_code);
3451 } else {
3452 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$object->id, $object->multicurrency_tx, 'none', $object->multicurrency_code);
3453 if ($object->status == $object::STATUS_DRAFT && $object->multicurrency_code && $object->multicurrency_code != $conf->currency) {
3454 print '<div class="inline-block"> &nbsp; &nbsp; &nbsp; &nbsp; ';
3455 print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=actualizemulticurrencyrate">'.$langs->trans("ActualizeCurrency").'</a>';
3456 print '</div>';
3457 }
3458 }
3459 print '</td></tr>';
3460 }
3461 }
3462
3463 // Bank Account
3464 if (isModEnabled("bank")) {
3465 print '<tr><td class="nowrap">';
3466 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
3467 print $langs->trans('BankAccount');
3468 print '<td>';
3469 if ($action != 'editbankaccount' && $usercancreate) {
3470 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editbankaccount&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetBankAccount'), 1).'</a></td>';
3471 }
3472 print '</tr></table>';
3473 print '</td><td>';
3474 if ($action == 'editbankaccount') {
3475 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1);
3476 } else {
3477 $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none');
3478 }
3479 print "</td>";
3480 print '</tr>';
3481 }
3482
3483 // Vat reverse-charge by default
3484 if (getDolGlobalString('ACCOUNTING_FORCE_ENABLE_VAT_REVERSE_CHARGE')) {
3485 print '<tr><td class="nowrap">';
3486 print '<table width="100%" class="nobordernopadding"><tr><td class="nowrap">';
3487 print $langs->trans('VATReverseCharge');
3488 print '<td>';
3489 if ($action != 'editvatreversecharge' && $usercancreate) {
3490 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editvatreversecharge&amp;id='.$object->id.'">'.img_edit($langs->trans('SetVATReverseCharge'), 1).'</a></td>';
3491 }
3492 print '</tr></table>';
3493 print '</td><td>';
3494 if ($action == 'editvatreversecharge') {
3495 print '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
3496 print '<input type="hidden" name="action" value="setvatreversecharge">';
3497 print '<input type="hidden" name="token" value="'.newToken().'">';
3498
3499 print '<input type="checkbox" name="vat_reverse_charge"' . ($object->vat_reverse_charge == '1' ? ' checked ' : '') . '>';
3500
3501 print '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
3502 print '</form>';
3503 } else {
3504 print '<input type="checkbox" name="vat_reverse_charge"'. ($object->vat_reverse_charge == '1' ? ' checked ' : '') . ' disabled>';
3505 }
3506 print '</td></tr>';
3507 }
3508
3509 // Incoterms
3510 if (isModEnabled('incoterm')) {
3511 print '<tr><td>';
3512 print '<table width="100%" class="nobordernopadding"><tr><td>';
3513 print $langs->trans('IncotermLabel');
3514 print '<td><td class="right">';
3515 if ($usercancreate) {
3516 print '<a class="editfielda" href="'.DOL_URL_ROOT.'/fourn/facture/card.php?facid='.$object->id.'&action=editincoterm&token='.newToken().'">'.img_edit().'</a>';
3517 } else {
3518 print '&nbsp;';
3519 }
3520 print '</td></tr></table>';
3521 print '</td>';
3522 print '<td>';
3523 if ($action != 'editincoterm') {
3524 print $form->textwithpicto($object->display_incoterms(), $object->label_incoterms, 1);
3525 } else {
3526 print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id);
3527 }
3528 print '</td></tr>';
3529 }
3530
3531 // Intracomm report
3532 if (isModEnabled('intracommreport')) {
3533 $langs->loadLangs(array("intracommreport"));
3534 print '<!-- If module intracomm on -->'."\n";
3535 print '<tr><td>';
3536 print '<table class="nobordernopadding centpercent"><tr><td>';
3537 print $langs->trans('IntracommReportTransportMode');
3538 print '</td>';
3539 if ($action != 'edittransportmode' && ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"))) {
3540 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=edittransportmode&token='.newToken().'&id='.$object->id.'">'.img_edit().'</a></td>';
3541 }
3542 print '</tr></table>';
3543 print '</td>';
3544 print '<td>';
3545 if ($action == 'edittransportmode') {
3546 $form->formSelectTransportMode($_SERVER['PHP_SELF'].'?id='.$object->id, $object->transport_mode_id, 'transport_mode_id', 1, 1);
3547 } else {
3548 $form->formSelectTransportMode($_SERVER['PHP_SELF'].'?id='.$object->id, $object->transport_mode_id, 'none');
3549 }
3550 print '</td></tr>';
3551 }
3552
3553 // Other attributes
3554 $cols = 2;
3555 if ($object->status != $object::STATUS_DRAFT) {
3556 $disableedit = 1;
3557 $disableremove = 1;
3558 }
3559 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
3560
3561 print '</table>';
3562 print '</div>';
3563
3564 print '<div class="fichehalfright">';
3565 print '<div class="underbanner clearboth"></div>';
3566
3567 print '<table class="border tableforfield centpercent">';
3568
3569 print '<tr>';
3570 print '<td class="titlefieldmiddle">' . $langs->trans('AmountHT') . '</td>';
3571 print '<td class="nowrap amountcard right">' . price($object->total_ht, 0, $langs, 0, -1, -1, $conf->currency) . '</td>';
3572 if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
3573 print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_ht, 0, $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
3574 }
3575 print '</tr>';
3576
3577 print '<tr>';
3578 print '<td>' . $langs->trans('AmountVAT') . '</td>';
3579 print '<td class="nowrap amountcard right">';
3580 if (GETPOST('calculationrule')) {
3581 $calculationrule = GETPOST('calculationrule', 'alpha');
3582 } else {
3583 $calculationrule = (!getDolGlobalString('MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND') ? 'totalofround' : 'roundoftotal');
3584 }
3585 if ($calculationrule == 'totalofround') {
3586 $calculationrulenum = 1;
3587 } else {
3588 $calculationrulenum = 2;
3589 }
3590 // Show link for "recalculate"
3591 if ($object->getVentilExportCompta() == 0) {
3592 $s = '<span class="hideonsmartphone opacitymedium">' . $langs->trans("ReCalculate") . ' </span>';
3593 $s .= '<a href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=calculate&token='.newToken().'&calculationrule=totalofround">' . $langs->trans("Mode1") . '</a>';
3594 $s .= ' / ';
3595 $s .= '<a href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=calculate&token='.newToken().'&calculationrule=roundoftotal">' . $langs->trans("Mode2") . '</a>';
3596 print '<div class="inline-block">';
3597 print $form->textwithtooltip($s, $langs->trans("CalculationRuleDesc", $calculationrulenum) . '<br>' . $langs->trans("CalculationRuleDescSupplier"), 2, 1, img_picto('', 'help'), '', 3, '', 0, 'recalculate');
3598 print '&nbsp; &nbsp; &nbsp; &nbsp;';
3599 print '</div>';
3600 }
3601 print price($object->total_tva, 1, $langs, 0, -1, -1, $conf->currency);
3602 print '</td>';
3603 if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
3604 print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_tva, 0, $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
3605 }
3606 print '</tr>';
3607
3608 if ($societe->localtax1_assuj == "1") { //Localtax1
3609 print '<tr>';
3610 print '<td>' . $langs->transcountry("AmountLT1", $societe->country_code) . '</td>';
3611 print '<td class="nowrap amountcard right">' . price($object->total_localtax1, 1, $langs, 0, -1, -1, $conf->currency) . '</td>';
3612 print '</tr>';
3613 }
3614 if ($societe->localtax2_assuj == "1") { //Localtax2
3615 print '<tr>';
3616 print '<td>' . $langs->transcountry("AmountLT2", $societe->country_code) . '</td>';
3617 print '<td class="nowrap amountcard right">' . price($object->total_localtax2, 1, $langs, 0, -1, -1, $conf->currency) . '</td>';
3618 print '</tr>';
3619 }
3620
3621 print '<tr>';
3622 print '<td>' . $langs->trans('AmountTTC') . '</td>';
3623 print '<td class="nowrap amountcard right">' . price($object->total_ttc, 0, $langs, 0, -1, -1, $conf->currency) . '</td>';
3624 if (isModEnabled("multicurrency") && ($object->multicurrency_code && $object->multicurrency_code != $conf->currency)) {
3625 print '<td class="nowrap amountcard right">' . price($object->multicurrency_total_ttc, 0, $langs, 0, -1, -1, $object->multicurrency_code) . '</td>';
3626 }
3627 print '</tr>';
3628
3629 print '</table>';
3630
3631
3632 // List of payments
3633
3634 $totalpaid = 0;
3635
3636 $sign = 1;
3638 $sign = - 1;
3639 }
3640
3641 $nbrows = 9;
3642 $nbcols = 3;
3643 if (isModEnabled('project')) {
3644 $nbrows++;
3645 }
3646 if (isModEnabled("bank")) {
3647 $nbrows++;
3648 $nbcols++;
3649 }
3650 if (isModEnabled('incoterm')) {
3651 $nbrows++;
3652 }
3653 if (isModEnabled("multicurrency")) {
3654 $nbrows += 5;
3655 }
3656
3657 // Local taxes
3658 if ($societe->localtax1_assuj == "1") {
3659 $nbrows++;
3660 }
3661 if ($societe->localtax2_assuj == "1") {
3662 $nbrows++;
3663 }
3664
3665 $sql = 'SELECT p.datep as dp, p.ref, p.num_paiement as num_payment, p.rowid, p.fk_bank,';
3666 $sql .= ' c.id as payment_type, c.code as payment_code,';
3667 $sql .= ' pf.amount,';
3668 $sql .= ' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal';
3669 $sql .= ' FROM '.MAIN_DB_PREFIX.'paiementfourn as p';
3670 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid';
3671 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid';
3672 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as c ON p.fk_paiement = c.id';
3673 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON pf.fk_paiementfourn = p.rowid';
3674 $sql .= ' WHERE pf.fk_facturefourn = '.((int) $object->id);
3675 $sql .= ' ORDER BY p.datep, p.tms';
3676
3677 $result = $db->query($sql);
3678 if ($result) {
3679 $num = $db->num_rows($result);
3680 $i = 0;
3681
3682 print '<div class="div-table-responsive-no-min">';
3683 print '<table class="noborder paymenttable centpercent">';
3684 print '<tr class="liste_titre">';
3685 print '<td class="liste_titre">'.($object->type == FactureFournisseur::TYPE_CREDIT_NOTE ? $langs->trans("PaymentsBack") : $langs->trans('Payments')).'</td>';
3686 print '<td>'.$langs->trans('Date').'</td>';
3687 print '<td>'.$langs->trans('Type').'</td>';
3688 if (isModEnabled("bank")) {
3689 print '<td class="right">'.$langs->trans('BankAccount').'</td>';
3690 }
3691 print '<td class="right">'.$langs->trans('Amount').'</td>';
3692 print '<td width="18">&nbsp;</td>';
3693 print '</tr>';
3694
3695 if ($num > 0) {
3696 while ($i < $num) {
3697 $objp = $db->fetch_object($result);
3698
3699 $paymentstatic->id = $objp->rowid;
3700 $paymentstatic->datepaye = $db->jdate($objp->dp);
3701 $paymentstatic->ref = ($objp->ref ? $objp->ref : $objp->rowid);
3702 $paymentstatic->num_payment = $objp->num_payment;
3703
3704 $paymentstatic->paiementcode = $objp->payment_code;
3705 $paymentstatic->type_code = $objp->payment_code;
3706 $paymentstatic->type_label = $objp->payment_type;
3707
3708 print '<tr class="oddeven">';
3709 print '<td class="nowraponall">';
3710 print $paymentstatic->getNomUrl(1);
3711 print '</td>';
3712 print '<td>'.dol_print_date($db->jdate($objp->dp), 'day').'</td>';
3713 $s = $form->form_modes_reglement('', $objp->payment_type, 'none', '', 1, 0, '', 1).' '.$objp->num_payment;
3714 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($s).'">';
3715 print $s;
3716 print '</td>';
3717 if (isModEnabled("bank")) {
3718 $bankaccountstatic->id = $objp->baid;
3719 $bankaccountstatic->ref = $objp->baref;
3720 $bankaccountstatic->label = $objp->baref;
3721 $bankaccountstatic->number = $objp->banumber;
3722
3723 if (isModEnabled('accounting')) {
3724 $bankaccountstatic->account_number = $objp->account_number;
3725
3726 $accountingjournal = new AccountingJournal($db);
3727 $accountingjournal->fetch($objp->fk_accountancy_journal);
3728 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
3729 }
3730
3731 print '<td class="right">';
3732 if ($objp->baid > 0) {
3733 print $bankaccountstatic->getNomUrl(1, 'transactions');
3734 }
3735 print '</td>';
3736 }
3737 print '<td class="right">'.price($sign * $objp->amount).'</td>';
3738 print '<td class="center">';
3739 if ($object->status == FactureFournisseur::STATUS_VALIDATED && $object->paid == 0 && $user->socid == 0) {
3740 print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=deletepayment&token='.newToken().'&paiement_id='.$objp->rowid.'">';
3741 print img_delete();
3742 print '</a>';
3743 }
3744 print '</td>';
3745 print '</tr>';
3746 $totalpaid += $objp->amount;
3747 $i++;
3748 }
3749 } else {
3750 print '<tr class="oddeven"><td colspan="'.$nbcols.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td><td></td><td></td></tr>';
3751 }
3752
3753 /*
3754 if ($object->paid == 0)
3755 {
3756 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans('AlreadyPaid').' :</td><td class="right">'.price($totalpaid).'</td><td></td></tr>';
3757 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("Billed").' :</td><td class="right">'.price($object->total_ttc).'</td><td></td></tr>';
3758
3759 $resteapayer = $object->total_ttc - $totalpaid;
3760
3761 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans('RemainderToPay').' :</td>';
3762 print '<td class="right'.($resteapayer?' amountremaintopay':'').'">'.price($resteapayer).'</td><td></td></tr>';
3763 }
3764 */
3765
3766 $db->free($result);
3767 } else {
3768 dol_print_error($db);
3769 }
3770
3772 // Total already paid
3773 print '<tr><td colspan="'.$nbcols.'" class="right">';
3774 print '<span class="opacitymedium">';
3776 print $langs->trans('AlreadyPaidNoCreditNotesNoDeposits');
3777 } else {
3778 print $langs->trans('AlreadyPaid');
3779 }
3780 print '</span>';
3781 print '</td><td class="right"'.(($totalpaid > 0) ? ' class="amountalreadypaid"' : '').'>'.price($totalpaid).'</td><td>&nbsp;</td></tr>';
3782
3783 //$resteapayer = $object->total_ttc - $totalpaid;
3784 $resteapayeraffiche = $resteapayer;
3785
3786 $cssforamountpaymentcomplete = 'amountpaymentcomplete';
3787
3788 // Loop on each credit note or deposit amount applied
3789 $creditnoteamount = 0;
3790 $depositamount = 0;
3791
3792 $sql = "SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc,";
3793 $sql .= " re.description, re.fk_invoice_supplier_source";
3794 $sql .= " FROM ".MAIN_DB_PREFIX."societe_remise_except as re";
3795 $sql .= " WHERE fk_invoice_supplier = ".((int) $object->id);
3796 $resql = $db->query($sql);
3797 if ($resql) {
3798 $num = $db->num_rows($resql);
3799 $i = 0;
3800 $invoice = new FactureFournisseur($db);
3801 while ($i < $num) {
3802 $obj = $db->fetch_object($resql);
3803 $invoice->fetch($obj->fk_invoice_supplier_source);
3804 print '<tr><td colspan="'.$nbcols.'" class="right">';
3805 if ($invoice->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
3806 print $langs->trans("CreditNote").' ';
3807 }
3808 if ($invoice->type == FactureFournisseur::TYPE_DEPOSIT) {
3809 print $langs->trans("Deposit").' ';
3810 }
3811 print $invoice->getNomUrl(0);
3812 print ' :</td>';
3813 print '<td class="right">'.price($obj->amount_ttc).'</td>';
3814 print '<td class="right">';
3815 print '<a href="'.$_SERVER["PHP_SELF"].'?facid='.$object->id.'&action=unlinkdiscount&discountid='.$obj->rowid.'">';
3816 print img_picto($langs->transnoentitiesnoconv("RemoveDiscount"), 'unlink');
3817 print '</a>';
3818 print '</td></tr>';
3819 $i++;
3820 if ($invoice->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
3821 $creditnoteamount += $obj->amount_ttc;
3822 }
3823 if ($invoice->type == FactureFournisseur::TYPE_DEPOSIT) {
3824 $depositamount += $obj->amount_ttc;
3825 }
3826 }
3827 } else {
3828 dol_print_error($db);
3829 }
3830
3831 // Paye partiellement 'escompte'
3832 if (($object->status == FactureFournisseur::STATUS_CLOSED || $object->status == FactureFournisseur::STATUS_ABANDONED) && $object->close_code == 'discount_vat') {
3833 print '<tr><td colspan="'.$nbcols.'" class="right nowrap">';
3834 print '<span class="opacitymedium">';
3835 print $form->textwithpicto($langs->trans("Discount"), $langs->trans("HelpEscompte"), - 1);
3836 print '</span>';
3837 print '</td><td class="right">'.price($object->total_ttc - $creditnoteamount - $depositamount - $totalpaid).'</td><td>&nbsp;</td></tr>';
3838 $resteapayeraffiche = 0;
3839 $cssforamountpaymentcomplete = 'amountpaymentneutral';
3840 }
3841 // Paye partiellement ou Abandon 'badsupplier'
3842 if (($object->status == FactureFournisseur::STATUS_CLOSED || $object->status == FactureFournisseur::STATUS_ABANDONED) && $object->close_code == 'badsupplier') {
3843 print '<tr><td colspan="'.$nbcols.'" class="right nowrap">';
3844 print '<span class="opacitymedium">';
3845 print $form->textwithpicto($langs->trans("Abandoned"), $langs->trans("HelpAbandonBadCustomer"), - 1);
3846 print '</span>';
3847 print '</td><td class="right">'.price($object->total_ttc - $creditnoteamount - $depositamount - $totalpaid).'</td><td>&nbsp;</td></tr>';
3848 // $resteapayeraffiche=0;
3849 $cssforamountpaymentcomplete = 'amountpaymentneutral';
3850 }
3851 // Paye partiellement ou Abandon 'product_returned'
3852 if (($object->status == FactureFournisseur::STATUS_CLOSED || $object->status == FactureFournisseur::STATUS_ABANDONED) && $object->close_code == 'product_returned') {
3853 print '<tr><td colspan="'.$nbcols.'" class="right nowrap">';
3854 print '<span class="opacitymedium">';
3855 print $form->textwithpicto($langs->trans("ProductReturned"), $langs->trans("HelpAbandonProductReturned"), - 1);
3856 print '</span>';
3857 print '</td><td class="right">'.price($object->total_ttc - $creditnoteamount - $depositamount - $totalpaid).'</td><td>&nbsp;</td></tr>';
3858 $resteapayeraffiche = 0;
3859 $cssforamountpaymentcomplete = 'amountpaymentneutral';
3860 }
3861 // Paye partiellement ou Abandon 'abandon'
3862 if (($object->status == FactureFournisseur::STATUS_CLOSED || $object->status == FactureFournisseur::STATUS_ABANDONED) && $object->close_code == 'abandon') {
3863 print '<tr><td colspan="'.$nbcols.'" class="right nowrap">';
3864 $text = $langs->trans("HelpAbandonOther");
3865 if ($object->close_note) {
3866 $text .= '<br><br><b>'.$langs->trans("Reason").'</b>:'.$object->close_note;
3867 }
3868 print '<span class="opacitymedium">';
3869 // @phan-suppress-next-line PhanPluginSuspiciousParamPosition
3870 print $form->textwithpicto($langs->trans("Abandoned"), $text, - 1);
3871 print '</span>';
3872 print '</td><td class="right">'.price($object->total_ttc - $creditnoteamount - $depositamount - $totalpaid).'</td><td>&nbsp;</td></tr>';
3873 $resteapayeraffiche = 0;
3874 $cssforamountpaymentcomplete = 'amountpaymentneutral';
3875 }
3876
3877 // Billed
3878 print '<tr><td colspan="'.$nbcols.'" class="right">';
3879 print '<span class="opacitymedium">';
3880 print $langs->trans("Billed");
3881 print '</span>';
3882 print '</td><td class="right">'.price($object->total_ttc).'</td><td>&nbsp;</td></tr>';
3883
3884 // Remainder to pay
3885 print '<tr><td colspan="'.$nbcols.'" class="right">';
3886 print '<span class="opacitymedium">';
3887 print $langs->trans('RemainderToPay');
3888 if ($resteapayeraffiche < 0) {
3889 print ' ('.$langs->trans('NegativeIfExcessPaid').')';
3890 }
3891 print '</span>';
3892 print '</td>';
3893 print '<td class="right'.($resteapayeraffiche ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.price($resteapayeraffiche).'</td><td>&nbsp;</td></tr>';
3894
3895 // Remainder to pay Multicurrency
3896 if (isModEnabled('multicurrency') && $object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
3897 print '<tr><td colspan="'.$nbcols.'" class="right">';
3898 print '<span class="opacitymedium">';
3899 print $langs->trans('RemainderToPayMulticurrency');
3900 if ($resteapayeraffiche < 0) {
3901 print ' ('.$langs->trans('NegativeIfExcessPaid').')';
3902 }
3903 print '</span>';
3904 print '</td>';
3905 print '<td class="right'.($resteapayeraffiche ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.(!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency).' '.price(price2num($multicurrency_resteapayer, 'MT')).'</td><td>&nbsp;</td></tr>';
3906 }
3907 } else { // Credit note
3908 $cssforamountpaymentcomplete = 'amountpaymentneutral';
3909
3910 // Total already paid back
3911 print '<tr><td colspan="'.$nbcols.'" class="right">';
3912 print $langs->trans('AlreadyPaidBack');
3913 print ' :</td><td class="right">'.price($sign * $totalpaid).'</td><td>&nbsp;</td></tr>';
3914
3915 // Billed
3916 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("Billed").' :</td><td class="right">'.price($sign * $object->total_ttc).'</td><td>&nbsp;</td></tr>';
3917
3918 // Remainder to pay back
3919 print '<tr><td colspan="'.$nbcols.'" class="right">';
3920 print '<span class="opacitymedium">';
3921 print $langs->trans('RemainderToPayBack');
3922 if ($resteapayeraffiche > 0) {
3923 print ' ('.$langs->trans('NegativeIfExcessRefunded').')';
3924 }
3925 print '</td>';
3926 print '</span>';
3927 print '<td class="right'.($resteapayeraffiche ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.price($sign * $resteapayeraffiche).'</td><td>&nbsp;</td></tr>';
3928
3929 // Remainder to pay back Multicurrency
3930 if (isModEnabled('multicurrency') && $object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
3931 print '<tr><td colspan="'.$nbcols.'" class="right">';
3932 print '<span class="opacitymedium">';
3933 print $langs->trans('RemainderToPayBackMulticurrency');
3934 if ($resteapayeraffiche > 0) {
3935 print ' ('.$langs->trans('NegativeIfExcessRefunded').')';
3936 }
3937 print '</span>';
3938 print '</td>';
3939 print '<td class="right'.($resteapayeraffiche ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.(!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency).' '.price(price2num($sign * $object->multicurrency_tx * $resteapayeraffiche, 'MT')).'</td><td>&nbsp;</td></tr>';
3940 }
3941
3942 // Sold credit note
3943 // print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans('TotalTTC').' :</td>';
3944 // print '<td class="right" style="border: 1px solid;" bgcolor="#f0f0f0"><b>'.price($sign *
3945 // $object->total_ttc).'</b></td><td>&nbsp;</td></tr>';
3946 }
3947
3948 print '</table>';
3949 print '</div>';
3950
3951 print '</div>';
3952 print '</div>';
3953
3954 print '<div class="clearboth"></div><br>';
3955
3956 if (getDolGlobalString('MAIN_DISABLE_CONTACTS_TAB')) {
3957 $blocname = 'contacts';
3958 $title = $langs->trans('ContactsAddresses');
3959 include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
3960 }
3961
3962 if (getDolGlobalString('MAIN_DISABLE_NOTES_TAB')) {
3963 $colwidth = 20;
3964 $blocname = 'notes';
3965 $title = $langs->trans('Notes');
3966 include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
3967 }
3968
3969
3970 /*
3971 * Lines
3972 */
3973 print '<form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="POST">';
3974 print '<input type="hidden" name="token" value="'.newToken().'">';
3975 print '<input type="hidden" name="action" value="'.(($action != 'editline') ? 'addline' : 'updateline').'">';
3976 print '<input type="hidden" name="mode" value="">';
3977 print '<input type="hidden" name="page_y" value="">';
3978 print '<input type="hidden" name="id" value="'.$object->id.'">';
3979 print '<input type="hidden" name="socid" value="'.$societe->id.'">';
3980 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
3981
3982 if (!empty($conf->use_javascript_ajax) && $object->status == FactureFournisseur::STATUS_DRAFT) {
3983 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
3984 }
3985
3986 print '<div class="div-table-responsive-no-min">';
3987 print '<table id="tablelines" class="noborder noshadow centpercent">';
3988
3989 global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax;
3990 $forceall = 1;
3991 $dateSelector = 0;
3992 $inputalsopricewithtax = 1;
3993 $senderissupplier = 2; // $senderissupplier=2 is same than 1 but disable test on minimum qty and disable autofill qty with minimum.
3994 //if (!empty($conf->global->SUPPLIER_INVOICE_WITH_NOPRICEDEFINED)) $senderissupplier=2;
3995 if (getDolGlobalString('SUPPLIER_INVOICE_WITH_PREDEFINED_PRICES_ONLY')) {
3996 $senderissupplier = 1;
3997 }
3998
3999 // Show object lines (result may vary according to hidden option MAIN_NO_INPUT_PRICE_WITH_TAX)
4000 if (!empty($object->lines)) {
4001 $object->printObjectLines($action, $societe, $mysoc, $lineid, 1);
4002 }
4003
4004 $num = count($object->lines);
4005
4006 // Form to add new line
4007 if ($object->status == FactureFournisseur::STATUS_DRAFT && $usercancreate) {
4008 if ($action != 'editline') {
4009 // Add free products/services
4010
4011 $parameters = array();
4012 $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
4013 if ($reshook < 0) {
4014 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
4015 }
4016 if (empty($reshook)) {
4017 $object->formAddObjectLine(1, $societe, $mysoc);
4018 }
4019 }
4020 }
4021
4022 print '</table>';
4023 print '</div>';
4024 print '</form>';
4025 }
4026
4027 print dol_get_fiche_end();
4028
4029
4030 if ($action != 'presend') {
4031 /*
4032 * Buttons actions
4033 */
4034
4035 print '<div class="tabsAction">';
4036
4037 $parameters = array();
4038 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
4039 // modified by hook
4040 if (empty($reshook)) {
4041 // Modify a validated invoice with no payments
4042 if ($object->status == FactureFournisseur::STATUS_VALIDATED && $action != 'confirm_edit' && $object->getSommePaiement() == 0 && $usercancreate) {
4043 // We check if lines of invoice are not already transferred into accountancy
4044 $ventilExportCompta = $object->getVentilExportCompta(); // Should be 0 since the sum of payments are zero. But we keep the protection.
4045
4046 if ($ventilExportCompta == 0) {
4047 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans('Modify').'</a>';
4048 } else {
4049 print '<span class="butActionRefused classfortooltip" title="'.$langs->trans("DisabledBecauseDispatchedInBookkeeping").'">'.$langs->trans('Modify').'</span>';
4050 }
4051 }
4052
4053 $discount = new DiscountAbsolute($db);
4054 $result = $discount->fetch(0, 0, $object->id);
4055
4056 // Reopen a standard paid invoice
4058 || ($object->type == FactureFournisseur::TYPE_CREDIT_NOTE && empty($discount->id))
4059 || ($object->type == FactureFournisseur::TYPE_DEPOSIT && empty($discount->id)))
4060 && ($object->status == FactureFournisseur::STATUS_CLOSED || $object->status == FactureFournisseur::STATUS_ABANDONED)) { // A paid invoice (partially or completely)
4061 if (!$objectidnext && $object->close_code != 'replaced' && $usercancreate) { // Not replaced by another invoice
4062 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans('ReOpen').'</a>';
4063 } else {
4064 if ($usercancreate) {
4065 print '<span class="butActionRefused classfortooltip" title="'.$langs->trans("DisabledBecauseReplacedInvoice").'">'.$langs->trans('ReOpen').'</span>';
4066 } elseif (!getDolGlobalString('MAIN_BUTTON_HIDE_UNAUTHORIZED')) {
4067 print '<span class="butActionRefused classfortooltip">'.$langs->trans('ReOpen').'</span>';
4068 }
4069 }
4070 }
4071
4072 // Validate
4073 if ($action != 'confirm_edit' && $object->status == FactureFournisseur::STATUS_DRAFT) {
4074 if (count($object->lines)) {
4075 if ($usercanvalidate) {
4076 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=valid&token='.newToken().'"';
4077 print '>'.$langs->trans('Validate').'</a>';
4078 } else {
4079 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotAllowed")).'"';
4080 print '>'.$langs->trans('Validate').'</a>';
4081 }
4082 }
4083 }
4084
4085 // Send by mail
4086 if (empty($user->socid)) {
4088 if ($usercansend) {
4089 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans('SendMail').'</a>';
4090 } else {
4091 print '<span class="butActionRefused classfortooltip">'.$langs->trans('SendMail').'</span>';
4092 }
4093 }
4094 }
4095
4096 // Create payment
4098 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.DOL_URL_ROOT.'/fourn/facture/paiement.php?facid='.$object->id.'&amp;action=create'.($object->fk_account > 0 ? '&amp;accountid='.$object->fk_account : '').'">'.$langs->trans('DoPayment').'</a>'; // must use facid because id is for payment id not invoice
4099 }
4100
4101 // Reverse back money or convert to reduction
4103 // For credit note only
4104 if ($object->type == FactureFournisseur::TYPE_CREDIT_NOTE && $object->status == 1 && $object->paid == 0) {
4105 if ($resteapayer == 0) {
4106 print '<span class="butActionRefused classfortooltip" title="'.$langs->trans("DisabledBecauseRemainderToPayIsZero").'">'.$langs->trans('DoPaymentBack').'</span>';
4107 } else {
4108 print '<a class="butAction" href="'.DOL_URL_ROOT.'/fourn/facture/paiement.php?facid='.$object->id.'&amp;action=create&amp;accountid='.$object->fk_account.'">'.$langs->trans('DoPaymentBack').'</a>';
4109 }
4110 }
4111
4112 // For standard invoice with excess paid
4113 if ($object->type == FactureFournisseur::TYPE_STANDARD && empty($object->paid) && ($object->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits) < 0 && $usercancreate && empty($discount->id)) {
4114 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.$_SERVER["PHP_SELF"].'?facid='.$object->id.'&action=converttoreduc&token='.newToken().'">'.$langs->trans('ConvertExcessPaidToReduc').'</a>';
4115 }
4116 // For credit note
4117 if ($object->type == FactureFournisseur::TYPE_CREDIT_NOTE && $object->status == 1 && $object->paid == 0 && $usercancreate
4118 && (getDolGlobalString('SUPPLIER_INVOICE_ALLOW_REUSE_OF_CREDIT_WHEN_PARTIALLY_REFUNDED') || $object->getSommePaiement() == 0)
4119 ) {
4120 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.$_SERVER["PHP_SELF"].'?facid='.$object->id.'&action=converttoreduc&token='.newToken().'" title="'.dol_escape_htmltag($langs->trans("ConfirmConvertToReducSupplier2")).'">'.$langs->trans('ConvertToReduc').'</a>';
4121 }
4122 // For deposit invoice
4123 if ($object->type == FactureFournisseur::TYPE_DEPOSIT && $usercancreate && $object->status > 0 && empty($discount->id)) {
4124 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.$_SERVER["PHP_SELF"].'?facid='.$object->id.'&action=converttoreduc&token='.newToken().'">'.$langs->trans('ConvertToReduc').'</a>';
4125 }
4126 }
4127
4128 // Classify paid
4129 if ($object->status == FactureFournisseur::STATUS_VALIDATED && $object->paid == 0 && (
4130 ($object->type != FactureFournisseur::TYPE_CREDIT_NOTE && $object->type != FactureFournisseur::TYPE_DEPOSIT && ($resteapayer <= 0 || (getDolGlobalString('SUPPLIER_INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID') && $object->total_ttc == $resteapayer))) ||
4131 ($object->type == FactureFournisseur::TYPE_CREDIT_NOTE && $resteapayer >= 0) ||
4132 ($object->type == FactureFournisseur::TYPE_DEPOSIT && $object->total_ttc > 0 && ($resteapayer == 0 || (getDolGlobalString('SUPPLIER_INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID') && $object->total_ttc == $resteapayer)))
4133 )
4134 ) {
4135 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=paid&token='.newToken().'">'.$langs->trans('ClassifyPaid').'</a>';
4136 }
4137
4138 // Classify 'closed not completely paid' (possible if validated and not yet filed paid)
4139 if ($object->status == FactureFournisseur::STATUS_VALIDATED && $object->paid == 0 && $resteapayer > 0 && (!getDolGlobalString('SUPPLIER_INVOICE_CAN_SET_PAID_EVEN_IF_PARTIALLY_PAID') || $object->total_ttc != $resteapayer)) {
4140 if ($totalpaid > 0 || $totalcreditnotes > 0) {
4141 // If one payment or one credit note was linked to this invoice
4142 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=paid&token='.newToken().'">'.$langs->trans('ClassifyPaidPartially').'</a>';
4143 } else {
4144 if (!getDolGlobalString('INVOICE_CAN_NEVER_BE_CANCELED')) {
4145 print '<a class="butAction'.($conf->use_javascript_ajax ? ' reposition' : '').'" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=canceled">'.$langs->trans('ClassifyCanceled').'</a>';
4146 }
4147 }
4148 }
4149
4150 // Create event
4151 /*if (isModEnabled('agenda') && getDolGlobalString('MAIN_ADD_EVENT_ON_ELEMENT_CARD')) // Add hidden condition because this is not a "workflow" action so should appears somewhere else on page.
4152 {
4153 print '<div class="inline-block divButAction"><a class="butAction" href="' . DOL_URL_ROOT . '/comm/action/card.php?action=create&amp;origin=' . $object->element . '&amp;originid=' . $object->id . '&amp;socid=' . $object->socid . '">' . $langs->trans("AddAction") . '</a></div>';
4154 }*/
4155
4156 // Create a credit note
4157 if (($object->type == FactureFournisseur::TYPE_STANDARD || $object->type == FactureFournisseur::TYPE_DEPOSIT) && $object->status > 0 && $usercancreate) {
4158 if (!$objectidnext) {
4159 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?socid='.$object->socid.'&amp;fac_avoir='.$object->id.'&amp;action=create&amp;type=2'.($object->fk_project > 0 ? '&amp;projectid='.$object->fk_project : '').'">'.$langs->trans("CreateCreditNote").'</a>';
4160 }
4161 }
4162
4163 // Clone
4164 if ($action != 'edit' && $usercancreate) {
4165 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=clone&socid='.$object->socid.'&token='.newToken().'">'.$langs->trans('ToClone').'</a>';
4166 }
4167
4168 // Clone as predefined / Create template
4169 if (($object->type == FactureFournisseur::TYPE_STANDARD || $object->type == FactureFournisseur::TYPE_DEPOSIT) && $object->status == 0 && $usercancreate) {
4170 if (!$objectidnext && count($object->lines) > 0) {
4171 print '<a class="butAction" href="'.DOL_URL_ROOT.'/fourn/facture/card-rec.php?facid='.$object->id.'&action=create">'.$langs->trans("ChangeIntoRepeatableInvoice").'</a>';
4172 }
4173 }
4174
4175 // Delete
4176 $isErasable = $object->is_erasable();
4177 if ($action != 'confirm_edit' && ($usercandelete || ($usercancreate && $isErasable == 1))) { // isErasable = 1 means draft with temporary ref (draft can always be deleted with no need of permissions)
4178 $enableDelete = false;
4179 $htmltooltip = '';
4180 $params = (empty($conf->use_javascript_ajax) ? array() : array('attr' => array('class' => 'reposition')));
4181 //var_dump($isErasable); var_dump($params);
4182 if ($isErasable == -4) {
4183 $htmltooltip = $langs->trans("DisabledBecausePayments");
4184 } elseif ($isErasable == -3) { // Should never happen with supplier invoice
4185 $htmltooltip = $langs->trans("DisabledBecauseNotLastSituationInvoice");
4186 } elseif ($isErasable == -2) { // Should never happen with supplier invoice
4187 $htmltooltip = $langs->trans("DisabledBecauseNotLastInvoice");
4188 } elseif ($isErasable == -1) {
4189 $htmltooltip = $langs->trans("DisabledBecauseDispatchedInBookkeeping");
4190 } elseif ($isErasable <= 0) { // Any other cases
4191 $htmltooltip = $langs->trans("DisabledBecauseNotErasable");
4192 } else {
4193 $enableDelete = true;
4194 $htmltooltip = '';
4195 }
4196 print dolGetButtonAction($htmltooltip, $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), $object->id, $enableDelete, $params);
4197 }
4198 print '</div>';
4199
4200 if ($action != 'confirm_edit') {
4201 print '<div class="fichecenter"><div class="fichehalfleft">';
4202
4203 /*
4204 * Generated documents
4205 */
4206 $ref = dol_sanitizeFileName($object->ref);
4207 $subdir = get_exdir($object->id, 2, 0, 0, $object, 'invoice_supplier').$ref;
4208 $filedir = $conf->fournisseur->facture->dir_output.'/'.$subdir;
4209 $urlsource = $_SERVER['PHP_SELF'].'?id='.$object->id;
4210 $genallowed = $usercanread;
4211 $delallowed = $usercancreate;
4212 $modelpdf = (!empty($object->model_pdf) ? $object->model_pdf : (!getDolGlobalString('INVOICE_SUPPLIER_ADDON_PDF') ? '' : $conf->global->INVOICE_SUPPLIER_ADDON_PDF));
4213
4214 print $formfile->showdocuments('facture_fournisseur', $subdir, $filedir, $urlsource, $genallowed, $delallowed, $modelpdf, 1, 0, 0, 40, 0, '', '', '', $societe->default_lang);
4215 $somethingshown = $formfile->numoffiles;
4216
4217 // Show links to link elements
4218 $linktoelem = $form->showLinkToObjectBlock($object, array(), array('invoice_supplier'));
4219 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
4220
4221 print '</div><div class="fichehalfright">';
4222
4223 // List of actions on element
4224 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
4225 $formactions = new FormActions($db);
4226 $somethingshown = $formactions->showactions($object, 'invoice_supplier', $socid, 1, 'listaction'.($genallowed ? 'largetitle' : ''));
4227
4228 print '</div></div>';
4229 }
4230 }
4231 }
4232
4233 // Select mail models is same action as presend
4234 if (GETPOST('modelselected')) {
4235 $action = 'presend';
4236 }
4237
4238 // Presend form
4239 $modelmail = 'invoice_supplier_send';
4240 $defaulttopic = 'SendBillRef';
4241 $diroutput = $conf->fournisseur->facture->dir_output;
4242 $autocopy = 'MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO';
4243 $trackid = 'sinv'.$object->id;
4244
4245 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
4246 }
4247}
4248
4249
4250// End of page
4251llxFooter();
4252$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage bank accounts.
Class to manage accounting journals.
const TYPE_SITUATION
Situation invoice.
Class to manage absolute discounts.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
Class to manage standard extra fields.
Class to manage suppliers invoices.
const TYPE_DEPOSIT
Deposit invoice.
const TYPE_CREDIT_NOTE
Credit note invoice.
const TYPE_REPLACEMENT
Replacement invoice.
const STATUS_VALIDATED
Validated (need to be paid)
const TYPE_STANDARD
Standard invoice.
const STATUS_ABANDONED
Classified abandoned and no payment done.
const STATUS_CLOSED
Classified paid.
Class to manage invoice templates.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class with static methods for building HTML components related to products Only components common to ...
Class to manage building of HTML components.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage payments for supplier invoices.
Class ProductCombination Used to represent the relation between a product and one of its variants.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
dol_get_last_hour($date, $gm='tzserver')
Return GMT time for last hour of a given GMT date (it replaces hours, min and second part to 23:59:59...
Definition date.lib.php:641
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:125
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
facturefourn_prepare_head(FactureFournisseur $object)
Prepare array with list of tabs.
Definition fourn.lib.php:36
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
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...
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.