From db46d82de3b947735262a4386f3970b7a46071f0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 15 Dec 2018 15:35:59 +0100 Subject: [PATCH 1/5] Fix position of menu entries --- htdocs/core/menus/standard/eldy.lib.php | 77 +++++++++++++------------ htdocs/core/modules/modAgenda.class.php | 2 +- htdocs/core/modules/modECM.class.php | 2 +- htdocs/core/modules/modTicket.class.php | 3 +- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index ce2145d3986..c97307bd830 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -132,6 +132,37 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$mode $menu->add('/product/index.php?mainmenu=products&leftmenu=', $chaine, 0, $showmode, $atarget, "products", '', 30, $id, $idsel, $classname); } + // Projects + $tmpentry=array('enabled'=>(! empty($conf->projet->enabled)), + 'perms'=>(! empty($user->rights->projet->lire)), + 'module'=>'projet'); + $showmode=isVisibleToUserType($type_user, $tmpentry, $listofmodulesforexternal); + if ($showmode) + { + $langs->load("projects"); + + $classname=""; + if ($_SESSION["mainmenu"] && $_SESSION["mainmenu"] == "project") { $classname='class="tmenusel"'; $_SESSION['idmenu']=''; } + else $classname = 'class="tmenu"'; + $idsel='project'; + + $title = $langs->trans("LeadsOrProjects"); // Leads and opportunities by default + $showmodel = $showmodep = $showmode; + if (empty($conf->global->PROJECT_USE_OPPORTUNITIES)) + { + $title = $langs->trans("Projects"); + $showmodel = 0; + } + if ($conf->global->PROJECT_USE_OPPORTUNITIES == 2) { + $title = $langs->trans("Leads"); + $showmodep = 0; + } + + $menu->add('/projet/index.php?mainmenu=project&leftmenu=', $title, 0, $showmode, $atarget, "project", '', 35, $id, $idsel, $classname); + //$menu->add('/projet/index.php?mainmenu=project&leftmenu=&search_opp_status=openedopp', $langs->trans("ListLeads"), 0, $showmodel & $conf->global->PROJECT_USE_OPPORTUNITIES, $atarget, "project", '', 70, $id, $idsel, $classname); + //$menu->add('/projet/index.php?mainmenu=project&leftmenu=&search_opp_status=notopenedopp', $langs->trans("ListProjects"), 0, $showmodep, $atarget, "project", '', 70, $id, $idsel, $classname); + } + // Commercial $menuqualified=0; if (! empty($conf->propal->enabled)) $menuqualified++; @@ -222,37 +253,6 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$mode $menu->add('/accountancy/index.php?mainmenu=accountancy&leftmenu=', $langs->trans("MenuAccountancy"), 0, $showmode, $atarget, "accountancy", '', 54, $id, $idsel, $classname); } - // Projects - $tmpentry=array('enabled'=>(! empty($conf->projet->enabled)), - 'perms'=>(! empty($user->rights->projet->lire)), - 'module'=>'projet'); - $showmode=isVisibleToUserType($type_user, $tmpentry, $listofmodulesforexternal); - if ($showmode) - { - $langs->load("projects"); - - $classname=""; - if ($_SESSION["mainmenu"] && $_SESSION["mainmenu"] == "project") { $classname='class="tmenusel"'; $_SESSION['idmenu']=''; } - else $classname = 'class="tmenu"'; - $idsel='project'; - - $title = $langs->trans("LeadsOrProjects"); // Leads and opportunities by default - $showmodel = $showmodep = $showmode; - if (empty($conf->global->PROJECT_USE_OPPORTUNITIES)) - { - $title = $langs->trans("Projects"); - $showmodel = 0; - } - if ($conf->global->PROJECT_USE_OPPORTUNITIES == 2) { - $title = $langs->trans("Leads"); - $showmodep = 0; - } - - $menu->add('/projet/index.php?mainmenu=project&leftmenu=', $title, 0, $showmode, $atarget, "project", '', 70, $id, $idsel, $classname); - //$menu->add('/projet/index.php?mainmenu=project&leftmenu=&search_opp_status=openedopp', $langs->trans("ListLeads"), 0, $showmodel & $conf->global->PROJECT_USE_OPPORTUNITIES, $atarget, "project", '', 70, $id, $idsel, $classname); - //$menu->add('/projet/index.php?mainmenu=project&leftmenu=&search_opp_status=notopenedopp', $langs->trans("ListProjects"), 0, $showmodep, $atarget, "project", '', 70, $id, $idsel, $classname); - } - // HRM $tmpentry=array('enabled'=>(! empty($conf->hrm->enabled) || ! empty($conf->holiday->enabled) || ! empty($conf->deplacement->enabled) || ! empty($conf->expensereport->enabled)), 'perms'=>(! empty($user->rights->hrm->employee->read) || ! empty($user->rights->holiday->write) || ! empty($user->rights->deplacement->lire) || ! empty($user->rights->expensereport->lire)), @@ -1196,8 +1196,8 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu */ if ($mainmenu == 'bank') { - // Load translation files required by the page - $langs->loadLangs(array("withdrawals","banks","bills","categories")); + // Load translation files required by the page + $langs->loadLangs(array("withdrawals","banks","bills","categories")); // Bank-Caisse if (! empty($conf->banque->enabled)) @@ -1212,11 +1212,12 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $newmenu->add("/compta/bank/transfer.php",$langs->trans("MenuBankInternalTransfer"),1,$user->rights->banque->transfer); } - if (! empty($conf->categorie->enabled)) { - $langs->load("categories"); - $newmenu->add("/categories/index.php?type=5",$langs->trans("Rubriques"),1,$user->rights->categorie->creer, '', $mainmenu, 'tags'); - $newmenu->add("/compta/bank/categ.php",$langs->trans("RubriquesTransactions"),1,$user->rights->categorie->creer, '', $mainmenu, 'tags'); - } + if (! empty($conf->categorie->enabled)) + { + $langs->load("categories"); + $newmenu->add("/categories/index.php?type=5",$langs->trans("Rubriques"),1,$user->rights->categorie->creer, '', $mainmenu, 'tags'); + $newmenu->add("/compta/bank/categ.php",$langs->trans("RubriquesTransactions"),1,$user->rights->categorie->creer, '', $mainmenu, 'tags'); + } // Prelevements if (! empty($conf->prelevement->enabled)) diff --git a/htdocs/core/modules/modAgenda.class.php b/htdocs/core/modules/modAgenda.class.php index 50e767fe411..2324bfad616 100644 --- a/htdocs/core/modules/modAgenda.class.php +++ b/htdocs/core/modules/modAgenda.class.php @@ -210,7 +210,7 @@ class modAgenda extends DolibarrModules 'mainmenu'=>'agenda', 'url'=>'/comm/action/index.php', 'langs'=>'agenda', - 'position'=>15, + 'position'=>86, 'perms'=>'$user->rights->agenda->myactions->read', 'enabled'=>'$conf->agenda->enabled', 'target'=>'', diff --git a/htdocs/core/modules/modECM.class.php b/htdocs/core/modules/modECM.class.php index c4c00597885..593f702ac52 100644 --- a/htdocs/core/modules/modECM.class.php +++ b/htdocs/core/modules/modECM.class.php @@ -129,7 +129,7 @@ class modECM extends DolibarrModules 'mainmenu'=>'ecm', 'url'=>'/ecm/index.php', 'langs'=>'ecm', - 'position'=>100, + 'position'=>82, 'perms'=>'$user->rights->ecm->read || $user->rights->ecm->upload || $user->rights->ecm->setup', 'enabled'=>'$conf->ecm->enabled', 'target'=>'', diff --git a/htdocs/core/modules/modTicket.class.php b/htdocs/core/modules/modTicket.class.php index 79e4d015a5e..08f1050df32 100644 --- a/htdocs/core/modules/modTicket.class.php +++ b/htdocs/core/modules/modTicket.class.php @@ -32,7 +32,6 @@ require_once DOL_DOCUMENT_ROOT . "/core/modules/DolibarrModules.class.php"; */ class modTicket extends DolibarrModules { - /** * Constructor. Define names, constants, directories, boxes, permissions * @@ -194,7 +193,7 @@ class modTicket extends DolibarrModules 'leftmenu' => '1', // Use 1 if you also want to add left menu entries using this descriptor. 'url' => '/ticket/index.php', 'langs' => 'ticket', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position' => 100, + 'position' => 88, 'enabled' => '$conf->ticket->enabled', // Define condition to show or hide menu entry. Use '$conf->ticket->enabled' if entry must be visible if module is enabled. 'perms' => '$user->rights->ticket->read', // Use 'perms'=>'$user->rights->ticket->level1->level2' if you want your menu with a permission rules 'target' => '', From cdaf04876605b245179c4476af112a1967428ae9 Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Sat, 8 Dec 2018 21:33:54 +0100 Subject: [PATCH 2/5] First CashControl version --- htdocs/compta/cashcontrol/cashcontrol.php | 204 ++++++++++++ .../cashcontrol/class/cashcontrol.class.php | 199 ++++++++++++ htdocs/compta/cashcontrol/report.php | 303 ++++++++++++++++++ htdocs/core/menus/standard/eldy.lib.php | 7 + .../mysql/tables/llx_pos_cash_fence.sql | 34 ++ 5 files changed, 747 insertions(+) create mode 100644 htdocs/compta/cashcontrol/cashcontrol.php create mode 100644 htdocs/compta/cashcontrol/class/cashcontrol.class.php create mode 100644 htdocs/compta/cashcontrol/report.php create mode 100644 htdocs/install/mysql/tables/llx_pos_cash_fence.sql diff --git a/htdocs/compta/cashcontrol/cashcontrol.php b/htdocs/compta/cashcontrol/cashcontrol.php new file mode 100644 index 00000000000..6671b0562ee --- /dev/null +++ b/htdocs/compta/cashcontrol/cashcontrol.php @@ -0,0 +1,204 @@ + + * Copyright (C) 2004-2013 Laurent Destailleur + * Copyright (C) 2005-2009 Regis Houssin + * Copyright (C) 2013 Charles-Fr BENKE + * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2016 Marcos García + * Copyright (C) 2018 Andreu Bisquerra + * + * 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 . + */ + +/** + * \file htdocs/compta/bank/categ.php + * \ingroup compta + * \brief Page ajout de categories bancaires + */ + +$res=@include("../main.inc.php"); +if (! $res) $res=@include("../../main.inc.php"); +include_once 'class/cashcontrol.class.php'; + +$langs->loadLangs(array("cashcontrol","install","cashdesk","admin")); + +$action=GETPOST('action','aZ09'); +$id=GETPOST('id'); + +if (!$user->rights->banque->configurer) + accessforbidden(); + +$categid = GETPOST('categid'); +$label = GETPOST("label"); + +if (empty($conf->global->CASHDESK_ID_BANKACCOUNT_CASH) or empty($conf->global->CASHDESK_ID_BANKACCOUNT_CB)) setEventMessages($langs->trans("CashDesk")." - ".$langs->trans("NotConfigured"), null, 'errors'); + +/* + * Add category + */ +if ($action=="start") +{ + $cashcontrol= new CashControl($db); + $cashcontrol->opening=GETPOST('opening'); + if (GETPOST('posmodule')==0) $cashcontrol->posmodule="cashdesk"; + else if (GETPOST('posmodule')==1) $cashcontrol->posmodule="takepos"; + $cashcontrol->posnumber=GETPOST('posnumber'); + $id=$cashcontrol->create($user); + $action="view"; +} + +if ($action=="close") +{ + $cashcontrol= new CashControl($db); + $cashcontrol->id=$id; + $cashcontrol->close($user); + $action="view"; +} + + +if ($action=="create") +{ +llxHeader(); + print load_fiche_titre("Cashcontrol - ".$langs->trans("New"), '', 'title_bank.png'); + print '
'; + print ''; + print ''; + print ''; + print ''; + print "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'.$langs->trans("Ref").''.$langs->trans("InitialBankBalance").''.$langs->trans("Module").''.$langs->trans("CashDesk").' ID,
 '.$form->selectarray('posmodule', array('0'=>$langs->trans('CashDesk'),'1'=>$langs->trans('TakePOS')),1).'
'; +} + + +if ($action=="list") +{ +llxHeader(); + print load_fiche_titre("Cashcontrol - ".$langs->trans("List"), '', 'title_bank.png'); + print '
'; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + $sql = "SELECT *"; + $sql.= " FROM "; + $sql.= MAIN_DB_PREFIX."pos_cash_fence order by rowid DESC"; + $result = $db->query($sql); + if ($result) { + $i = 0; + $num = $db->num_rows($result); + + while ($i < $num) { + print ''; + $objp = $db->fetch_object($result); + $totalpaye += $objp->amount; + print ''; + print ''; + $i ++; + } + } else { + //no hay + } + + print '
'.$langs->trans("Ref").''.$langs->trans("DateCreationShort").''.$langs->trans("DateEnd").''.$langs->trans("Cash").''.$langs->trans("PaymentTypeCB").''.$langs->trans("Status").'
'; + print ''.$objp->rowid.''; + print ''.dol_print_date($objp->date_creation, 'dayhour').''.dol_print_date(strtotime($objp->year_close."-".$objp->month_close."-".$objp->day_close), 'day').''; + if ($objp->status==2) print price($objp->cash); + print ''; + if ($objp->status==2) price($objp->card); + print ''; + if ($objp->status==1) print $langs->trans("Opened"); + if ($objp->status==2) print $langs->trans("Closed"); + print '
'; +} + + + +if ($action=="view") +{ + $cashcontrol= new CashControl($db); + $cashcontrol->fetch($id); + llxHeader(); + print load_fiche_titre($langs->trans("CashControl"), '', 'title_bank.png'); + print '
'; + print '
'; + print '
'; + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print '
'; + print $langs->trans("Code"); + print ''; + print $id; + print '
'; + print $langs->trans("DateCreationShort"); + print ''; + print dol_print_date($cashcontrol->date_creation, 'dayhour'); + print '
'; + print $langs->trans("DateEnd"); + print ''; + print dol_print_date(strtotime($cashcontrol->year_close."-".$cashcontrol->month_close."-".$cashcontrol->day_close), 'day'); + print '
'; + print $langs->trans("Status"); + print ''; + if ($cashcontrol->status==1) print $langs->trans("Opened"); + if ($cashcontrol->status==2) print $langs->trans("Closed"); + print '
'; + print '
'; + print '
'; + print '
'; + print ''; + + print '"; + + print '"; + + print '"; + + print "
'.$langs->trans("InitialBankBalance").''; + print price($cashcontrol->opening); + print "
'.$langs->trans("CashDesk").' ID'; + print $cashcontrol->posnumber; + print "
'.$langs->trans("Module").''; + print $cashcontrol->posmodule; + print "
\n"; + print '
'; + print '
'; + print '
'; + + dol_fiche_end(); + + print '
'; + print ''; + if ($cashcontrol->status==1) print ''; + print '
'; + + print '
'; +} + +llxFooter(); diff --git a/htdocs/compta/cashcontrol/class/cashcontrol.class.php b/htdocs/compta/cashcontrol/class/cashcontrol.class.php new file mode 100644 index 00000000000..fcf80e093d8 --- /dev/null +++ b/htdocs/compta/cashcontrol/class/cashcontrol.class.php @@ -0,0 +1,199 @@ + + * Copyright (C) 2009 Regis Houssin + * Copyright (C) 2016 Marcos García + * Copyright (C) 2018 Andreu Bisquerra + * + * 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 . + */ + +/** + * \file cashcontrol/class/cashcontrol.class.php + * \ingroup bank + * \brief This file is CRUD class file (Create/Read/Update/Delete) for bank categories + */ + +/** + * Class to manage bank categories + */ +class CashControl // extends CommonObject +{ + public $id; + public $opening; + public $status; + public $date_creation; + public $year_close; + public $month_close; + public $day_close; + public $posmodule; + public $posnumber; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct(DoliDB $db) + { + $this->db = $db; + } + + + /** + * Create in database + * + * @param User $user User that create + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + public function create(User $user, $notrigger = 0) + { + global $conf; + + $error = 0; + + // Insert request + $sql = "INSERT INTO ".MAIN_DB_PREFIX."pos_cash_fence ("; + $sql .= "entity"; + $sql .= ", opening"; + $sql .= ", status"; + $sql .= ", date_creation"; + $sql .= ", posmodule"; + $sql .= ", posnumber"; + $sql .= ") VALUES ("; + $sql .= $conf->entity; + $sql .= ", ".$this->opening; + $sql .= ",1"; + $sql .= ", now()"; + $sql .= ", '".$this->posmodule."'"; + $sql .= ", '".$this->posnumber."'"; + $sql .= ")"; + + $this->db->begin(); + + dol_syslog(get_class($this)."::create", LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $error++; + $this->errors[] = "Error ".$this->db->lasterror(); + } + + if (!$error) { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."pos_cash_fence"); + } + + // Commit or rollback + if ($error) { + foreach ($this->errors as $errmsg) { + dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } else { + $this->db->commit(); + return $this->id; + } + } + + + + + + public function close(User $user, $notrigger = 0) + { + global $conf; + + $error = 0; + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX."pos_cash_fence "; + $sql .= "SET"; + $sql .= " day_close=DAYOFMONTH(NOW())"; + $sql .= ", month_close=MONTH(NOW())"; + $sql .= ", year_close=YEAR(NOW())"; + $sql .= ", status=2"; + $sql .= " where rowid=".$this->id; + $this->db->begin(); + + dol_syslog(get_class($this)."::create", LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $error++; + $this->errors[] = "Error ".$this->db->lasterror(); + } + + if (!$error) { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."pos_cash_fence"); + } + + // Commit or rollback + if ($error) { + foreach ($this->errors as $errmsg) { + dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } else { + $this->db->commit(); + return $this->id; + } + } + + + + + + /** + * Load object in memory from database + * + * @param int $id Id object + * @return int <0 if KO, >0 if OK + */ + public function fetch($id) + { + global $conf; + + $sql = "SELECT"; + $sql .= " *"; + $sql .= " FROM ".MAIN_DB_PREFIX."pos_cash_fence"; + $sql .= " WHERE rowid = ".$id; + $sql .= " AND entity = ".$conf->entity; + + dol_syslog(get_class($this)."::fetch", LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + if ($this->db->num_rows($resql)) { + $obj = $this->db->fetch_object($resql); + $this->opening = $obj->opening; + $this->status = $obj->status; + $this->date_creation = $obj->date_creation; + $this->year_close = $obj->year_close; + $this->month_close = $obj->month_close; + $this->day_close = $obj->day_close; + $this->posmodule = $obj->posmodule; + $this->posnumber = $obj->posnumber; + $this->id=$id; + } + $this->db->free($resql); + + return 1; + } else { + $this->error = "Error ".$this->db->lasterror(); + return -1; + } + } +} diff --git a/htdocs/compta/cashcontrol/report.php b/htdocs/compta/cashcontrol/report.php new file mode 100644 index 00000000000..8dd3075d8c7 --- /dev/null +++ b/htdocs/compta/cashcontrol/report.php @@ -0,0 +1,303 @@ + + * Copyright (C) 2004-2016 Laurent Destailleur + * Copyright (C) 2005-2010 Regis Houssin + * Copyright (C) 2012 Vinícius Nogueira + * Copyright (C) 2014 Florian Henry + * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2016 Juanjo Menent + * Copyright (C) 2017 Alexandre Spangaro + * Copyright (C) 2018 Andreu Bisquerra + * + * 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 . + */ + +/** + * \file htdocs/compta/bank/bankentries_list.php + * \ingroup banque + * \brief List of bank transactions + */ + +$res=@include("../main.inc.php"); +if (! $res) $res=@include("../../main.inc.php"); +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; + +$id = GETPOST('id','int'); + +$_GET['optioncss']="print"; +include_once 'class/cashcontrol.class.php'; +$cashcontrol= new CashControl($db); +$cashcontrol->fetch($id); + +$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit; +$sortorder='ASC'; +$sortfield='b.datev,b.dateo,b.rowid'; + +$arrayfields=array( + 'b.rowid'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'b.dateo'=>array('label'=>$langs->trans("DateOperationShort"), 'checked'=>1), + 'b.num_chq'=>array('label'=>$langs->trans("Number"), 'checked'=>1), + 'ba.ref'=>array('label'=>$langs->trans("BankAccount"), 'checked'=>1), + 'b.debit'=>array('label'=>$langs->trans("Debit"), 'checked'=>1, 'position'=>600), + 'b.credit'=>array('label'=>$langs->trans("Credit"), 'checked'=>1, 'position'=>605), +); + +/* + * View + */ + +llxHeader('', $langs->trans("CashControl"), '', '', 0, 0, array(), array(), $param); + +$sql = "SELECT b.rowid, b.dateo as do, b.datev as dv, b.amount, b.label, b.rappro as conciliated, b.num_releve, b.num_chq,"; +$sql.= " b.fk_account, b.fk_type,"; +$sql.= " ba.rowid as bankid, ba.ref as bankref,"; +$sql.= " bu.url_id,"; +$sql.= " f.module_source, f.facnumber as facnumber"; +$sql.= " FROM "; +if ($bid) $sql.= MAIN_DB_PREFIX."bank_class as l,"; +$sql.= " ".MAIN_DB_PREFIX."bank_account as ba,"; +$sql.= " ".MAIN_DB_PREFIX."bank as b"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."bank_url as bu ON bu.fk_bank = b.rowid AND type = 'payment'"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."facture as f ON bu.url_id = f.rowid"; +$sql.= " WHERE b.fk_account = ba.rowid"; +$sql.= " AND f.module_source='$cashcontrol->posmodule'"; +$sql.= " AND ba.entity IN (".getEntity('bank_account').")"; + +$sql.=" AND b.datec>'".$cashcontrol->date_creation."'"; +if ($cashcontrol->date_close>0) $sql.=" AND b.datec<'".$cashcontrol->date_close."'"; +$sql.=" AND (b.fk_account="; +$sql.=$conf->global->CASHDESK_ID_BANKACCOUNT_CASH; +$sql.=" or b.fk_account="; +$sql.=$conf->global->CASHDESK_ID_BANKACCOUNT_CB; +$sql.=")"; +$resql = $db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + $i = 0; + + print "

"; + if ($cashcontrol->status==2) print "Cashcontrol ".$cashcontrol->id; + else print $langs->trans("Cashcontrol")." - ".$langs->trans("Draft"); + print "
".$langs->trans("DateCreationShort").": ".dol_print_date($cashcontrol->date_creation, 'day')."

"; + + + print '
'; + print ''."\n"; + + // Fields title + print ''; + print_liste_field_titre($arrayfields['b.rowid']['label'],$_SERVER['PHP_SELF'],'b.rowid','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($arrayfields['b.dateo']['label'],$_SERVER['PHP_SELF'],'b.dateo','',$param,'align="left"',$sortfield,$sortorder); + print_liste_field_titre($arrayfields['ba.ref']['label'],$_SERVER['PHP_SELF'],'ba.ref','',$param,'align="right"',$sortfield,$sortorder); + print_liste_field_titre($arrayfields['b.debit']['label'],$_SERVER['PHP_SELF'],'b.amount','',$param,'align="right"',$sortfield,$sortorder); + print_liste_field_titre($arrayfields['b.credit']['label'],$_SERVER['PHP_SELF'],'b.amount','',$param,'align="right"',$sortfield,$sortorder); + print "\n"; + + $balance = 0; // For balance + $balancecalculated = false; + $posconciliatecol = 0; + + // Loop on each record + $sign = 1; + + $totalarray=array(); + while ($i < min($num,$limit)) + { + $objp = $db->fetch_object($resql); + + // If we are in a situation where we need/can show balance, we calculate the start of balance + if (! $balancecalculated && (! empty($arrayfields['balancebefore']['checked']) || ! empty($arrayfields['balance']['checked'])) && $mode_balance_ok) + { + if (! $account) + { + dol_print_error('', 'account is not defined but $mode_balance_ok is true'); + exit; + } + + // Loop on each record before + $sign = 1; + $i = 0; + $sqlforbalance='SELECT SUM(b.amount) as balance'; + $sqlforbalance.= " FROM "; + $sqlforbalance.= " ".MAIN_DB_PREFIX."bank_account as ba,"; + $sqlforbalance.= " ".MAIN_DB_PREFIX."bank as b"; + $sqlforbalance.= " WHERE b.fk_account = ba.rowid"; + $sqlforbalance.= " AND ba.entity IN (".getEntity('bank_account').")"; + $sqlforbalance.= " AND b.fk_account = ".$account; + $sqlforbalance.= " AND (b.datev < '" . $db->idate($db->jdate($objp->dv)) . "' OR (b.datev = '" . $db->idate($db->jdate($objp->dv)) . "' AND (b.dateo < '".$db->idate($db->jdate($objp->do))."' OR (b.dateo = '".$db->idate($db->jdate($objp->do))."' AND b.rowid < ".$objp->rowid."))))"; + $resqlforbalance = $db->query($sqlforbalance); + if ($resqlforbalance) + { + $objforbalance = $db->fetch_object($resqlforbalance); + if ($objforbalance) + { + $balance = $objforbalance->balance; + } + } + else dol_print_error($db); + + $balancecalculated=true; + + // Output a line with start balance + if ($user->rights->banque->consolidate && $action == 'reconcile') + { + $tmpnbfieldbeforebalance=0; + $tmpnbfieldafterbalance=0; + $balancefieldfound=false; + foreach($arrayfields as $key => $val) + { + if ($key == 'balancebefore' || $key == 'balance') + { + $balancefieldfound=true; + continue; + } + if (! empty($arrayfields[$key]['checked'])) + { + if (! $balancefieldfound) $tmpnbfieldbeforebalance++; + else $tmpnbfieldafterbalance++; + } + } + + print ''; + if ($tmpnbfieldbeforebalance) + { + print ''; + } + print ''; + print ''; + print ''; + } + } + + $balance = price2num($balance + ($sign * $objp->amount),'MT'); + + if (empty($cachebankaccount[$objp->bankid])) + { + $bankaccounttmp = new Account($db); + $bankaccounttmp->fetch($objp->bankid); + $cachebankaccount[$objp->bankid]=$bankaccounttmp; + $bankaccount = $bankaccounttmp; + } + else + { + $bankaccount = $cachebankaccount[$objp->bankid]; + } + print ''; + + if ($first==""){ + print ''; + print ''; + $first="no"; + } + + // Ref + print ''; + if (! $i) $totalarray['nbfield']++; + + + // Date ope + print '\n"; + if (! $i) $totalarray['nbfield']++; + + // Bank account + print '\n"; + if (! $i) $totalarray['nbfield']++; + + // Debit + print '\n"; + if (! $i) $totalarray['nbfield']++; + if (! $i) $totalarray['totaldebfield']=$totalarray['nbfield']; + + // Credit + print '\n"; + if (! $i) $totalarray['nbfield']++; + if (! $i) $totalarray['totalcredfield']=$totalarray['nbfield']; + + print ""; + + $i++; + } + + // Show total line + if (isset($totalarray['totaldebfield']) || isset($totalarray['totalcredfield'])) + { + print ''; + $i=0; + while ($i < $totalarray['nbfield']) + { + $i++; + if ($i == 1) + { + if ($num < $limit && empty($offset)) print ''; + else print ''; + } + elseif ($totalarray['totaldebfield'] == $i) print ''; + elseif ($totalarray['totalcredfield'] == $i) print ''; + else print ''; + } + print ''; + } + + print "
'; + print ''; + print price(price2num($balance, 'MT'), 1, $langs); + print ''; + print '
'.$langs->trans("InitialBankBalance").''.price($cashcontrol->opening).'
'; + print $objp->facnumber; + print ''; + print ''.dol_print_date($db->jdate($objp->do),"day").""; + print "'; + print $bankaccount->getNomUrl(1); + if ($sql.=$conf->global->CASHDESK_ID_BANKACCOUNT_CASH==$bankaccount->rowid) $cash+=$objp->amount; + if ($sql.=$conf->global->CASHDESK_ID_BANKACCOUNT_CB==$bankaccount->rowid) $bank+=$objp->amount; + print "'; + if ($objp->amount < 0) + { + print price($objp->amount * -1); + $totalarray['totaldeb'] += $objp->amount; + } + print "'; + if ($objp->amount > 0) + { + print price($objp->amount); + $totalarray['totalcred'] += $objp->amount; + } + print "
'.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price(-1 * $totalarray['totaldeb']).''.price($totalarray['totalcred']).'
"; + + $cash=$cash+$cashcontrol->opening; + print "

".$langs->trans("Cash").": ".price($cash)."

".$langs->trans("PaymentTypeCB").": ".price($bank)."

"; + + + //save totals to DB + $sql = "UPDATE ".MAIN_DB_PREFIX."pos_cash_fence "; + $sql .= "SET"; + $sql .= " cash='".$cash."'"; + $sql .= ", card='".$bank."'"; + $sql .= " where rowid=".$id; + $db->query($sql); + + print "
"; + + print ''; + $db->free($resql); +} +else +{ + dol_print_error($db); +} + +llxFooter(); + +$db->close(); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index c97307bd830..3667f2ec157 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1244,6 +1244,13 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu if (preg_match('/checks/',$leftmenu)) $newmenu->add("/compta/paiement/cheque/card.php?leftmenu=checks_bis&action=new&mainmenu=bank",$langs->trans("NewChequeDeposit"),1,$user->rights->banque->cheque); if (preg_match('/checks/',$leftmenu)) $newmenu->add("/compta/paiement/cheque/list.php?leftmenu=checks_bis&mainmenu=bank",$langs->trans("List"),1,$user->rights->banque->cheque); } + + //Cash Control + if ($conf->takepos->enabled or $conf->cashdesk->enabled){ + $newmenu->add("/compta/cashcontrol/cashcontrol.php?action=list",$langs->trans("CashControl"),0,1, '', $mainmenu, 'cashcontrol'); + $newmenu->add("/compta/cashcontrol/cashcontrol.php?action=list",$langs->trans("List"),1,1); + $newmenu->add("/compta/cashcontrol/cashcontrol.php?action=create",$langs->trans("New"),1,1); + } } /* diff --git a/htdocs/install/mysql/tables/llx_pos_cash_fence.sql b/htdocs/install/mysql/tables/llx_pos_cash_fence.sql new file mode 100644 index 00000000000..f8014e17366 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_pos_cash_fence.sql @@ -0,0 +1,34 @@ +-- Copyright (C) 2018 Andreu Bisquerra +-- +-- 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/. + + +CREATE TABLE llx_pos_cash_fence( + rowid INTEGER AUTO_INCREMENT PRIMARY KEY, + entity INTEGER DEFAULT 1 NOT NULL, + label VARCHAR(255), + opening double(24,8) default 0, + cash double(24,8) default 0, + card double(24,8) default 0, + status INTEGER, + date_creation DATETIME NOT NULL, + day_close INTEGER, + month_close INTEGER, + year_close INTEGER, + posmodule VARCHAR(30), + posnumber VARCHAR(30), + fk_user_valid integer, + tms TIMESTAMP NOT NULL, + import_key VARCHAR(14) +) ENGINE=innodb; \ No newline at end of file From 33a91ff70779a3a8b5dfa5d7f974b44dd8acf3f7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 15 Dec 2018 16:47:06 +0100 Subject: [PATCH 3/5] Add missing POS closure feature --- .../install/mysql/migration/8.0.0-9.0.0.sql | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/htdocs/install/mysql/migration/8.0.0-9.0.0.sql b/htdocs/install/mysql/migration/8.0.0-9.0.0.sql index 98dc051e984..ef89604058e 100644 --- a/htdocs/install/mysql/migration/8.0.0-9.0.0.sql +++ b/htdocs/install/mysql/migration/8.0.0-9.0.0.sql @@ -229,3 +229,24 @@ ALTER TABLE llx_societe_rib ADD COLUMN comment varchar(255); ALTER TABLE llx_societe_rib ADD COLUMN ipaddress varchar(68); DROP TABLE llx_ticket_logs; + + +CREATE TABLE llx_pos_cash_fence( + rowid INTEGER AUTO_INCREMENT PRIMARY KEY, + entity INTEGER DEFAULT 1 NOT NULL, + label VARCHAR(255), + opening double(24,8) default 0, + cash double(24,8) default 0, + card double(24,8) default 0, + status INTEGER, + date_creation DATETIME NOT NULL, + day_close INTEGER, + month_close INTEGER, + year_close INTEGER, + posmodule VARCHAR(30), + posnumber VARCHAR(30), + fk_user_valid integer, + tms TIMESTAMP NOT NULL, + import_key VARCHAR(14) +) ENGINE=innodb; + From 527ad04ae8b68a09dc8dbb75942c3d27981ebe96 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 15 Dec 2018 18:11:40 +0100 Subject: [PATCH 4/5] FIX Mandatory field feature should works on textarea Conflicts: htdocs/core/lib/functions.lib.php --- htdocs/core/lib/functions.lib.php | 11 ++-- htdocs/langs/en_US/admin.lang | 2 +- htdocs/public/members/new.php | 2 + htdocs/user/class/user.class.php | 98 +++++++++++++++++++------------ 4 files changed, 69 insertions(+), 44 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e903777211d..39476ee97f3 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -7150,7 +7150,7 @@ function printCommonFooter($zone='private') if ($zone == 'private' && empty($conf->dol_use_jmobile)) { print "\n"; - print '/* JS CODE TO ENABLE to enable handler to switch left menu page (menuhider) */'."\n"; + print '/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'."\n"; print 'jQuery(".menuhider").click(function() {'; print ' console.log("We click on .menuhider");'."\n"; //print " $('.side-nav').animate({width:'toggle'},200);\n"; // OK with eldy theme but not with md @@ -7160,9 +7160,9 @@ function printCommonFooter($zone='private') } // Management of focus and mandatory for fields - if ($action == 'create' || $action == 'edit') + if ($action == 'create' || $action == 'edit' || (empty($action) && (preg_match('/new\.php/', $_SERVER["PHP_SELF"])))) { - print '/* Code js to manage focus and mandatory form fields */'."\n"; + print '/* JS CODE TO ENABLE to manage focus and mandatory form fields */'."\n"; $relativepathstring = $_SERVER["PHP_SELF"]; // Clean $relativepathstring if (constant('DOL_URL_ROOT')) $relativepathstring = preg_replace('/^'.preg_quote(constant('DOL_URL_ROOT'),'/').'/', '', $relativepathstring); @@ -7191,8 +7191,10 @@ function printCommonFooter($zone='private') { foreach($defval as $paramkey => $paramval) { - // Add property 'required' on input + // Set focus on field print 'jQuery("input[name=\''.$paramkey.'\']").focus();'."\n"; + print 'jQuery("textarea[name=\''.$paramkey.'\']").focus();'."\n"; + print 'jQuery("select[name=\''.$paramkey.'\']").focus();'."\n"; // Not really usefull, but we keep it in case of. } } } @@ -7221,6 +7223,7 @@ function printCommonFooter($zone='private') { // Add property 'required' on input print 'jQuery("input[name=\''.$paramkey.'\']").prop(\'required\',true);'."\n"; + print 'jQuery("textarea[name=\''.$paramkey.'\']").prop(\'required\',true);'."\n"; print 'jQuery("select[name=\''.$paramkey.'\']").prop(\'required\',true);'."\n"; // required on a select works only if key is "", this does not happen in Dolibarr } } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index d580fa90809..1a6487e4e26 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1819,7 +1819,7 @@ SocialNetworkSetup=Setup of module Social Networks EnableFeatureFor=Enable features for %s VATIsUsedIsOff=Note: The option to use sales Tax or VAT has been set to Off in the menu %s - %s, so Sale tax or Vat used will always be 0 for sales. SwapSenderAndRecipientOnPDF=Swap sender and recipient address on PDF -FeatureSupportedOnTextFieldsOnly=Warning, feature supported on text fields only +FeatureSupportedOnTextFieldsOnly=Warning, feature supported on text fields only. Also an URL parameter action=create or action=edit' must be set OR page name must end with 'new.php' to trigger this feature. EmailCollector=Email collector EmailCollectorDescription=Add a scheduled job and a setup page to scan regularly email boxes (using IMAP protocol) and record emails received into your application, at the right place and/or create some record automatically (like leads). NewEmailCollector=New Email Collector diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index 78b3ceb75db..9a85191e34f 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -76,6 +76,8 @@ $extrafields = new ExtraFields($db); $object = new Adherent($db); +$user->loadDefaultValues(); + /** * Show header for new member diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 6c0ff6e4915..4aaaff7ed21 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -422,45 +422,9 @@ class User extends CommonObject return -2; } - // Load user->default_values for user. TODO Save this in memcached ? - $sql = "SELECT rowid, entity, type, page, param, value"; - $sql.= " FROM ".MAIN_DB_PREFIX."default_values"; - $sql.= " WHERE entity IN (".$this->entity.",".$conf->entity.")"; - $sql.= " AND user_id IN (0, ".$this->id.")"; - $resql = $this->db->query($sql); - if ($resql) - { - while ($obj = $this->db->fetch_object($resql)) - { - if (! empty($obj->page) && ! empty($obj->type) && ! empty($obj->param)) - { - // $obj->page is relative URL with or without params - // $obj->type can be 'filters', 'sortorder', 'createform', ... - // $obj->param is key or param - $pagewithoutquerystring=$obj->page; - $pagequeries=''; - if (preg_match('/^([^\?]+)\?(.*)$/', $pagewithoutquerystring, $reg)) // There is query param - { - $pagewithoutquerystring=$reg[1]; - $pagequeries=$reg[2]; - } - $this->default_values[$pagewithoutquerystring][$obj->type][$pagequeries?$pagequeries:'_noquery_'][$obj->param]=$obj->value; - //if ($pagequeries) $this->default_values[$pagewithoutquerystring][$obj->type.'_queries']=$pagequeries; - } - } - // Sort by key, so _noquery_ is last - if(!empty($this->default_values)) { - foreach($this->default_values as $a => $b) - { - foreach($b as $c => $d) - { - krsort($this->default_values[$a][$c]); - } - } - } - $this->db->free($resql); - } - else + $result = $this->loadDefaultValues(); + + if ($result < 0) { $this->error=$this->db->lasterror(); return -3; @@ -470,6 +434,62 @@ class User extends CommonObject return 1; } + /** + * Load default value in property ->default_values + * + * @return int > 0 if OK, < 0 if KO + */ + function loadDefaultValues() + { + global $conf; + + // Load user->default_values for user. TODO Save this in memcached ? + $sql = "SELECT rowid, entity, type, page, param, value"; + $sql.= " FROM ".MAIN_DB_PREFIX."default_values"; + $sql.= " WHERE entity IN (".($this->entity > 0 ? $this->entity.", " : "").$conf->entity.")"; // Entity of user (if defined) + current entity + $sql.= " AND user_id IN (0".($this->id > 0 ? ", ".$this->id : "").")"; // User 0 (all) + me (if defined) + $resql = $this->db->query($sql); + if ($resql) + { + while ($obj = $this->db->fetch_object($resql)) + { + if (! empty($obj->page) && ! empty($obj->type) && ! empty($obj->param)) + { + // $obj->page is relative URL with or without params + // $obj->type can be 'filters', 'sortorder', 'createform', ... + // $obj->param is key or param + $pagewithoutquerystring=$obj->page; + $pagequeries=''; + if (preg_match('/^([^\?]+)\?(.*)$/', $pagewithoutquerystring, $reg)) // There is query param + { + $pagewithoutquerystring=$reg[1]; + $pagequeries=$reg[2]; + } + $this->default_values[$pagewithoutquerystring][$obj->type][$pagequeries?$pagequeries:'_noquery_'][$obj->param]=$obj->value; + //if ($pagequeries) $this->default_values[$pagewithoutquerystring][$obj->type.'_queries']=$pagequeries; + } + } + // Sort by key, so _noquery_ is last + if(!empty($this->default_values)) { + foreach($this->default_values as $a => $b) + { + foreach($b as $c => $d) + { + krsort($this->default_values[$a][$c]); + } + } + } + $this->db->free($resql); + + return 1; + } + else + { + dol_print_error($this->db); + return -1; + } + } + /** * Add a right to the user * From 944f9ac89412df1f599f6a7166b2fab5e987238c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 15 Dec 2018 18:14:08 +0100 Subject: [PATCH 5/5] Typo --- htdocs/langs/en_US/admin.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 1a6487e4e26..01900aba754 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1819,7 +1819,7 @@ SocialNetworkSetup=Setup of module Social Networks EnableFeatureFor=Enable features for %s VATIsUsedIsOff=Note: The option to use sales Tax or VAT has been set to Off in the menu %s - %s, so Sale tax or Vat used will always be 0 for sales. SwapSenderAndRecipientOnPDF=Swap sender and recipient address on PDF -FeatureSupportedOnTextFieldsOnly=Warning, feature supported on text fields only. Also an URL parameter action=create or action=edit' must be set OR page name must end with 'new.php' to trigger this feature. +FeatureSupportedOnTextFieldsOnly=Warning, feature supported on text fields only. Also an URL parameter action=create or action=edit must be set OR page name must end with 'new.php' to trigger this feature. EmailCollector=Email collector EmailCollectorDescription=Add a scheduled job and a setup page to scan regularly email boxes (using IMAP protocol) and record emails received into your application, at the right place and/or create some record automatically (like leads). NewEmailCollector=New Email Collector