diff --git a/htdocs/admin/agenda_other.php b/htdocs/admin/agenda_other.php index 76b3b06092578c5663ed39f86f404ff5eec53e61..2fe4f0a60371aa815e9c4c574904537f15b47cf9 100644 --- a/htdocs/admin/agenda_other.php +++ b/htdocs/admin/agenda_other.php @@ -147,7 +147,7 @@ else if ($action == 'specimen') // For orders // Activate a model else if ($action == 'setmodel') { - print "sssd".$value; + //print "sssd".$value; $ret = addDocumentModel($value, $type, $label, $scandir); } diff --git a/htdocs/admin/bank.php b/htdocs/admin/bank.php index bccae5bbfafa927deae546127215a48d73d39bb8..58d97842017e823520c052974868a28c52d18638 100644 --- a/htdocs/admin/bank.php +++ b/htdocs/admin/bank.php @@ -28,7 +28,8 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php'; $langs->load("admin"); $langs->load("companies"); @@ -40,6 +41,9 @@ if (!$user->admin) accessforbidden(); $action = GETPOST('action','alpha'); +$value = GETPOST('value','alpha'); +$label = GETPOST('label','alpha'); +$scandir = GETPOST('scandir','alpha'); $type = 'bankaccount'; @@ -66,15 +70,22 @@ if ($action == 'specimen') { $modele=GETPOST('module','alpha'); - $commande = new Commande($db); - $commande->initAsSpecimen(); + if ($modele == 'sepamandate') + { + $object = new CompanyBankAccount($db); + } + else + { + $object = new Account($db); + } + $object->initAsSpecimen(); // Search template files $file=''; $classname=''; $filefound=0; $dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']); foreach($dirmodels as $reldir) { - $file=dol_buildpath($reldir."core/modules/paymentorders/doc/pdf_".$modele.".modules.php",0); + $file=dol_buildpath($reldir."core/modules/bank/doc/pdf_".$modele.".modules.php",0); if (file_exists($file)) { $filefound=1; @@ -89,9 +100,9 @@ if ($action == 'specimen') $module = new $classname($db); - if ($module->write_file($commande,$langs) > 0) + if ($module->write_file($object,$langs) > 0) { - header("Location: ".DOL_URL_ROOT."/document.php?modulepart=paymentorders&file=SPECIMEN.pdf"); + header("Location: ".DOL_URL_ROOT."/document.php?modulepart=bank&file=SPECIMEN.pdf"); return; } else @@ -107,14 +118,28 @@ if ($action == 'specimen') } } +// Activate a model +if ($action == 'set') +{ + $ret = addDocumentModel($value, $type, $label, $scandir); +} + +else if ($action == 'del') +{ + $ret = delDocumentModel($value, $type); + if ($ret > 0) + { + if ($conf->global->BANKADDON_PDF == "$value") dolibarr_del_const($db, 'BANKADDON_PDF',$conf->entity); + } +} // Set default model else if ($action == 'setdoc') { - if (dolibarr_set_const($db, "PAYMENTORDER_ADDON_PDF",$value,'chaine',0,'',$conf->entity)) + if (dolibarr_set_const($db, "BANKADDON_PDF",$value,'chaine',0,'',$conf->entity)) { // The constant that was read before the new set // We therefore requires a variable to have a coherent view - $conf->global->PAYMENTORDER_ADDON_PDF = $value; + $conf->global->BANKADDON_PDF = $value; } // On active le modele @@ -213,6 +238,8 @@ print '<br><br>'; /* * Document templates generators */ +//if (! empty($conf->global->MAIN_FEATURES_LEVEL)) +//{ print load_fiche_titre($langs->trans("BankAccountModelModule"), '', ''); // Load array def with activated templates @@ -303,7 +330,7 @@ foreach ($dirmodels as $reldir) // Default print '<td align="center">'; - if ($conf->global->PAYMENTORDER_ADDON_PDF == $name) { + if ($conf->global->BANKADDON_PDF == $name) { print img_picto($langs->trans("Default"), 'on'); } else { print '<a href="' . $_SERVER["PHP_SELF"] . '?action=setdoc&value=' . $name . '&scandir=' . $module->scandir . '&label=' . urlencode($module->name) . '" alt="' . $langs->trans("Default") . '">' . img_picto($langs->trans("Disabled"), 'off') . '</a>'; @@ -318,12 +345,12 @@ foreach ($dirmodels as $reldir) } $htmltooltip .= '<br><br><u>' . $langs->trans("FeaturesSupported") . ':</u>'; $htmltooltip .= '<br>' . $langs->trans("Logo") . ': ' . yn($module->option_logo, 1, 1); - $htmltooltip .= '<br>' . $langs->trans("PaymentMode") . ': ' . yn($module->option_modereg, 1, 1); - $htmltooltip .= '<br>' . $langs->trans("PaymentConditions") . ': ' . yn($module->option_condreg, 1, 1); + //$htmltooltip .= '<br>' . $langs->trans("PaymentMode") . ': ' . yn($module->option_modereg, 1, 1); + //$htmltooltip .= '<br>' . $langs->trans("PaymentConditions") . ': ' . yn($module->option_condreg, 1, 1); $htmltooltip .= '<br>' . $langs->trans("MultiLanguage") . ': ' . yn($module->option_multilang, 1, 1); // $htmltooltip.='<br>'.$langs->trans("Discounts").': '.yn($module->option_escompte,1,1); // $htmltooltip.='<br>'.$langs->trans("CreditNote").': '.yn($module->option_credit_note,1,1); - $htmltooltip .= '<br>' . $langs->trans("WatermarkOnDraftOrders") . ': ' . yn($module->option_draft_watermark, 1, 1); + //$htmltooltip .= '<br>' . $langs->trans("WatermarkOnDraftOrders") . ': ' . yn($module->option_draft_watermark, 1, 1); print '<td align="center">'; print $form->textwithpicto('', $htmltooltip, 1, 0); @@ -347,8 +374,7 @@ foreach ($dirmodels as $reldir) } } } - - +//} dol_fiche_end(); diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 9cb9e130bab2695ad580b9e32678cfb85d2239e4..a26062e2bacc30d1220d80d8faf5eaacb858a8a2 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1450,8 +1450,9 @@ class Account extends CommonObject */ function initAsSpecimen() { + $this->specimen = 1; $this->ref = 'MBA'; - $this->label = 'My Bank account'; + $this->label = 'My Big Company Bank account'; $this->bank = 'MyBank'; $this->courant = Account::TYPE_CURRENT; $this->clos = Account::STATUS_OPEN; @@ -1461,7 +1462,7 @@ class Account extends CommonObject $this->cle_rib = 50; $this->bic = 'AA12'; $this->iban = 'FR999999999'; - $this->domiciliation = 'The bank addresse'; + $this->domiciliation = 'My bank address'; $this->proprio = 'Owner'; $this->owner_address = 'Owner address'; $this->country_id = 1; diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index cd14736632d3d7a3d23576e8b1a393f54316e991..5bc0941966652a6c0081852b9e455a359a4baf6c 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1525,7 +1525,8 @@ class BonPrelevement extends CommonObject */ static function buildRumNumber($row_code_client, $row_datec, $row_drum) { - $pre = ($row_datec > 1359673200) ? 'RUM-' : '++R'; + global $langs; + $pre = ($row_datec > 1359673200) ? $langs->trans('RUM').'-' : '++R'; return $pre.$row_code_client.'-'.$row_drum.'-'.date('U', $row_datec); } diff --git a/htdocs/core/modules/bank/doc/pdf_ban.modules.php b/htdocs/core/modules/bank/doc/pdf_ban.modules.php new file mode 100644 index 0000000000000000000000000000000000000000..a496e303fa63badc333a6273f50feefc2e12e397 --- /dev/null +++ b/htdocs/core/modules/bank/doc/pdf_ban.modules.php @@ -0,0 +1,472 @@ +<?php +/* Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net> + * + * 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 + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/bank/doc/pdf_ban.modules.php + * \ingroup bank + * \brief File of class to generate document with template ban + */ + +require_once DOL_DOCUMENT_ROOT.'/core/modules/bank/modules_bank.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; + + +/** + * Classe permettant de generer les projets au modele Ban + */ + +class pdf_ban extends ModeleBankAccountDoc +{ + var $emetteur; // Objet societe qui emet + var $version = 'development'; + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + global $conf,$langs,$mysoc; + + $langs->load("main"); + $langs->load("bank"); + $langs->load("withdrawals"); + $langs->load("companies"); + + $this->db = $db; + $this->name = "ban"; + $this->description = $langs->trans("DocumentModelBan").' (Volunteer wanted to finish)'; + + // Dimension page pour format A4 + $this->type = 'pdf'; + $formatarray=pdf_getFormat(); + $this->page_largeur = $formatarray['width']; + $this->page_hauteur = $formatarray['height']; + $this->format = array($this->page_largeur,$this->page_hauteur); + $this->marge_gauche=isset($conf->global->MAIN_PDF_MARGIN_LEFT)?$conf->global->MAIN_PDF_MARGIN_LEFT:10; + $this->marge_droite=isset($conf->global->MAIN_PDF_MARGIN_RIGHT)?$conf->global->MAIN_PDF_MARGIN_RIGHT:10; + $this->marge_haute =isset($conf->global->MAIN_PDF_MARGIN_TOP)?$conf->global->MAIN_PDF_MARGIN_TOP:10; + $this->marge_basse =isset($conf->global->MAIN_PDF_MARGIN_BOTTOM)?$conf->global->MAIN_PDF_MARGIN_BOTTOM:10; + + $this->option_logo = 1; // Affiche logo FAC_PDF_LOGO + $this->option_tva = 1; // Gere option tva FACTURE_TVAOPTION + $this->option_codeproduitservice = 1; // Affiche code produit-service + + // Recupere emmetteur + $this->emetteur=$mysoc; + if (! $this->emetteur->country_code) $this->emetteur->country_code=substr($langs->defaultlang,-2); // By default if not defined + + // Defini position des colonnes + $this->posxref=$this->marge_gauche+1; + $this->posxlabel=$this->marge_gauche+25; + $this->posxworkload=$this->marge_gauche+100; + $this->posxprogress=$this->marge_gauche+130; + $this->posxdatestart=$this->marge_gauche+150; + $this->posxdateend=$this->marge_gauche+170; + } + + + /** + * Fonction generant le projet sur le disque + * + * @param Project $object Object project a generer + * @param Translate $outputlangs Lang output object + * @return int 1 if OK, <=0 if KO + */ + function write_file($object,$outputlangs) + { + global $conf, $hookmanager, $langs, $user; + + if (! is_object($outputlangs)) $outputlangs=$langs; + // For backward compatibility with FPDF, force output charset to ISO, because FPDF expect text to be encoded in ISO + if (! empty($conf->global->MAIN_USE_FPDF)) $outputlangs->charset_output='ISO-8859-1'; + + $outputlangs->load("main"); + $outputlangs->load("dict"); + $outputlangs->load("companies"); + $outputlangs->load("projects"); + + if ($conf->bank->dir_output) + { + //$nblignes = count($object->lines); // This is set later with array of tasks + + // Definition of $dir and $file + if ($object->specimen) + { + $dir = $conf->bank->dir_output; + $file = $dir . "/SPECIMEN.pdf"; + } + else + { + $objectref = dol_sanitizeFileName($object->ref); + $dir = $conf->bank->dir_output . "/" . $objectref; + $file = $dir . "/" . $objectref . ".pdf"; + } + + if (! file_exists($dir)) + { + if (dol_mkdir($dir) < 0) + { + $this->error=$langs->transnoentities("ErrorCanNotCreateDir",$dir); + return 0; + } + } + + if (file_exists($dir)) + { + // Add pdfgeneration hook + if (! is_object($hookmanager)) + { + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager=new HookManager($this->db); + } + $hookmanager->initHooks(array('pdfgeneration')); + $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs); + global $action; + $reshook=$hookmanager->executeHooks('beforePDFCreation',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks + + $pdf=pdf_getInstance($this->format); + $default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance + $heightforinfotot = 50; // Height reserved to output the info and total part + $heightforfreetext= (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT)?$conf->global->MAIN_PDF_FREETEXT_HEIGHT:5); // Height reserved to output the free text on last page + $heightforfooter = $this->marge_basse + 8; // Height reserved to output the footer (value include bottom margin) + $pdf->SetAutoPageBreak(1,0); + + if (class_exists('TCPDF')) + { + $pdf->setPrintHeader(false); + $pdf->setPrintFooter(false); + } + $pdf->SetFont(pdf_getPDFFont($outputlangs)); + + $pdf->Open(); + $pagenb=0; + $pdf->SetDrawColor(128,128,128); + + $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref)); + $pdf->SetSubject($outputlangs->transnoentities("BAN")); + $pdf->SetCreator("Dolibarr ".DOL_VERSION); + $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs))); + $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("BAN")); + if (! empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) $pdf->SetCompression(false); + + $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right + + // New page + $pdf->AddPage(); + $pagenb++; + $this->_pagehead($pdf, $object, 1, $outputlangs); + $pdf->SetFont('','', $default_font_size - 1); + $pdf->MultiCell(0, 3, ''); // Set interline to 3 + $pdf->SetTextColor(0,0,0); + + $tab_top = 50; + $tab_height = 200; + $tab_top_newpage = 40; + $tab_height_newpage = 210; + + // Affiche notes + if (! empty($object->note_public)) + { + $pdf->SetFont('','', $default_font_size - 1); + $pdf->writeHTMLCell(190, 3, $this->posxref-1, $tab_top-2, dol_htmlentitiesbr($object->note_public), 0, 1); + $nexY = $pdf->GetY(); + $height_note=$nexY-($tab_top-2); + + // Rect prend une longueur en 3eme param + $pdf->SetDrawColor(192,192,192); + $pdf->Rect($this->marge_gauche, $tab_top-3, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_note+1); + + $tab_height = $tab_height - $height_note; + $tab_top = $nexY+6; + } + else + { + $height_note=0; + } + + $iniY = $tab_top + 7; + $curY = $tab_top + 7; + $nexY = $tab_top + 7; + + $pdf->SetXY($this->marge_gauche, $curY); + $pdf->MultiCell(200, 3, $outputlangs->trans("BAN").' : '.$object->account_number, 0, 'L'); + + // Boucle sur les lignes + /* + for ($i = 0 ; $i < $nblignes ; $i++) + { + $curY = $nexY; + + // Description of ligne + $ref=$object->lines[$i]->ref; + $libelleline=$object->lines[$i]->label; + $progress=$object->lines[$i]->progress.'%'; + $datestart=dol_print_date($object->lines[$i]->date_start,'day'); + $dateend=dol_print_date($object->lines[$i]->date_end,'day'); + $planned_workload=convertSecondToTime($object->lines[$i]->planned_workload,'allhourmin'); + + $pdf->SetFont('','', $default_font_size - 1); // Dans boucle pour gerer multi-page + + $pdf->SetXY($this->posxref, $curY); + $pdf->MultiCell($this->posxlabel-$this->posxref, 3, $outputlangs->convToOutputCharset($ref), 0, 'L'); + $pdf->SetXY($this->posxlabel, $curY); + $pdf->MultiCell($this->posxworkload-$this->posxlabel, 3, $outputlangs->convToOutputCharset($libelleline), 0, 'L'); + $pdf->SetXY($this->posxworkload, $curY); + $pdf->MultiCell($this->posxprogress-$this->posxworkload, 3, $planned_workload, 0, 'R'); + $pdf->SetXY($this->posxprogress, $curY); + $pdf->MultiCell($this->posxdatestart-$this->posxprogress, 3, $progress, 0, 'R'); + + $pdf->SetXY($this->posxdatestart, $curY); + $pdf->MultiCell($this->posxdateend-$this->posxdatestart, 3, $datestart, 0, 'C'); + $pdf->SetXY($this->posxdateend, $curY); + $pdf->MultiCell($this->page_largeur-$this->marge_droite-$this->posxdateend, 3, $dateend, 0, 'C'); + + $pageposafter=$pdf->getPage(); + + $pdf->SetFont('','', $default_font_size - 1); // On repositionne la police par defaut + $nexY = $pdf->GetY(); + + // Add line + if (! empty($conf->global->MAIN_PDF_DASH_BETWEEN_LINES) && $i < ($nblignes - 1)) + { + $pdf->setPage($pageposafter); + $pdf->SetLineStyle(array('dash'=>'1,1','color'=>array(80,80,80))); + //$pdf->SetDrawColor(190,190,200); + $pdf->line($this->marge_gauche, $nexY+1, $this->page_largeur - $this->marge_droite, $nexY+1); + $pdf->SetLineStyle(array('dash'=>0)); + } + + $nexY+=2; // Passe espace entre les lignes + + // Detect if some page were added automatically and output _tableau for past pages + while ($pagenb < $pageposafter) + { + $pdf->setPage($pagenb); + if ($pagenb == 1) + { + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1); + } + else + { + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1); + } + $this->_pagefoot($pdf,$object,$outputlangs,1); + $pagenb++; + $pdf->setPage($pagenb); + $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it. + } + if (isset($object->lines[$i+1]->pagebreak) && $object->lines[$i+1]->pagebreak) + { + if ($pagenb == 1) + { + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1); + } + else + { + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1); + } + $this->_pagefoot($pdf,$object,$outputlangs,1); + // New page + $pdf->AddPage(); + if (! empty($tplidx)) $pdf->useTemplate($tplidx); + $pagenb++; + } + } + */ + + // Show square + if ($pagenb == 1) + { + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0); + $bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; + } + else + { + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0); + $bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; + } + + /* + * Pied de page + */ + $this->_pagefoot($pdf,$object,$outputlangs); + if (method_exists($pdf,'AliasNbPages')) $pdf->AliasNbPages(); + + $pdf->Close(); + + $pdf->Output($file,'F'); + + // Add pdfgeneration hook + if (! is_object($hookmanager)) + { + include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; + $hookmanager=new HookManager($this->db); + } + $hookmanager->initHooks(array('pdfgeneration')); + $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs); + global $action; + $reshook=$hookmanager->executeHooks('afterPDFCreation',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + + if (! empty($conf->global->MAIN_UMASK)) + @chmod($file, octdec($conf->global->MAIN_UMASK)); + + return 1; // Pas d'erreur + } + else + { + $this->error=$langs->transnoentities("ErrorCanNotCreateDir",$dir); + return 0; + } + } + + $this->error=$langs->transnoentities("ErrorConstantNotDefined","LIVRAISON_OUTPUTDIR"); + return 0; + } + + + /** + * Show table for lines + * + * @param PDF $pdf Object PDF + * @param string $tab_top Top position of table + * @param string $tab_height Height of table (rectangle) + * @param int $nexY Y + * @param Translate $outputlangs Langs object + * @param int $hidetop Hide top bar of array + * @param int $hidebottom Hide bottom bar of array + * @return void + */ + function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop=0, $hidebottom=0) + { + global $conf,$mysoc; + + $default_font_size = pdf_getPDFFontSize($outputlangs); + + + } + + /** + * Show top header of page. + * + * @param PDF $pdf Object PDF + * @param Project $object Object to show + * @param int $showaddress 0=no, 1=yes + * @param Translate $outputlangs Object lang for output + * @return void + */ + function _pagehead(&$pdf, $object, $showaddress, $outputlangs) + { + global $langs,$conf,$mysoc; + + $default_font_size = pdf_getPDFFontSize($outputlangs); + + pdf_pagehead($pdf,$outputlangs,$this->page_hauteur); + + $pdf->SetTextColor(0,0,60); + $pdf->SetFont('','B', $default_font_size + 3); + + $posx=$this->page_largeur-$this->marge_droite-100; + $posy=$this->marge_haute; + + $pdf->SetXY($this->marge_gauche,$posy); + + // Logo + $logo=$conf->mycompany->dir_output.'/logos/'.$mysoc->logo; + if ($mysoc->logo) + { + if (is_readable($logo)) + { + $height=pdf_getHeightForLogo($logo); + $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto) + } + else + { + $pdf->SetTextColor(200,0,0); + $pdf->SetFont('','B', $default_font_size - 2); + $pdf->MultiCell(100, 3, $langs->transnoentities("ErrorLogoFileNotFound",$logo), 0, 'L'); + $pdf->MultiCell(100, 3, $langs->transnoentities("ErrorGoToModuleSetup"), 0, 'L'); + } + } + else $pdf->MultiCell(100, 4, $outputlangs->transnoentities($this->emetteur->name), 0, 'L'); + + $pdf->SetFont('','B', $default_font_size + 3); + $pdf->SetXY($posx,$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 4, $outputlangs->transnoentities("BAN")." ".$outputlangs->convToOutputCharset($object->ref), '', 'R'); + $pdf->SetFont('','', $default_font_size + 2); + + $posy+=6; + $pdf->SetXY($posx,$posy); + $pdf->SetTextColor(0,0,60); + $pdf->MultiCell(100, 4, $outputlangs->transnoentities("Date")." : " . dol_print_date(dol_now(),'day',false,$outputlangs,true), '', 'R'); + /*$posy+=6; + $pdf->SetXY($posx,$posy); + $pdf->MultiCell(100, 4, $outputlangs->transnoentities("DateEnd")." : " . dol_print_date($object->date_end,'day',false,$outputlangs,true), '', 'R'); + */ + + $pdf->SetTextColor(0,0,60); + + // Add list of linked objects + /* Removed: A project can have more than thousands linked objects (orders, invoices, proposals, etc.... + $object->fetchObjectLinked(); + + foreach($object->linkedObjects as $objecttype => $objects) + { + var_dump($objects);exit; + if ($objecttype == 'commande') + { + $outputlangs->load('orders'); + $num=count($objects); + for ($i=0;$i<$num;$i++) + { + $posy+=4; + $pdf->SetXY($posx,$posy); + $pdf->SetFont('','', $default_font_size - 1); + $text=$objects[$i]->ref; + if ($objects[$i]->ref_client) $text.=' ('.$objects[$i]->ref_client.')'; + $pdf->MultiCell(100, 4, $outputlangs->transnoentities("RefOrder")." : ".$outputlangs->transnoentities($text), '', 'R'); + } + } + } + */ + + } + + /** + * Show footer of page. Need this->emetteur object + * + * @param PDF $pdf PDF + * @param Project $object Object to show + * @param Translate $outputlangs Object lang for output + * @param int $hidefreetext 1=Hide free text + * @return integer + */ + function _pagefoot(&$pdf,$object,$outputlangs,$hidefreetext=0) + { + global $conf; + $showdetails=$conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS; + //return pdf_pagefoot($pdf,$outputlangs,'BANK_FREE_TEXT',$this->emetteur,$this->marge_basse,$this->marge_gauche,$this->page_hauteur,$object,$showdetails,$hidefreetext); + } + +} + diff --git a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php index 111b426267bc27c9562ec40789b424e3dc1c9167..932fdd2d9f0f201fe5ed47863e5dbe38d3bfc09c 100644 --- a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php +++ b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php @@ -23,7 +23,7 @@ */ require_once DOL_DOCUMENT_ROOT.'/core/modules/bank/modules_bank.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; @@ -36,7 +36,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; class pdf_sepamandate extends ModeleBankAccountDoc { var $emetteur; // Objet societe qui emet - + var $version = 'dolibarr'; + /** * Constructor * @@ -48,6 +49,7 @@ class pdf_sepamandate extends ModeleBankAccountDoc $langs->load("main"); $langs->load("bank"); + $langs->load("withdrawals"); $langs->load("companies"); $this->db = $db; @@ -107,11 +109,19 @@ class pdf_sepamandate extends ModeleBankAccountDoc { //$nblignes = count($object->lines); // This is set later with array of tasks - $objectref = dol_sanitizeFileName($object->ref); - $dir = $conf->bank->dir_output; - if (! preg_match('/specimen/i',$objectref)) $dir.= "/" . $objectref; - $file = $dir . "/" . $objectref . ".pdf"; - + // Definition of $dir and $file + if ($object->specimen) + { + $dir = $conf->bank->dir_output; + $file = $dir . "/SPECIMEN.pdf"; + } + else + { + $objectref = dol_sanitizeFileName($object->ref); + $dir = $conf->bank->dir_output . "/" . $objectref; + $file = $dir . "/" . $objectref . ".pdf"; + } + if (! file_exists($dir)) { if (dol_mkdir($dir) < 0) @@ -148,27 +158,15 @@ class pdf_sepamandate extends ModeleBankAccountDoc } $pdf->SetFont(pdf_getPDFFont($outputlangs)); - // Complete object by loading several other informations - $task = new Task($this->db); - $tasksarray = $task->getTasksArray(0,0,$object->id); - - if (! $object->id > 0) // Special case when used with object = specimen, we may return all lines - { - $tasksarray=array_slice($tasksarray, 0, min(5, count($tasksarray))); - } - - $object->lines=$tasksarray; - $nblignes=count($object->lines); - $pdf->Open(); $pagenb=0; $pdf->SetDrawColor(128,128,128); $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref)); - $pdf->SetSubject($outputlangs->transnoentities("Project")); + $pdf->SetSubject($outputlangs->transnoentities("SepaMandate")); $pdf->SetCreator("Dolibarr ".DOL_VERSION); $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs))); - $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Project")); + $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("SepaMandate")); if (! empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) $pdf->SetCompression(false); $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right @@ -210,7 +208,12 @@ class pdf_sepamandate extends ModeleBankAccountDoc $curY = $tab_top + 7; $nexY = $tab_top + 7; + //var_dump($object);exit; + $pdf->SetXY($this->marge_gauche, $curY); + $pdf->MultiCell(200, 3, $outputlangs->trans("RUMLong").' ('.$outputlangs->trans("RUM").')'.' : '.$object->rum, 0, 'L'); + // Boucle sur les lignes + /* for ($i = 0 ; $i < $nblignes ; $i++) { $curY = $nexY; @@ -290,7 +293,8 @@ class pdf_sepamandate extends ModeleBankAccountDoc $pagenb++; } } - + */ + // Show square if ($pagenb == 1) { @@ -359,34 +363,6 @@ class pdf_sepamandate extends ModeleBankAccountDoc $default_font_size = pdf_getPDFFontSize($outputlangs); - $pdf->SetDrawColor(128,128,128); - - // Rect prend une longueur en 3eme param - $pdf->Rect($this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $tab_height); - // line prend une position y en 3eme param - $pdf->line($this->marge_gauche, $tab_top+6, $this->page_largeur-$this->marge_droite, $tab_top+6); - - $pdf->SetTextColor(0,0,0); - $pdf->SetFont('','', $default_font_size); - - $pdf->SetXY($this->posxref, $tab_top+1); - $pdf->MultiCell($this->posxlabel-$this->posxref,3, $outputlangs->transnoentities("Tasks"),'','L'); - - $pdf->SetXY($this->posxlabel, $tab_top+1); - $pdf->MultiCell($this->posxworkload-$this->posxlabel, 3, $outputlangs->transnoentities("Description"), 0, 'L'); - - $pdf->SetXY($this->posxworkload, $tab_top+1); - $pdf->MultiCell($this->posxprogress-$this->posxworkload, 3, $outputlangs->transnoentities("PlannedWorkloadShort"), 0, 'R'); - - $pdf->SetXY($this->posxprogress, $tab_top+1); - $pdf->MultiCell($this->posxdatestart-$this->posxprogress, 3, '%', 0, 'R'); - - $pdf->SetXY($this->posxdatestart, $tab_top+1); - $pdf->MultiCell($this->posxdateend-$this->posxdatestart, 3, '', 0, 'C'); - - $pdf->SetXY($this->posxdateend, $tab_top+1); - $pdf->MultiCell($this->page_largeur - $this->marge_droite - $this->posxdatestart, 3, '', 0, 'C'); - } /** @@ -436,16 +412,17 @@ class pdf_sepamandate extends ModeleBankAccountDoc $pdf->SetFont('','B', $default_font_size + 3); $pdf->SetXY($posx,$posy); $pdf->SetTextColor(0,0,60); - $pdf->MultiCell(100, 4, $outputlangs->transnoentities("Project")." ".$outputlangs->convToOutputCharset($object->ref), '', 'R'); + $pdf->MultiCell(100, 4, $outputlangs->transnoentities("SepaMandate"), '', 'R'); $pdf->SetFont('','', $default_font_size + 2); $posy+=6; $pdf->SetXY($posx,$posy); $pdf->SetTextColor(0,0,60); - $pdf->MultiCell(100, 4, $outputlangs->transnoentities("DateStart")." : " . dol_print_date($object->date_start,'day',false,$outputlangs,true), '', 'R'); - $posy+=6; + $pdf->MultiCell(100, 4, $outputlangs->transnoentities("Date")." : " . dol_print_date(dol_now(),'day',false,$outputlangs,true), '', 'R'); + /*$posy+=6; $pdf->SetXY($posx,$posy); $pdf->MultiCell(100, 4, $outputlangs->transnoentities("DateEnd")." : " . dol_print_date($object->date_end,'day',false,$outputlangs,true), '', 'R'); + */ $pdf->SetTextColor(0,0,60); diff --git a/htdocs/core/modules/modBanque.class.php b/htdocs/core/modules/modBanque.class.php index 33ca523d00bfa6fcafb992d927a69e95adeaeb16..d3c28b246df7fe88e307756f3cb8a3701115fa69 100644 --- a/htdocs/core/modules/modBanque.class.php +++ b/htdocs/core/modules/modBanque.class.php @@ -70,7 +70,7 @@ class modBanque extends DolibarrModules // Dependancies $this->depends = array(); - $this->requiredby = array("modComptabilite","modAccounting"); + $this->requiredby = array("modComptabilite","modAccounting","modPrelevement"); $this->conflictwith = array(); $this->langfiles = array("banks","compta","bills","companies"); diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 0d5e6e464e951ec5e6e3bdcacac5da54c0b12a2c..626af0340a26523604d1dd70c7757a8cc9a1427f 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1355,7 +1355,7 @@ GenbarcodeLocation=Bar code generation command line tool (used by internal engin BarcodeInternalEngine=Internal engine BarCodeNumberManager=Manager to auto define barcode numbers ##### Prelevements ##### -WithdrawalsSetup=Withdrawal module setup +WithdrawalsSetup=Setup of module Direct debit payment orders ##### ExternalRSS ##### ExternalRSSSetup=External RSS imports setup NewRSS=New RSS Feed diff --git a/htdocs/langs/en_US/banks.lang b/htdocs/langs/en_US/banks.lang index 8a6a6aaeeac8d4e933cc99e1e1a4de254a7c8d69..3cef6fd6c40c150b027453776dce1036c5e4f3e9 100644 --- a/htdocs/langs/en_US/banks.lang +++ b/htdocs/langs/en_US/banks.lang @@ -32,8 +32,8 @@ IbanNotValid=IBAN is Not Valid BIC=BIC/SWIFT number SwiftValid=BIC/SWIFT is Valid SwiftNotValid=BIC/SWIFT is Not Valid -StandingOrders=Standing orders -StandingOrder=Standing order +StandingOrders=Direct Debit orders +StandingOrder=Direct debit order AccountStatement=Account statement AccountStatementShort=Statement AccountStatements=Account statements diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index ac27ef018fdce817cf3019e1aff7be37b31e9c1e..3210c3ff83870f0af31fc4e45bfb1b922641e31c 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -209,8 +209,8 @@ EscompteOffered=Discount offered (payment before term) EscompteOfferedShort=Discount SendBillRef=Submission of invoice %s SendReminderBillRef=Submission of invoice %s (reminder) -StandingOrders=Standing orders -StandingOrder=Standing order +StandingOrders=Direct debit orders +StandingOrder=Direct debit order NoDraftBills=No draft invoices NoOtherDraftBills=No other draft invoices NoDraftInvoices=No draft invoices @@ -351,8 +351,8 @@ VarAmount=Variable amount (%% tot.) # PaymentType PaymentTypeVIR=Bank transfer PaymentTypeShortVIR=Bank transfer -PaymentTypePRE=Bank's order -PaymentTypeShortPRE=Bank's order +PaymentTypePRE=Direct debit payment order +PaymentTypeShortPRE=Debit payment order PaymentTypeLIQ=Cash PaymentTypeShortLIQ=Cash PaymentTypeCB=Credit card diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 0462b4d1dc99b93661239fb02b25eba3df6bae1d..8c40a8080749f3cfbfc59b92db614a06b6f771d3 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -175,6 +175,7 @@ ErrorStockIsNotEnoughToAddProductOnInvoice=Stock is not enougth for product %s t ErrorStockIsNotEnoughToAddProductOnShipment=Stock is not enougth for product %s to add it into a new shipment. ErrorStockIsNotEnoughToAddProductOnProposal=Stock is not enougth for product %s to add it into a new proposal. ErrorFailedToLoadLoginFileForMode=Failed to get the login file for mode '%s'. +ErrorModuleNotFound=File of module was not found. # Warnings WarningPasswordSetWithNoAccount=A password was set for this member. However, no user account was created. So this password is stored but can't be used to login to Dolibarr. It may be used by an external module/interface but if you don't need to define any login nor password for a member, you can disable option "Manage a login for each member" from Member module setup. If you need to manage a login but don't need any password, you can keep this field empty to avoid this warning. Note: Email can also be used as a login if the member is linked to a user. diff --git a/htdocs/langs/en_US/withdrawals.lang b/htdocs/langs/en_US/withdrawals.lang index 3ecc090f2fe407713854cfeae11c22c82b111cca..443524f9a30ae7f4a904e6befb199f1313b5c8af 100644 --- a/htdocs/langs/en_US/withdrawals.lang +++ b/htdocs/langs/en_US/withdrawals.lang @@ -3,26 +3,26 @@ CustomersStandingOrdersArea=Direct debit payment orders area SuppliersStandingOrdersArea=Direct credit payment orders area StandingOrders=Direct debit payment orders StandingOrder=Direct debit payment order -NewStandingOrder=New direct debit payment order +NewStandingOrder=New direct debit order StandingOrderToProcess=To process -WithdrawalsReceipts=Withdrawal receipts -WithdrawalReceipt=Withdrawal receipt -LastWithdrawalReceipts=Latest %s withdrawal receipts -WithdrawalsLines=Withdrawal lines +WithdrawalsReceipts=Direct debit orders +WithdrawalReceipt=Direct debit order +LastWithdrawalReceipts=Latest %s direct debit files +WithdrawalsLines=Direct debit order lines RequestStandingOrderToTreat=Request for direct debit payment order to process RequestStandingOrderTreated=Request for direct debit payment order processed NotPossibleForThisStatusOfWithdrawReceiptORLine=Not yet possible. Withdraw status must be set to 'credited' before declaring reject on specific lines. -NbOfInvoiceToWithdraw=Nb. of invoice with withdraw request -NbOfInvoiceToWithdrawWithInfo=Nb. of invoice with withdraw request for customers having defined bank account information -InvoiceWaitingWithdraw=Invoice waiting for withdraw +NbOfInvoiceToWithdraw=Nb. of invoice with direct debit order +NbOfInvoiceToWithdrawWithInfo=Nb. of customer invoice with direct debit payment orders having defined bank account information +InvoiceWaitingWithdraw=Invoice waiting for direct debit AmountToWithdraw=Amount to withdraw -WithdrawsRefused=Withdraws refused +WithdrawsRefused=Direct debit refused NoInvoiceToWithdraw=No customer invoice in payment mode "withdraw" is waiting. Go on 'Withdraw' tab on invoice card to make a request. ResponsibleUser=Responsible user -WithdrawalsSetup=Withdrawal setup -WithdrawStatistics=Withdraw's statistics -WithdrawRejectStatistics=Withdraw reject's statistics -LastWithdrawalReceipt=Latest %s withdrawal receipts +WithdrawalsSetup=Direct debit payment setup +WithdrawStatistics=Direct debit payment statistics +WithdrawRejectStatistics=Direct debit payment reject statistics +LastWithdrawalReceipt=Latest %s direct debit receipts MakeWithdrawRequest=Make a withdraw request ThirdPartyBankCode=Third party bank code NoInvoiceCouldBeWithdrawed=No invoice withdrawed with success. Check that invoice are on companies with a valid BAN. @@ -47,7 +47,7 @@ StatusRefused=Refused StatusMotif0=Unspecified StatusMotif1=Insufficient funds StatusMotif2=Request contested -StatusMotif3=No Withdrawal order +StatusMotif3=No direct debit payment order StatusMotif4=Customer Order StatusMotif5=RIB unusable StatusMotif6=Account without balance @@ -62,7 +62,7 @@ NotifyCredit=Withdrawal Credit NumeroNationalEmetter=National Transmitter Number WithBankUsingRIB=For bank accounts using RIB WithBankUsingBANBIC=For bank accounts using IBAN/BIC/SWIFT -BankToReceiveWithdraw=Bank account to receive withdraws +BankToReceiveWithdraw=Bank account to receive direct debit CreditDate=Credit on WithdrawalFileNotCapable=Unable to generate withdrawal receipt file for your country %s (Your country is not supported) ShowWithdraw=Show Withdraw @@ -72,11 +72,13 @@ WithdrawalFile=Withdrawal file SetToStatusSent=Set to status "File Sent" ThisWillAlsoAddPaymentOnInvoice=This will also apply payments to invoices and will classify them as "Paid" StatisticsByLineStatus=Statistics by status of lines -RUM=RUM -RUMWillBeGenerated=RUM number will be generated once bank account information are saved -WithdrawMode=Withdraw mode (FRST or RECUR) +RUM=UMR +RUMLong=Unique Mandate Reference +RUMWillBeGenerated=UMR number will be generated once bank account information are saved +WithdrawMode=Direct debit mode (FRST or RECUR) WithdrawRequestAmount=Withdraw request amount: WithdrawRequestErrorNilAmount=Unable to create withdraw request for nil amount. +SepaMandate=SEPA Direct Debit Mandate ### Notifications InfoCreditSubject=Payment of direct debit payment order %s by the bank diff --git a/htdocs/societe/class/companybankaccount.class.php b/htdocs/societe/class/companybankaccount.class.php index 774976c3a4a6f2e2e08e604e7a2634c5dd9bf732..63d2a48d901b85e41d75acf1f5f26e245c1dd6c7 100644 --- a/htdocs/societe/class/companybankaccount.class.php +++ b/htdocs/societe/class/companybankaccount.class.php @@ -129,6 +129,8 @@ class CompanyBankAccount extends Account if ($conf->prelevement->enabled) { $sql.= ",frstrecur = '".$this->db->escape($this->frstrecur)."'"; + $sql.= ",rum = '".$this->db->escape($this->rum)."'"; + $sql.= ",date_rum = ".($this->date_rum ? "'".$this->db->idate($this->date_rum)."'" : "null"); } if (trim($this->label) != '') $sql.= ",label = '".$this->db->escape($this->label)."'"; @@ -302,5 +304,36 @@ class CompanyBankAccount extends Account return -1; } } + + /** + * Initialise an instance with random values. + * Used to build previews or test instances. + * id must be 0 if object instance is a specimen. + * + * @return void + */ + function initAsSpecimen() + { + $this->specimen = 1; + $this->ref = 'CBA'; + $this->label = 'CustomerCorp Bank account'; + $this->bank = 'CustomerCorp Bank'; + $this->courant = Account::TYPE_CURRENT; + $this->clos = Account::STATUS_OPEN; + $this->code_banque = '123'; + $this->code_guichet = '456'; + $this->number = 'CUST12345'; + $this->cle_rib = 50; + $this->bic = 'CC12'; + $this->iban = 'FR999999999'; + $this->domiciliation = 'Bank address of customer corp'; + $this->proprio = 'Owner'; + $this->owner_address = 'Owner address'; + $this->country_id = 1; + + $this->rum = 'UMR-CU1212-0007-5-1475405262'; + $this->frstrecur = 'FRST'; + } + } diff --git a/htdocs/societe/rib.php b/htdocs/societe/rib.php index f1ba5217b8e7baeed8f8ed806e7c7d29791b59ee..dd12548400f48d5ff2fa60baba2acf1cb9892571 100644 --- a/htdocs/societe/rib.php +++ b/htdocs/societe/rib.php @@ -50,6 +50,7 @@ $ribid=GETPOST("ribid","int"); $action=GETPOST("action"); $account = new CompanyBankAccount($db); +$prelevement = new BonPrelevement($db); /* @@ -106,7 +107,12 @@ if ($action == 'update' && ! $_POST["cancel"]) $account->proprio = GETPOST('proprio','alpha'); $account->owner_address = GETPOST('owner_address','alpha'); $account->frstrecur = GETPOST('frstrecur','alpha'); - + if (empty($account->rum)) + { + $account->rum = $prelevement->buildRumNumber($object->code_client, $account->datec, $account->id); + $account->date_rum = dol_now(); + } + $result = $account->update($user); if (! $result) { @@ -185,7 +191,14 @@ if ($action == 'add' && ! $_POST["cancel"]) if (! $error) { - $result = $account->update($user); // TODO Use create and include update into create method + if (empty($account->rum)) + { + $account->rum = $prelevement->buildRumNumber($object->code_client, $account->datec, $account->id); + $account->date_rum = dol_now(); + } + + $result = $account->update($user); // This will set the UMR number. + // TODO Use create and include update into create method if (! $result) { setEventMessages($account->error, $account->errors, 'errors'); @@ -246,7 +259,6 @@ if ($action == 'confirm_delete' && $_GET['confirm'] == 'yes') */ $form = new Form($db); -$prelevement = new BonPrelevement($db); llxHeader(); @@ -384,7 +396,7 @@ if ($socid && $action != 'edit' && $action != "create") print_liste_field_titre($langs->trans("BIC")); if (! empty($conf->prelevement->enabled)) { - print '<td>RUM</td>'; + print '<td>'.$langs->trans("RUM").'</td>'; print '<td>'.$langs->trans("WithdrawMode").'</td>'; } print_liste_field_titre($langs->trans("DefaultRIB"), '', '', '', '', 'align="center"'); @@ -412,7 +424,8 @@ if ($socid && $action != 'edit' && $action != "create") if (! empty($conf->prelevement->enabled)) { // RUM - print '<td>'.$prelevement->buildRumNumber($object->code_client, $rib->datec, $rib->id).'</td>'; + //print '<td>'.$prelevement->buildRumNumber($object->code_client, $rib->datec, $rib->id).'</td>'; + print '<td>'.$rib->rum.'</td>'; // FRSTRECUR print '<td>'.$rib->frstrecur.'</td>';