dolibarr 20.0.2
account.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2003 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2004-2012 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2004 Christophe Combelles <ccomb@free.fr>
6 * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
7 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
8 * Copyright (C) 2015-2016 Marcos García <marcosgdf@gmail.com>
9 * Copyright (C) 2015-2017 Alexandre Spangaro <aspangaro@open-dsi.fr>
10 * Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
11 * Copyright (C) 2019 JC Prieto <jcprieto@virtual20.com><prietojc@gmail.com>
12 * Copyright (C) 2022-2024 Frédéric France <frederic.france@free.fr>
13 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 3 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program. If not, see <https://www.gnu.org/licenses/>.
27 */
28
35require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
36
37
41class Account extends CommonObject
42{
46 public $element = 'bank_account';
47
51 public $table_element = 'bank_account';
52
56 public $picto = 'account';
57
63 public $rowid;
64
69 public $label;
70
77 public $courant;
78
83 public $type;
84
89 public $bank;
90
98 public $clos = self::STATUS_OPEN;
99
104 public $rappro = 1;
105
110 public $url;
111
116 public $code_banque;
117
122 public $code_guichet;
123
128 public $number;
129
134 public $cle_rib;
135
140 public $bic;
141
146 public $iban;
147
154 public $iban_prefix;
155
160 public $pti_in_ctti = 0;
161
168 public $proprio;
169
174 public $owner_name;
175
180 public $owner_address;
181
186 public $owner_zip;
187
192 public $owner_town;
193 public $owner_country_id;
194 public $owner_country_code;
195
202 public $domiciliation;
203
208 public $address;
209 public $state_id;
210 public $state_code;
211 public $state;
212 public $country_id;
213
219 public $type_lib = array();
220
225 public $account_number;
226
230 public $fk_accountancy_journal;
231
235 public $accountancy_journal;
236
241 public $currency_code;
242
249 public $account_currency_code;
250
255 public $min_allowed;
256
261 public $min_desired;
262
267 public $comment;
268
273 public $date_solde;
274
281 public $solde;
282
287 public $balance;
288
293 public $ics;
294
299 public $ics_transfer;
300
304 public $oldref;
305
306
331 // BEGIN MODULEBUILDER PROPERTIES
335 public $fields = array(
336 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 10),
337 'ref' => array('type' => 'varchar(12)', 'label' => 'Ref', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'showoncombobox' => 1, 'position' => 25),
338 'label' => array('type' => 'varchar(30)', 'label' => 'Label', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 30),
339 'entity' => array('type' => 'integer', 'label' => 'Entity', 'default' => '1', 'enabled' => 1, 'visible' => -2, 'notnull' => 1, 'position' => 35, 'index' => 1),
340 'bank' => array('type' => 'varchar(60)', 'label' => 'Bank', 'enabled' => 1, 'visible' => -1, 'position' => 40),
341 'code_banque' => array('type' => 'varchar(128)', 'label' => 'Code banque', 'enabled' => 1, 'visible' => -1, 'position' => 45),
342 'code_guichet' => array('type' => 'varchar(6)', 'label' => 'Code guichet', 'enabled' => 1, 'visible' => -1, 'position' => 50),
343 'number' => array('type' => 'varchar(255)', 'label' => 'Number', 'enabled' => 1, 'visible' => -1, 'position' => 55),
344 'cle_rib' => array('type' => 'varchar(5)', 'label' => 'Cle rib', 'enabled' => 1, 'visible' => -1, 'position' => 60),
345 'bic' => array('type' => 'varchar(11)', 'label' => 'Bic', 'enabled' => 1, 'visible' => -1, 'position' => 65),
346 'iban_prefix' => array('type' => 'varchar(34)', 'label' => 'Iban prefix', 'enabled' => 1, 'visible' => -1, 'position' => 70),
347 'country_iban' => array('type' => 'varchar(2)', 'label' => 'Country iban', 'enabled' => 1, 'visible' => -1, 'position' => 75),
348 'cle_iban' => array('type' => 'varchar(2)', 'label' => 'Cle iban', 'enabled' => 1, 'visible' => -1, 'position' => 80),
349 'domiciliation' => array('type' => 'varchar(255)', 'label' => 'Domiciliation', 'enabled' => 1, 'visible' => -1, 'position' => 85),
350 'state_id' => array('type' => 'integer', 'label' => 'StateId', 'enabled' => 1, 'visible' => -1, 'position' => 90),
351 'fk_pays' => array('type' => 'integer', 'label' => 'Country', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 95),
352 'proprio' => array('type' => 'varchar(60)', 'label' => 'Proprio', 'enabled' => 1, 'visible' => -1, 'position' => 100),
353 'owner_address' => array('type' => 'varchar(255)', 'label' => 'Owner address', 'enabled' => 1, 'visible' => -1, 'position' => 105),
354 'owner_zip' => array('type' => 'varchar(25)', 'label' => 'Owner zip', 'enabled' => 1, 'visible' => -1, 'position' => 106),
355 'owner_town' => array('type' => 'varchar(50)', 'label' => 'Owner town', 'enabled' => 1, 'visible' => -1, 'position' => 107),
356 'owner_country_id' => array('type' => 'integer', 'label' => 'Owner country', 'enabled' => 1, 'visible' => -1, 'position' => 108),
357 'courant' => array('type' => 'smallint(6)', 'label' => 'Courant', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 110),
358 'clos' => array('type' => 'smallint(6)', 'label' => 'Clos', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 115),
359 'rappro' => array('type' => 'smallint(6)', 'label' => 'Rappro', 'enabled' => 1, 'visible' => -1, 'position' => 120),
360 'url' => array('type' => 'varchar(128)', 'label' => 'Url', 'enabled' => 1, 'visible' => -1, 'position' => 125),
361 'account_number' => array('type' => 'varchar(32)', 'label' => 'Account number', 'enabled' => 1, 'visible' => -1, 'position' => 130),
362 'fk_accountancy_journal' => array('type' => 'integer', 'label' => 'Accountancy journal ID', 'enabled' => 1, 'visible' => -1, 'position' => 132),
363 'accountancy_journal' => array('type' => 'varchar(20)', 'label' => 'Accountancy journal', 'enabled' => 1, 'visible' => -1, 'position' => 135),
364 'currency_code' => array('type' => 'varchar(3)', 'label' => 'Currency code', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 140),
365 'min_allowed' => array('type' => 'integer', 'label' => 'Min allowed', 'enabled' => 1, 'visible' => -1, 'position' => 145),
366 'min_desired' => array('type' => 'integer', 'label' => 'Min desired', 'enabled' => 1, 'visible' => -1, 'position' => 150),
367 'comment' => array('type' => 'text', 'label' => 'Comment', 'enabled' => 1, 'visible' => -1, 'position' => 155),
368 'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'visible' => -1, 'position' => 156),
369 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 157),
370 'fk_user_author' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'Fk user author', 'enabled' => 1, 'visible' => -1, 'position' => 160),
371 'fk_user_modif' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModif', 'enabled' => 1, 'visible' => -2, 'notnull' => -1, 'position' => 165),
372 'note_public' => array('type' => 'html', 'label' => 'NotePublic', 'enabled' => 1, 'visible' => 0, 'position' => 170),
373 'model_pdf' => array('type' => 'varchar(255)', 'label' => 'Model pdf', 'enabled' => 1, 'visible' => 0, 'position' => 175),
374 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'visible' => -2, 'position' => 180),
375 'extraparams' => array('type' => 'varchar(255)', 'label' => 'Extraparams', 'enabled' => 1, 'visible' => -1, 'position' => 185),
376 );
377 // END MODULEBUILDER PROPERTIES
378
382 const TYPE_CURRENT = 1;
386 const TYPE_CASH = 2;
390 const TYPE_SAVINGS = 0;
391
392
393 const STATUS_OPEN = 0;
394 const STATUS_CLOSED = 1;
395
396
402 public function __construct(DoliDB $db)
403 {
404 global $langs;
405
406 $this->db = $db;
407
408 $this->ismultientitymanaged = 1;
409
410 $this->balance = 0;
411
412 $this->type_lib = array(
413 self::TYPE_SAVINGS => $langs->transnoentitiesnoconv("BankType0"),
414 self::TYPE_CURRENT => $langs->transnoentitiesnoconv("BankType1"),
415 self::TYPE_CASH => $langs->transnoentitiesnoconv("BankType2"),
416 );
417
418 $this->labelStatus = array(
419 self::STATUS_OPEN => $langs->transnoentitiesnoconv("StatusAccountOpened"),
420 self::STATUS_CLOSED => $langs->transnoentitiesnoconv("StatusAccountClosed")
421 );
422 }
423
429 public function __toString()
430 {
431 $string = '';
432 foreach ($this->getFieldsToShow() as $val) {
433 if ($val == 'BankCode') {
434 $string .= $this->code_banque.' ';
435 } elseif ($val == 'BankAccountNumber') {
436 $string .= $this->number.' ';
437 } elseif ($val == 'DeskCode') {
438 $string .= $this->code_guichet.' ';
439 } elseif ($val == 'BankAccountNumberKey') {
440 $string .= $this->cle_rib.' ';
441 } elseif ($val == 'BIC') {
442 $string .= $this->bic.' ';
443 } elseif ($val == 'IBAN') {
444 $string .= $this->iban.' ';
445 }
446 }
447
448 return trim($string);
449 }
450
451
457 public function canBeConciliated()
458 {
459 global $conf;
460
461 if (empty($this->rappro)) {
462 return -1;
463 }
464 if ($this->type == Account::TYPE_CASH && !getDolGlobalString('BANK_CAN_RECONCILIATE_CASHACCOUNT')) {
465 return -2;
466 }
467 if ($this->status) {
468 return -3;
469 }
470 return 1;
471 }
472
473
474 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
485 public function add_url_line($line_id, $url_id, $url, $label, $type)
486 {
487 // phpcs:enable
488 $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_url (";
489 $sql .= "fk_bank";
490 $sql .= ", url_id";
491 $sql .= ", url"; // deprecated
492 $sql .= ", label";
493 $sql .= ", type";
494 $sql .= ") VALUES (";
495 $sql .= ((int) $line_id);
496 $sql .= ", ".((int) $url_id);
497 $sql .= ", '".$this->db->escape($url)."'"; // deprecated
498 $sql .= ", '".$this->db->escape($label)."'";
499 $sql .= ", '".$this->db->escape($type)."'";
500 $sql .= ")";
501
502 dol_syslog(get_class($this)."::add_url_line", LOG_DEBUG);
503 if ($this->db->query($sql)) {
504 $rowid = $this->db->last_insert_id(MAIN_DB_PREFIX."bank_url");
505 return $rowid;
506 } else {
507 $this->error = $this->db->lasterror();
508 return -1;
509 }
510 }
511
512 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
522 public function get_url($fk_bank = 0, $url_id = 0, $type = '')
523 {
524 // phpcs:enable
525 $lines = array();
526
527 // Check parameters
528 if (!empty($fk_bank) && (!empty($url_id) || !empty($type))) {
529 $this->error = "ErrorBadParameter";
530 return -1;
531 }
532
533 $sql = "SELECT fk_bank, url_id, url, label, type";
534 $sql .= " FROM ".MAIN_DB_PREFIX."bank_url";
535 if ($fk_bank > 0) {
536 $sql .= " WHERE fk_bank = ".((int) $fk_bank);
537 } else {
538 $sql .= " WHERE url_id = ".((int) $url_id)." AND type = '".$this->db->escape($type)."'";
539 }
540 $sql .= " ORDER BY type, label";
541
542 dol_syslog(get_class($this)."::get_url", LOG_DEBUG);
543 $result = $this->db->query($sql);
544 if ($result) {
545 $i = 0;
546 $num = $this->db->num_rows($result);
547 while ($i < $num) {
548 $obj = $this->db->fetch_object($result);
549 // Anciens liens (pour compatibilite)
550 $lines[$i][0] = $obj->url;
551 $lines[$i][1] = $obj->url_id;
552 $lines[$i][2] = $obj->label;
553 $lines[$i][3] = $obj->type;
554 // Nouveaux liens
555 $lines[$i]['url'] = $obj->url;
556 $lines[$i]['url_id'] = $obj->url_id;
557 $lines[$i]['label'] = $obj->label;
558 $lines[$i]['type'] = $obj->type;
559 $lines[$i]['fk_bank'] = $obj->fk_bank;
560 $i++;
561 }
562 } else {
563 dol_print_error($this->db);
564 }
565
566 return $lines;
567 }
568
587 public function addline($date, $oper, $label, $amount, $num_chq, $categorie, User $user, $emetteur = '', $banque = '', $accountancycode = '', $datev = null, $num_releve = '', $amount_main_currency = null)
588 {
589 global $langs;
590
591 // Deprecation warning
592 if (is_numeric($oper)) {
593 dol_syslog(__METHOD__.": using numeric operations is deprecated", LOG_WARNING);
594 }
595
596 if (empty($this->id) && !empty($this->rowid)) { // For backward compatibility
597 $this->id = $this->rowid;
598 }
599
600 // Clean parameters
601 $emetteur = trim($emetteur);
602 $banque = trim($banque);
603 $label = trim($label);
604
605 $now = dol_now();
606
607 if (is_numeric($oper)) { // Clean operation to have a code instead of a rowid
608 $sql = "SELECT code FROM ".MAIN_DB_PREFIX."c_paiement";
609 $sql .= " WHERE id = ".((int) $oper);
610 $sql .= " AND entity IN (".getEntity('c_paiement').")";
611 $resql = $this->db->query($sql);
612 if ($resql) {
613 $obj = $this->db->fetch_object($resql);
614 $oper = $obj->code;
615 } else {
616 dol_print_error($this->db, 'Failed to get payment type code');
617 return -1;
618 }
619 }
620
621 // Check parameters
622 if (!$oper) {
623 $this->error = $langs->trans("OperNotDefined");
624 return -1;
625 }
626 if (!$this->id) {
627 $this->error = $langs->trans("ThisIdNotDefined");
628 return -2;
629 }
630 if ($this->type == Account::TYPE_CASH && $oper != 'LIQ') {
631 $this->error = "ErrorCashAccountAcceptsOnlyCashMoney";
632 return -3;
633 }
634
635 $this->db->begin();
636
637 if (is_null($datev) || empty($datev)) {
638 $datev = $date;
639 }
640
641 $accline = new AccountLine($this->db);
642 $accline->datec = $now;
643 $accline->dateo = $date;
644 $accline->datev = $datev;
645 $accline->label = $label;
646 $accline->amount = $amount;
647 $accline->amount_main_currency = $amount_main_currency;
648 $accline->fk_user_author = $user->id;
649 $accline->fk_account = $this->id;
650 $accline->fk_type = $oper;
651 $accline->numero_compte = $accountancycode;
652 $accline->num_releve = $num_releve;
653
654 if ($num_chq) {
655 $accline->num_chq = $num_chq;
656 }
657
658 if ($emetteur) {
659 $accline->emetteur = $emetteur;
660 }
661
662 if ($banque) {
663 $accline->bank_chq = $banque;
664 }
665
666 if ($accline->insert() > 0) {
667 if ($categorie > 0) {
668 $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_class(";
669 $sql .= "lineid, fk_categ";
670 $sql .= ") VALUES (";
671 $sql .= ((int) $accline->id).", '".$this->db->escape($categorie)."'";
672 $sql .= ")";
673
674 $result = $this->db->query($sql);
675 if (!$result) {
676 $this->error = $this->db->lasterror();
677 $this->db->rollback();
678
679 return -4;
680 }
681 }
682
683 $this->db->commit();
684
685 return $accline->id;
686 } else {
687 $this->setErrorsFromObject($accline);
688 $this->db->rollback();
689
690 return -5;
691 }
692 }
693
701 public function create(User $user, $notrigger = 0)
702 {
703 global $langs, $conf;
704
705 $error = 0;
706
707 // Clean parameters
708 if (!$this->min_allowed) {
709 $this->min_allowed = 0;
710 }
711 if (!$this->min_desired) {
712 $this->min_desired = 0;
713 }
714
715 // Check parameters
716 if (empty($this->country_id)) {
717 $this->error = $langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("Country"));
718 dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
719 return -1;
720 }
721 if (empty($this->ref)) {
722 $this->error = $langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("Ref"));
723 dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
724 return -1;
725 }
726 if (empty($this->date_solde)) {
727 $this->error = $langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateInitialBalance"));
728 dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
729 return -1;
730 }
731
732 // Load libraries to check BAN
733 $balance = $this->balance;
734 if (empty($balance) && !empty($this->solde)) {
735 $balance = $this->solde;
736 }
737 if (empty($balance)) {
738 $balance = 0;
739 }
740 if (empty($this->address && !empty($this->domiciliation))) {
741 dol_syslog(get_class($this)."::create domiciliation is deprecated use address", LOG_NOTICE);
742 $this->address = $this->domiciliation;
743 }
744 if (empty($this->status && !empty($this->clos))) {
745 dol_syslog(get_class($this)."::create clos is deprecated use status", LOG_NOTICE);
746 $this->status = $this->clos;
747 }
748
749 if (empty($this->address && !empty($this->domiciliation))) {
750 dol_syslog(get_class($this)."::create domiciliation is deprecated use address", LOG_NOTICE);
751 $this->address = $this->domiciliation;
752 }
753
754 // Load the library to validate/check a BAN account
755 require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
756
757 $now = dol_now();
758
759 $this->db->begin();
760
761 $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_account (";
762 $sql .= "datec";
763 $sql .= ", ref";
764 $sql .= ", label";
765 $sql .= ", entity";
766 $sql .= ", account_number";
767 $sql .= ", fk_accountancy_journal";
768 $sql .= ", bank";
769 $sql .= ", code_banque";
770 $sql .= ", code_guichet";
771 $sql .= ", number";
772 $sql .= ", cle_rib";
773 $sql .= ", bic";
774 $sql .= ", iban_prefix";
775 $sql .= ", domiciliation";
776 $sql .= ", pti_in_ctti";
777 $sql .= ", proprio";
778 $sql .= ", owner_address";
779 $sql .= ", owner_zip";
780 $sql .= ", owner_town";
781 $sql .= ", owner_country_id";
782 $sql .= ", currency_code";
783 $sql .= ", rappro";
784 $sql .= ", min_allowed";
785 $sql .= ", min_desired";
786 $sql .= ", comment";
787 $sql .= ", state_id";
788 $sql .= ", fk_pays";
789 $sql .= ", ics";
790 $sql .= ", ics_transfer";
791 $sql .= ") VALUES (";
792 $sql .= "'".$this->db->idate($now)."'";
793 $sql .= ", '".$this->db->escape($this->ref)."'";
794 $sql .= ", '".$this->db->escape($this->label)."'";
795 $sql .= ", ".((int) $conf->entity);
796 $sql .= ", '".$this->db->escape($this->account_number)."'";
797 $sql .= ", ".($this->fk_accountancy_journal > 0 ? ((int) $this->fk_accountancy_journal) : "null");
798 $sql .= ", '".$this->db->escape($this->bank)."'";
799 $sql .= ", '".$this->db->escape($this->code_banque)."'";
800 $sql .= ", '".$this->db->escape($this->code_guichet)."'";
801 $sql .= ", '".$this->db->escape($this->number)."'";
802 $sql .= ", '".$this->db->escape($this->cle_rib)."'";
803 $sql .= ", '".$this->db->escape($this->bic)."'";
804 $sql .= ", '".$this->db->escape($this->iban)."'";
805 $sql .= ", '".$this->db->escape($this->address)."'";
806 $sql .= ", ".((int) $this->pti_in_ctti);
807 $sql .= ", '".$this->db->escape($this->owner_name ? $this->owner_name : $this->proprio)."'";
808 $sql .= ", '".$this->db->escape($this->owner_address)."'";
809 $sql .= ", '".$this->db->escape($this->owner_zip)."'";
810 $sql .= ", '".$this->db->escape($this->owner_town)."'";
811 $sql .= ", ".($this->owner_country_id > 0 ? ((int) $this->owner_country_id) : "null");
812 $sql .= ", '".$this->db->escape($this->currency_code)."'";
813 $sql .= ", ".((int) $this->rappro);
814 $sql .= ", ".price2num($this->min_allowed, 'MT');
815 $sql .= ", ".price2num($this->min_desired, 'MT');
816 $sql .= ", '".$this->db->escape($this->comment)."'";
817 $sql .= ", ".($this->state_id > 0 ? ((int) $this->state_id) : "null");
818 $sql .= ", ".($this->country_id > 0 ? ((int) $this->country_id) : "null");
819 $sql .= ", '".$this->db->escape($this->ics)."'";
820 $sql .= ", '".$this->db->escape($this->ics_transfer)."'";
821 $sql .= ")";
822
823 dol_syslog(get_class($this)."::create", LOG_DEBUG);
824 $resql = $this->db->query($sql);
825 if ($resql) {
826 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."bank_account");
827
828 $result = $this->update($user, 1);
829 if ($result > 0) {
830 $accline = new AccountLine($this->db);
831 $accline->datec = $now;
832 $accline->label = '('.$langs->trans("InitialBankBalance").')';
833 $accline->amount = (float) price2num($balance);
834 $accline->fk_user_author = $user->id;
835 $accline->fk_account = $this->id;
836 $accline->datev = $this->date_solde;
837 $accline->dateo = $this->date_solde;
838 $accline->fk_type = 'SOLD';
839
840 if ($accline->insert() < 0) {
841 $error++;
842 $this->error = $accline->error;
843 $this->errors = $accline->errors;
844 }
845
846 if (!$error) {
847 $result = $this->insertExtraFields();
848 if ($result < 0) {
849 $error++;
850 }
851 }
852
853 if (!$error && !$notrigger) {
854 // Call trigger
855 $result = $this->call_trigger('BANKACCOUNT_CREATE', $user);
856 if ($result < 0) {
857 $error++;
858 }
859 // End call triggers
860 }
861 } else {
862 $error++;
863 }
864 } else {
865 if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
866 $this->error = $langs->trans("ErrorBankLabelAlreadyExists");
867 $error++;
868 } else {
869 $this->error = $this->db->error()." sql=".$sql;
870 $error++;
871 }
872 }
873
874 if (!$error) {
875 $this->db->commit();
876 return $this->id;
877 } else {
878 $this->db->rollback();
879 return -1 * $error;
880 }
881 }
882
890 public function update(User $user, $notrigger = 0)
891 {
892 global $langs, $conf;
893
894 $error = 0;
895
896 $this->db->begin();
897
898 // Check parameters
899 if (empty($this->country_id)) {
900 $this->error = $langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("Country"));
901 dol_syslog(get_class($this)."::update ".$this->error, LOG_ERR);
902 return -1;
903 }
904 if (empty($this->ref)) {
905 $this->error = $langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("Ref"));
906 dol_syslog(get_class($this)."::update ".$this->error, LOG_ERR);
907 return -1;
908 }
909 if (!$this->label) {
910 $this->label = "???";
911 }
912
913 $sql = "UPDATE ".MAIN_DB_PREFIX."bank_account SET";
914 $sql .= " ref = '".$this->db->escape($this->ref)."'";
915 $sql .= ",label = '".$this->db->escape($this->label)."'";
916 $sql .= ",courant = ".((int) $this->type);
917 $sql .= ",clos = ".((int) $this->status);
918 $sql .= ",rappro = ".((int) $this->rappro);
919 $sql .= ",url = ".($this->url ? "'".$this->db->escape($this->url)."'" : "null");
920 $sql .= ",account_number = '".$this->db->escape($this->account_number)."'";
921 $sql .= ",fk_accountancy_journal = ".($this->fk_accountancy_journal > 0 ? ((int) $this->fk_accountancy_journal) : "null");
922 $sql .= ",bank = '".$this->db->escape($this->bank)."'";
923 $sql .= ",code_banque='".$this->db->escape($this->code_banque)."'";
924 $sql .= ",code_guichet='".$this->db->escape($this->code_guichet)."'";
925 $sql .= ",number='".$this->db->escape($this->number)."'";
926 $sql .= ",cle_rib='".$this->db->escape($this->cle_rib)."'";
927 $sql .= ",bic='".$this->db->escape($this->bic)."'";
928 $sql .= ",iban_prefix = '".$this->db->escape($this->iban)."'";
929 $sql .= ",domiciliation='".$this->db->escape($this->address)."'";
930 $sql .= ",pti_in_ctti=".((int) $this->pti_in_ctti);
931 $sql .= ",proprio = '".$this->db->escape($this->owner_name ? $this->owner_name : $this->proprio)."'";
932 $sql .= ",owner_address = '".$this->db->escape($this->owner_address)."'";
933 $sql .= ",owner_zip = '".$this->db->escape($this->owner_zip)."'";
934 $sql .= ",owner_town = '".$this->db->escape($this->owner_town)."'";
935 $sql .= ",owner_country_id = ".($this->owner_country_id > 0 ? ((int) $this->owner_country_id) : "null");
936
937 $sql .= ",currency_code = '".$this->db->escape($this->currency_code)."'";
938
939 $sql .= ",min_allowed = ".($this->min_allowed != '' ? price2num($this->min_allowed) : "null");
940 $sql .= ",min_desired = ".($this->min_desired != '' ? price2num($this->min_desired) : "null");
941 $sql .= ",comment = '".$this->db->escape($this->comment)."'";
942
943 $sql .= ",state_id = ".($this->state_id > 0 ? ((int) $this->state_id) : "null");
944 $sql .= ",fk_pays = ".($this->country_id > 0 ? ((int) $this->country_id) : "null");
945 $sql .= ",ics = '".$this->db->escape($this->ics)."'";
946 $sql .= ",ics_transfer = '".$this->db->escape($this->ics_transfer)."'";
947
948 $sql .= " WHERE rowid = ".((int) $this->id);
949
950 dol_syslog(get_class($this)."::update", LOG_DEBUG);
951 $result = $this->db->query($sql);
952 if ($result) {
953 // Actions on extra fields (by external module or standard code)
954 if (!$error) {
955 $result = $this->insertExtraFields();
956 if ($result < 0) {
957 $error++;
958 }
959 }
960
961 if (!$error && !empty($this->oldref) && $this->oldref !== $this->ref) {
962 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'bank/".$this->db->escape($this->ref)."'";
963 $sql .= " WHERE filepath = 'bank/".$this->db->escape($this->oldref)."' and src_object_type='bank_account' and entity = ".((int) $conf->entity);
964 $resql = $this->db->query($sql);
965 if (!$resql) {
966 $error++;
967 $this->error = $this->db->lasterror();
968 }
969
970 // We rename directory in order not to lose the attachments
971 $oldref = dol_sanitizeFileName($this->oldref);
972 $newref = dol_sanitizeFileName($this->ref);
973 $dirsource = $conf->bank->dir_output.'/'.$oldref;
974 $dirdest = $conf->bank->dir_output.'/'.$newref;
975 if (file_exists($dirsource)) {
976 dol_syslog(get_class($this)."::update rename dir ".$dirsource." into ".$dirdest, LOG_DEBUG);
977 if (@rename($dirsource, $dirdest)) {
978 dol_syslog("Rename ok", LOG_DEBUG);
979 }
980 }
981 }
982
983 if (!$error && !$notrigger) {
984 // Call trigger
985 $result = $this->call_trigger('BANKACCOUNT_MODIFY', $user);
986 if ($result < 0) {
987 $error++;
988 }
989 // End call triggers
990 }
991 } else {
992 $error++;
993 $this->error = $this->db->lasterror();
994 dol_print_error($this->db);
995 }
996
997 if (!$error) {
998 $this->db->commit();
999 return $this->id;
1000 } else {
1001 $this->db->rollback();
1002 return -1 * $error;
1003 }
1004 }
1005
1006
1007 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1014 public function update_bban(User $user = null)
1015 {
1016 // phpcs:enable
1017 global $conf, $langs;
1018
1019 // Load library to get BAN control function
1020 require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
1021
1022 dol_syslog(get_class($this)."::update_bban $this->code_banque,$this->code_guichet,$this->number,$this->cle_rib,$this->iban");
1023
1024 // Check parameters
1025 if (!$this->ref) {
1026 $this->error = $langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->trans("Ref"));
1027 return -2;
1028 }
1029
1030 $sql = "UPDATE ".MAIN_DB_PREFIX."bank_account SET";
1031 $sql .= " bank = '".$this->db->escape($this->bank)."'";
1032 $sql .= ",code_banque='".$this->db->escape($this->code_banque)."'";
1033 $sql .= ",code_guichet='".$this->db->escape($this->code_guichet)."'";
1034 $sql .= ",number='".$this->db->escape($this->number)."'";
1035 $sql .= ",cle_rib='".$this->db->escape($this->cle_rib)."'";
1036 $sql .= ",bic='".$this->db->escape($this->bic)."'";
1037 $sql .= ",iban_prefix = '".$this->db->escape($this->iban)."'";
1038 $sql .= ",domiciliation='".$this->db->escape($this->address ? $this->address : $this->domiciliation)."'";
1039 $sql .= ",proprio = '".$this->db->escape($this->owner_name ? $this->owner_name : $this->proprio)."'";
1040 $sql .= ",owner_address = '".$this->db->escape($this->owner_address)."'";
1041 $sql .= ",owner_zip = '".$this->db->escape($this->owner_zip)."'";
1042 $sql .= ",owner_town = '".$this->db->escape($this->owner_town)."'";
1043 $sql .= ",owner_country_id = ".($this->owner_country_id > 0 ? ((int) $this->owner_country_id) : "null");
1044 $sql .= ",state_id = ".($this->state_id > 0 ? $this->state_id : "null");
1045 $sql .= ",fk_pays = ".($this->country_id > 0 ? $this->country_id : "null");
1046 $sql .= " WHERE rowid = ".((int) $this->id);
1047 $sql .= " AND entity = ".((int) $conf->entity);
1048
1049 dol_syslog(get_class($this)."::update_bban", LOG_DEBUG);
1050
1051 $result = $this->db->query($sql);
1052 if ($result) {
1053 return 1;
1054 } else {
1055 $this->error = $this->db->lasterror();
1056 dol_print_error($this->db);
1057 return -1;
1058 }
1059 }
1060
1061
1069 public function fetch($id, $ref = '')
1070 {
1071 if (empty($id) && empty($ref)) {
1072 $this->error = "ErrorBadParameters";
1073 return -1;
1074 }
1075
1076 $sql = "SELECT ba.rowid, ba.ref, ba.label, ba.bank, ba.number, ba.courant as type, ba.clos as status, ba.rappro, ba.url,";
1077 $sql .= " ba.code_banque, ba.code_guichet, ba.cle_rib, ba.bic, ba.iban_prefix as iban,";
1078 $sql .= " ba.domiciliation as address, ba.pti_in_ctti, ba.proprio as owner_name, ba.owner_address, ba.owner_zip, ba.owner_town, ba.owner_country_id, ba.state_id, ba.fk_pays as country_id,";
1079 $sql .= " ba.account_number, ba.fk_accountancy_journal, ba.currency_code,";
1080 $sql .= " ba.min_allowed, ba.min_desired, ba.comment,";
1081 $sql .= " ba.datec as date_creation, ba.tms as date_modification, ba.ics, ba.ics_transfer,";
1082 $sql .= ' c.code as country_code, c.label as country,';
1083 $sql .= ' d.code_departement as state_code, d.nom as state,';
1084 $sql .= ' aj.code as accountancy_journal';
1085 $sql .= " FROM ".MAIN_DB_PREFIX."bank_account as ba";
1086 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_country as c ON ba.fk_pays = c.rowid';
1087 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_departements as d ON ba.state_id = d.rowid';
1088 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'accounting_journal as aj ON aj.rowid=ba.fk_accountancy_journal';
1089 $sql .= " WHERE ba.entity IN (".getEntity($this->element).")";
1090 if ($id) {
1091 $sql .= " AND ba.rowid = ".((int) $id);
1092 }
1093 if ($ref) {
1094 $sql .= " AND ba.ref = '".$this->db->escape($ref)."'";
1095 }
1096
1097 dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
1098 $result = $this->db->query($sql);
1099 if ($result) {
1100 if ($this->db->num_rows($result)) {
1101 $obj = $this->db->fetch_object($result);
1102
1103 $this->id = $obj->rowid;
1104 $this->rowid = $obj->rowid;
1105 $this->ref = $obj->ref;
1106 $this->label = $obj->label;
1107 $this->type = $obj->type;
1108 $this->courant = $obj->type;
1109 $this->bank = $obj->bank;
1110 $this->clos = $obj->status;
1111 $this->status = $obj->status;
1112 $this->rappro = $obj->rappro;
1113 $this->url = $obj->url;
1114
1115 $this->code_banque = $obj->code_banque;
1116 $this->code_guichet = $obj->code_guichet;
1117 $this->number = $obj->number;
1118 $this->cle_rib = $obj->cle_rib;
1119 $this->bic = $obj->bic;
1120 $this->iban = $obj->iban;
1121 $this->domiciliation = $obj->address;
1122 $this->address = $obj->address;
1123 $this->pti_in_ctti = $obj->pti_in_ctti;
1124 $this->proprio = $obj->owner_name;
1125 $this->owner_name = $obj->owner_name;
1126 $this->owner_address = $obj->owner_address;
1127 $this->owner_zip = $obj->owner_zip;
1128 $this->owner_town = $obj->owner_town;
1129 $this->owner_country_id = $obj->owner_country_id;
1130
1131 $this->state_id = $obj->state_id;
1132 $this->state_code = $obj->state_code;
1133 $this->state = $obj->state;
1134
1135 $this->country_id = $obj->country_id;
1136 $this->country_code = $obj->country_code;
1137 $this->country = $obj->country;
1138
1139 $this->account_number = $obj->account_number;
1140 $this->fk_accountancy_journal = $obj->fk_accountancy_journal;
1141 $this->accountancy_journal = $obj->accountancy_journal;
1142
1143 $this->currency_code = $obj->currency_code;
1144 $this->account_currency_code = $obj->currency_code;
1145 $this->min_allowed = $obj->min_allowed;
1146 $this->min_desired = $obj->min_desired;
1147 $this->comment = $obj->comment;
1148
1149 $this->date_creation = $this->db->jdate($obj->date_creation);
1150 $this->date_modification = $this->db->jdate($obj->date_modification);
1151
1152 $this->ics = $obj->ics;
1153 $this->ics_transfer = $obj->ics_transfer;
1154
1155 // Retrieve all extrafield
1156 // fetch optionals attributes and labels
1157 $this->fetch_optionals();
1158
1159 return 1;
1160 } else {
1161 return 0;
1162 }
1163 } else {
1164 $this->error = $this->db->lasterror();
1165 $this->errors[] = $this->error;
1166 return -1;
1167 }
1168 }
1169
1180 public function setCategories($categories)
1181 {
1182 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1183 return parent::setCategoriesCommon($categories, Categorie::TYPE_ACCOUNT);
1184 }
1185
1193 public function delete(User $user = null, $notrigger = 0)
1194 {
1195 $error = 0;
1196
1197 $this->db->begin();
1198
1199 // @TODO Check there is no child into llx_payment_various, ... to allow deletion ?
1200
1201 // Delete link between tag and bank account
1202 if (!$error) {
1203 $sql = "DELETE FROM ".MAIN_DB_PREFIX."categorie_account";
1204 $sql .= " WHERE fk_account = ".((int) $this->id);
1205
1206 $resql = $this->db->query($sql);
1207 if (!$resql) {
1208 $error++;
1209 $this->error = "Error ".$this->db->lasterror();
1210 }
1211 }
1212
1213 if (!$error) {
1214 $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element;
1215 $sql .= " WHERE rowid = ".((int) $this->id);
1216
1217 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
1218 $result = $this->db->query($sql);
1219 if ($result) {
1220 // Remove extrafields
1221 if (!$error) {
1222 $result = $this->deleteExtraFields();
1223 if ($result < 0) {
1224 $error++;
1225 dol_syslog(get_class($this)."::delete error -4 ".$this->error, LOG_ERR);
1226 }
1227 }
1228 } else {
1229 $error++;
1230 $this->error = "Error ".$this->db->lasterror();
1231 }
1232 }
1233
1234 if (!$error) {
1235 $this->db->commit();
1236 return 1;
1237 } else {
1238 $this->db->rollback();
1239 return -1;
1240 }
1241 }
1242
1243
1250 public function getLibStatut($mode = 0)
1251 {
1252 return $this->LibStatut($this->status, $mode);
1253 }
1254
1255 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1263 public function LibStatut($status, $mode = 0)
1264 {
1265 // phpcs:enable
1266 global $langs;
1267 $langs->load('banks');
1268
1269 if ($status == self::STATUS_OPEN) {
1270 $label = $langs->transnoentitiesnoconv("StatusAccountOpened");
1271 $labelshort = $langs->transnoentitiesnoconv("StatusAccountOpened");
1272 $statusType = 'status4';
1273 } else {
1274 $label = $langs->transnoentitiesnoconv("StatusAccountClosed");
1275 $labelshort = $langs->transnoentitiesnoconv("StatusAccountClosed");
1276 $statusType = 'status5';
1277 }
1278
1279 return dolGetStatus($label, $labelshort, '', $statusType, $mode);
1280 }
1281
1282
1283 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1289 public function can_be_deleted()
1290 {
1291 // phpcs:enable
1292 $can_be_deleted = false;
1293
1294 $sql = "SELECT COUNT(rowid) as nb";
1295 $sql .= " FROM ".MAIN_DB_PREFIX."bank";
1296 $sql .= " WHERE fk_account = ".((int) $this->id);
1297
1298 $resql = $this->db->query($sql);
1299 if ($resql) {
1300 $obj = $this->db->fetch_object($resql);
1301 if ($obj->nb <= 1) {
1302 $can_be_deleted = true; // Juste le solde
1303 }
1304 } else {
1305 dol_print_error($this->db);
1306 }
1307 return $can_be_deleted;
1308 }
1309
1310
1316 public function error()
1317 {
1318 return $this->error;
1319 }
1320
1329 public function solde($option = 0, $date_end = '', $field = 'dateo')
1330 {
1331 $solde = 0;
1332
1333 $sql = "SELECT sum(amount) as amount";
1334 $sql .= " FROM ".MAIN_DB_PREFIX."bank";
1335 $sql .= " WHERE fk_account = ".((int) $this->id);
1336 if ($option == 1) {
1337 $sql .= " AND ".$this->db->escape($field)." <= '".(!empty($date_end) ? $this->db->idate($date_end) : $this->db->idate(dol_now()))."'";
1338 }
1339
1340 $resql = $this->db->query($sql);
1341 if ($resql) {
1342 if ($this->db->num_rows($resql)) {
1343 $obj = $this->db->fetch_object($resql);
1344 $solde = $obj->amount;
1345 }
1346 $this->db->free($resql);
1347 } else {
1348 $this->errors[] = $this->db->lasterror;
1349 return -1;
1350 }
1351
1352 return (float) price2num($solde, 'MU');
1353 }
1354
1355 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1363 public function load_board(User $user, $filteraccountid = 0)
1364 {
1365 // phpcs:enable
1366 global $conf, $langs;
1367
1368 if ($user->socid) {
1369 return -1; // protection pour eviter appel par utilisateur externe
1370 }
1371
1372 $sql = "SELECT b.rowid, b.datev as datefin";
1373 $sql .= " FROM ".MAIN_DB_PREFIX."bank as b,";
1374 $sql .= " ".MAIN_DB_PREFIX."bank_account as ba";
1375 $sql .= " WHERE b.rappro=0";
1376 $sql .= " AND b.fk_account = ba.rowid";
1377 $sql .= " AND ba.entity IN (".getEntity('bank_account').")";
1378 $sql .= " AND (ba.rappro = 1 AND ba.courant != " . Account::TYPE_CASH . ")"; // Compte rapprochable
1379 $sql .= " AND clos = 0";
1380 if ($filteraccountid) {
1381 $sql .= " AND ba.rowid = ".((int) $filteraccountid);
1382 }
1383
1384 $resql = $this->db->query($sql);
1385 if ($resql) {
1386 $langs->load("banks");
1387 $now = dol_now();
1388
1389 require_once DOL_DOCUMENT_ROOT.'/core/class/workboardresponse.class.php';
1390
1391 $response = new WorkboardResponse();
1392 $response->warning_delay = $conf->bank->rappro->warning_delay / 60 / 60 / 24;
1393 $response->label = $langs->trans("TransactionsToConciliate");
1394 $response->labelShort = $langs->trans("TransactionsToConciliateShort");
1395 $response->url = DOL_URL_ROOT.'/compta/bank/list.php?leftmenu=bank&amp;mainmenu=bank';
1396 $response->img = img_object('', "payment");
1397
1398 while ($obj = $this->db->fetch_object($resql)) {
1399 $response->nbtodo++;
1400 if ($this->db->jdate($obj->datefin) < ($now - $conf->bank->rappro->warning_delay)) {
1401 $response->nbtodolate++;
1402 }
1403 }
1404
1405 return $response;
1406 } else {
1407 dol_print_error($this->db);
1408 $this->error = $this->db->error();
1409 return -1;
1410 }
1411 }
1412
1419 public function loadStateBoard($filteraccountid = 0)
1420 {
1421 global $user;
1422
1423 if ($user->socid) {
1424 return -1; // protection pour eviter appel par utilisateur externe
1425 }
1426
1427 $sql = "SELECT count(b.rowid) as nb";
1428 $sql .= " FROM ".MAIN_DB_PREFIX."bank as b,";
1429 $sql .= " ".MAIN_DB_PREFIX."bank_account as ba";
1430 $sql .= " WHERE b.fk_account = ba.rowid";
1431 $sql .= " AND ba.entity IN (".getEntity('bank_account').")";
1432 $sql .= " AND (ba.rappro = 1 AND ba.courant != 2)"; // Compte rapprochable
1433 $sql .= " AND clos = 0";
1434 if ($filteraccountid) {
1435 $sql .= " AND ba.rowid = ".((int) $filteraccountid);
1436 }
1437
1438 $resql = $this->db->query($sql);
1439 if ($resql) {
1440 while ($obj = $this->db->fetch_object($resql)) {
1441 $this->nb["banklines"] = $obj->nb;
1442 }
1443 $this->db->free($resql);
1444 return 1;
1445 } else {
1446 dol_print_error($this->db);
1447 $this->error = $this->db->error();
1448 return -1;
1449 }
1450 }
1451
1452
1458 public function countAccountToReconcile()
1459 {
1460 global $user;
1461
1462 //Protection against external users
1463 if ($user->socid) {
1464 return 0;
1465 }
1466
1467 $nb = 0;
1468
1469 $sql = "SELECT COUNT(ba.rowid) as nb";
1470 $sql .= " FROM ".MAIN_DB_PREFIX."bank_account as ba";
1471 $sql .= " WHERE ba.rappro > 0 and ba.clos = 0";
1472 $sql .= " AND ba.entity IN (".getEntity('bank_account').")";
1473 if (!getDolGlobalString('BANK_CAN_RECONCILIATE_CASHACCOUNT')) {
1474 $sql .= " AND ba.courant != " . Account::TYPE_CASH;
1475 }
1476
1477 $resql = $this->db->query($sql);
1478 if ($resql) {
1479 $obj = $this->db->fetch_object($resql);
1480 $nb = $obj->nb;
1481 } else {
1482 dol_print_error($this->db);
1483 }
1484
1485 return $nb;
1486 }
1487
1495 public function getTooltipContentArray($params)
1496 {
1497 global $langs;
1498 $langs->loadLangs(['banks', 'compta']);
1499 include_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
1500
1501 $datas = array();
1502
1503 $nofetch = !empty($params['nofetch']);
1504 $pictos = img_picto('', $this->picto).' <u class="paddingrightnow">'.$langs->trans("BankAccount").'</u>';
1505 if (isset($this->status)) {
1506 $pictos .= ' '.$this->getLibStatut(5);
1507 }
1508 $datas['picto'] = $pictos;
1509 $datas['label'] = '<br><b>'.$langs->trans('Label').':</b> '.$this->label;
1510 $datas['accountnumber'] = '<br><b>'.$langs->trans('AccountNumber').':</b> '.$this->number;
1511 $datas['iban'] = '<br><b>'.$langs->trans('IBAN').':</b> '.getIbanHumanReadable($this);
1512 $datas['bic'] = '<br><b>'.$langs->trans('BIC').':</b> '.$this->bic;
1513 $datas['accountcurrency'] = '<br><b>'.$langs->trans("AccountCurrency").':</b> '.$this->currency_code;
1514
1515 if (isModEnabled('accounting')) {
1516 include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
1517 $langs->load("accountancy");
1518 $datas['accountaccounting'] = '<br><b>'.$langs->trans('AccountAccounting').':</b> '.length_accountg($this->account_number);
1519 $datas['accountancyjournal'] = '<br><b>'.$langs->trans('AccountancyJournal').':</b> '.$this->accountancy_journal;
1520 }
1521 // show categories for this record only in ajax to not overload lists
1522 if (isModEnabled('category') && !$nofetch) {
1523 require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
1524 $form = new Form($this->db);
1525 $datas['categories'] = '<br>' . $form->showCategories($this->id, Categorie::TYPE_ACCOUNT, 1);
1526 }
1527
1528 return $datas;
1529 }
1530
1542 public function getNomUrl($withpicto = 0, $mode = '', $option = '', $save_lastsearch_value = -1, $notooltip = 0, $morecss = '')
1543 {
1544 global $conf, $langs;
1545
1546 if (!empty($conf->dol_no_mouse_hover)) {
1547 $notooltip = 1; // Force disable tooltips
1548 }
1549
1550 include_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
1551
1552 $result = '';
1553 $classfortooltip = 'classfortooltip';
1554 $dataparams = '';
1555 $params = [
1556 'id' => $this->id,
1557 'objecttype' => $this->element,
1558 'option' => $option,
1559 'nofetch' => 1,
1560 ];
1561 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
1562 $classfortooltip = 'classforajaxtooltip';
1563 $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
1564 $label = '';
1565 } else {
1566 $label = implode($this->getTooltipContentArray($params));
1567 }
1568
1569 $url = DOL_URL_ROOT.'/compta/bank/card.php?id='.$this->id;
1570 if ($mode == 'transactions') {
1571 $url = DOL_URL_ROOT.'/compta/bank/bankentries_list.php?id='.$this->id;
1572 } elseif ($mode == 'receipts') {
1573 $url = DOL_URL_ROOT.'/compta/bank/releve.php?account='.$this->id;
1574 }
1575
1576 if ($option != 'nolink') {
1577 // Add param to save lastsearch_values or not
1578 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1579 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
1580 $add_save_lastsearch_values = 1;
1581 }
1582 if ($add_save_lastsearch_values) {
1583 $url .= '&save_lastsearch_values=1';
1584 }
1585 }
1586
1587 $linkclose = '';
1588 if (empty($notooltip)) {
1589 if (getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER')) {
1590 $label = $langs->trans("BankAccount");
1591 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
1592 }
1593 $linkclose .= ($label ? ' title="'.dol_escape_htmltag($label, 1).'"' : ' title="tocomplete"');
1594 $linkclose .= $dataparams.' class="'.$classfortooltip.($morecss ? ' '.$morecss : '').'"';
1595 } else {
1596 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
1597 }
1598
1599 if ($option == 'nolink' || empty($url)) {
1600 $linkstart = '<span';
1601 } else {
1602 $linkstart = '<a href="'.$url.'"';
1603 }
1604 $linkstart .= $linkclose.'>';
1605 if ($option == 'nolink' || empty($url)) {
1606 $linkend = '</span>';
1607 } else {
1608 $linkend = '</a>';
1609 }
1610
1611 $result .= $linkstart;
1612
1613 if ($withpicto) {
1614 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'"'), 0, 0, $notooltip ? 0 : 1);
1615 }
1616 if ($withpicto != 2) {
1617 $result .= $this->ref.($option == 'reflabel' && $this->label ? ' - '.$this->label : '');
1618 }
1619 $result .= $linkend;
1620
1621 return $result;
1622 }
1623
1624
1625 // Method after here are common to Account and CompanyBankAccount
1626
1627
1633 public function verif()
1634 {
1635 require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
1636
1637 $error = 0;
1638
1639 // Call functions to check BAN
1640 if (!checkIbanForAccount($this)) {
1641 $error++;
1642 $this->error = 'IBANNotValid';
1643 }
1644 if (!checkSwiftForAccount($this)) {
1645 $error++;
1646 $this->error = 'SwiftNotValid';
1647 }
1648
1649 if (! $error) {
1650 return 1;
1651 } else {
1652 return 0;
1653 }
1654 }
1655
1661 public function getCountryCode()
1662 {
1663 global $mysoc;
1664
1665 // We return country code of bank account
1666 if (!empty($this->country_code)) {
1667 return $this->country_code;
1668 }
1669
1670 // For backward compatibility, we try to guess country from other information
1671 if (!empty($this->iban)) {
1672 // If IBAN defined, we can know country of account from it
1673 $reg = array();
1674 if (preg_match("/^([a-zA-Z][a-zA-Z])/i", $this->iban, $reg)) {
1675 return $reg[1];
1676 }
1677 }
1678
1679 // If this class is linked to a third party
1680 if (!empty($this->socid)) {
1681 require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
1682 $company = new Societe($this->db);
1683 $result = $company->fetch($this->socid);
1684 if (!empty($company->country_code)) {
1685 return $company->country_code;
1686 }
1687 }
1688
1689 // We return country code of managed company
1690 if (!empty($mysoc->country_code)) {
1691 return $mysoc->country_code;
1692 }
1693
1694 return '';
1695 }
1696
1704 public function getBannerAddress($htmlkey, $object)
1705 {
1706 global $conf, $langs;
1707
1708 $out = '';
1709
1710 $outdone = 0;
1711 $coords = $this->getFullAddress(1, ', ', getDolGlobalInt('MAIN_SHOW_REGION_IN_STATE_SELECT'));
1712 if ($coords) {
1713 if (!empty($conf->use_javascript_ajax)) {
1714 // hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile
1715 $out .= '<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($coords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
1716 $out .= img_picto($langs->trans("Address"), 'map-marker-alt');
1717 $out .= '</a> ';
1718 }
1719 $address = dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', ');
1720 if ($address) {
1721 $out .= $address;
1722 $outdone++;
1723 }
1724 $outdone++;
1725 }
1726
1727 return $out;
1728 }
1729
1730
1739 public function useDetailedBBAN()
1740 {
1741 $country_code = $this->getCountryCode();
1742
1743 if (in_array($country_code, array('FR', 'ES', 'GA', 'IT', 'NC'))) {
1744 return 1; // France, Spain, Gabon, ... - Not valid for CH
1745 }
1746 if (in_array($country_code, array('AD', 'AU', 'BE', 'CA', 'DE', 'DK', 'GR', 'GB', 'ID', 'IE', 'IR', 'KR', 'NL', 'NZ', 'UK', 'US'))) {
1747 return 2; // Australia, England...
1748 }
1749 return 0;
1750 }
1751
1757 public function needIBAN()
1758 {
1759 global $conf;
1760
1761 if (getDolGlobalString('MAIN_IBAN_IS_NEVER_MANDATORY')) {
1762 return 0;
1763 }
1764
1765 $country_code = $this->getCountryCode();
1766
1767 $country_code_in_EEC = array(
1768 'AT', // Austria
1769 'BE', // Belgium
1770 'BG', // Bulgaria
1771 'CY', // Cyprus
1772 'CZ', // Czech republic
1773 'DE', // Germany
1774 'DK', // Danemark
1775 'EE', // Estonia
1776 'ES', // Spain
1777 'FI', // Finland
1778 'FR', // France
1779 'GB', // United Kingdom
1780 'GR', // Greece
1781 'HR', // Croatia
1782 'NL', // Holland
1783 'HU', // Hungary
1784 'IE', // Ireland
1785 'IM', // Isle of Man - Included in UK
1786 'IT', // Italy
1787 'LT', // Lithuania
1788 'LU', // Luxembourg
1789 'LV', // Latvia
1790 'MC', // Monaco - Included in France
1791 'MT', // Malta
1792 //'NO', // Norway
1793 'PL', // Poland
1794 'PT', // Portugal
1795 'RO', // Romania
1796 'SE', // Sweden
1797 'SK', // Slovakia
1798 'SI', // Slovenia
1799 'UK', // United Kingdom
1800 //'CH', // Switzerland - No. Swizerland in not in EEC
1801 );
1802
1803 if (in_array($country_code, $country_code_in_EEC)) {
1804 return 1; // France, Spain, ...
1805 }
1806 return 0;
1807 }
1808
1815 public function info($id)
1816 {
1817 }
1818
1833 public function getFieldsToShow($includeibanbic = 0)
1834 {
1835 //Get the required properties depending on the country
1836 $detailedBBAN = $this->useDetailedBBAN();
1837
1838 if ($detailedBBAN == 0) {
1839 $fieldarray = array(
1840 'BankAccountNumber'
1841 );
1842 } elseif ($detailedBBAN == 2) {
1843 $fieldarray = array(
1844 'BankCode',
1845 'BankAccountNumber'
1846 );
1847 } else {
1848 $fieldarray = self::getAccountNumberOrder();
1849 }
1850
1851 //if ($this->needIBAN()) { // return always IBAN and BIC (this was old behaviour)
1852 if ($includeibanbic) {
1853 $fieldarray[] = 'IBAN';
1854 $fieldarray[] = 'BIC';
1855 }
1856 //}
1857
1858 //Get the order the properties are shown
1859 return $fieldarray;
1860 }
1861
1872 public static function getAccountNumberOrder()
1873 {
1874 global $conf;
1875
1876 $fieldlists = array(
1877 'BankCode',
1878 'DeskCode',
1879 'BankAccountNumber',
1880 'BankAccountNumberKey'
1881 );
1882
1883 if (getDolGlobalString('BANK_SHOW_ORDER_OPTION')) {
1884 if (is_numeric(getDolGlobalString('BANK_SHOW_ORDER_OPTION'))) {
1885 if (getDolGlobalString('BANK_SHOW_ORDER_OPTION') == '1') {
1886 $fieldlists = array(
1887 'BankCode',
1888 'DeskCode',
1889 'BankAccountNumberKey',
1890 'BankAccountNumber'
1891 );
1892 }
1893 } else {
1894 //Replace the old AccountNumber key with the new BankAccountNumber key
1895 $fieldlists = explode(
1896 ' ',
1897 preg_replace('/ ?[^Bank]AccountNumber ?/', 'BankAccountNumber', $conf->global->BANK_SHOW_ORDER_OPTION)
1898 );
1899 }
1900 }
1901
1902 return $fieldlists;
1903 }
1904
1905
1913 public function initAsSpecimen()
1914 {
1915 // Example of IBAN FR7630001007941234567890185
1916 $this->specimen = 1;
1917 $this->ref = 'MBA';
1918 $this->label = 'My Big Company Bank account';
1919 $this->courant = Account::TYPE_CURRENT;
1920 $this->clos = Account::STATUS_OPEN;
1921 $this->type = Account::TYPE_CURRENT;
1922 $this->status = Account::STATUS_OPEN;
1923 $this->code_banque = '30001';
1924 $this->code_guichet = '00794';
1925 $this->number = '12345678901';
1926 $this->cle_rib = '85';
1927 $this->bic = 'AA12';
1928 $this->iban = 'FR7630001007941234567890185';
1929
1930 $this->bank = 'MyBank';
1931 $this->address = 'Rue de Paris';
1932 $this->proprio = 'Owner';
1933 $this->owner_name = 'Owner';
1934 $this->owner_address = 'Owner address';
1935 $this->owner_zip = 'Owner zip';
1936 $this->owner_town = 'Owner town';
1937 $this->owner_country_id = 'Owner country_id';
1938 $this->country_id = 1;
1939
1940 return 1;
1941 }
1942
1951 public static function replaceThirdparty($dbs, $origin_id, $dest_id)
1952 {
1953 $sql = "UPDATE ".MAIN_DB_PREFIX."bank_url SET url_id = ".((int) $dest_id)." WHERE url_id = ".((int) $origin_id)." AND type='company'";
1954
1955 if ($dbs->query($sql)) {
1956 return true;
1957 } else {
1958 //if ($ignoreerrors) return true; // TODO Not enough. If there is A-B on kept thirdparty and B-C on old one, we must get A-B-C after merge. Not A-B.
1959 //$this->errors = $dbs->lasterror();
1960 return false;
1961 }
1962 }
1963
1971 public function getKanbanView($option = '', $arraydata = null)
1972 {
1973 global $langs;
1974
1975 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
1976
1977 $return = '<div class="box-flex-item box-flex-grow-zero">';
1978 $return .= '<div class="info-box info-box-sm">';
1979 $return .= '<span class="info-box-icon bg-infobox-action">';
1980 $return .= img_picto('', $this->picto);
1981 $return .= '</span>';
1982 $return .= '<div class="info-box-content">';
1983 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
1984 if ($selected >= 0) {
1985 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
1986 }
1987 if (property_exists($this, 'type_lib')) {
1988 $return .= '<br><span class="info-box-label opacitymedium" title="'.$this->type_lib[$this->type].'">'.substr($this->type_lib[$this->type], 0, 24).'...</span>';
1989 }
1990 if (method_exists($this, 'solde')) {
1991 $return .= '<br><a href="'.DOL_URL_ROOT.'/compta/bank/bankentries_list.php?id='.$this->id.'">';
1992 $return .= '<span class="opacitymedium">'.$langs->trans("Balance").'</span> : <span class="amount">'.price(price2num($this->solde(1), 'MT'), 0, $langs, 1, -1, -1, $this->currency_code).'</span>';
1993 }
1994 if (method_exists($this, 'getLibStatut')) {
1995 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
1996 }
1997 $return .= '</div>';
1998 $return .= '</div>';
1999 $return .= '</div>';
2000 return $return;
2001 }
2002}
2003
2004
2005require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
2006
2010class AccountLine extends CommonObjectLine
2011{
2015 public $db;
2016
2020 public $element = 'bank';
2021
2025 public $table_element = 'bank';
2026
2030 public $picto = 'accountline';
2031
2035 public $id;
2036
2040 public $ref;
2041
2047 public $datec;
2048
2054 public $dateo;
2055
2061 public $datev;
2062
2066 public $amount;
2067
2071 public $amount_main_currency;
2072
2076 public $fk_user_author;
2077
2081 public $fk_user_rappro;
2082
2086 public $fk_type;
2087
2091 public $fk_bordereau;
2092
2096 public $fk_account;
2097
2101 public $bank_account_ref;
2102
2106 public $bank_account_label;
2107
2111 public $numero_compte;
2112
2116 public $emetteur;
2117
2121 public $rappro;
2122
2126 public $num_releve;
2127
2131 public $num_chq;
2132
2136 public $bank_chq;
2137
2141 public $label;
2142
2146 public $note;
2147
2152 public $user_rappro;
2153
2154
2160 public function __construct(DoliDB $db)
2161 {
2162 $this->db = $db;
2163 }
2164
2173 public function fetch($rowid, $ref = '', $num = '')
2174 {
2175 // Check parameters
2176 if (empty($rowid) && empty($ref) && empty($num)) {
2177 return -1;
2178 }
2179
2180 $sql = "SELECT b.rowid, b.datec, b.datev, b.dateo, b.amount, b.label as label, b.fk_account,";
2181 $sql .= " b.fk_user_author, b.fk_user_rappro,";
2182 $sql .= " b.fk_type, b.num_releve, b.num_chq, b.rappro, b.note,";
2183 $sql .= " b.fk_bordereau, b.banque, b.emetteur,";
2184 $sql .= " ba.ref as bank_account_ref, ba.label as bank_account_label";
2185 $sql .= " FROM ".MAIN_DB_PREFIX."bank as b,";
2186 $sql .= " ".MAIN_DB_PREFIX."bank_account as ba";
2187 $sql .= " WHERE b.fk_account = ba.rowid";
2188 $sql .= " AND ba.entity IN (".getEntity('bank_account').")";
2189 if ($num) {
2190 $sql .= " AND b.num_chq = '".$this->db->escape($num)."'";
2191 } elseif ($ref) {
2192 $sql .= " AND b.rowid = '".$this->db->escape($ref)."'";
2193 } else {
2194 $sql .= " AND b.rowid = ".((int) $rowid);
2195 }
2196
2197 dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
2198 $result = $this->db->query($sql);
2199 if ($result) {
2200 $ret = 0;
2201
2202 $obj = $this->db->fetch_object($result);
2203 if ($obj) {
2204 $this->id = $obj->rowid;
2205 $this->rowid = $obj->rowid;
2206 $this->ref = $obj->rowid;
2207
2208 $this->datec = $this->db->jdate($obj->datec);
2209 $this->datev = $this->db->jdate($obj->datev);
2210 $this->dateo = $this->db->jdate($obj->dateo);
2211 $this->amount = $obj->amount;
2212 $this->label = $obj->label;
2213 $this->note = $obj->note;
2214
2215 $this->fk_user_author = $obj->fk_user_author;
2216 $this->fk_user_rappro = $obj->fk_user_rappro;
2217
2218 $this->fk_type = $obj->fk_type; // Type of transaction
2219 $this->rappro = (int) $obj->rappro;
2220 $this->num_releve = $obj->num_releve;
2221
2222 $this->num_chq = $obj->num_chq;
2223 $this->bank_chq = $obj->banque;
2224 $this->fk_bordereau = $obj->fk_bordereau;
2225
2226 $this->fk_account = $obj->fk_account;
2227 $this->bank_account_ref = $obj->bank_account_ref;
2228 $this->bank_account_label = $obj->bank_account_label;
2229
2230 // Retrieve all extrafield
2231 // fetch optionals attributes and labels
2232 $this->fetch_optionals();
2233
2234 $ret = 1;
2235 }
2236 $this->db->free($result);
2237 return $ret;
2238 } else {
2239 return -1;
2240 }
2241 }
2242
2248 public function insert()
2249 {
2250 $error = 0;
2251
2252 $this->db->begin();
2253
2254 $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank (";
2255 $sql .= "datec";
2256 $sql .= ", dateo";
2257 $sql .= ", datev";
2258 $sql .= ", label";
2259 $sql .= ", amount";
2260 $sql .= ", amount_main_currency";
2261 $sql .= ", fk_user_author";
2262 $sql .= ", num_chq";
2263 $sql .= ", fk_account";
2264 $sql .= ", fk_type";
2265 $sql .= ", emetteur,banque";
2266 $sql .= ", rappro";
2267 $sql .= ", numero_compte";
2268 $sql .= ", num_releve";
2269 $sql .= ") VALUES (";
2270 $sql .= "'".$this->db->idate($this->datec)."'";
2271 $sql .= ", '".$this->db->idate($this->dateo)."'";
2272 $sql .= ", '".$this->db->idate($this->datev)."'";
2273 $sql .= ", '".$this->db->escape($this->label)."'";
2274 $sql .= ", ".price2num($this->amount);
2275 $sql .= ", ".(empty($this->amount_main_currency) ? "NULL" : price2num($this->amount_main_currency));
2276 $sql .= ", ".($this->fk_user_author > 0 ? ((int) $this->fk_user_author) : "null");
2277 $sql .= ", ".($this->num_chq ? "'".$this->db->escape($this->num_chq)."'" : "null");
2278 $sql .= ", '".$this->db->escape($this->fk_account)."'";
2279 $sql .= ", '".$this->db->escape($this->fk_type)."'";
2280 $sql .= ", ".($this->emetteur ? "'".$this->db->escape($this->emetteur)."'" : "null");
2281 $sql .= ", ".($this->bank_chq ? "'".$this->db->escape($this->bank_chq)."'" : "null");
2282 $sql .= ", ".(int) $this->rappro;
2283 $sql .= ", ".($this->numero_compte ? "'".$this->db->escape($this->numero_compte)."'" : "''");
2284 $sql .= ", ".($this->num_releve ? "'".$this->db->escape($this->num_releve)."'" : "null");
2285 $sql .= ")";
2286
2287
2288 dol_syslog(get_class($this)."::insert", LOG_DEBUG);
2289 $resql = $this->db->query($sql);
2290 if ($resql) {
2291 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'bank');
2292 // Actions on extra fields (by external module or standard code)
2293 $result = $this->insertExtraFields();
2294 if ($result < 0) {
2295 $error++;
2296 }
2297 } else {
2298 $error++;
2299 $this->error = $this->db->lasterror();
2300 dol_print_error($this->db);
2301 }
2302
2303 if (!$error) {
2304 $this->db->commit();
2305 return $this->id;
2306 } else {
2307 $this->db->rollback();
2308 return -1 * $error;
2309 }
2310 }
2311
2319 public function delete(User $user = null, $notrigger = 0)
2320 {
2321 $nbko = 0;
2322
2323 if ($this->rappro) {
2324 // Protection to avoid any delete of consolidated lines
2325 $this->error = "ErrorDeleteNotPossibleLineIsConsolidated";
2326 return -1;
2327 }
2328
2329 $this->db->begin();
2330
2331 if (!$notrigger) {
2332 // Call trigger
2333 $result = $this->call_trigger('BANKACCOUNTLINE_DELETE', $user);
2334 if ($result < 0) {
2335 $this->db->rollback();
2336 return -1;
2337 }
2338 // End call triggers
2339 }
2340
2341 // Protection to avoid any delete of accounted lines. Protection on by default
2342 if (!getDolGlobalString('BANK_ALLOW_TRANSACTION_DELETION_EVEN_IF_IN_ACCOUNTING')) {
2343 $sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."accounting_bookkeeping WHERE doc_type = 'bank' AND fk_doc = ".((int) $this->id);
2344 $resql = $this->db->query($sql);
2345 if ($resql) {
2346 $obj = $this->db->fetch_object($resql);
2347 if ($obj && $obj->nb) {
2348 $this->error = 'ErrorRecordAlreadyInAccountingDeletionNotPossible';
2349 $this->db->rollback();
2350 return -1;
2351 }
2352 } else {
2353 $this->error = $this->db->lasterror();
2354 $this->db->rollback();
2355 return -1;
2356 }
2357 }
2358
2359 // Delete urls
2360 $result = $this->delete_urls($user);
2361 if ($result < 0) {
2362 $nbko++;
2363 }
2364
2365 $sql = "DELETE FROM ".MAIN_DB_PREFIX."bank_class WHERE lineid=".(int) $this->rowid;
2366 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
2367 $result = $this->db->query($sql);
2368 if (!$result) {
2369 $nbko++;
2370 }
2371
2372 $sql = "DELETE FROM ".MAIN_DB_PREFIX."bank_extrafields WHERE fk_object=".(int) $this->rowid;
2373 $result = $this->db->query($sql);
2374 if (!$result) {
2375 $nbko++;
2376 }
2377
2378 $sql = "DELETE FROM ".MAIN_DB_PREFIX."bank WHERE rowid=".(int) $this->rowid;
2379 dol_syslog(get_class($this)."::delete", LOG_DEBUG);
2380 $result = $this->db->query($sql);
2381 if (!$result) {
2382 $nbko++;
2383 }
2384
2385 if (!$nbko) {
2386 $this->db->commit();
2387 return 1;
2388 } else {
2389 $this->db->rollback();
2390 return -$nbko;
2391 }
2392 }
2393
2394
2395 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2402 public function delete_urls(User $user = null)
2403 {
2404 // phpcs:enable
2405 $nbko = 0;
2406
2407 if ($this->rappro) {
2408 // Protection to avoid any delete of consolidated lines
2409 $this->error = "ErrorDeleteNotPossibleLineIsConsolidated";
2410 return -1;
2411 }
2412
2413 $this->db->begin();
2414
2415 $sql = "DELETE FROM ".MAIN_DB_PREFIX."bank_url WHERE fk_bank=".(int) $this->rowid;
2416 dol_syslog(get_class($this)."::delete_urls", LOG_DEBUG);
2417 $result = $this->db->query($sql);
2418 if (!$result) {
2419 $nbko++;
2420 }
2421
2422 if (!$nbko) {
2423 $this->db->commit();
2424 return 1;
2425 } else {
2426 $this->db->rollback();
2427 return -$nbko;
2428 }
2429 }
2430
2431
2439 public function update(User $user, $notrigger = 0)
2440 {
2441 $this->db->begin();
2442
2443 $sql = "UPDATE ".MAIN_DB_PREFIX."bank SET";
2444 $sql .= " amount = ".price2num($this->amount).",";
2445 $sql .= " datev='".$this->db->idate($this->datev)."',";
2446 $sql .= " dateo='".$this->db->idate($this->dateo)."'";
2447 $sql .= " WHERE rowid = ".((int) $this->rowid);
2448
2449 dol_syslog(get_class($this)."::update", LOG_DEBUG);
2450 $resql = $this->db->query($sql);
2451 if ($resql) {
2452 $this->db->commit();
2453 return 1;
2454 } else {
2455 $this->db->rollback();
2456 $this->error = $this->db->error();
2457 return -1;
2458 }
2459 }
2460
2461
2467 public function updateLabel()
2468 {
2469 $this->db->begin();
2470
2471 $sql = "UPDATE ".MAIN_DB_PREFIX."bank SET";
2472 $sql .= " label = '".$this->db->escape($this->label)."'";
2473 $sql .= " WHERE rowid = ".((int) $this->rowid);
2474
2475 dol_syslog(get_class($this)."::update_label", LOG_DEBUG);
2476 $resql = $this->db->query($sql);
2477 if ($resql) {
2478 $this->db->commit();
2479 return 1;
2480 } else {
2481 $this->db->rollback();
2482 $this->error = $this->db->error();
2483 return -1;
2484 }
2485 }
2486
2487
2488 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2497 public function update_conciliation(User $user, $cat, $conciliated = 1)
2498 {
2499 // phpcs:enable
2500 global $conf, $langs;
2501
2502 $this->db->begin();
2503
2504 // Check statement field
2505 if (getDolGlobalString('BANK_STATEMENT_REGEX_RULE')) {
2506 if (!preg_match('/' . getDolGlobalString('BANK_STATEMENT_REGEX_RULE').'/', $this->num_releve)) {
2507 $this->errors[] = $langs->trans("ErrorBankStatementNameMustFollowRegex", getDolGlobalString('BANK_STATEMENT_REGEX_RULE'));
2508 return -1;
2509 }
2510 }
2511
2512 $sql = "UPDATE ".MAIN_DB_PREFIX."bank SET";
2513 $sql .= " rappro = ".((int) $conciliated);
2514 $sql .= ", num_releve = '".$this->db->escape($this->num_releve)."'";
2515 if ($conciliated) {
2516 $sql .= ", fk_user_rappro = ".$user->id;
2517 }
2518 $sql .= " WHERE rowid = ".((int) $this->id);
2519
2520 dol_syslog(get_class($this)."::update_conciliation", LOG_DEBUG);
2521 $resql = $this->db->query($sql);
2522 if ($resql) {
2523 if (!empty($cat) && $cat > 0) {
2524 $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_class (";
2525 $sql .= "lineid";
2526 $sql .= ", fk_categ";
2527 $sql .= ") VALUES (";
2528 $sql .= $this->id;
2529 $sql .= ", ".((int) $cat);
2530 $sql .= ")";
2531
2532 dol_syslog(get_class($this)."::update_conciliation", LOG_DEBUG);
2533 $this->db->query($sql);
2534
2535 // No error check. Can fail if category already affected
2536 // TODO Do no try the insert if link already exists
2537 }
2538
2539 $this->rappro = (int) $conciliated;
2540
2541 $this->db->commit();
2542 return 1;
2543 } else {
2544 $this->db->rollback();
2545 return -1;
2546 }
2547 }
2548
2549
2550 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2558 public function datev_change($rowid, $sign = 1)
2559 {
2560 // phpcs:enable
2561 $sql = "SELECT datev FROM ".MAIN_DB_PREFIX."bank WHERE rowid = ".((int) $rowid);
2562 $resql = $this->db->query($sql);
2563 if ($resql) {
2564 $obj = $this->db->fetch_object($resql);
2565 $newdate = $this->db->jdate($obj->datev) + (3600 * 24 * $sign);
2566
2567 $sql = "UPDATE ".MAIN_DB_PREFIX."bank SET";
2568 $sql .= " datev = '".$this->db->idate($newdate)."'";
2569 $sql .= " WHERE rowid = ".((int) $rowid);
2570
2571 $result = $this->db->query($sql);
2572 if ($result) {
2573 if ($this->db->affected_rows($result)) {
2574 return 1;
2575 }
2576 } else {
2577 dol_print_error($this->db);
2578 return 0;
2579 }
2580 } else {
2581 dol_print_error($this->db);
2582 }
2583 return 0;
2584 }
2585
2586 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2593 public function datev_next($id)
2594 {
2595 // phpcs:enable
2596 return $this->datev_change($id, 1);
2597 }
2598
2599 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2606 public function datev_previous($id)
2607 {
2608 // phpcs:enable
2609 return $this->datev_change($id, -1);
2610 }
2611
2612
2613 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2621 public function dateo_change($rowid, $sign = 1)
2622 {
2623 // phpcs:enable
2624 $sql = "SELECT dateo FROM ".MAIN_DB_PREFIX."bank WHERE rowid = ".((int) $rowid);
2625 $resql = $this->db->query($sql);
2626 if ($resql) {
2627 $obj = $this->db->fetch_object($resql);
2628 $newdate = $this->db->jdate($obj->dateo) + (3600 * 24 * $sign);
2629
2630 $sql = "UPDATE ".MAIN_DB_PREFIX."bank SET";
2631 $sql .= " dateo = '".$this->db->idate($newdate)."'";
2632 $sql .= " WHERE rowid = ".((int) $rowid);
2633
2634 $result = $this->db->query($sql);
2635 if ($result) {
2636 if ($this->db->affected_rows($result)) {
2637 return 1;
2638 }
2639 } else {
2640 dol_print_error($this->db);
2641 return 0;
2642 }
2643 } else {
2644 dol_print_error($this->db);
2645 }
2646 return 0;
2647 }
2648
2649 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2656 public function dateo_next($id)
2657 {
2658 // phpcs:enable
2659 return $this->dateo_change($id, 1);
2660 }
2661
2662 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2669 public function dateo_previous($id)
2670 {
2671 // phpcs:enable
2672 return $this->dateo_change($id, -1);
2673 }
2674
2675
2682 public function info($id)
2683 {
2684 $sql = 'SELECT b.rowid, b.datec, b.tms as datem,';
2685 $sql .= ' b.fk_user_author, b.fk_user_rappro';
2686 $sql .= ' FROM '.MAIN_DB_PREFIX.'bank as b';
2687 $sql .= ' WHERE b.rowid = '.((int) $id);
2688
2689 $result = $this->db->query($sql);
2690 if ($result) {
2691 if ($this->db->num_rows($result)) {
2692 $obj = $this->db->fetch_object($result);
2693
2694 $this->id = $obj->rowid;
2695
2696 $this->user_creation_id = $obj->fk_user_author;
2697 $this->user_rappro = $obj->fk_user_rappro;
2698 $this->date_creation = $this->db->jdate($obj->datec);
2699 $this->date_modification = $this->db->jdate($obj->datem);
2700 //$this->date_rappro = $obj->daterappro; // Not yet managed
2701 }
2702 $this->db->free($result);
2703 } else {
2704 dol_print_error($this->db);
2705 }
2706 }
2707
2708
2718 public function getNomUrl($withpicto = 0, $maxlen = 0, $option = '', $notooltip = 0)
2719 {
2720 global $conf, $langs;
2721
2722 $result = '';
2723
2724 $label = img_picto('', $this->picto).' <u>'.$langs->trans("BankTransactionLine").'</u>:<br>';
2725 $label .= '<b>'.$langs->trans("Ref").':</b> '.$this->ref;
2726 if ($this->amount) {
2727 $label .= '<br><strong>'.$langs->trans("Amount").':</strong> '.price($this->amount, 0, $langs, 1, -1, -1, $conf->currency);
2728 }
2729
2730 $linkstart = '<a href="'.DOL_URL_ROOT.'/compta/bank/line.php?rowid='.((int) $this->id).'&save_lastsearch_values=1" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">';
2731 $linkend = '</a>';
2732
2733 $result .= $linkstart;
2734 if ($withpicto) {
2735 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'account'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
2736 }
2737 if ($withpicto != 2) {
2738 $result .= ($this->ref ? $this->ref : $this->id);
2739 }
2740
2741 $result .= $linkend;
2742
2743 if ($option == 'showall' || $option == 'showconciliated' || $option == 'showconciliatedandaccounted') {
2744 $result .= ' <span class="opacitymedium">(';
2745 }
2746 if ($option == 'showall') {
2747 $result .= $langs->trans("BankAccount").': ';
2748 $accountstatic = new Account($this->db);
2749 $accountstatic->id = $this->fk_account;
2750 $accountstatic->ref = $this->bank_account_ref;
2751 $accountstatic->label = $this->bank_account_label;
2752 $result .= $accountstatic->getNomUrl(0).', ';
2753 }
2754 if ($option == 'showall' || $option == 'showconciliated' || $option == 'showconciliatedandaccounted') {
2755 $result .= $langs->trans("BankLineConciliated").': ';
2756 $result .= yn($this->rappro);
2757 }
2758 if (isModEnabled('accounting') && ($option == 'showall' || $option == 'showconciliatedandaccounted')) {
2759 $sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."accounting_bookkeeping";
2760 $sql .= " WHERE doc_type = 'bank' AND fk_doc = ".((int) $this->id);
2761 $resql = $this->db->query($sql);
2762 if ($resql) {
2763 $obj = $this->db->fetch_object($resql);
2764 if ($obj && $obj->nb) {
2765 $result .= ' - '.$langs->trans("Accounted").': '.yn(1);
2766 } else {
2767 $result .= ' - '.$langs->trans("Accounted").': '.yn(0);
2768 }
2769 }
2770 }
2771 if ($option == 'showall' || $option == 'showconciliated' || $option == 'showconciliatedandaccounted') {
2772 $result .= ')</span>';
2773 }
2774
2775 return $result;
2776 }
2777
2778
2785 public function getLibStatut($mode = 0)
2786 {
2787 return $this->LibStatut($this->status, $mode);
2788 }
2789
2790 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2798 public function LibStatut($status, $mode = 0)
2799 {
2800 // phpcs:enable
2801 return '';
2802 }
2803
2809 public function getVentilExportCompta()
2810 {
2811 $alreadydispatched = 0;
2812
2813 $type = 'bank';
2814
2815 $sql = " SELECT COUNT(ab.rowid) as nb FROM ".MAIN_DB_PREFIX."accounting_bookkeeping as ab WHERE ab.doc_type='".$this->db->escape($type)."' AND ab.fk_doc = ".((int) $this->id);
2816 $resql = $this->db->query($sql);
2817 if ($resql) {
2818 $obj = $this->db->fetch_object($resql);
2819 if ($obj) {
2820 $alreadydispatched = $obj->nb;
2821 }
2822 } else {
2823 $this->error = $this->db->lasterror();
2824 return -1;
2825 }
2826
2827 if ($alreadydispatched) {
2828 return 1;
2829 }
2830 return 0;
2831 }
2832}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition security.php:637
checkSwiftForAccount(Account $account=null, $swift=null)
Check SWIFT information for a bank account.
Definition bank.lib.php:284
checkIbanForAccount(Account $account=null, $ibantocheck=null)
Check IBAN number information for a bank account.
Definition bank.lib.php:305
getIbanHumanReadable(Account $account)
Returns the iban human readable.
Definition bank.lib.php:330
$object ref
Definition info.php:79
Class to manage bank accounts.
solde($option=0, $date_end='', $field='dateo')
Return current balance.
fetch($id, $ref='')
Load a bank account into memory from database.
__construct(DoliDB $db)
Constructor.
getNomUrl($withpicto=0, $mode='', $option='', $save_lastsearch_value=-1, $notooltip=0, $morecss='')
Return clicable name (with picto eventually)
add_url_line($line_id, $url_id, $url, $label, $type)
Add a link between bank line record and its source.
loadStateBoard($filteraccountid=0)
Load the indicators this->nb for the state board.
update(User $user, $notrigger=0)
Update bank account card.
getCountryCode()
Return account country code.
getLibStatut($mode=0)
Return label of object status.
delete(User $user=null, $notrigger=0)
Delete bank account from database.
getBannerAddress($htmlkey, $object)
Return full address for banner.
error()
Return error.
info($id)
Load miscellaneous information for tab "Info".
const TYPE_CASH
Cash account.
__toString()
Shows the account number in the appropriate format.
const TYPE_SAVINGS
Savings account.
getTooltipContentArray($params)
getTooltipContentArray
canBeConciliated()
Return if a bank account need to be conciliated.
create(User $user, $notrigger=0)
Create bank account into database.
can_be_deleted()
Indicates if an account can be deleted or not (without movements)
update_bban(User $user=null)
Update BBAN (RIB) account fields.
const TYPE_CURRENT
Current account.
setCategories($categories)
Sets object to supplied categories.
countAccountToReconcile()
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
verif()
Return if an account has valid information for Direct debit payment.
getFieldsToShow($includeibanbic=0)
Returns the fields in order that this bank account should show to the user Will return an array with ...
load_board(User $user, $filteraccountid=0)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
get_url($fk_bank=0, $url_id=0, $type='')
TODO Move this into AccountLine Return array with links from llx_bank_url.
addline($date, $oper, $label, $amount, $num_chq, $categorie, User $user, $emetteur='', $banque='', $accountancycode='', $datev=null, $num_releve='', $amount_main_currency=null)
Add an entry into table ".MAIN_DB_PREFIX."bank.
LibStatut($status, $mode=0)
Return label of given object status.
Class to manage bank transaction lines.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
setErrorsFromObject($object)
setErrorsFromObject
getFullAddress($withcountry=0, $sep="\n", $withregion=0, $extralangcode='')
Return full address of contact.
deleteExtraFields()
Delete all extra fields values for the current object.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Dolibarr database access.
Class to manage generation of HTML components Only common components must be here.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
table table fiche title col title div col center btnTitle icon
Automatically calls the icon named with the corresponding "object_" prefix.
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:137
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e rowid
Definition invoice.php:2010