diff --git a/.gitignore b/.gitignore index 3ec764dec5b..b5fd3da5961 100755 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ doxygen_warnings.log .DS_Store .idea *.iml +Thumbs.db + diff --git a/dev/initdata/mysqldump_dolibarr_3.5.0.sql b/dev/initdata/mysqldump_dolibarr_3.5.0.sql index 6cebad53c22..990b6b984b9 100644 --- a/dev/initdata/mysqldump_dolibarr_3.5.0.sql +++ b/dev/initdata/mysqldump_dolibarr_3.5.0.sql @@ -6511,6 +6511,7 @@ CREATE TABLE `llx_societe_rib` ( `domiciliation` varchar(255) DEFAULT NULL, `proprio` varchar(60) DEFAULT NULL, `owner_address` text, + `default_rib` tinyint NOT NULL DEFAULT 0, `import_key` varchar(14) DEFAULT NULL, PRIMARY KEY (`rowid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 39cc96a9f32..bff890a09b7 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -40,6 +40,7 @@ class Contact extends CommonObject protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe var $id; + var $ref_ext; var $civilite_id; // In fact we store civility_code var $lastname; var $firstname; @@ -64,9 +65,13 @@ class Contact extends CommonObject var $code; var $email; var $skype; + var $jabberid; var $phone_pro; var $phone_perso; var $phone_mobile; + var $fax; + + var $priv; var $birthday; var $default_lang; diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 97ecce50a15..c578e5d9786 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -174,7 +174,7 @@ class FormFile $out .= ''; $out .= ''; $out .= $langs->trans("Link") . ': '; - $out .= ''; + $out .= ''; $out .= '   ' . $langs->trans("Label") . ': '; $out .= ''; $out .= ''; @@ -1063,6 +1063,9 @@ class FormFile // Show list of associated links print_titre($langs->trans("LinkedFiles")); + + print '
'; + print ''; print ''; print_liste_field_titre( @@ -1076,7 +1079,7 @@ class FormFile $sortorder ); print_liste_field_titre( - $langs->trans("Size"), + "", "", "", "", @@ -1104,30 +1107,30 @@ class FormFile print_liste_field_titre('','',''); print ''; $nboflinks = count($links); - if ($nboflinks > 0) { - include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; - } + if ($nboflinks > 0) include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; $var = true; - foreach ($links as $link) { + foreach ($links as $link) + { $var =! $var; print ''; //edit mode - if ($action == 'update' && $selected === $link->id) { - print ''; + if ($action == 'update' && $selected === $link->id) + { + print ''; print ''; print ''; print ''; print ''; - print ''; + print ''; + print ''; } else { print '\n"; } - if ($nboflinks == 0) { + if ($nboflinks == 0) + { print ''; } print "
'; + print ''; print ''; print ''; - print ''; - print $langs->trans('Link') . ': '; + print $langs->trans('Link') . ': '; print ''; - print $langs->trans('Label') . ': '; + print $langs->trans('Label') . ': '; print '' . dol_print_date(dol_now(), "dayhour", "tzuser") . ''; - print ''; @@ -1142,7 +1145,7 @@ class FormFile print '' . img_edit().''; if ($permtodelete) { - print 'id . '&id=' . $object->id . '" class="deletefilelink" >' . img_delete() . ''; } else { print ' '; @@ -1151,13 +1154,16 @@ class FormFile } print "
'; print $langs->trans("NoLinkFound"); print '
"; + print ''; + return $nboflinks; } diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index 4727044ba45..22b90ef52e0 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -442,7 +442,7 @@ function isValidUrl($url,$http=0,$pass=0,$port=0,$path=0,$query=0,$anchor=0) * Clean an url string * * @param string $url Url - * @param string $http 1: keep http://, 0: remove also http:// + * @param string $http 1 = keep both http:// and https://, 0: remove http:// but not https:// * @return string Cleaned url */ function clean_url($url,$http=1) diff --git a/htdocs/core/tpl/document_actions_post_headers.tpl.php b/htdocs/core/tpl/document_actions_post_headers.tpl.php index 201355e60fe..5e06b585b57 100644 --- a/htdocs/core/tpl/document_actions_post_headers.tpl.php +++ b/htdocs/core/tpl/document_actions_post_headers.tpl.php @@ -20,22 +20,24 @@ /* * Confirm suppression */ -if ($action == 'delete') { - $ret = $form->form_confirm( - $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&urlfile=' . urlencode(GETPOST("urlfile")) . '&linkid=' . GETPOST('linkid', 'int'), - $langs->trans('DeleteFile'), - $langs->trans('ConfirmDeleteFile'), - 'confirm_deletefile', - '', - 0, - 1 - ); - if ($ret == 'html') print '
'; + +if ($action == 'delete') +{ + $ret = $form->form_confirm( + $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&urlfile=' . urlencode(GETPOST("urlfile")) . '&linkid=' . GETPOST('linkid', 'int'), + $langs->trans('DeleteFile'), + $langs->trans('ConfirmDeleteFile'), + 'confirm_deletefile', + '', + 0, + 1 + ); + if ($ret == 'html') print '
'; } $formfile=new FormFile($db); -// Show upload form +// Show upload form (document and links) $formfile->form_attach_new_file( $_SERVER["PHP_SELF"].'?id='.$object->id, '', diff --git a/htdocs/core/tpl/document_actions_pre_headers.tpl.php b/htdocs/core/tpl/document_actions_pre_headers.tpl.php index 18b7c18c4a5..96344944666 100644 --- a/htdocs/core/tpl/document_actions_pre_headers.tpl.php +++ b/htdocs/core/tpl/document_actions_pre_headers.tpl.php @@ -25,7 +25,8 @@ if (GETPOST('sendit') && ! empty($conf->global->MAIN_UPLOAD_DOC)) { } elseif (GETPOST('linkit') && ! empty($conf->global->MAIN_UPLOAD_DOC)) { if ($object->id) { $link = GETPOST('link', 'alpha'); - if ($link) { + if ($link) + { if (substr($link, 0, 7) != 'http://' && substr($link, 0, 8) != 'https://') { $link = 'http://' . $link; } @@ -36,11 +37,14 @@ if (GETPOST('sendit') && ! empty($conf->global->MAIN_UPLOAD_DOC)) { // Delete file/link -if ($action == 'confirm_deletefile' && $confirm == 'yes') { - if ($object->id) { +if ($action == 'confirm_deletefile' && $confirm == 'yes') +{ + if ($object->id) + { $urlfile = GETPOST('urlfile', 'alpha'); $linkid = GETPOST('linkid', 'int'); - if ($urlfile) { + if ($urlfile) + { $file = $upload_dir . "/" . $urlfile; // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP). $ret = dol_delete_file($file, 0, 0, 0, $object); @@ -49,7 +53,9 @@ if ($action == 'confirm_deletefile' && $confirm == 'yes') { } else { setEventMessage($langs->trans("ErrorFailToDeleteFile", $urlfile), 'errors'); } - } elseif ($linkid) { + } + elseif ($linkid) + { require_once DOL_DOCUMENT_ROOT . '/link/class/link.class.php'; $link = new Link($db); $link->id = $linkid; @@ -65,23 +71,30 @@ if ($action == 'confirm_deletefile' && $confirm == 'yes') { header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id); exit; } -} elseif ($action == 'confirm_updateline' && GETPOST('save') && GETPOST('link', 'alpha')) { +} +elseif ($action == 'confirm_updateline' && GETPOST('save') && GETPOST('link', 'alpha')) +{ require_once DOL_DOCUMENT_ROOT . '/link/class/link.class.php'; $langs->load('link'); $link = new Link($db); $link->id = GETPOST('linkid', 'int'); $f = $link->fetch(); - if ($f) { + if ($f) + { $link->url = GETPOST('link', 'alpha'); - if (substr($link->url, 0, 7) != 'http://' && substr($link->url, 0, 8) != 'https://') { + if (substr($link->url, 0, 7) != 'http://' && substr($link->url, 0, 8) != 'https://') + { $link->url = 'http://' . $link->url; } $link->label = GETPOST('label', 'alpha'); $res = $link->update($user); - if (!$res) { + if (!$res) + { setEventMessage($langs->trans("ErrorFailedToUpdateLink", $link->label)); } - } else { + } + else + { //error fetching } } diff --git a/htdocs/install/mysql/migration/3.4.0-3.5.0.sql b/htdocs/install/mysql/migration/3.4.0-3.5.0.sql index 4b1a16d532d..5fbd3dcc3f4 100755 --- a/htdocs/install/mysql/migration/3.4.0-3.5.0.sql +++ b/htdocs/install/mysql/migration/3.4.0-3.5.0.sql @@ -357,3 +357,7 @@ ALTER TABLE llx_user ADD skype VARCHAR(255) AFTER job; ALTER TABLE llx_socpeople ADD skype VARCHAR(255) AFTER jabberid; ALTER TABLE llx_societe ADD skype VARCHAR(255) AFTER email; ALTER TABLE llx_adherent ADD skype VARCHAR(255) AFTER email; + +-- multi-rib +ALTER TABLE llx_societe_rib ADD default_rib TINYINT NOT NULL DEFAULT 0 AFTER owner_address; +UPDATE llx_societe_rib SET default_rib = 1; diff --git a/htdocs/install/mysql/tables/llx_societe_rib.sql b/htdocs/install/mysql/tables/llx_societe_rib.sql index a526d5b82d7..d928da868ed 100644 --- a/htdocs/install/mysql/tables/llx_societe_rib.sql +++ b/htdocs/install/mysql/tables/llx_societe_rib.sql @@ -2,6 +2,7 @@ -- Copyright (C) 2000-2004 Rodolphe Quiedeville -- Copyright (C) 2005-2009 Regis Houssin -- Copyright (C) 2012 Juanjo Menent +-- Copyright (C) 2013 Peter Fontaine -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by @@ -35,6 +36,7 @@ create table llx_societe_rib domiciliation varchar(255), proprio varchar(60), owner_address varchar(255), + default_rib tinyint NOT NULL DEFAULT 0, import_key varchar(14) -- import key diff --git a/htdocs/langs/en_US/banks.lang b/htdocs/langs/en_US/banks.lang index 4d504db9794..3503ff11e62 100644 --- a/htdocs/langs/en_US/banks.lang +++ b/htdocs/langs/en_US/banks.lang @@ -149,4 +149,8 @@ InputReceiptNumber=Choose the bank statement related with the conciliation. Use EventualyAddCategory=Eventually, specify a category in which to classify the records ToConciliate=To conciliate? ThenCheckLinesAndConciliate=Then, check the lines present in the bank statement and click -BankDashboard=Bank accounts summary \ No newline at end of file +BankDashboard=Bank accounts summary +DefaultRIB=Default BAN +AllRIB=All BAN +LabelRIB=BAN Label +NoBANRecord=No BAN record diff --git a/htdocs/langs/en_US/suppliers.lang b/htdocs/langs/en_US/suppliers.lang index 83a8e067d84..3561fd3e57e 100644 --- a/htdocs/langs/en_US/suppliers.lang +++ b/htdocs/langs/en_US/suppliers.lang @@ -12,6 +12,8 @@ OrderDate=Order date BuyingPrice=Buying price BuyingPriceMin=Minimum buying price BuyingPriceMinShort=Min buying price +TotalBuyingPriceMin=Total of subproducts buying prices +SomeSubProductHaveNoPrices=Some sub-products have no price defined AddSupplierPrice=Add supplier price ChangeSupplierPrice=Change supplier price ErrorQtyTooLowForThisSupplier=Quantity too low for this supplier or no price defined on this product for this supplier diff --git a/htdocs/langs/fr_FR/banks.lang b/htdocs/langs/fr_FR/banks.lang index 2105cce24e1..29440edd862 100644 --- a/htdocs/langs/fr_FR/banks.lang +++ b/htdocs/langs/fr_FR/banks.lang @@ -150,3 +150,7 @@ EventualyAddCategory=Eventuellement, saisissez une catégorie dans laquelle clas ToConciliate=A rapprocher ? ThenCheckLinesAndConciliate=Ensuite, cochez les lignes présentes sur le relevé et cliquez sur BankDashboard=Synthèse comptes bancaires +DefaultRIB=RIB par défaut +AllRIB=Tous les RIB +LabelRIB=Nom du RIB +NoBANRecord=Aucun RIB enregistré diff --git a/htdocs/langs/fr_FR/suppliers.lang b/htdocs/langs/fr_FR/suppliers.lang index 4e0514987f2..8e0f3475db4 100644 --- a/htdocs/langs/fr_FR/suppliers.lang +++ b/htdocs/langs/fr_FR/suppliers.lang @@ -12,6 +12,8 @@ OrderDate=Date de commande BuyingPrice=Prix d'achat BuyingPriceMin=Prix d'achat minimum BuyingPriceMinShort=Prix achat min. +TotalBuyingPriceMin=Total des prix d'achats des sous-produits +SomeSubProductHaveNoPrices=Certains sous-produits n'ont pas de prix définis AddSupplierPrice=Ajouter prix fournisseur ChangeSupplierPrice=Modifier prix fournisseur ErrorQtyTooLowForThisSupplier=Quantité trop basse pour ce fournisseur ou prix de ce produit non défini pour ce fournisseur diff --git a/htdocs/link/class/link.class.php b/htdocs/link/class/link.class.php index fb924eeec9d..0bb57c52cf6 100644 --- a/htdocs/link/class/link.class.php +++ b/htdocs/link/class/link.class.php @@ -154,22 +154,22 @@ class Link extends CommonObject { global $langs,$conf; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + $langs->load("errors"); $error=0; dol_syslog(get_class($this)."::Update id = " . $this->id . " call_trigger = " . $call_trigger); // Check parameters - if (empty($this->url)) { + if (empty($this->url)) + { $this->error = $langs->trans("NoURL"); return -1; } // Clean parameters - $this->url = clean_url($this->url,0); - if(empty($this->label)) { - $this->label = basename($this->url); - } + $this->url = clean_url($this->url,1); + if (empty($this->label)) $this->label = basename($this->url); $this->label = trim($this->label); @@ -189,7 +189,8 @@ class Link extends CommonObject $resql = $this->db->query($sql); if ($resql) { - if ($call_trigger) { + if ($call_trigger) + { // Appel des triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface = new Interfaces($this->db); @@ -201,7 +202,8 @@ class Link extends CommonObject // Fin appel triggers } - if (! $error) { + if (! $error) + { dol_syslog(get_class($this) . "::Update success"); $this->db->commit(); return 1; @@ -209,14 +211,19 @@ class Link extends CommonObject $this->db->rollback(); return -1; } - } else { - if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { + } + else + { + if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') + { // Doublon $this->error = $langs->trans("ErrorDuplicateField"); $result = -1; - } else { + } + else + { $this->error = $langs->trans("Error sql = " . $sql); - dol_syslog(get_class($this) . "::Update fails update sql = " . $sql, LOG_ERR); + dol_syslog(get_class($this) . "::Update fails update = " . $this->error, LOG_ERR); $result = -2; } $this->db->rollback(); diff --git a/htdocs/product/composition/fiche.php b/htdocs/product/composition/fiche.php index f94f831cc63..fac6402e300 100644 --- a/htdocs/product/composition/fiche.php +++ b/htdocs/product/composition/fiche.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2014 Laurent Destailleur + * Copyright (C) 2004-2013 Laurent Destailleur * Copyright (C) 2005 Eric Seigne * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2006 Andre Cianfarani @@ -71,7 +71,7 @@ $cancel <> $langs->trans("Cancel") && ($user->rights->produit->creer || $user->rights->service->creer)) { $error=0; - for($i=0;$i<$_POST["max_prod"];$i++) + for ($i=0; $i<$_POST["max_prod"]; $i++) { if ($_POST["prod_id_chk".$i] > 0) { @@ -289,7 +289,7 @@ if ($id > 0 || ! empty($ref)) print ''; if (empty($conf->global->PRODUIT_MULTIPRICES)) - { + { // Price print ''.$langs->trans("SellingPrice").''; if ($object->price_base_type == 'TTC') @@ -301,7 +301,7 @@ if ($id > 0 || ! empty($ref)) print price($object->price).' '.$langs->trans($object->price_base_type); } print ''; - + // Price minimum print ''.$langs->trans("MinPrice").''; if ($object->price_base_type == 'TTC') @@ -328,6 +328,7 @@ if ($id > 0 || ! empty($ref)) // List of subproducts if (count($prods_arbo) > 0) { + $atleastonenotdefined=0; print ''; print $langs->trans("ProductAssociationList").'
'; print ''; @@ -341,19 +342,20 @@ if ($id > 0 || ! empty($ref)) print ''; if ($value['level'] <= 1) { + $notdefined=0; $productstatic->ref=$value['fullpath']; - print ''; + print ''; print ''; $totalline=price2num($value['nb'] * $product_fourn->fourn_unitprice, 'MT'); $total+=$totalline; - print ''; + print ''; if (! empty($conf->stock->enabled)) print ''; // Real stock } else { @@ -361,18 +363,20 @@ if ($id > 0 || ! empty($ref)) print ''; - print ''; + print ''; // Real stock } print ''; } - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; if (! empty($conf->stock->enabled)) print ''; print ''; print '
'.$productstatic->getNomUrl(1,'composition').' ('.$value['nb'].')  '.$productstatic->getNomUrl(1,'composition').' ('.$value['nb'].')'; if ($product_fourn->find_min_price_product_fournisseur($productstatic->id, $value['nb']) > 0) { print $langs->trans("BuyingPriceMinShort").': '; if ($product_fourn->product_fourn_price_id > 0) print $product_fourn->display_price_product_fournisseur(0,0); - else print $langs->trans("NotDefined"); + else { print $langs->trans("NotDefined"); $notdefined++; $atleastonenotdefined++; } } print ''.price($totalline,'','',0,0,-1,$conf->currency).''.($notdefined?'':price($totalline,'','',0,0,-1,$conf->currency)).''.$langs->trans("Stock").': '.$value['stock'].''; for ($i=0; $i < $value['level']; $i++) { - print '       '; + print '     '; } - print $productstatic->getNomUrl(1,'composition').' ('.$value['nb'].')  '; - print ''; + print $productstatic->getNomUrl(1,'composition').' ('.$value['nb'].')'; + print ''; if (! empty($conf->stock->enabled)) print '
'.$langs->trans("BuyingPriceMin").': '.price($total,'','',0,0,-1,$conf->currency).'
'.$langs->trans("TotalBuyingPriceMin").': '; + if ($atleastonenotdefined) print $langs->trans("Unknown").' ('.$langs->trans("SomeSubProductHaveNoPrices").')'; + print ''.($atleastonenotdefined?'':price($total,'','',0,0,-1,$conf->currency)).' 
'; @@ -544,26 +548,6 @@ if ($id > 0 || ! empty($ref)) } - -/* ************************************************************************** */ -/* */ -/* Barre d'action */ -/* */ -/* ************************************************************************** */ -/* -print "\n
\n"; - -if ($action == '') -{ - if ($user->rights->produit->creer || $user->rights->service->creer) - { - print ''.$langs->trans("EditAssociate").''; - } -} - -print "\n
\n"; -*/ - llxFooter(); $db->close(); diff --git a/htdocs/societe/class/companybankaccount.class.php b/htdocs/societe/class/companybankaccount.class.php index ce637588d8a..1cc32d1ff50 100644 --- a/htdocs/societe/class/companybankaccount.class.php +++ b/htdocs/societe/class/companybankaccount.class.php @@ -2,6 +2,7 @@ /* Copyright (C) 2004 Rodolphe Quiedeville * Copyright (C) 2010 Laurent Destailleur * Copyright (C) 2012 Regis Houssin + * Copyright (C) 2013 Peter Fontaine * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,6 +35,7 @@ class CompanyBankAccount extends Account var $rowid; var $socid; + var $label; var $bank; var $courant; var $clos; @@ -46,6 +48,7 @@ class CompanyBankAccount extends Account var $iban_prefix; // deprecated var $proprio; var $owner_address; + var $default_rib; /** * Constructor @@ -60,6 +63,7 @@ class CompanyBankAccount extends Account $this->clos = 0; $this->solde = 0; $this->error_number = 0; + $this->default_rib = 0; return 1; } @@ -79,6 +83,8 @@ class CompanyBankAccount extends Account { if ($this->db->affected_rows($resql)) { + $this->default_rib = 1; + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."societe_rib"); return 1; } } @@ -97,21 +103,25 @@ class CompanyBankAccount extends Account */ function update($user='') { - $sql = "SELECT fk_soc FROM ".MAIN_DB_PREFIX."societe_rib"; - $sql .= " WHERE fk_soc = ".$this->socid; +// $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe_rib"; +// $sql .= " WHERE rowid = ".$this->id; +// +// $result = $this->db->query($sql); +// if ($result) +// { +// if ($this->db->num_rows($result) == 0) +// { +// $this->create(); +// } +// } +// else +// { +// dol_print_error($this->db); +// return 0; +// } - $result = $this->db->query($sql); - if ($result) - { - if ($this->db->num_rows($result) == 0) - { - $this->create(); - } - } - else - { - dol_print_error($this->db); - return 0; + if (!$this->id) { + $this->create(); } $sql = "UPDATE ".MAIN_DB_PREFIX."societe_rib SET "; @@ -125,7 +135,12 @@ class CompanyBankAccount extends Account $sql .= ",domiciliation='".$this->db->escape($this->domiciliation)."'"; $sql .= ",proprio = '".$this->db->escape($this->proprio)."'"; $sql .= ",owner_address = '".$this->db->escape($this->owner_address)."'"; - $sql .= " WHERE fk_soc = ".$this->socid; + $sql .= ",default_rib = ".$this->default_rib; + if (trim($this->label) != '') + $sql .= ",label = '".$this->db->escape($this->label)."'"; + else + $sql .= ",label = NULL"; + $sql .= " WHERE rowid = ".$this->id; $result = $this->db->query($sql); if ($result) @@ -150,10 +165,10 @@ class CompanyBankAccount extends Account { if (empty($id) && empty($socid)) return -1; - $sql = "SELECT rowid, fk_soc, bank, number, code_banque, code_guichet, cle_rib, bic, iban_prefix as iban, domiciliation, proprio, owner_address"; + $sql = "SELECT rowid, fk_soc, bank, number, code_banque, code_guichet, cle_rib, bic, iban_prefix as iban, domiciliation, proprio, owner_address, default_rib, label"; $sql.= " FROM ".MAIN_DB_PREFIX."societe_rib"; if ($id) $sql.= " WHERE rowid = ".$id; - if ($socid) $sql.= " WHERE fk_soc = ".$socid; + if ($socid) $sql.= " WHERE fk_soc = ".$socid." AND default_rib = 1"; $resql = $this->db->query($sql); if ($resql) @@ -175,6 +190,8 @@ class CompanyBankAccount extends Account $this->domiciliation = $obj->domiciliation; $this->proprio = $obj->proprio; $this->owner_address = $obj->owner_address; + $this->label = $obj->label; + $this->default_rib = $obj->default_rib; } $this->db->free($resql); @@ -190,15 +207,18 @@ class CompanyBankAccount extends Account /** * Return RIB * + * @param boolean $displayriblabel Show or Hide Label * @return string RIB */ - function getRibLabel() + function getRibLabel($displayriblabel = true) { global $langs; - + if ($this->code_banque || $this->code_guichet || $this->number || $this->cle_rib) { - $rib = $this->code_banque." ".$this->code_guichet." ".$this->number; + if ($this->label && $displayriblabel) + $rib = $this->label." : "; + $rib.= $this->code_banque." ".$this->code_guichet." ".$this->number; $rib.=($this->cle_rib?" (".$this->cle_rib.")":""); } else @@ -208,6 +228,53 @@ class CompanyBankAccount extends Account return $rib; } + + /** + * Set RIB as Default + * + * @param int $id RIB id + * @return int 0 if KO, 1 if OK + */ + function setAsDefault($id) + { + if ($id) { + $sql1 = "SELECT fk_soc FROM ".MAIN_DB_PREFIX."societe_rib"; + $sql1.= " WHERE rowid = ".$id; + + $result1 = $this->db->query($sql1); + if ($result1) { + if ($this->db->num_rows($result1) == 0) { + return 0; + } else { + $obj = $this->db->fetch_object($result1); + $sql2 = "UPDATE ".MAIN_DB_PREFIX."societe_rib SET default_rib = 0 "; + $sql2.= "WHERE fk_soc = ".$obj->fk_soc; + + $sql3 = "UPDATE ".MAIN_DB_PREFIX."societe_rib SET default_rib = 1 "; + $sql3.= "WHERE rowid = ".$id; + + $this->db->begin(); + + $result2 = $this->db->query($sql2); + $result3 = $this->db->query($sql3); + + if (!$result2 || !$result3) { + dol_print_error($this->db); + $this->db->rollback(); + return 0; + } else { + $this->db->commit(); + return 1; + } + } + } else { + dol_print_error($this->db); + return 0; + } + } else { + return 0; + } + } } ?> diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 3ed53f2692e..3b902be93f7 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -8,7 +8,8 @@ * Copyright (C) 2008 Patrick Raguin * Copyright (C) 2010-2011 Juanjo Menent * Copyright (C) 2013 Florian Henry - * Copyright (C) 2013 Alexandre Spangaro + * Copyright (C) 2013 Alexandre Spangaro + * Copyright (C) 2013 Peter Fontaine * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1753,6 +1754,34 @@ class Societe extends CommonObject return $bac->getRibLabel(); } + /** + * Return Array of RIB + * + * @return array|int 0 if KO, Array of CompanyBanckAccount if OK + */ + function get_all_rib() + { + require_once DOL_DOCUMENT_ROOT . '/societe/class/companybankaccount.class.php'; + $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe_rib WHERE fk_soc = ".$this->id; + $result = $this->db->query($sql); + if (!$result) { + $this->error++; + $this->errors[] = $this->db->lasterror; + return 0; + } else { + $num_rows = $this->db->num_rows($result); + $rib_array = array(); + if ($num_rows) { + while ($obj = $this->db->fetch_object($result)) { + $rib = new CompanyBankAccount($this->db); + $rib->fetch($obj->rowid); + $rib_array[] = $rib; + } + } + return $rib_array; + } + } + /** * Attribut un code client a partir du module de controle des codes. * Return value is stored into this->code_client diff --git a/htdocs/societe/rib.php b/htdocs/societe/rib.php index e85845c6a59..b3432d105a8 100644 --- a/htdocs/societe/rib.php +++ b/htdocs/societe/rib.php @@ -3,6 +3,7 @@ * Copyright (C) 2003 Jean-Louis Bergamo * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin + * Copyright (C) 2013 Peter Fontaine * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -52,6 +53,8 @@ if ($_POST["action"] == 'update' && ! $_POST["cancel"]) // Modification $account = new CompanyBankAccount($db); + $account->fetch($_POST["id"]); + $account->socid = $soc->id; $account->bank = $_POST["bank"]; @@ -76,11 +79,59 @@ if ($_POST["action"] == 'update' && ! $_POST["cancel"]) } else { - $_GET["id"]=$_POST["id"]; // Force chargement page en mode visu + $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$soc->id; + header('Location: '.$url); + exit; } } +if ($_POST["action"] == 'add' && ! $_POST["cancel"]) +{ + // Ajout + $account = new CompanyBankAccount($db); + $account->socid = $soc->id; + + $account->bank = $_POST["bank"]; + $account->label = $_POST["label"]; + $account->courant = $_POST["courant"]; + $account->clos = $_POST["clos"]; + $account->code_banque = $_POST["code_banque"]; + $account->code_guichet = $_POST["code_guichet"]; + $account->number = $_POST["number"]; + $account->cle_rib = $_POST["cle_rib"]; + $account->bic = $_POST["bic"]; + $account->iban_prefix = $_POST["iban_prefix"]; + $account->domiciliation = $_POST["domiciliation"]; + $account->proprio = $_POST["proprio"]; + $account->owner_address = $_POST["owner_address"]; + + $result = $account->update($user); + if (! $result) + { + $message=$account->error; + $_GET["action"]='create'; // Force chargement page création + } + else + { + $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$soc->id; + header('Location: '.$url); + exit; + } +} + +if ($_GET['action'] == 'setasdefault') +{ + $account = new CompanyBankAccount($db); + $res = $account->setAsDefault($_GET['ribid']); + if ($res) { + $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$soc->id; + header('Location: '.$url); + exit; + } else { + $message=$db->lasterror; + } +} /* * View @@ -93,7 +144,10 @@ $head=societe_prepare_head2($soc); dol_fiche_head($head, 'rib', $langs->trans("ThirdParty"),0,'company'); $account = new CompanyBankAccount($db); -$account->fetch(0,$soc->id); +if (!$_GET['id']) + $account->fetch(0,$soc->id); +else + $account->fetch($_GET['id']); if (empty($account->socid)) $account->socid=$soc->id; @@ -104,10 +158,14 @@ if (empty($account->socid)) $account->socid=$soc->id; /* */ /* ************************************************************************** */ -if ($_GET["socid"] && $_GET["action"] != 'edit') +if ($_GET["socid"] && $_GET["action"] != 'edit' && $_GET["action"] != "create") { + print_titre($langs->trans("DefaultRIB")); print ''; + print ''; + print ''; + print ''; print ''; @@ -165,6 +223,54 @@ if ($_GET["socid"] && $_GET["action"] != 'edit') print '
'.$langs->trans("RIBControlError").'
'; } + print "
"; + + print_titre($langs->trans("AllRIB")); + + $rib_list = $soc->get_all_rib(); + $var = false; + if (is_array($rib_list)) { + print '
'.$langs->trans("LabelRIB").''.$account->label.'
'.$langs->trans("Bank").''.$account->bank.'
'; + + print ''; + print_liste_field_titre($langs->trans("LabelRIB")); + print_liste_field_titre($langs->trans("Bank")); + print_liste_field_titre($langs->trans("RIB")); + print_liste_field_titre($langs->trans("DefaultRIB")); + print ''; + print ''; + + foreach ($rib_list as $rib) { + print ""; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + $var = !$var; + } + + if (count($rib_list) == 0) { + print ''; + } + + print '
'.$rib->label.''.$rib->bank.''.$rib->getRibLabel(false).''; + if (!$rib->default_rib) { + print ''; + print img_picto($langs->trans("Disabled"),'switch_off'); + print ''; + } else { + print img_picto($langs->trans("Enabled"),'switch_on'); + } + print ''; + print ''; + print img_picto($langs->trans("Modify"),'edit'); + print ''; + print '
'.$langs->trans("NoBANRecord").'
'; + } else { + dol_print_error($db); + } } /* ************************************************************************** */ @@ -176,31 +282,34 @@ if ($_GET["socid"] && $_GET["action"] != 'edit') if ($_GET["socid"] && $_GET["action"] == 'edit' && $user->rights->societe->creer) { - $form = new Form($db); + $form = new Form($db); - dol_htmloutput_mesg($message); + dol_htmloutput_mesg($message); - print '
'; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; - print ''; + print '
'; - print ''; - print ''; + print ''; + print ''; - // BBAN - if ($account->useDetailedBBAN() == 1) - { - print ''; - print ''; - print ''; + print ''; + print ''; - print ''; - print ''; - print ''; - } + // BBAN + if ($account->useDetailedBBAN() == 1) + { + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + } if ($account->useDetailedBBAN() == 2) { print ''; @@ -208,52 +317,135 @@ if ($_GET["socid"] && $_GET["action"] == 'edit' && $user->rights->societe->creer print ''; } - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; - if ($account->useDetailedBBAN() == 1) - { - print ''; - print ''; - print ''; - } + if ($account->useDetailedBBAN() == 1) + { + print ''; + print ''; + print ''; + } - // IBAN - print ''; - print ''; + // IBAN + print ''; + print ''; - print ''; - print ''; + print ''; + print ''; - print '"; + print '"; - print ''; - print ''; - print "\n"; + print ''; + print ''; + print "\n"; - print '"; + print '"; - print '
'.$langs->trans("Bank").'
'.$langs->trans("LabelRIB").'
'.$langs->trans("BankCode").'
'.$langs->trans("Bank").'
'.$langs->trans("DeskCode").'
'.$langs->trans("BankCode").'
'.$langs->trans("DeskCode").'
'.$langs->trans("BankCode").'
'.$langs->trans("BankAccountNumber").'
'.$langs->trans("BankAccountNumber").'
'.$langs->trans("BankAccountNumberKey").'
'.$langs->trans("BankAccountNumberKey").'
'.$langs->trans("IBAN").'
'.$langs->trans("IBAN").'
'.$langs->trans("BIC").'
'.$langs->trans("BIC").'
'.$langs->trans("BankAccountDomiciliation").''; - print "
'.$langs->trans("BankAccountDomiciliation").''; + print "
'.$langs->trans("BankAccountOwner").'
'.$langs->trans("BankAccountOwner").'
'.$langs->trans("BankAccountOwnerAddress").''; - print "
'.$langs->trans("BankAccountOwnerAddress").''; + print "

'; + print '
'; - print '
'; - print '   '; - print '
'; + print '
'; + print '   '; + print '
'; - print '
'; + print ''; +} + + +/* ************************************************************************** */ +/* */ +/* Création */ +/* */ +/* ************************************************************************** */ + +if ($_GET["socid"] && $_GET["action"] == 'create' && $user->rights->societe->creer) +{ + + $form = new Form($db); + + dol_htmloutput_mesg($message); + + print '
'; + print ''; + print ''; + print ''; + + + print ''; + print ''; + + print ''; + print ''; + + // BBAN + if ($account->useDetailedBBAN() == 1) + { + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + } + if ($account->useDetailedBBAN() == 2) + { + print ''; + print ''; + print ''; + } + + print ''; + print ''; + print ''; + + if ($account->useDetailedBBAN() == 1) + { + print ''; + print ''; + print ''; + } + + // IBAN + print ''; + print ''; + + print ''; + print ''; + + print '"; + + print ''; + print ''; + print "\n"; + + print '"; + + print '
'.$langs->trans("LabelRIB").'
'.$langs->trans("Bank").'
'.$langs->trans("BankCode").'
'.$langs->trans("DeskCode").'
'.$langs->trans("BankCode").'
'.$langs->trans("BankAccountNumber").'
'.$langs->trans("BankAccountNumberKey").'
'.$langs->trans("IBAN").'
'.$langs->trans("BIC").'
'.$langs->trans("BankAccountDomiciliation").''; + print "
'.$langs->trans("BankAccountOwner").'
'.$langs->trans("BankAccountOwnerAddress").''; + print "

'; + + print '
'; + print '   '; + print '
'; + + print '
'; } dol_fiche_end(); -if ($_GET["socid"] && $_GET["action"] != 'edit') +if ($_GET["socid"] && $_GET["action"] != 'edit' && $_GET["action"] != 'create') { /* * Barre d'actions @@ -262,7 +454,7 @@ if ($_GET["socid"] && $_GET["action"] != 'edit') if ($user->rights->societe->creer) { - print ''.$langs->trans("Modify").''; + print ''.$langs->trans("Add").''; } print ''; diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index 9001894c149..07610bb88ba 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -266,7 +266,7 @@ if (empty($reshook)) $contact->state_id = $object->state_id; $contact->country_id = $object->country_id; $contact->socid = $object->id; // fk_soc - $contact->status = 1; + $contact->statut = 1; $contact->email = $object->email; $contact->skype = $object->skype; $contact->phone_pro = $object->phone; diff --git a/test/phpunit/CompanyBankAccountTest.php b/test/phpunit/CompanyBankAccountTest.php index 4c954e4e8b7..c85bb8272b5 100644 --- a/test/phpunit/CompanyBankAccountTest.php +++ b/test/phpunit/CompanyBankAccountTest.php @@ -140,7 +140,7 @@ class CompanyBankAccountTest extends PHPUnit_Framework_TestCase * testCompanyBankAccountFetch * * @param int $id Id of bank account - * @return void + * @return Object Bank account object * * @depends testCompanyBankAccountCreate * The depends says test is run only if previous is ok @@ -161,6 +161,29 @@ class CompanyBankAccountTest extends PHPUnit_Framework_TestCase return $localobject; } + /** + * testCompanyBankAccountSetAsDefault + * + * @param Object $localobject Bank account + * @return int + * + * @depends testCompanyBankAccountFetch + */ + public function testCompanyBankAccountSetAsDefault($localobject) + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + $result=$localobject->setAsDefault($localobject->id); + + print __METHOD__." id=".$localobject->id." result=".$result."\n"; + $this->assertLessThan($result, 0); + return $localobject; + } + /** * testCompanyBankAccountUpdate *