[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Noalyss-commit] [noalyss] 08/26: Task #0002050: Mobile : menu différent
From: |
Dany De Bontridder |
Subject: |
[Noalyss-commit] [noalyss] 08/26: Task #0002050: Mobile : menu différent |
Date: |
Wed, 11 Aug 2021 11:08:10 -0400 (EDT) |
sparkyx pushed a commit to branch master
in repository noalyss.
commit b9744170845f02fa1a79901e7e390c25251a2200
Author: sparkyx <danydb@noalyss.eu>
AuthorDate: Thu Jul 29 18:04:25 2021 +0200
Task #0002050: Mobile : menu différent
---
html/ajax_misc.php | 4 +-
html/css/style-classic7.css | 125 +-
html/js/gestion.js | 1 -
html/js/noalyss_script.js | 2 +-
html/login.php | 33 +-
html/mobile.php | 100 +
include/ajax/ajax_get_profile.php | 11 +-
include/ajax/ajax_mobile_device_menu.php | 66 +
include/calendar.inc.php | 4 +-
include/class/calendar.class.php | 3 +-
include/class/mobile.class.php | 239 ++
include/class/mobile_device_mtable.class.php | 153 ++
include/class/profile_menu.class.php | 24 +-
include/class/user.class.php | 2621 ++++++++++----------
include/constant.php | 8 +-
include/database/profile_menu_sql.class.php | 4 +-
..._sql.class.php => profile_mobile_sql.class.php} | 67 +-
include/lib/message_javascript.php | 2 +-
include/profile.inc.php | 5 +-
include/sql/patch/upgrade163.sql | 22 +
include/template/calendar.php | 22 +-
include/template/mobile-display_menu.php | 69 +
22 files changed, 2233 insertions(+), 1352 deletions(-)
diff --git a/html/ajax_misc.php b/html/ajax_misc.php
index b764655..5d4ebf2 100644
--- a/html/ajax_misc.php
+++ b/html/ajax_misc.php
@@ -309,7 +309,9 @@ $path = array(
// report definition
"report_definition"=>"ajax_report_definition",
// search all card , analytic or accounting
- "search_account_card"=>"ajax_search_account_card"
+ "search_account_card"=>"ajax_search_account_card",
+ // Mobile device menu from mobile_device_mtable
+ "mobile_device_menu"=>"ajax_mobile_device_menu"
) ;
if (array_key_exists($op, $path)) {
diff --git a/html/css/style-classic7.css b/html/css/style-classic7.css
index ba1352d..498c084 100644
--- a/html/css/style-classic7.css
+++ b/html/css/style-classic7.css
@@ -563,23 +563,53 @@ select {
padding: 3px;
}
+.infobulle {
+ position:absolute;
+ border:1px solid #000000;
+ background-color:#FCFFCC;
+ padding-bottom: 10px;
+ padding-top: 10px;
+ padding-left: 10px;
+ padding-right: 10px;
+ color:#000000;
+ top:0px;left:0px;
+ visibility:hidden;
+ width:80%;
+ z-index:20;
+ }
+/* SM */
+@media (min-width: 576px) {
+ .infobulle {
+ position:absolute;
+ border:1px solid #000000;
+ background-color:#FCFFCC;
+ padding-bottom: 10px;
+ padding-top: 10px;
+ padding-left: 10px;
+ padding-right: 10px;
+ color:#000000;
+ top:0px;left:0px;
+ visibility:hidden;
+ width:400px;
+ width:25rem;
+ z-index:20;
+ }
+}
+/* MD */
+@media (min-width: 768px) {
-.infobulle {
- position:absolute;
- border:1px solid #000000;
- background-color:#FCFFCC;
- padding-bottom: 10px;
- padding-top: 10px;
- padding-left: 10px;
- padding-right: 10px;
- color:#000000;
- top:0px;left:0px;
- visibility:hidden;
- width:400px;
- width:25rem;
- z-index:20;
}
+/* LG */
+@media (min-width: 992px) {
+
+}
+/* XL */
+@media (min-width: 1200px) {
+
+}
+/**========*/
+
span.action {
height:48px;
@@ -1593,7 +1623,44 @@ div#bookmark_div {
left:30%;
width:40%;
}
+#error_div{
+ position:absolute;
+ border:1px solid #000000;
+ background-color:#DDE6FF;
+ padding-bottom: 2px;
+ padding-top: 2px;
+ padding-left: 2px;
+ padding-right: 2px;
+ color:#FF0000;
+ top:14%;left:2%;
+ visibility:hidden;
+ z-index:20;
+}
+/* SM */
+@media (min-width: 576px) {
+#error_div{
+ position:absolute;
+ border:1px solid #000000;
+ background-color:#DDE6FF;
+ padding-bottom: 2px;
+ padding-top: 2px;
+ padding-left: 2px;
+ padding-right: 2px;
+ color:#FF0000;
+ top:40%;left:25%;
+ visibility:hidden;
+ width:640px;
+ width:40rem;
+ z-index:20;
+}
+}
+/* MD */
+@media (min-width: 768px) {
+
+}
+/* LG */
+@media (min-width: 992px) {
#error_div{
position:absolute;
border:1px solid #000000;
@@ -1609,6 +1676,13 @@ div#bookmark_div {
width:40rem;
z-index:20;
}
+}
+/* XL */
+@media (min-width: 1200px) {
+
+}
+/**========*/
+
#error_div h2 {
background: #FF0000;
}
@@ -2960,7 +3034,7 @@ span.tagcell {
color:white;
}
.nav-pills .nav-link.active {
- background-color: #70829d !important;
+ background-color: hsl(224, 42%, 51.7%) !important;
border-radius: 0px;
}
.nav-pills .nav-link {
@@ -2972,7 +3046,7 @@ li.li-active {
}
.nav-level2 {
- background-color: #0b2d99;
+ background-color: hsl(240, 39%, 41.2%);
}
.nav-level2>li {
border-right: 1px #9fbcd6 ridge;
@@ -3027,3 +3101,22 @@ li.li-active {
color:white !important;
border: 0px solid black;
}
+/**
+ * Module for smartphone menu
+ */
+#mobile_module .nav-pills a.nav-link {
+ background-color:transparent !important;
+ color:navy !important;
+ border:1px solid blue;
+ margin:0px;
+ border-radius: 0px;
+ }
+#mobile_module .nav-pills a.nav-link:hover {
+ background-color: navy !important;
+ color:white !important;
+ border-radius: 0px;
+}
+#mobile_module h1 {
+ text-align: center;
+ font-weight: 700;
+}
\ No newline at end of file
diff --git a/html/js/gestion.js b/html/js/gestion.js
index 8356570..dec6e83 100644
--- a/html/js/gestion.js
+++ b/html/js/gestion.js
@@ -312,7 +312,6 @@ function action_add(p_dossier) {
if (p_xml.responseText === 'NOCONX') { reconnect();return;}
remove_waiting_box();
add_div({id: 'action_add_div',
- style:"top:1%;width:80%;left:10%" ,
cssclass: 'inner_box'});
$('action_add_div').innerHTML=p_xml.responseText;
p_xml.responseText.evalScripts();
diff --git a/html/js/noalyss_script.js b/html/js/noalyss_script.js
index 912fa10..15a9c60 100644
--- a/html/js/noalyss_script.js
+++ b/html/js/noalyss_script.js
@@ -2034,7 +2034,7 @@ function show_fin_chdate(obj_id)
function profile_show(p_div)
{
try {
- var div = ['profile_gen_div', 'profile_menu_div', 'profile_print_div',
'profile_gestion_div', 'profile_repo_div'];
+ var div = ['profile_gen_div', 'profile_menu_div', 'profile_print_div',
'profile_gestion_div', 'profile_repo_div','profile_menu_mobile_div'];
for (var r = 0; r < div.length; r++) {
$(div[r]).hide();
}
diff --git a/html/login.php b/html/login.php
index 3e4ab0b..70ce7dd 100644
--- a/html/login.php
+++ b/html/login.php
@@ -25,7 +25,7 @@ include_once NOALYSS_INCLUDE.'/lib/ac_common.php';
* \brief Login page
*/
-require_once NOALYSS_INCLUDE.'/class/database.class.php';
+
// Verif if User and Pass match DB
// if no, then redirect to the login page
$rep=new Database();
@@ -37,11 +37,9 @@ if (defined('MULTI') && MULTI == 0)
if ( isset ($_POST["p_user"] ) )
{
- $g_user=strtolower(sql_string($_POST["p_user"]));
- $g_pass=$_POST["p_pass"];
- $_SESSION[SESSION_KEY.'g_user']=$g_user;
- $_SESSION[SESSION_KEY.'g_pass']=$g_pass;
+ $User=new User($rep);
+ $User->Check(false,'LOGIN');
/*
@@ -57,9 +55,6 @@ if ( isset ($_POST["p_user"] ) )
echo "<META HTTP-EQUIV=\"REFRESH\"
content=\"3;url=admin-noalyss.php??action=upgrade&sb=database\">";
exit();
}
- require_once NOALYSS_INCLUDE."/class/user.class.php";
- $User=new User($rep);
- $User->Check(false,'LOGIN');
if (defined('NOALYSS_CAPTCHA') && NOALYSS_CAPTCHA==true)
{
include("securimage/securimage.php");
@@ -70,15 +65,21 @@ if ( isset ($_POST["p_user"] ) )
echo alert(_('Code invalide'));
echo "<META HTTP-EQUIV=\"REFRESH\" content=\"0;url=index.php\">";
exit();
+ }
}
+ if ($User->get_access_mode()=='PC')
+ {
+ // force the nocache
+ $backurl='user_login.php?v='.microtime(true);
+ if ( isset ($_POST['backurl'])) {
+ $backurl=urldecode($_POST['backurl']);
+ }
+ echo "<META HTTP-EQUIV=\"REFRESH\" content=\"0;url={$backurl}\">";
+ exit();
+ } else {
+ echo "<META HTTP-EQUIV=\"REFRESH\" content=\"0;url=mobile.php\">";
+ exit();
}
- // force the nocache
- $backurl='user_login.php?v='.microtime(true);
- if ( isset ($_POST['backurl'])) {
- $backurl=urldecode($_POST['backurl']);
- }
- echo "<META HTTP-EQUIV=\"REFRESH\" content=\"0;url={$backurl}\">";
- exit();
}
else
{
@@ -99,8 +100,6 @@ else
}
- include_once ("class/user.class.php");
-
$User=new User($rep);
$User->Check();
diff --git a/html/mobile.php b/html/mobile.php
new file mode 100644
index 0000000..7fc7ea7
--- /dev/null
+++ b/html/mobile.php
@@ -0,0 +1,100 @@
+<?php
+
+/*
+ * This file is part of NOALYSS.
+ *
+ * PhpCompta 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * PhpCompta 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 PhpCompta; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+/**
+ * @file
+ * @brief only for mobile device
+ */
+
+require_once '../include/constant.php';
+global $g_user;
+
+$cn=new Database();
+$g_user=new \User($cn);
+$g_user->check();
+define ('ALLOWED',true);
+
+//-----------------------------------------------------------------
+/// if $_REQUEST['gDossier'] is not set then select the folder
+//-----------------------------------------------------------------
+$http=new HttpInput();
+
+$dossier_id=$http->request("gDossier","number",-1);
+if ($dossier_id === -1) {
+ // count the available folder
+ $cnt_folder=$g_user->get_available_folder();
+
+ // if there is no available folder , then exit
+ if ($cnt_folder==0) {
+ echo _("Aucun dossier disponible");
+ redirect(NOALYSS_URL."/index.php", 3);
+ return;
+ }
+ if (count($cnt_folder ) == 1) {
+ // if only one folder available , connect to it
+ $dossier_id=$cnt_folder[0]['dos_id'];
+ put_global(array(['key'=>'gDossier',"value"=>$dossier_id]));
+ } else {
+ $mobile=new \Noalyss\Mobile();
+ //-----------------------------------------------------------------
+ // --- load the javascript and start a page ----------------------
+ //-----------------------------------------------------------------
+ $mobile->page_start();
+ // propose to select the available folder
+ echo '<ul class="nav bg-light flex-column">';
+ foreach ($cnt_folder as $folder)
+ {
+ echo '<li>';
+ echo '<a class="nav-item nav-link "
href="mobile.php?gDossier='.$folder['dos_id'].'">';
+ echo $folder['dos_id']." ".$folder['dos_name']."
".$folder["dos_description"];
+ echo '</a>';
+ echo '</li>';
+ }
+ echo '</ul>';
+ return;
+ }
+
+}
+// we are connected to a folder
+global $g_user,$cn;
+$cn=Dossier::connect();
+$g_user->setDb($cn);
+
+global $g_parameter;
+$g_parameter=new Noalyss_Parameter_Folder($cn);
+$mobile=new \Noalyss\Mobile();
+
+$ac=trim($http->request("ac","string",""));
+
+//-----------------------------------------------------------------
+/// If a module is selected the execute it
+//-----------------------------------------------------------------
+if ( $ac !== "" && $g_user->check_module($ac) == 1) {
+
+ // if $ac is in the mobile profile then execute it
+ $mobile->execute_menu($ac);
+} else {
+//-----------------------------------------------------------------
+/// inside a folder , propose a menu
+//-----------------------------------------------------------------
+ $mobile->page_start();
+ $mobile->display_menu();
+}
diff --git a/include/ajax/ajax_get_profile.php
b/include/ajax/ajax_get_profile.php
index 9379482..270978e 100644
--- a/include/ajax/ajax_get_profile.php
+++ b/include/ajax/ajax_get_profile.php
@@ -39,18 +39,19 @@ $profile=new Profile_sql($cn,$p_id);
$gDossier=Dossier::id();
$add_impression=HtmlInput::button("add", _("Ajout
Menu"),"onclick=\"add_menu({dossier:$gDossier,p_id:$p_id,type:'pr'})\"");
$call_tab=$http->post('tab', "string",'profile_gen_div');
-$a_tab=array('profile_gen_div'=>'tabs','profile_menu_div'=>'tabs','profile_print_div'=>'tabs','profile_gestion_div'=>'tabs','profile_repo_div'=>'tabs');
+$a_tab=array('profile_gen_div'=>'tabs','profile_menu_div'=>'tabs','profile_print_div'=>'tabs','profile_gestion_div'=>'tabs','profile_repo_div'=>'tabs',"profile_menu_mobile_div"=>"tabs");
$a_tab[$call_tab]='tabs_selected';
?>
<h1>Profil <?php echo $profile->p_name?></h1>
<?php
- echo HtmlInput::anchor(_('Retour'), "", " onclick = \"
$('detail_profile').hide();$('list_profile').show(); \" ", 'class="line"');
+ echo HtmlInput::anchor("❮"._('Retour'), "", " onclick = \"
$('detail_profile').hide();$('list_profile').show(); \" ", 'class="line"');
?>
<?php if ($p_id > 0 ) : ?>
<ul class="tabs">
<li class="<?php echo $a_tab['profile_gen_div']?>"><a
href="javascript:void(0)"
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_gen_div')"><?php
echo _('Nom')?></a></li>
<li class="<?php echo $a_tab['profile_menu_div']?>"><a
href="javascript:void(0)"
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_menu_div')"><?php
echo _('Détail Menus')?></a></li>
+ <li class="<?php echo $a_tab['profile_menu_mobile_div']?>"><a
href="javascript:void(0)"
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_menu_mobile_div')"><?php
echo _('Menu SmartPhone')?></a></li>
<li class="<?php echo $a_tab['profile_print_div']?>"><a
href="javascript:void(0)"
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_print_div')"><?php
echo _('Détail Impressions')?></a></li>
<li class="<?php echo $a_tab['profile_gestion_div']?>"><a
href="javascript:void(0)" style=""
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_gestion_div')"><?php
echo _('Groupe Gestion')?> </a></li>
<li class="<?php echo $a_tab['profile_repo_div']?>"><a
href="javascript:void(0)"
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_repo_div')"><?php
echo _('Dépôts')?></a>
@@ -112,6 +113,12 @@ if ($profile->p_id > 0)
$profile_menu->p_id=$p_id;
$profile_menu->display_profile_menu_detail();
echo '</div>';
+
+
+ echo '<div class="myfieldset" style="display:none"
id="profile_menu_mobile_div">';
+ $profile_menu->mobile_device();
+ echo '</div>';
+
echo '<div class="myfieldset" style="display:none"
id="profile_print_div">';
echo "<h1 class=\"legend\">"._("Impression")."</h1>";
$profile_menu->printing();
diff --git a/include/ajax/ajax_mobile_device_menu.php
b/include/ajax/ajax_mobile_device_menu.php
new file mode 100644
index 0000000..14fc61a
--- /dev/null
+++ b/include/ajax/ajax_mobile_device_menu.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of NOALYSS.
+ *
+ * PhpCompta 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * PhpCompta 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 PhpCompta; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+if (!defined('ALLOWED'))
+ die('Appel direct ne sont pas permis');
+
+/**
+ * @file
+ * @brief callback script for mobile_device_mtable
+ * @see Mobile_Device_MTable
+ */
+$http=new HttpInput();
+try
+{
+ $table=$http->request('table');
+ $action=$http->request('action');
+ $p_id=$http->request('p_id', "number");
+ $ctl_id=$http->request('ctl');
+ $profile_id=$http->request("profile_id","number");
+}
+catch (Exception $e)
+{
+ echo $e->getMessage();
+ return;
+}
+
+$object= Mobile_Device_MTable::build($p_id,$profile_id);
+$object->set_profile_id($profile_id);
+$object->set_object_name($ctl_id);
+$object->send_header();
+switch ($action)
+{
+ case "input":
+ echo $object->ajax_input()->saveXML();
+ break;
+
+ case "save":
+ echo $object->ajax_save()->saveXML();
+ break;
+
+ case "delete":
+ echo $object->ajax_delete()->saveXML();
+ break;
+
+ default:
+
+ break;
+}
\ No newline at end of file
diff --git a/include/calendar.inc.php b/include/calendar.inc.php
index 17c671d..50e3242 100644
--- a/include/calendar.inc.php
+++ b/include/calendar.inc.php
@@ -7,9 +7,9 @@
* @brief show the calendar
*/
if ( ! defined ('ALLOWED') ) die('Appel direct ne sont pas permis');
-
+$http=new HttpInput();
$cal=new Calendar();
-$cal->default_periode=(isset ($_GET['in']))?$_GET['in']:$g_user->get_periode();
+$cal->default_periode=(isset
($_GET['in']))?$http->get("in","number"):$g_user->get_periode();
?>
<div id="calendar_zoom_div">
diff --git a/include/class/calendar.class.php b/include/class/calendar.class.php
index 58aa9e1..e7fa774 100644
--- a/include/class/calendar.class.php
+++ b/include/class/calendar.class.php
@@ -152,7 +152,8 @@ class Calendar
}
}
}
- /*!\brief display a calendar after a call to Calendar::fill
+ /*!
+ *\brief display a calendar after a call to Calendar::fill
*\param $p_type long or short
*
*\return HTML String
diff --git a/include/class/mobile.class.php b/include/class/mobile.class.php
new file mode 100644
index 0000000..e882f7d
--- /dev/null
+++ b/include/class/mobile.class.php
@@ -0,0 +1,239 @@
+<?php
+
+/*
+ * This file is part of NOALYSS.
+ *
+ * PhpCompta 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * PhpCompta 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 PhpCompta; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+namespace Noalyss;
+
+use \HtmlInput;
+use \Dossier;
+use \User;
+
+/**
+ * @file
+ * @brief Main class for Mobile device
+ */
+
+/**
+ * @class Mobile
+ * @brief Main class for Mobile device
+ */
+class Mobile
+{
+ /**
+ * @brief Load a module with all its data from database thanks the
access_code
+ * @global \Noalyss\type $g_user
+ * @param type $p_access_code
+ * @return type
+ */
+
+ function load_module($p_access_code)
+ {
+ global $g_user;
+ $cn=Dossier::connect();
+ $aModule=$cn->get_row("
+ select
+ me_file,me_parameter,me_javascript,me_type,menu_ref.me_code,
+ pmo_id,pmo_order,pmo_default
+ from menu_ref
+ join profile_mobile using (me_code)
+ where
+ me_code=$1 and
+ (me_file is not null or trim(me_file) <>'' or
+ me_javascript is not null or trim (me_javascript) <> '')
+ and profile_mobile.p_id=$2",
+ array($p_access_code,$g_user->get_profile()));
+
+ if (count($aModule)==0)
+ {
+ return [];
+ }
+ return $aModule;
+ }
+ /**
+ * @brief HTML Page
+ * @staticvar int $already_call
+ * @return type
+ */
+ function page_start()
+ {
+ // check not called twiced
+ static $already_call=0;
+ if ($already_call==1)
+ return;
+ $already_call=1;
+
+ $style="style-classic7.css";
+
+ $title="NOALYSS";
+ echo '<!doctype html>';
+ printf("\n");
+
+ echo "<HTML>";
+
+ echo "<HEAD>";
+ echo '<meta charset="utf-8">';
+ echo "<META http-equiv=\"Content-Type\" content=\"text/html;
charset=UTF-8\">";
+ echo "
+ <TITLE>$title</TITLE>
+ <link rel=\"icon\" type=\"image/ico\" href=\"favicon.ico\" />
+ <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
+ <LINK id=\"bootstrap\" REL=\"stylesheet\" type=\"text/css\"
href=\"css/bootstrap.min.css\" media=\"screen\"/>
+ <LINK id=\"fontello\" REL=\"stylesheet\" type=\"text/css\"
href=\"css/font/fontello/css/fontello.css\" media=\"screen\"/>
+ <LINK id=\"pagestyle\" REL=\"stylesheet\" type=\"text/css\"
href=\"css/".$style."?version=".SVNINFO."\" media=\"screen\"/>
+ <link rel=\"stylesheet\" type=\"text/css\"
href=\"css/style-print.css?version=".SVNINFO."\" media=\"print\"/>";
+
+ // preload font
+ echo '<link rel="preload" href="./css/font/OpenSansRegular.woff"
as="font" crossorigin="anonymous" />';
+ echo '<link rel="preload"
href="./css/font/SansationLight/SansationLight.woff" as="font"
crossorigin="anonymous" />';
+ echo '<link rel="preload" href="./css/font/fontello/fontello.woff"
as="font" crossorigin="anonymous" />';
+
+ echo '<script language="javascript" src="js/calendar.js"></script>
+ <script type="text/javascript" src="js/lang/calendar-en.js"></script>';
+
+ if
(isset($_SESSION[SESSION_KEY.'g_lang'])&&$_SESSION[SESSION_KEY.'g_lang']=='fr_FR.utf8')
+ {
+ echo '<script type="text/javascript"
src="js/lang/calendar-fr.js"></script>';
+ }
+ elseif
(isset($_SESSION[SESSION_KEY.'g_lang'])&&$_SESSION[SESSION_KEY.'g_lang']=='nl_NL.utf8')
+ {
+ echo '<script type="text/javascript"
src="js/lang/calendar-nl.js"></script>';
+ }
+
+ echo '
+ <script language="javascript" src="js/calendar-setup.js"></script>
+ <LINK REL="stylesheet" type="text/css" href="css/calendar-blue.css"
media="screen">
+ ';
+ // language
+ if (isset($_SESSION[SESSION_KEY.'g_lang']))
+ {
+ set_language();
+ }
+
+ echo load_all_script();
+ echo ' </HEAD> ';
+
+ echo "<BODY>";
+ echo '<div id="info_div"></div>';
+ echo '<div id="error_div">'.
+ HtmlInput::title_box(_("Erreur"), 'error_div', 'hide').
+ '<div id="error_content_div">'.
+ '</div>'.
+ '<p style="text-align:center">'.
+ HtmlInput::button_action('Valider',
+
'$(\'error_div\').style.visibility=\'hidden\';$(\'error_content_div\').innerHTML=\'\';').
+ '</p>'.
+ '</div>';
+ }
+
+ /**
+ * @brief Display the menu available for this folder
+ *
+ */
+ public function display_menu()
+ {
+ if (DEBUGNOALYSS>1)
+ {
+ echo __CLASS__."→".__FUNCTION__;
+ }
+ $cn=Dossier::connect();
+ $user=new User($cn);
+
+ $aModule=$cn->get_array("select *
+ from profile_mobile pm
+ join menu_ref mr on (pm.me_code=mr.me_code)
+ where p_id=$1 order by pmo_order", [$user->get_profile()]);
+ require_once NOALYSS_TEMPLATE."/mobile-display_menu.php";
+ }
+
+ /**
+ * @brief execute the menu
+ * @global type $g_user
+ * @staticvar int $level
+ * @param type $p_access_code
+ * @return type
+ */
+ public function execute_menu($p_access_code)
+ {
+ global $g_user,$g_parameter,$cn;
+ $aModule=$this->load_module($p_access_code);
+ if ( empty($aModule)) {
+ return;
+ }
+ /*-- Load the standard headers if needed -- */
+ if ( $aModule['pmo_default'] == 1) {
+ $this->page_start();
+ }
+
+ echo HtmlInput::anchor("❮"._("Retour"),
"mobile.php?".http_build_query(["gDossier"=>Dossier::id()]));
+
+ if ($aModule['me_file']!="")
+ {
+ if ($aModule['me_parameter']!=="")
+ {
+ // if there are paramter put them in superglobal
+ $array=compute_variable($aModule['me_parameter']);
+ put_global($array);
+ }
+ if (DEBUGNOALYSS==2)
+ {
+ echo $aModule['me_file'], " param : ",
$aModule['me_parameter'];
+ }
+ /*
+ * Log the file we input to put in the folder test-noalyss for
replaying it
+ */
+ if (LOGINPUT)
+ {
+
$file_loginput=fopen($_ENV['TMP'].'/scenario-'.$_SERVER['REQUEST_TIME'].'.php',
'a+');
+ fwrite($file_loginput, "include '".$aModule['me_file']."';");
+ fwrite($file_loginput, "\n");
+ fclose($file_loginput);
+ }
+ // if file is not a plugin, include the file, otherwise
+ // include the plugin launcher
+ if ($aModule['me_type']!='PL')
+ {
+ if (file_exists($aModule['me_file']))
+ {
+ require_once $aModule['me_file'];
+ }
+ elseif (file_exists(NOALYSS_INCLUDE.'/'.$aModule['me_file']))
+ {
+ require_once NOALYSS_INCLUDE.'/'.$aModule['me_file'];
+ }
+ else
+ {
+ echo echo_warning(_("Fichier non trouvé"));
+ }
+ }
+ else
+ {
+ require 'extension_get.inc.php';
+ }
+
+ exit();
+ }
+ elseif ($aModule['me_javascript']!='')
+ {
+ $js=str_replace('<DOSSIER>', dossier::id(),
$aModule['me_javascript']);
+ echo create_script($js);
+ }
+ }
+
+}
diff --git a/include/class/mobile_device_mtable.class.php
b/include/class/mobile_device_mtable.class.php
new file mode 100644
index 0000000..4a4b8a6
--- /dev/null
+++ b/include/class/mobile_device_mtable.class.php
@@ -0,0 +1,153 @@
+<?php
+
+/*
+ * This file is part of NOALYSS.
+ *
+ * PhpCompta 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * PhpCompta 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 PhpCompta; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+/**
+ * @file
+ * @brief Manage the table profile_mobile
+ */
+
+/**
+ * @class Mobile_Device_MTable
+ * @brief Manage the table profile_mobile
+ */
+class Mobile_Device_MTable extends Manage_Table_SQL
+{
+ private $profile_id; //!< profile_mobile.p_id profile
+
+ function __construct(Profile_Mobile_SQL $p_table)
+ {
+ parent::__construct($p_table);
+ $this->set_append_row(true);
+ $this->set_delete_row(true);
+ $this->set_col_label("me_code", _("Code Menu"));
+ $this->set_col_label("pmo_order", _("Ordre apparition"));
+ $this->set_col_label("pmo_default", _("Entêtes standards"));
+ $this->set_col_tips("pmo_default",80 );
+ $this->set_property_visible("pmo_id", false);
+ $this->set_property_visible("p_id", false);
+ $this->set_col_type("pmo_default", "select",array(
+
["value"=>1,"label"=>_("Oui")],
+
["value"=>0,"label"=>_("Non")]
+ ));
+ $this->set_col_type("me_code","custom");
+ $this->set_col_type("pmo_order","numeric");
+ $this->set_header_option("pmo_order",'style="text-align:right;"');
+ $this->set_callback("ajax_misc.php");
+ $this->add_json_param("op","mobile_device_menu");
+ $this->set_sort_column("pmo_order");
+ $this->set_col_sort(1);
+ $this->set_order(["me_code","pmo_order","pmo_default"]);
+
+
+ $this->set_object_name("profile_menu_mtable");
+ }
+ public function get_profile_id()
+ {
+ return $this->profile_id;
+ }
+
+ public function set_profile_id($profile_id)
+ {
+ $this->profile_id=$profile_id;
+ $this->get_table()->setp('p_id',$profile_id);
+ $this->add_json_param("profile_id",$profile_id);
+ return $this;
+ }
+
+ /**
+ * @brief
+ * @param number $p_id profile_mobile.pmo_id
+ * @param number $profile_id profile_mobile.p_id profile
+ * @return \Mobile_Device_MTable
+ */
+ static function build($p_id,$profile_id)
+ {
+ $cn=Dossier::connect();
+ $profile_mobile=new Profile_Mobile_SQL($cn,$p_id);
+ if ( $p_id== -1) {
+ $profile_mobile->setp("pmo_order",5);
+ $profile_mobile->setp("pmo_default",1);
+ }
+
+ $mobile_device_table=new Mobile_Device_MTable($profile_mobile);
+ /* $mobile_device_table->set_profile_id($profile_id);
+ $mobile_device_table->get_table()->setp('p_id',$profile_id);*/
+ return $mobile_device_table;
+ }
+ function input_custom($p_key,$p_value)
+ {
+
+ if ( $p_key == "me_code") {
+ $select = new ISelect("me_code");
+ $cn=$this->get_table()->get_cn();
+ $select->value=$cn->make_array("select me_code , me_code ||'
'||coalesce(me_description,'') from menu_ref
+ where
+ me_type in ('PL','ME') and trim(me_code) != 'new_line'
+ order by me_code");
+ $select->rowsize=17;
+ $select->selected=$p_value;
+ echo td($select->input());
+ return;
+ }
+ }
+ function display_row_custom($p_key, $p_value, $p_id=0)
+ {
+ if ( $p_key == 'me_code') {
+ echo td($p_value);
+ return;
+ }
+ }
+ /**
+ * @brief before inserting or updating, check that the data are correct ,
+ *
+ */
+ function check()
+ {
+ // DB connection
+ $cn=$this->get_table()->cn;
+ // object to insert
+ $profile_mobile_sql=$this->get_table();
+
$profile_mobile_sql->me_code=strtoupper($profile_mobile_sql->getp('me_code'));
+ $me_code=$profile_mobile_sql->me_code;
+
+ $profile_id=$profile_mobile_sql->getp("p_id");
+ $pmo_id=$profile_mobile_sql->getp("pmo_id");
+
+ // check for duplicate
+ if ( $cn->get_value("select count(*) from profile_mobile where p_id =
$1 and me_code=$2 and pmo_id <> $3",
+ array($profile_id,$me_code,$pmo_id )) > 0
+ ) {
+ $this->set_error("me_code", _("Doublon"));
+ }
+
+ if (isNumber($profile_mobile_sql->getp("pmo_order")) != 1 ) {
+ $this->set_error("pmo_order", _("doit être un nombre"));
+ }
+
+ if ( $cn->get_value("select count(*) from menu_ref where
me_code=$1",[$me_code]) == 0) {
+ $this->set_error ("me_code",_('Menu code invalide'));
+ }
+ if ($this->count_error() > 0) {
+ return false;
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/include/class/profile_menu.class.php
b/include/class/profile_menu.class.php
index b16e509..76d1dff 100644
--- a/include/class/profile_menu.class.php
+++ b/include/class/profile_menu.class.php
@@ -21,12 +21,18 @@
require_once NOALYSS_INCLUDE.'/database/profile_menu_sql.class.php';
/**
- * Manage the menu of a profile
+ * @file
+ * @brief Manage the menu of a profile
*
* @author dany
*/
+/**
+ * @class Profile_Menu
+ * @brief Manage the menu of a profile
+ */
class Profile_Menu extends Profile_Menu_sql
{
+
function __construct($p_cn, $p_id=-1)
{
@@ -35,7 +41,7 @@ class Profile_Menu extends Profile_Menu_sql
}
/**
- * Display the content of a profile menu for printing
+ * @brief Display the content of a profile menu for printing
* @param type $resource
* @param type $p_id
*/
@@ -97,7 +103,7 @@ class Profile_Menu extends Profile_Menu_sql
}
/**
- * Show a table with all the menu and the type
+ * @brief Show a table with all the menu and the type
* @param type $p_id profile.p_id
*/
function display_profile_menu_detail()
@@ -224,7 +230,7 @@ class Profile_Menu extends Profile_Menu_sql
}
/**
- * Show the available profile for the profile $p_id, it concerns only
the action of management (action-gestion)
+ * @brief Show the available profile for the profile $p_id, it
concerns only the action of management (action-gestion)
* @param $p_id is the profile p_id
*/
function available_profile()
@@ -250,7 +256,7 @@ class Profile_Menu extends Profile_Menu_sql
}
/**
- * Show the available repository for the profile $p_id
+ * @brief Show the available repository for the profile $p_id
* @param $p_id is the profile p_id
*/
function available_repository()
@@ -273,6 +279,14 @@ class Profile_Menu extends Profile_Menu_sql
);
require_once NOALYSS_TEMPLATE.'/profile_sec_repository.php';
}
+ /**
+ * @brief menu for device
+ */
+ function mobile_device() {
+ $profile_mobile=Mobile_Device_MTable::build(0,$this->p_id);
+ $profile_mobile->display_table("where p_id=$1 order by
pmo_order",[ $this->p_id ]);
+ echo
create_script("profile_menu_mtable.param_add({profile_id:{$this->p_id}});");
+ }
}
diff --git a/include/class/user.class.php b/include/class/user.class.php
index 5a7cb6f..35771c0 100644
--- a/include/class/user.class.php
+++ b/include/class/user.class.php
@@ -18,16 +18,14 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// Copyright Author Dany De Bontridder danydb@aevalys.eu
-/**
+/**
* @file
* @brief Data & function about connected users
*/
-
/**
* @brief Data & function about connected users
*
*/
-
require_once NOALYSS_INCLUDE.'/constant.php';
require_once NOALYSS_INCLUDE.'/lib/user_common.php';
require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
@@ -35,63 +33,115 @@ require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
class User
{
- var $id;
- var $pass;
- var $db;
- var $admin;
- var $valid;
+ var $id; //!< in account_repository , ac_users.use_id
+ var $pass; //!< password
+ var $db; //!< database connx
+ var $admin; //!< is or is not admin
+ var $valid; //!< is or is not valid
var $first_name;
var $name;
- var $active ;
- var $login ;
- var $password ;
- var $email ;
-
- function __construct($p_cn, $p_id = -1)
- {
- // if p_id is not set then check the connected user
- if ($p_id == -1)
- {
- if (!isset($_SESSION[SESSION_KEY.'g_user']))
- {
- $http=new \HttpInput();
- $user_login=$http->request("p_user","string","");
- $user_password=$http->request("p_pass","string","");
-
- if ($user_login != "" && $user_password != "") {
- $_SESSION[SESSION_KEY."g_user"]=$user_login;
- $_SESSION[SESSION_KEY."g_pass"]=$user_password;
- } else {
- echo '<h2 class="error">' . _('Session
expirée<br>Utilisateur déconnecté') . '</h2>';
- redirect('index.php', 1);
- exit();
- }
- }
-
- $this->login
=strtolower($_SESSION[SESSION_KEY.'g_user']);
- $this->pass = $_SESSION[SESSION_KEY.'g_pass'];
- $this->id = -1;
- $this->db = $p_cn;
- $this->lang = (isset($_SESSION[SESSION_KEY.'g_lang']))
? $_SESSION[SESSION_KEY.'g_lang'] : 'fr_FR.utf8';
- $this->valid =
(isset($_SESSION[SESSION_KEY.'isValid'])) ? 1 : 0;
- if (isset($_SESSION[SESSION_KEY.'g_theme']))
- $this->theme = $_SESSION[SESSION_KEY.'g_theme'];
-
- $this->admin = (
isset($_SESSION[SESSION_KEY.'use_admin']) ) ?
$_SESSION[SESSION_KEY.'use_admin'] : 0;
-
- if (isset($_SESSION[SESSION_KEY.'use_name']))
- $this->name = $_SESSION[SESSION_KEY.'use_name'];
- if (isset($_SESSION[SESSION_KEY.'use_first_name']))
- $this->first_name =
$_SESSION[SESSION_KEY.'use_first_name'];
- $this->load();
- }
- else // if p_id is set get data of another user
- {
- $this->id = $p_id;
- $this->db = $p_cn;
- $this->load();
- }
- }
+ var $active; //!< 1 active , 0 disables
+ var $login; //!< login lower case
+ var $password; //!< password
+ var $email; //!< user's email
+ var $access_mode; //!< MOBILE or PC depending if when connecting $login
contains @mobile
+
+ function __construct($p_cn, $p_id=-1)
+ {
+ $this->db=$p_cn;
+ // if p_id is not set then check the connected user
+ if ($p_id==-1)
+ {
+ $this->connect_user();
+ }
+ else // if p_id is set get data of another user
+ {
+ $this->id=$p_id;
+ $this->load();
+ }
+ }
+
+ /**
+ * @brief connect the user and set the $_SESSION variables if not set
thanks the $_REQUEST
+ */
+ private function connect_user()
+ {
+ if (!isset($_SESSION[SESSION_KEY.'g_user']))
+ {
+ $http=new \HttpInput();
+ $user_login=$http->request("p_user", "string", "");
+ $user_password=$http->request("p_pass", "string", "");
+
+ if ($user_login!=""&&$user_password!="")
+ {
+ $_SESSION[SESSION_KEY."g_user"]=$user_login;
+ $_SESSION[SESSION_KEY."g_pass"]=$user_password;
+ }
+ else
+ {
+ echo '<h2 class="error">'._('Session expirée<br>Utilisateur
déconnecté').'</h2>';
+ redirect('index.php', 1);
+ exit();
+ }
+
+
+ if (strpos($user_login, '@mobile')!=false)
+ {
+ $this->access_mode='MOBILE';
+ $this->login=str_ireplace("@mobile", "", $user_login);
+ }
+ else
+ {
+ $this->access_mode='PC';
+ $this->login=strtolower($user_login);
+ }
+
+ $_SESSION[SESSION_KEY."access_mode"]=$this->access_mode;
+ $_SESSION[SESSION_KEY.'g_user']=$this->login;
+ }
+ $this->login=$_SESSION[SESSION_KEY."g_user"];
+ $this->pass=$_SESSION[SESSION_KEY.'g_pass'];
+ $this->id=-1;
+
$this->lang=(isset($_SESSION[SESSION_KEY.'g_lang']))?$_SESSION[SESSION_KEY.'g_lang']:'fr_FR.utf8';
+ $this->access_mode=$_SESSION[SESSION_KEY."access_mode"];
+
+ if ($this->load()==-1)
+ {
+ echo '<h2 class="error">'._('Utilisateur ou mot de passe
incorrect').'</h2>';
+
+ redirect('logout.php', 1);
+ exit();
+ }
+
+ $this->load_global_pref();
+
+ $_SESSION[SESSION_KEY.'g_lang']=$this->lang;
+ $this->valid=(isset($_SESSION[SESSION_KEY.'isValid']))?1:0;
+ if (isset($_SESSION[SESSION_KEY.'g_theme']))
+ {
+ $this->theme=$_SESSION[SESSION_KEY.'g_theme'];
+ }
+ $_SESSION[SESSION_KEY.'use_admin']=$this->admin;
+ $_SESSION[SESSION_KEY.'use_name']=$this->name;
+ $_SESSION[SESSION_KEY.'use_first_name']=$this->first_name;
+ }
+
+ /**
+ * @brief access_mode tells what mode must be used : pc or mobile
+ */
+ public function get_access_mode()
+ {
+ return $this->access_mode;
+ }
+
+ /**
+ * @brief access_mode tells what mode must be used : pc or mobile
+ */
+ public function set_access_mode($access_mode): object
+ {
+ $this->access_mode=$access_mode;
+ return $this;
+ }
/**
* @return int|mixed
@@ -106,7 +156,7 @@ class User
*/
public function setId(int $id): void
{
- $this->id = $id;
+ $this->id=$id;
}
/**
@@ -122,7 +172,7 @@ class User
*/
public function setPass($pass): void
{
- $this->pass = $pass;
+ $this->pass=$pass;
}
/**
@@ -138,7 +188,7 @@ class User
*/
public function setDb($db): void
{
- $this->db = $db;
+ $this->db=$db;
}
/**
@@ -154,7 +204,7 @@ class User
*/
public function setAdmin($admin): void
{
- $this->admin = $admin;
+ $this->admin=$admin;
}
/**
@@ -170,7 +220,7 @@ class User
*/
public function setValid(int $valid): void
{
- $this->valid = $valid;
+ $this->valid=$valid;
}
/**
@@ -186,7 +236,7 @@ class User
*/
public function setFirstName($first_name): void
{
- $this->first_name = $first_name;
+ $this->first_name=$first_name;
}
/**
@@ -202,7 +252,7 @@ class User
*/
public function setName($name): void
{
- $this->name = $name;
+ $this->name=$name;
}
/**
@@ -218,7 +268,7 @@ class User
*/
public function setActive($active): void
{
- $this->active = $active;
+ $this->active=$active;
}
/**
@@ -234,7 +284,7 @@ class User
*/
public function setLogin(string $login): void
{
- $this->login = $login;
+ $this->login=$login;
}
/**
@@ -250,7 +300,7 @@ class User
*/
public function setPassword($password): void
{
- $this->password = $password;
+ $this->password=$password;
}
/**
@@ -266,30 +316,30 @@ class User
*/
public function setEmail($email): void
{
- $this->email = $email;
- }
-
- /**\brief load data from database.
- * if this->id == -1, it is unknown so we have to retrieve it
- from the database by the login
- * return -1 if nothing is found
- */
-
- function load()
- {
- /* if this->id == -1, it is unknown so we have to retrieve it
from
- the database thanks it login */
- if ($this->id < 0)
- {
- $sql_cond = " where lower(use_login)=lower($1)";
- $sql_array = array($this->login);
- }
- else
- {
- $sql_cond = " where use_id=$1";
- $sql_array = array($this->id);
- }
- $sql = "select use_id,
+ $this->email=$email;
+ }
+
+ /* * \brief load data from database.
+ * if this->id == -1, it is unknown so we have to retrieve it
+ from the database by the login
+ * return -1 if nothing is found
+ */
+
+ function load()
+ {
+ /* if this->id == -1, it is unknown so we have to retrieve it from
+ the database thanks it login */
+ if ($this->id<0)
+ {
+ $sql_cond=" where lower(use_login)=lower($1)";
+ $sql_array=array($this->login);
+ }
+ else
+ {
+ $sql_cond=" where use_id=$1";
+ $sql_array=array($this->id);
+ }
+ $sql="select use_id,
use_first_name,
use_name,
use_login,
@@ -298,281 +348,284 @@ class User
use_pass,
use_email
from ac_users ";
- $cn = new Database();
- $Res = $cn->exec_sql($sql . $sql_cond, $sql_array);
- if (($Max = Database::num_row($Res)) == 0)
- return -1;
- $row = Database::fetch_array($Res, 0);
- $this->id = $row['use_id'];
- $this->first_name = $row['use_first_name'];
- $this->last_name = $row['use_name'];
- $this->name = $row['use_name'];
- $this->active = $row['use_active'];
- $this->login =strtolower($row['use_login']);
- $this->admin = $row['use_admin'];
- $this->password = $row['use_pass'];
- $this->email=$row['use_email'];
- }
-
- function save()
- {
-
- $Sql = "update ac_users set use_first_name=$1, use_name=$2
+ $cn=new Database();
+ $Res=$cn->exec_sql($sql.$sql_cond, $sql_array);
+ if (($Max=Database::num_row($Res))==0)
+ return -1;
+ $row=Database::fetch_array($Res, 0);
+ $this->id=$row['use_id'];
+ $this->first_name=$row['use_first_name'];
+ $this->last_name=$row['use_name'];
+ $this->name=$row['use_name'];
+ $this->active=$row['use_active'];
+ $this->login=strtolower($row['use_login']);
+ $this->admin=$row['use_admin'];
+ $this->password=$row['use_pass'];
+ $this->email=$row['use_email'];
+ }
+
+ function save()
+ {
+
+ $Sql="update ac_users set use_first_name=$1, use_name=$2
,use_active=$3,use_admin=$4,use_pass=$5 ,use_email = $7 where
use_id=$6";
- $cn = new Database();
- $Res = $cn->exec_sql($Sql, array($this->first_name,
$this->last_name, $this->active, $this->admin, $this->pass,
$this->id,$this->email));
- }
- function insert()
- {
+ $cn=new Database();
+ $Res=$cn->exec_sql($Sql,
+ array($this->first_name, $this->last_name, $this->active,
$this->admin, $this->pass, $this->id, $this->email));
+ }
+
+ function insert()
+ {
- $Sql = "INSERT INTO ac_users(
+ $Sql="INSERT INTO ac_users(
use_first_name, use_name, use_login, use_active,
use_admin, use_pass, use_email)
VALUES ($1, $2, $3, $4, $5, $6, $7) returning
use_id";
- $cn = new Database();
- $this->id= $cn->get_value($Sql, array($this->first_name,
$this->last_name, $this->login,1,0, $this->pass,$this->email));
- }
-
- /**
- * \brief Check if user is active and exists in therepository
- * Automatically redirect, it doesn't check if a user can access a
folder
- * \param $silent false, echo an error message and exit, true : exit
without warning
- * default is false
- *
- ++ */
+ $cn=new Database();
+ $this->id=$cn->get_value($Sql,
+ array($this->first_name, $this->last_name, $this->login, 1, 0,
$this->pass, $this->email));
+ }
- function Check($silent = false, $from = '')
- {
+ /**
+ * \brief Check if user is active and exists in therepository
+ * Automatically redirect, it doesn't check if a user can access a folder
+ * \param $silent false, echo an error message and exit, true : exit
without warning
+ * default is false
+ *
+ ++ */
+ function Check($silent=false, $from='')
+ {
- $res = 0;
- $pass5 = md5($this->pass);
+ $res=0;
+ $pass5=md5($this->pass);
- $cn = new Database();
- $sql = "select ac_users.use_login,ac_users.use_active,
ac_users.use_pass,
+ $cn=new Database();
+ $sql="select ac_users.use_login,ac_users.use_active, ac_users.use_pass,
use_admin,use_first_name,use_name
from ac_users
where ac_users.use_id=$1
and ac_users.use_active=1
and ac_users.use_pass=$2";
- $ret = $cn->exec_sql($sql,array($this->id,$pass5));
- $res = Database::num_row($ret);
- if ($res > 0)
- {
- $r = Database::fetch_array($ret, 0);
- $_SESSION[SESSION_KEY.'use_admin'] = $r['use_admin'];
- $_SESSION[SESSION_KEY.'use_name'] = $r['use_name'];
- $_SESSION[SESSION_KEY.'use_first_name'] =
$r['use_first_name'];
- $_SESSION[SESSION_KEY.'isValid'] = 1;
-
- $this->admin = $_SESSION[SESSION_KEY.'use_admin'];
- $this->name = $_SESSION[SESSION_KEY.'use_name'];
- $this->first_name =
$_SESSION[SESSION_KEY.'use_first_name'];
- $this->load_global_pref();
- }
- $sql = "insert into audit_connect
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
-
- if ($res == 0)
- {
- $cn->exec_sql($sql,
array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"],
- $from, $_SERVER['REQUEST_URI'], 'FAIL'));
- if (!$silent)
- {
- echo '<script> alert(\''._('Utilisateur ou mot
de passe incorrect').'\')</script>';
- redirect('index.html');
- }
- $this->valid = 0;
- session_unset();
- exit - 1;
- }
- else
- {
- if ($from == 'LOGIN')
- $cn->exec_sql($sql,
array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], $from,
- $_SERVER['REQUEST_URI'], 'SUCCESS'));
- $this->valid = 1;
- }
-
- return $ret;
- }
-
- /**
- * \brief return the access to a folder,
- * \param $p_dossier id if it is == 0 then we take the value from
$_SESSION
- * \return the priv_priv
- * - X no access
- * - R has access (normal user)
-
- *
- */
-
- function get_folder_access($p_dossier = 0)
- {
-
- if ($p_dossier == 0)
- $p_dossier = dossier::id();
- if ($this->admin == 1) return 'R';
- $cn = new Database();
-
- $sql = "select 'R' from jnt_use_dos where use_id=$1 and
dos_id=$2";
-
- $res = $cn->get_value($sql, array($this->id, $p_dossier));
-
- if ($cn->get_affected()== 0) return 'X';
- return $res;
- }
-
- /**
- * \brief save the access of a folder
- * \param $db_id the dossier id
- * \param $priv boolean, true then it is granted, false it is removed
- */
-
- function set_folder_access($db_id, $priv)
+ $ret=$cn->exec_sql($sql, array($this->id, $pass5));
+ $res=Database::num_row($ret);
+ if ($res>0)
{
+ $r=Database::fetch_array($ret, 0);
+ $_SESSION[SESSION_KEY.'use_admin']=$r['use_admin'];
+ $_SESSION[SESSION_KEY.'use_name']=$r['use_name'];
+ $_SESSION[SESSION_KEY.'use_first_name']=$r['use_first_name'];
+ $_SESSION[SESSION_KEY.'isValid']=1;
+
+ $this->admin=$_SESSION[SESSION_KEY.'use_admin'];
+ $this->name=$_SESSION[SESSION_KEY.'use_name'];
+ $this->first_name=$_SESSION[SESSION_KEY.'use_first_name'];
+ $this->load_global_pref();
+ }
+ $sql="insert into audit_connect
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
- $cn=new Database();
- if ($priv)
+ if ($res==0)
+ {
+ $cn->exec_sql($sql,
+ array($_SESSION[SESSION_KEY.'g_user'],
$_SERVER["REMOTE_ADDR"],
+ $from, $_SERVER['REQUEST_URI'], 'FAIL'));
+ if (!$silent)
{
- // the access is granted
- $jnt=$cn->get_value("select jnt_id from jnt_use_dos where
dos_id=$1 and use_id=$2",
- array($db_id, $this->id));
+ echo '<script> alert(\''._('Utilisateur ou mot de passe
incorrect').'\')</script>';
+ redirect('index.html');
+ }
+ $this->valid=0;
+ session_unset();
+ exit-1;
+ }
+ else
+ {
+ if ($from=='LOGIN')
+ $cn->exec_sql($sql,
+ array($_SESSION[SESSION_KEY.'g_user'],
$_SERVER["REMOTE_ADDR"], $from,
+ $_SERVER['REQUEST_URI'], 'SUCCESS'));
+ $this->valid=1;
+ }
+
+ return $ret;
+ }
+
+ /**
+ * \brief return the access to a folder,
+ * \param $p_dossier id if it is == 0 then we take the value from $_SESSION
+ * \return the priv_priv
+ * - X no access
+ * - R has access (normal user)
+
+ *
+ */
+ function get_folder_access($p_dossier=0)
+ {
+
+ if ($p_dossier==0)
+ $p_dossier=dossier::id();
+ if ($this->admin==1)
+ return 'R';
+ $cn=new Database();
+
+ $sql="select 'R' from jnt_use_dos where use_id=$1 and dos_id=$2";
+
+ $res=$cn->get_value($sql, array($this->id, $p_dossier));
+
+ if ($cn->get_affected()==0)
+ return 'X';
+ return $res;
+ }
+
+ /**
+ * \brief save the access of a folder
+ * \param $db_id the dossier id
+ * \param $priv boolean, true then it is granted, false it is removed
+ */
+ function set_folder_access($db_id, $priv)
+ {
- if ($cn->size()==0)
- {
+ $cn=new Database();
+ if ($priv)
+ {
+ // the access is granted
+ $jnt=$cn->get_value("select jnt_id from jnt_use_dos where
dos_id=$1 and use_id=$2", array($db_id, $this->id));
- $Res=$cn->exec_sql("insert into jnt_use_dos(dos_id,use_id)
values($1,$2)", array($db_id, $this->id));
- }
- }
- else
+ if ($cn->size()==0)
{
- // Access is revoked
- $cn->exec_sql('delete from jnt_use_dos where use_id = $1 and
dos_id = $2 ', array($this->id, $db_id));
+
+ $Res=$cn->exec_sql("insert into jnt_use_dos(dos_id,use_id)
values($1,$2)", array($db_id, $this->id));
}
}
+ else
+ {
+ // Access is revoked
+ $cn->exec_sql('delete from jnt_use_dos where use_id = $1 and
dos_id = $2 ', array($this->id, $db_id));
+ }
+ }
/**
- * \brief check that a user is valid and the access to the folder
- * \param $p_ledger the ledger to check
- * \return the priv_priv
- * - O only predefined operation
- * - W write
- * - R read only
- * - X no access
- *
-
- *
- */
-
- function get_ledger_access($p_ledger)
- {
- if ($this->admin == 1 ||
- $this->is_local_admin(dossier::id()) == 1
- || $this->get_status_security_ledger()==0)
- return 'W';
-
- $sql = "select uj_priv from user_sec_jrn where uj_login=$1 and
uj_jrn_id=$2";
- $res = $this->db->get_value($sql, array($this->login,
$p_ledger));
-
- if ($res == '')
- $res = 'X';
- return $res;
- }
-
- /**
- * \brief get all the available ledgers for the current user
- * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
- * \param $p_access =3 for Read or WRITE, 2 write, 1 for readonly
- * \param (boolean) $all if true show also inactive
- * \return a double array of available ledgers
- @verbatim
- [0] => [jrn_def_id]
- [jrn_def_type]
- [jrn_def_name]
- [jrn_def_class_deb]
- [jrn_def_class_cred]
- [jrn_type_id]
- [jrn_desc]
- [uj_priv]
- @endverbatim
- */
-
- function get_ledger($p_type = 'ALL', $p_access = 3,$disable=TRUE)
- {
- $p_type=strtoupper($p_type);
- if (! in_array($p_type, ["FIN","ALL","ODS","VEN",'ACH'])) {
- record_log(sprintf("UGL1, p_type %s",$p_type));
- throw new Exception("UGL1"._("Type incorrecte"));
- }
- if ($disable==TRUE) {
- $sql_enable="";
- } else {
- $sql_enable="and jrn_enable=1";
+ * \brief check that a user is valid and the access to the folder
+ * \param $p_ledger the ledger to check
+ * \return the priv_priv
+ * - O only predefined operation
+ * - W write
+ * - R read only
+ * - X no access
+ *
+
+ *
+ */
+ function get_ledger_access($p_ledger)
+ {
+ if ($this->admin==1||
+
$this->is_local_admin(dossier::id())==1||$this->get_status_security_ledger()==0)
+ return 'W';
+
+ $sql="select uj_priv from user_sec_jrn where uj_login=$1 and
uj_jrn_id=$2";
+ $res=$this->db->get_value($sql, array($this->login, $p_ledger));
+
+ if ($res=='')
+ $res='X';
+ return $res;
+ }
+
+ /**
+ * \brief get all the available ledgers for the current user
+ * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
+ * \param $p_access =3 for Read or WRITE, 2 write, 1 for readonly
+ * \param (boolean) $all if true show also inactive
+ * \return a double array of available ledgers
+ @verbatim
+ [0] => [jrn_def_id]
+ [jrn_def_type]
+ [jrn_def_name]
+ [jrn_def_class_deb]
+ [jrn_def_class_cred]
+ [jrn_type_id]
+ [jrn_desc]
+ [uj_priv]
+ @endverbatim
+ */
+ function get_ledger($p_type='ALL', $p_access=3, $disable=TRUE)
+ {
+ $p_type=strtoupper($p_type);
+ if (!in_array($p_type, ["FIN", "ALL", "ODS", "VEN", 'ACH']))
+ {
+ record_log(sprintf("UGL1, p_type %s", $p_type));
+ throw new Exception("UGL1"._("Type incorrecte"));
+ }
+ if ($disable==TRUE)
+ {
+ $sql_enable="";
+ }
+ else
+ {
+ $sql_enable="and jrn_enable=1";
+ }
+ if
($this->admin!=1&&$this->is_local_admin()!=1&&$this->get_status_security_ledger()==1)
+ {
+ $sql_type=($p_type=='ALL')?'':"and
jrn_def_type=upper('".sql_string($p_type)."')";
+ switch ($p_access)
+ {
+ case 3:
+ $sql_access=" and uj_priv!= 'X' ";
+ break;
+ case 2:
+ $sql_access=" and uj_priv = 'W' and jrn_enable=1 ";
+ break;
+
+ case 1:
+ $sql_access=" and ( uj_priv = 'R' or uj_priv='W') ";
+ break;
}
- if ($this->admin != 1 && $this->is_local_admin() != 1 &&
$this->get_status_security_ledger() == 1)
- {
- $sql_type = ($p_type == 'ALL') ? '' : "and
jrn_def_type=upper('" . sql_string($p_type) . "')";
- switch ($p_access)
- {
- case 3:
- $sql_access = " and uj_priv!= 'X' ";
- break;
- case 2:
- $sql_access = " and uj_priv = 'W' and
jrn_enable=1 ";
- break;
-
- case 1:
- $sql_access = " and ( uj_priv = 'R' or
uj_priv='W') ";
- break;
- }
-
- $sql = "select jrn_def_id,jrn_def_type,
+
+ $sql="select jrn_def_id,jrn_def_type,
jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_type_id,jrn_desc,uj_priv,
jrn_deb_max_line,jrn_cred_max_line,jrn_def_description,jrn_enable
from jrn_def join jrn_type on jrn_def_type=jrn_type_id
join user_sec_jrn on uj_jrn_id=jrn_def_id
where
- uj_login='" . $this->login . "'" .
- $sql_type . $sql_access .$sql_enable.
- " order by jrn_Def_name";
- }
- else
- {
- $sql_type = ($p_type == 'ALL') ? ' '.$sql_enable :
"where jrn_def_type=upper('" . sql_string($p_type) . "') ".$sql_enable;
- $sql = "select
jrn_def_id,jrn_def_type,jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_deb_max_line,jrn_cred_max_line,
+ uj_login='".$this->login."'".
+ $sql_type.$sql_access.$sql_enable.
+ " order by jrn_Def_name";
+ }
+ else
+ {
+ $sql_type=($p_type=='ALL')?' '.$sql_enable:"where
jrn_def_type=upper('".sql_string($p_type)."') ".$sql_enable;
+ $sql="select
jrn_def_id,jrn_def_type,jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_deb_max_line,jrn_cred_max_line,
jrn_type_id,jrn_desc,'W' as
uj_priv,jrn_def_description,jrn_enable
from jrn_def join jrn_type on jrn_def_type=jrn_type_id
$sql_type
order by jrn_Def_name";
- }
- $res = $this->db->exec_sql($sql);
- if (Database::num_row($res) == 0)
- return null;
- $array = Database::fetch_all($res);
- return $array;
- }
-
- /**
- * \brief return an sql condition for filtering the permitted ledger
- * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
- * \param $p_access =3 for READ or WRITE, 2 READ and write, 1 for
readonly
- *
- * \return sql condition like = jrn_def_id in (...)
- */
-
- function get_ledger_sql($p_type = 'ALL', $p_access = 3)
- {
- $aLedger = $this->get_ledger($p_type, $p_access);
- if (empty($aLedger))
- return ' jrn_def_id < 0 ';
- $sql = " jrn_def_id in (";
- foreach ($aLedger as $row)
- {
- $sql.=$row['jrn_def_id'] . ',';
- }
- $sql.='-1)';
- return $sql;
- }
+ }
+ $res=$this->db->exec_sql($sql);
+ if (Database::num_row($res)==0)
+ return null;
+ $array=Database::fetch_all($res);
+ return $array;
+ }
+
+ /**
+ * \brief return an sql condition for filtering the permitted ledger
+ * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
+ * \param $p_access =3 for READ or WRITE, 2 READ and write, 1 for readonly
+ *
+ * \return sql condition like = jrn_def_id in (...)
+ */
+ function get_ledger_sql($p_type='ALL', $p_access=3)
+ {
+ $aLedger=$this->get_ledger($p_type, $p_access);
+ if (empty($aLedger))
+ return ' jrn_def_id < 0 ';
+ $sql=" jrn_def_id in (";
+ foreach ($aLedger as $row)
+ {
+ $sql.=$row['jrn_def_id'].',';
+ }
+ $sql.='-1)';
+ return $sql;
+ }
/**
* synomym for isAdmin,
@@ -583,472 +636,480 @@ class User
return $this->isAdmin();
}
- /**
- * @brief Check if an user is an admin
- *
- * @return 1 for yes 0 for no
- */
- function isAdmin()
- {
- $this->admin = 0;
- $pass5 = md5($this->pass);
- $sql = "select count(*) from ac_users where use_login=$1
+ /**
+ * @brief Check if an user is an admin
+ *
+ * @return 1 for yes 0 for no
+ */
+ function isAdmin()
+ {
+ $this->admin=0;
+ $pass5=md5($this->pass);
+ $sql="select count(*) from ac_users where use_login=$1
and use_active=1 and use_admin=1 ";
- $cn = new Database();
- $this->admin = $cn->get_value($sql, array($this->login));
- return $this->admin;
- }
-
- /**
- * \brief Set the selected periode in the user's preferences
- *
- * \param $p_periode periode
- * \param - $p_user
- *
- */
- function set_periode($p_periode)
- {
- $sql = "update user_local_pref set parameter_value=$1 where
user_id=$2 and parameter_type='PERIODE'";
- $Res = $this->db->exec_sql($sql,[$p_periode,$this->id]);
- }
-
- private function set_default_periode()
- {
-
- /* get the first periode */
- $sql = 'select min(p_id) as pid '
- . ' from parm_periode '
- . ' where p_closed = false and p_start = (select
min(p_start) from parm_periode)';
- $Res = $this->db->exec_sql($sql);
-
- $pid = Database::fetch_result($Res, 0, 0);
- /* if all the periode are closed, then we use the last closed
period */
- if ($pid == null)
- {
- $sql = 'select min(p_id) as pid '
- . 'from parm_periode '
- . 'where p_start = (select max(p_start) from
parm_periode)';
- $Res2 = $this->db->exec_sql($sql);
- $pid = Database::fetch_result($Res2, 0, 0);
- if ($pid == null)
- {
- throw new Exception( _("Aucune période
trouvéee !!!"));
- }
-
- $pid = Database::fetch_result($Res2, 0, 0);
- }
-
- $sql = sprintf("insert into user_local_pref
(user_id,parameter_value,parameter_type)
+ $cn=new Database();
+ $this->admin=$cn->get_value($sql, array($this->login));
+ return $this->admin;
+ }
+
+ /**
+ * \brief Set the selected periode in the user's preferences
+ *
+ * \param $p_periode periode
+ * \param - $p_user
+ *
+ */
+ function set_periode($p_periode)
+ {
+ $sql="update user_local_pref set parameter_value=$1 where user_id=$2
and parameter_type='PERIODE'";
+ $Res=$this->db->exec_sql($sql, [$p_periode, $this->id]);
+ }
+
+ private function set_default_periode()
+ {
+
+ /* get the first periode */
+ $sql='select min(p_id) as pid '
+ .' from parm_periode '
+ .' where p_closed = false and p_start = (select min(p_start)
from parm_periode)';
+ $Res=$this->db->exec_sql($sql);
+
+ $pid=Database::fetch_result($Res, 0, 0);
+ /* if all the periode are closed, then we use the last closed period */
+ if ($pid==null)
+ {
+ $sql='select min(p_id) as pid '
+ .'from parm_periode '
+ .'where p_start = (select max(p_start) from parm_periode)';
+ $Res2=$this->db->exec_sql($sql);
+ $pid=Database::fetch_result($Res2, 0, 0);
+ if ($pid==null)
+ {
+ throw new Exception(_("Aucune période trouvéee !!!"));
+ }
+
+ $pid=Database::fetch_result($Res2, 0, 0);
+ }
+
+ $sql=sprintf("insert into user_local_pref
(user_id,parameter_value,parameter_type)
values ('%s','%d','PERIODE')", $this->id, $pid);
- $Res = $this->db->exec_sql($sql);
- }
-
- /**
- * \brief Get the default periode from the user's preferences
- *
- * \return the default periode
- *
- *
- */
-
- function get_periode()
- {
-
- $array = $this->get_preference();
- if (!isset($array['PERIODE']))
- {
- $this->set_default_periode();
- $array = $this->get_preference();
- }
- return $array['PERIODE'];
- }
-
- /**
- *
- * \brief return the mini rapport to display on the welcome page
- * \return 0 if nothing if found or the report to display
(form_definition.fr_id)
- */
-
- function get_mini_report()
- {
- $array = $this->get_preference();
- $fr_id = (isset($array['MINIREPORT'])) ? $array['MINIREPORT'] :
0;
- return $fr_id;
- }
-
- /**
- * \brief set the mini rapport to display on the welcome page
- */
- function set_mini_report($p_id)
- {
- $count = $this->db->get_value("select count(*) from
user_local_pref where user_id=$1 and parameter_type=$2", array($this->id,
'MINIREPORT'));
- if ($count == 1)
- {
- $sql = "update user_local_pref set parameter_value=$1
where user_id=$2 and parameter_type='MINIREPORT'";
- $Res = $this->db->exec_sql($sql, array($p_id,
$this->id));
- }
- else
- {
- $sql = "insert into user_local_pref
(user_id,parameter_type,parameter_value)" .
- "values($1,'MINIREPORT',$2)";
- $Res = $this->db->exec_sql($sql, array($this->id,
$p_id));
- }
- }
- /**
- * Save the preference , the scope is global, the settings are saved
- * into account_repository
- * @param $key THEME, LANG , PAGESIZE
- * @param $value value of the key
- */
-
- function save_global_preference($key, $value)
- {
- $repo = new Database();
- $count = $repo->get_value("select count(*)
+ $Res=$this->db->exec_sql($sql);
+ }
+
+ /**
+ * \brief Get the default periode from the user's preferences
+ *
+ * \return the default periode
+ *
+ *
+ */
+ function get_periode()
+ {
+
+ $array=$this->get_preference();
+ if (!isset($array['PERIODE']))
+ {
+ $this->set_default_periode();
+ $array=$this->get_preference();
+ }
+ return $array['PERIODE'];
+ }
+
+ /**
+ *
+ * \brief return the mini rapport to display on the welcome page
+ * \return 0 if nothing if found or the report to display
(form_definition.fr_id)
+ */
+ function get_mini_report()
+ {
+ $array=$this->get_preference();
+ $fr_id=(isset($array['MINIREPORT']))?$array['MINIREPORT']:0;
+ return $fr_id;
+ }
+
+ /**
+ * \brief set the mini rapport to display on the welcome page
+ */
+ function set_mini_report($p_id)
+ {
+ $count=$this->db->get_value("select count(*) from user_local_pref
where user_id=$1 and parameter_type=$2",
+ array($this->id, 'MINIREPORT'));
+ if ($count==1)
+ {
+ $sql="update user_local_pref set parameter_value=$1 where
user_id=$2 and parameter_type='MINIREPORT'";
+ $Res=$this->db->exec_sql($sql, array($p_id, $this->id));
+ }
+ else
+ {
+ $sql="insert into user_local_pref
(user_id,parameter_type,parameter_value)".
+ "values($1,'MINIREPORT',$2)";
+ $Res=$this->db->exec_sql($sql, array($this->id, $p_id));
+ }
+ }
+
+ /**
+ * Save the preference , the scope is global, the settings are saved
+ * into account_repository
+ * @param $key THEME, LANG , PAGESIZE
+ * @param $value value of the key
+ */
+ function save_global_preference($key, $value)
+ {
+ $repo=new Database();
+ $count=$repo->get_value("select count(*)
from
user_global_pref
where
parameter_type=$1 and user_id=$2", array($key, $this->login));
- if ($count == 1)
- {
- $repo->exec_sql("update user_global_pref set
parameter_value=$1
+ if ($count==1)
+ {
+ $repo->exec_sql("update user_global_pref set parameter_value=$1
where parameter_type=$2 and user_id=$3", array($value, $key,
$this->login));
- }
- elseif ($count == 0)
- {
- $repo->exec_sql("insert into
user_global_pref(user_id,parameter_type,parameter_value)
+ }
+ elseif ($count==0)
+ {
+ $repo->exec_sql("insert into
user_global_pref(user_id,parameter_type,parameter_value)
values($1,$2,$3)", array($this->login, $key, $value));
- }
- }
-
- /**
- * \brief Get the default user's preferences
- * \return array of (parameter_type => parameter_value)
- */
- function get_preference()
- {
- $sql = "select parameter_type,parameter_value from
user_local_pref where user_id=$1";
- $Res = $this->db->exec_sql($sql, array($this->id));
- $l_array = array();
- for ($i = 0; $i < Database::num_row($Res); $i++)
- {
- $row = Database::fetch_array($Res, $i);
- $type = $row['parameter_type'];
- $l_array[$type] = $row['parameter_value'];
- }
- $repo=new Database();
- $a_global_pref=$repo->get_array("select
parameter_type,parameter_value from user_global_pref
+ }
+ }
+
+ /**
+ * \brief Get the default user's preferences
+ * \return array of (parameter_type => parameter_value)
+ */
+ function get_preference()
+ {
+ $sql="select parameter_type,parameter_value from user_local_pref where
user_id=$1";
+ $Res=$this->db->exec_sql($sql, array($this->id));
+ $l_array=array();
+ for ($i=0; $i<Database::num_row($Res); $i++)
+ {
+ $row=Database::fetch_array($Res, $i);
+ $type=$row['parameter_type'];
+ $l_array[$type]=$row['parameter_value'];
+ }
+ $repo=new Database();
+ $a_global_pref=$repo->get_array("select parameter_type,parameter_value
from user_global_pref
where
-
upper(user_id) = upper($1)",[$this->login]);
- $nb_global=count($a_global_pref);
- for ( $i = 0 ;$i< $nb_global ; $i++) {
- $idx=$a_global_pref[$i]['parameter_type'];
- $value=$a_global_pref[$i]['parameter_value'];
- $l_array[$idx]=$value;
- }
-
- return $l_array;
- }
-
- /**
- * Check if an user can access a module, return 1 if yes, otherwise 0
- * record in audit log
- * This function works only if user is connected to a Folder
- * @param string $p_module menu_ref.me_code
- * @returns 0 for FORBIDDEN, 1 for GRANTED
- */
- function check_module($p_module)
- {
- $acc = $this->db->get_value("select count(*) from v_all_menu
where p_id = $1
- and me_code=$2", array($this->get_profile(), $p_module));
- if ($acc == 0)
- {
- $this->audit("FAIL", $p_module);
- return 0;
- }
- $this->audit("SUCCESS", $p_module);
- return 1;
- }
-
- /**
- * \brief Check if an user is allowed to do an action
- * \param p_action_id
- * \return
- * - 0 no priv
- * - 1 priv granted
- * @see constant.security.php
- */
-
- function check_action($p_action_id)
- {
- /* save it into the log */
- global $audit;
- if ($this->Admin() == 1)
- return 1;
- if ($this->is_local_admin(dossier::id()) == 1)
- return 1;
- if ( $this->get_status_security_action() == 0)
- return 1;
- $Res = $this->db->exec_sql(
- "select * from user_sec_act where ua_login=$1
and ua_act_id=$2", array($this->login, $p_action_id));
- $Count = Database::num_row($Res);
- if ($Count == 0)
- {
- if (isset($audit) && $audit == true)
- {
- $cn = new Database();
- $sql = "insert into audit_connect
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
- $cn->exec_sql($sql,
array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], $p_action_id,
$_SERVER['REQUEST_URI'], 'FAIL'));
- }
- return 0;
- }
- if ($Count == 1) return 1;
- echo_error(_("Action invalide"));
- record_log("User:check_action".sprintf("login %s ua_act_id
%s",$this->login,$p_action_id));
- exit();
- }
-
- /**
- * \brief Get the global preferences from user_global_pref
- * in the account_repository db
- *
- * \note set $SESSION[g_variable]
- */
-
- function load_global_pref()
- {
- $cn = new Database();
- // Load everything in an array
- $Res = $cn->exec_sql("select parameter_type,parameter_value from
+
upper(user_id) = upper($1)", [$this->login]);
+ $nb_global=count($a_global_pref);
+ for ($i=0; $i<$nb_global; $i++)
+ {
+ $idx=$a_global_pref[$i]['parameter_type'];
+ $value=$a_global_pref[$i]['parameter_value'];
+ $l_array[$idx]=$value;
+ }
+
+ return $l_array;
+ }
+ /**
+ * @brief Check if an user can access a module, return 1 if yes, otherwise 0
+ * record in audit log
+ * This function works only if user is connected to a Folder
+ * @param string $p_module menu_ref.me_code
+ * @returns 0 for FORBIDDEN, 1 for GRANTED
+ */
+ function check_module($p_module)
+ {
+ if ( $this->access_mode == "PC") {
+
+ $acc=$this->db->get_value("select count(*) from v_all_menu where
p_id = $1
+ and me_code=$2", array($this->get_profile(), $p_module));
+ } elseif ($this->access_mode=="MOBILE") {
+ $acc=$this->db->get_value("select count(*) from profile_mobile
where p_id=$1 and me_code=$2",
+ array($this->get_profile(), $p_module));
+ } else {
+ throw new Exception("USER:823:ACCESS_MODE INCONNU");
+ }
+ if ($acc==0)
+ {
+ $this->audit("FAIL", $p_module);
+ return 0;
+ }
+ $this->audit("SUCCESS", $p_module);
+ return 1;
+ }
+
+ /**
+ * \brief Check if an user is allowed to do an action
+ * \param p_action_id
+ * \return
+ * - 0 no priv
+ * - 1 priv granted
+ * @see constant.security.php
+ */
+ function check_action($p_action_id)
+ {
+ /* save it into the log */
+ global $audit;
+ if ($this->Admin()==1)
+ return 1;
+ if ($this->is_local_admin(dossier::id())==1)
+ return 1;
+ if ($this->get_status_security_action()==0)
+ return 1;
+ $Res=$this->db->exec_sql(
+ "select * from user_sec_act where ua_login=$1 and
ua_act_id=$2", array($this->login, $p_action_id));
+ $Count=Database::num_row($Res);
+ if ($Count==0)
+ {
+ if (isset($audit)&&$audit==true)
+ {
+ $cn=new Database();
+ $sql="insert into audit_connect
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
+ $cn->exec_sql($sql,
+ array($_SESSION[SESSION_KEY.'g_user'],
$_SERVER["REMOTE_ADDR"], $p_action_id, $_SERVER['REQUEST_URI'],
+ 'FAIL'));
+ }
+ return 0;
+ }
+ if ($Count==1)
+ return 1;
+ echo_error(_("Action invalide"));
+ record_log("User:check_action".sprintf("login %s ua_act_id %s",
$this->login, $p_action_id));
+ exit();
+ }
+
+ /**
+ * \brief Get the global preferences from user_global_pref
+ * in the account_repository db
+ *
+ * \note set $SESSION[g_variable]
+ */
+ function load_global_pref()
+ {
+ $cn=new Database();
+ // Load everything in an array
+ $Res=$cn->exec_sql("select parameter_type,parameter_value from
user_global_pref
- where user_id=$1",[$this->login]);
- $Max = Database::num_row($Res);
- if ($Max == 0)
- {
- $this->insert_default_global_pref();
- $this->load_global_pref();
- return;
- }
- // Load value into array
- $line = array();
- for ($i = 0; $i < $Max; $i++)
- {
- $row = Database::fetch_array($Res, $i);
- $type = $row['parameter_type'];
- $line[$type] = $row['parameter_value'];
- }
- // save array into g_ variable
- $array_pref = array('g_theme' => 'THEME',
- 'g_pagesize' => 'PAGESIZE',
- 'g_topmenu' => 'TOPMENU',
- 'g_lang' => 'LANG',
- 'csv_fieldsep'=>'csv_fieldsep',
- 'csv_decimal'=>'csv_decimal' ,
- 'csv_encoding'=>'csv_encoding',
- 'first_week_day'=>'first_week_day');
-
- foreach ($array_pref as $name => $parameter)
- {
- if (!isset($line[$parameter]))
- {
- $this->insert_default_global_pref($parameter);
- $this->load_global_pref();
- return;
- }
- $_SESSION[SESSION_KEY.$name] = $line[$parameter];
- }
- }
-
- /**
- * \brief insert default pref
- * if no parameter are given insert all the existing
- * parameter otherwise only the requested
- * \param $p_type parameter's type or nothing
- * \param $p_value parameter value
- *
- */
-
- function insert_default_global_pref($p_type = "", $p_value = "")
- {
-
- $default_parameter = array("THEME" => "classic",
- "PAGESIZE" => "50",
- 'TOPMENU' => 'TEXT',
- 'LANG' => 'fr_FR.utf8',
- 'csv_fieldsep'=>'0',
- 'csv_decimal'=>'0',
- 'csv_encoding'=>'utf8',
- 'first_week_day'=>1
- );
- $cn = new Database();
- $sql = "insert into
user_global_pref(user_id,parameter_type,parameter_value)
+ where user_id=$1", [$this->login]);
+ $Max=Database::num_row($Res);
+ if ($Max==0)
+ {
+ $this->insert_default_global_pref();
+ $this->load_global_pref();
+ return;
+ }
+ // Load value into array
+ $line=array();
+ for ($i=0; $i<$Max; $i++)
+ {
+ $row=Database::fetch_array($Res, $i);
+ $type=$row['parameter_type'];
+ $line[$type]=$row['parameter_value'];
+ }
+ // save array into g_ variable
+ $array_pref=array('g_theme'=>'THEME',
+ 'g_pagesize'=>'PAGESIZE',
+ 'g_topmenu'=>'TOPMENU',
+ 'g_lang'=>'LANG',
+ 'csv_fieldsep'=>'csv_fieldsep',
+ 'csv_decimal'=>'csv_decimal',
+ 'csv_encoding'=>'csv_encoding',
+ 'first_week_day'=>'first_week_day');
+
+ foreach ($array_pref as $name=> $parameter)
+ {
+ if (!isset($line[$parameter]))
+ {
+ $this->insert_default_global_pref($parameter);
+ $this->load_global_pref();
+ return;
+ }
+ $_SESSION[SESSION_KEY.$name]=$line[$parameter];
+ }
+ }
+
+ /**
+ * \brief insert default pref
+ * if no parameter are given insert all the existing
+ * parameter otherwise only the requested
+ * \param $p_type parameter's type or nothing
+ * \param $p_value parameter value
+ *
+ */
+ function insert_default_global_pref($p_type="", $p_value="")
+ {
+
+ $default_parameter=array("THEME"=>"classic",
+ "PAGESIZE"=>"50",
+ 'TOPMENU'=>'TEXT',
+ 'LANG'=>'fr_FR.utf8',
+ 'csv_fieldsep'=>'0',
+ 'csv_decimal'=>'0',
+ 'csv_encoding'=>'utf8',
+ 'first_week_day'=>1
+ );
+ $cn=new Database();
+ $sql="insert into
user_global_pref(user_id,parameter_type,parameter_value)
values ($1,$2,$3)";
- if ($p_type == "")
- {
- foreach ($default_parameter as $name => $value)
- {
-
$cn->exec_sql($sql,array($this->login,$name,$value));
- }
- }
- else
- {
- $value = ($p_value == "") ? $default_parameter[$p_type]
: $p_value;
- $cn->exec_sql($sql,array($this->login,$p_type,$value));
- }
- }
-
- /**
- * \brief update default pref
- * if value is not given then use the default value
- *
- * \param $p_type parameter's type
- * \param $p_value parameter's value value of the type
- */
-
- function update_global_pref($p_type, $p_value = "")
- {
- $default_parameter = array("THEME" => "classic",
- "PAGESIZE" => "50",
- "LANG" => 'fr_FR.utf8',
- 'TOPMENU' => 'SELECT',
- 'csv_fieldsep'=>'0',
- 'csv_decimal'=>'0',
- 'csv_encoding'=>'utf8',
- 'first_week_day'=>1
- );
- $cn = new Database();
- $Sql = "update user_global_pref set parameter_value=$1
+ if ($p_type=="")
+ {
+ foreach ($default_parameter as $name=> $value)
+ {
+ $cn->exec_sql($sql, array($this->login, $name, $value));
+ }
+ }
+ else
+ {
+ $value=($p_value=="")?$default_parameter[$p_type]:$p_value;
+ $cn->exec_sql($sql, array($this->login, $p_type, $value));
+ }
+ }
+
+ /**
+ * \brief update default pref
+ * if value is not given then use the default value
+ *
+ * \param $p_type parameter's type
+ * \param $p_value parameter's value value of the type
+ */
+ function update_global_pref($p_type, $p_value="")
+ {
+ $default_parameter=array("THEME"=>"classic",
+ "PAGESIZE"=>"50",
+ "LANG"=>'fr_FR.utf8',
+ 'TOPMENU'=>'SELECT',
+ 'csv_fieldsep'=>'0',
+ 'csv_decimal'=>'0',
+ 'csv_encoding'=>'utf8',
+ 'first_week_day'=>1
+ );
+ $cn=new Database();
+ $Sql="update user_global_pref set parameter_value=$1
where parameter_type=$2 and
user_id=$3";
- $value = ($p_value == "") ? $default_parameter[$p_type] :
$p_value;
- $cn->exec_sql($Sql, array($value, $p_type, $this->login));
- }
+ $value=($p_value=="")?$default_parameter[$p_type]:$p_value;
+ $cn->exec_sql($Sql, array($value, $p_type, $this->login));
+ }
//end function
- /**\brief Return the year of current Periode
- * it is the parm_periode.p_exercice col
- * if an error occurs return 0
- */
-
- function get_exercice()
- {
- $sql = "select p_exercice from parm_periode where p_id=" .
$this->get_periode();
- $Ret = $this->db->exec_sql($sql);
- if (Database::num_row($Ret) == 1)
- {
- $r = Database::fetch_array($Ret, 0);
- return $r['p_exercice'];
- }
- else
- return 0;
- }
-
- /**\brief Check if the user can access
- * otherwise warn and exit
- * \param $p_action requested action
- * \param $p_js = 1 javascript, or 0 just a text or 2 to log it silently
- * \return nothing the program exits automatically
- */
-
- function can_request($p_action, $p_js = 0)
- {
- if ($this->check_action($p_action) == 0)
- {
- $this->audit('FAIL');
- if ($p_js == 1)
- {
- echo create_script("alert_box(content[59])");
- }
- elseif ($p_js == 2) {
- record_log(_("Access invalid").$p_action);
- }
- else
- {
- echo '<h2 class="error">',
- htmlspecialchars(_("Cette action ne vous est pas
autorisée Contactez votre responsable")),
- '</h2>';
- echo '</div>';
- }
- exit(-1);
- }
- }
-
- /**
- *@brief Check if the user can print (in menu_ref p_type_display=p)
- * otherwise warn and exit
- * @param $p_action requested action
- * @return nothing the program exits automatically
- */
- function check_print($p_action)
- {
- global $audit, $cn;
- $this->audit('AUDIT', $p_action);
- if ($this->Admin() == 1)
- return 1;
-
- $res = $cn->get_value("select count(*) from profile_menu
+ /* * \brief Return the year of current Periode
+ * it is the parm_periode.p_exercice col
+ * if an error occurs return 0
+ */
+
+ function get_exercice()
+ {
+ $sql="select p_exercice from parm_periode where
p_id=".$this->get_periode();
+ $Ret=$this->db->exec_sql($sql);
+ if (Database::num_row($Ret)==1)
+ {
+ $r=Database::fetch_array($Ret, 0);
+ return $r['p_exercice'];
+ }
+ else
+ return 0;
+ }
+
+ /* * \brief Check if the user can access
+ * otherwise warn and exit
+ * \param $p_action requested action
+ * \param $p_js = 1 javascript, or 0 just a text or 2 to log it silently
+ * \return nothing the program exits automatically
+ */
+
+ function can_request($p_action, $p_js=0)
+ {
+ if ($this->check_action($p_action)==0)
+ {
+ $this->audit('FAIL');
+ if ($p_js==1)
+ {
+ echo create_script("alert_box(content[59])");
+ }
+ elseif ($p_js==2)
+ {
+ record_log(_("Access invalid").$p_action);
+ }
+ else
+ {
+ echo '<h2 class="error">',
+ htmlspecialchars(_("Cette action ne vous est pas autorisée
Contactez votre responsable")),
+ '</h2>';
+ echo '</div>';
+ }
+ exit(-1);
+ }
+ }
+
+ /**
+ * @brief Check if the user can print (in menu_ref p_type_display=p)
+ * otherwise warn and exit
+ * @param $p_action requested action
+ * @return nothing the program exits automatically
+ */
+ function check_print($p_action)
+ {
+ global $audit, $cn;
+ $this->audit('AUDIT', $p_action);
+ if ($this->Admin()==1)
+ return 1;
+
+ $res=$cn->get_value("select count(*) from profile_menu
join profile_user using (p_id)
where user_name=$1 and me_code=$2 ",
array($this->login, $p_action));
- return $res;
- }
-
- /**\brief Check if the user can print (in menu_ref p_type_display=p)
- * otherwise warn and exit
- * \param $p_action requested action
- * \return nothing the program exits automatically
- */
- function can_print($p_action, $p_js = 0)
- {
- if ($this->check_print($p_action) == 0)
- {
- $this->audit('FAIL');
- if ($p_js == 1)
- {
- echo create_script("alert_box(content[59])");
- }
- else
- {
- echo '<div class="redcontent">';
- echo '<h2 class="error">',
- htmlspecialchars(_("Cette action ne vous est pas
autorisée Contactez votre responsable")),
- '</h2>';
- echo '</div>';
- }
- exit(-1);
- }
- }
-
- /**
- * \brief Check if an user is an local administrator
- * @deprecated since version 6.7
- *
- *
- * \param $p_dossier : dossier_id
- *
- * \return
- * - 0 if no
- * - 1 if yes
- *
- */
-
- function is_local_admin($p_dossier = -1)
- {
- return 0;
+ return $res;
+ }
+
+ /* * \brief Check if the user can print (in menu_ref p_type_display=p)
+ * otherwise warn and exit
+ * \param $p_action requested action
+ * \return nothing the program exits automatically
+ */
+
+ function can_print($p_action, $p_js=0)
+ {
+ if ($this->check_print($p_action)==0)
+ {
+ $this->audit('FAIL');
+ if ($p_js==1)
+ {
+ echo create_script("alert_box(content[59])");
+ }
+ else
+ {
+ echo '<div class="redcontent">';
+ echo '<h2 class="error">',
+ htmlspecialchars(_("Cette action ne vous est pas autorisée
Contactez votre responsable")),
+ '</h2>';
+ echo '</div>';
+ }
+ exit(-1);
}
- /**
- *@brief return array of available repository
- *
- * @param $p_access R for read W for write
- * @return an array
- */
- function get_available_repository($p_access='R')
- {
- $profile=$this->get_profile();
- $r=array();
- if ($p_access=='R')
- {
- $r=$this->db->get_array("select distinct u.r_id,r_name
+ }
+
+ /**
+ * \brief Check if an user is an local administrator
+ * @deprecated since version 6.7
+ *
+ *
+ * \param $p_dossier : dossier_id
+ *
+ * \return
+ * - 0 if no
+ * - 1 if yes
+ *
+ */
+ function is_local_admin($p_dossier=-1)
+ {
+ return 0;
+ }
+
+ /**
+ * @brief return array of available repository
+ *
+ * @param $p_access R for read W for write
+ * @return an array
+ */
+ function get_available_repository($p_access='R')
+ {
+ $profile=$this->get_profile();
+ $r=array();
+ if ($p_access=='R')
+ {
+ $r=$this->db->get_array("select distinct u.r_id,r_name
from
profile_sec_repository as u
join stock_repository as s
on(u.r_id=s.r_id)
@@ -1056,204 +1117,201 @@ class User
p_id =$1
and ur_right='W'
order by 2
- ",array($profile));
- }
- if ($p_access == 'W')
- {
- $r=$this->db->get_array("select distinct u.r_id,r_name
+ ", array($profile));
+ }
+ if ($p_access=='W')
+ {
+ $r=$this->db->get_array("select distinct u.r_id,r_name
from
profile_sec_repository as u
join stock_repository as s
on(u.r_id=s.r_id)
where
p_id =$1 order by 2
- ",array($profile));
- }
- return $r;
- }
- /**
- * \brief return an array with all the active users who can access
- * $p_dossier including the global admin.
- * The user must be activated
- *
- * \param $p_dossier dossier
- * \return an array of user's object
- * array indices
- * - use_id (id )
- * - use_login (login of the user)
- * - use_name
- * - use_first_name
- *
- * \exception throw an exception if nobody can access
- */
-
- static function get_list($p_dossier)
- {
- $sql = "select distinct
use_id,use_login,use_first_name,use_name from ac_users
+ ", array($profile));
+ }
+ return $r;
+ }
+
+ /**
+ * \brief return an array with all the active users who can access
+ * $p_dossier including the global admin.
+ * The user must be activated
+ *
+ * \param $p_dossier dossier
+ * \return an array of user's object
+ * array indices
+ * - use_id (id )
+ * - use_login (login of the user)
+ * - use_name
+ * - use_first_name
+ *
+ * \exception throw an exception if nobody can access
+ */
+ static function get_list($p_dossier)
+ {
+ $sql="select distinct use_id,use_login,use_first_name,use_name from
ac_users
left outer join jnt_use_dos using (use_id)
where
(dos_id=$1 and use_active=1) or (use_active=1 and use_admin=1)
order by use_login,use_name";
+ $repo=new Database();
+ $array=$repo->get_array($sql, array($p_dossier));
+ if ($repo->size()==0)
+ throw new Exception('Error inaccessible folder');
+ return $array;
+ }
- $repo = new Database();
- $array = $repo->get_array($sql, array($p_dossier));
- if ($repo->size() == 0)
- throw new Exception('Error inaccessible folder');
- return $array;
- }
-
- /**
- * \brief check the access of an user on a ledger
- *
- * \param $p_jrn the ledger id
- * \return
- * - O only predefined operation
- * - W write
- * - R read only
- * - X no access
- *
- */
-
- function check_jrn($p_jrn)
- {
- return $this->get_ledger_access($p_jrn);
- }
-
- /**
- * \brief check if an user can access a folder, if he cannot display a
dialog box
- * and exit
- * \param the folder if
- * \param $silent false, echo an error message and exit, true : exit
without warning
- * default is false
- * \return
- * - L for administrator (local and global)
- * - X no access
- * - R regular user
- */
-
- function check_dossier($p_dossier_id, $silent = false)
- {
- $this->Admin();
- if ($this->admin == 1 || $this->is_local_admin($p_dossier_id)
== 1)
- return 'L';
- $cn = new Database();
-
- $dossier = $cn->get_value("select 'R' from jnt_use_dos where
dos_id=$1 and use_id=$2", array($p_dossier_id, $this->id));
- $dossier = ($dossier == '') ? 'X' : $dossier;
- if ($dossier == 'X')
- {
- $this->audit('FAIL', "Access folder ");
- if (!$silent)
- {
- alert(_('Dossier non accessible'));
- exit();
- }
- }
- return $dossier;
- }
-
- /**
- * @brief return the first date and the last date of the current
exercice for the current user
- * @return and array ([0] => start_date,[1] => end_date)
- */
- function get_limit_current_exercice()
- {
- $current_exercice = $this->get_exercice();
- $periode = new Periode($this->db);
- list($per_start, $per_end) =
$periode->get_limit($current_exercice);
- $start = $per_start->first_day();
- $end = $per_end->last_day();
- return array($start, $end);
- }
-
- /**
- * \brief Show all the available folder for the users
- * at the login page. For the special case 'E'
- * go directly to extension and bypasse the dashboard
- * \param $p_filtre user
- *
- * \return table in HTML
- *
- */
-
- function show_dossier($p_filtre = "")
- {
- $p_array = $this->get_available_folder($p_filtre);
-
- $result = "";
-
- $result.="<TABLE id=\"folder\" class=\"result\">";
- $result.="<tr>";
- $result.="<th>";
- $result.=_("Id");
- $result.="</th>";
- $result.="<th>";
- $result.=_("Nom");
- $result.="</th>";
- $result.="<th>";
- $result.=_("Description");
- $result.="</th>";
- $result.="</tr>";
- if ($p_array == 0) {
- $result.="<tr>";
- $result.='<td style="width:auto" colspan=3>';
- $result.=_("Aucun dossier disponible");
- $result.='</td>';
- $result.="</tr>";
- return $result;
- }
-
- for ($i = 0; $i < sizeof($p_array); $i++)
- {
-
- $id = $p_array[$i]['dos_id'];
- $name = $p_array[$i]['dos_name'];
- $desc = $p_array[$i]['dos_description'];
- if ($i % 2 == 0)
- $tr = "odd";
- else
- $tr = "even";
- $target = "do.php?gDossier=$id";
-
- $result.="<TR class=\"$tr\">";
-
- $result.=td($id, ' class="num" ');
- $result.="<TD class=\"$tr\">";
- $result.="<A class=\"dossier\" HREF=\"$target\">";
- $result.= " <B>" . h($name) . "</B>";
- $result.="</A>";
- $result.="</TD>";
- $desc = ($desc == "") ? "<i>Aucune description</i>" :
h($desc);
- $desc = "<A class=\"dossier\"
HREF=\"$target\">$desc</A>";
- $result.="<TD class=\"$tr\" >" . $desc;
- $result.="</TD>";
- $result.="</TR>";
- }
- $result.="</TABLE>";
- return $result;
- }
-
- /**
- * \brief Get all the available folders
- * for the users, checked with the security
- *
- * \param $p_filter
- * \return array containing
- * - ac_dossier.dos_id
- * - ac_dossier.dos_name
- * - ac_dossier.dos_description
- *
- */
-
- function get_available_folder($p_filter = "")
- {
- $cn = new Database();
- $filter = "";
- if ($this->admin == 0)
- {
- // show only available folders
- // if user is not an admin
- $Res = $cn->exec_sql("select
+ /**
+ * \brief check the access of an user on a ledger
+ *
+ * \param $p_jrn the ledger id
+ * \return
+ * - O only predefined operation
+ * - W write
+ * - R read only
+ * - X no access
+ *
+ */
+ function check_jrn($p_jrn)
+ {
+ return $this->get_ledger_access($p_jrn);
+ }
+
+ /**
+ * \brief check if an user can access a folder, if he cannot display a
dialog box
+ * and exit
+ * \param the folder if
+ * \param $silent false, echo an error message and exit, true : exit
without warning
+ * default is false
+ * \return
+ * - L for administrator (local and global)
+ * - X no access
+ * - R regular user
+ */
+ function check_dossier($p_dossier_id, $silent=false)
+ {
+ $this->Admin();
+ if ($this->admin==1||$this->is_local_admin($p_dossier_id)==1)
+ return 'L';
+ $cn=new Database();
+
+ $dossier=$cn->get_value("select 'R' from jnt_use_dos where dos_id=$1
and use_id=$2",
+ array($p_dossier_id, $this->id));
+ $dossier=($dossier=='')?'X':$dossier;
+ if ($dossier=='X')
+ {
+ $this->audit('FAIL', "Access folder ");
+ if (!$silent)
+ {
+ alert(_('Dossier non accessible'));
+ exit();
+ }
+ }
+ return $dossier;
+ }
+
+ /**
+ * @brief return the first date and the last date of the current exercice
for the current user
+ * @return and array ([0] => start_date,[1] => end_date)
+ */
+ function get_limit_current_exercice()
+ {
+ $current_exercice=$this->get_exercice();
+ $periode=new Periode($this->db);
+ list($per_start, $per_end)=$periode->get_limit($current_exercice);
+ $start=$per_start->first_day();
+ $end=$per_end->last_day();
+ return array($start, $end);
+ }
+
+ /**
+ * \brief Show all the available folder for the users
+ * at the login page. For the special case 'E'
+ * go directly to extension and bypasse the dashboard
+ * \param $p_filtre user
+ *
+ * \return table in HTML
+ *
+ */
+ function show_dossier($p_filtre="")
+ {
+ $p_array=$this->get_available_folder($p_filtre);
+
+ $result="";
+
+ $result.="<TABLE id=\"folder\" class=\"result\">";
+ $result.="<tr>";
+ $result.="<th>";
+ $result.=_("Id");
+ $result.="</th>";
+ $result.="<th>";
+ $result.=_("Nom");
+ $result.="</th>";
+ $result.="<th>";
+ $result.=_("Description");
+ $result.="</th>";
+ $result.="</tr>";
+ if ($p_array==0)
+ {
+ $result.="<tr>";
+ $result.='<td style="width:auto" colspan=3>';
+ $result.=_("Aucun dossier disponible");
+ $result.='</td>';
+ $result.="</tr>";
+ return $result;
+ }
+
+ for ($i=0; $i<sizeof($p_array); $i++)
+ {
+
+ $id=$p_array[$i]['dos_id'];
+ $name=$p_array[$i]['dos_name'];
+ $desc=$p_array[$i]['dos_description'];
+ if ($i%2==0)
+ $tr="odd";
+ else
+ $tr="even";
+ $target="do.php?gDossier=$id";
+
+ $result.="<TR class=\"$tr\">";
+
+ $result.=td($id, ' class="num" ');
+ $result.="<TD class=\"$tr\">";
+ $result.="<A class=\"dossier\" HREF=\"$target\">";
+ $result.=" <B>".h($name)."</B>";
+ $result.="</A>";
+ $result.="</TD>";
+ $desc=($desc=="")?"<i>Aucune description</i>":h($desc);
+ $desc="<A class=\"dossier\" HREF=\"$target\">$desc</A>";
+ $result.="<TD class=\"$tr\" >".$desc;
+ $result.="</TD>";
+ $result.="</TR>";
+ }
+ $result.="</TABLE>";
+ return $result;
+ }
+
+ /**
+ * \brief Get all the available folders
+ * for the users, checked with the security
+ *
+ * \param $p_filter
+ * \return array containing
+ * - ac_dossier.dos_id
+ * - ac_dossier.dos_name
+ * - ac_dossier.dos_description
+ *
+ */
+ function get_available_folder($p_filter="")
+ {
+ $cn=new Database();
+ $filter="";
+ if ($this->admin==0)
+ {
+ // show only available folders
+ // if user is not an admin
+ $Res=$cn->exec_sql("select
distinct
dos_id,dos_name,dos_description
from ac_users
natural join
jnt_use_dos
@@ -1263,241 +1321,271 @@ class User
and use_active
= 1
and ( dos_name
ilike '%' || $2 || '%' or dos_description ilike '%' || $2 || '%' )
order by dos_name", array($this->login,
$p_filter));
- }
- else
- {
- $Res = $cn->exec_sql("select
+ }
+ else
+ {
+ $Res=$cn->exec_sql("select
distinct dos_id,dos_name,dos_description from ac_dossier
where
dos_name ilike '%' || $1|| '%' or dos_description ilike
'%' || $1 || '%'
order by dos_name", array($p_filter));
- }
-
- $max = Database::num_row($Res);
- if ($max == 0)
- return 0;
-
- for ($i = 0; $i < $max; $i++)
- {
- $array[] = Database::fetch_array($Res, $i);
- }
- return $array;
- }
-
- /**
- * Audit action from the administration menu
- * @param $p_module description of the action
- */
- static function audit_admin($p_module) {
- $cn = new Database();
- $sql = "insert into audit_connect
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
-
- $cn->exec_sql($sql, array(
- $_SESSION[SESSION_KEY.'g_user'],
- $_SERVER["REMOTE_ADDR"],
- $p_module,
- $_SERVER['REQUEST_URI'],
- 'ADMIN'));
- }
- function audit($action = 'AUDIT', $p_module = "")
- {
- global $audit;
- if ($audit)
- {
- if ($p_module == "" && isset($_REQUEST['ac']))
- {
- $p_module = $_REQUEST['ac'];
- }
- $cn = new Database();
- if (isset($_REQUEST['gDossier']))
- $p_module.= " dossier : " .
$_REQUEST['gDossier'];
- $sql = "insert into audit_connect
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
-
- $cn->exec_sql($sql, array(
- $_SESSION[SESSION_KEY.'g_user'],
- $_SERVER["REMOTE_ADDR"],
- $p_module,
- $_SERVER['REQUEST_URI'],
- $action));
- }
- }
-
- function save_profile($p_id)
- {
- $count = $this->db->get_value("select count(*) from
profile_user where user_name=$1", array($this->login));
- if ($count == 0)
- {
- $this->db->exec_sql("insert into
profile_user(p_id,user_name)
+ }
+
+ $max=Database::num_row($Res);
+ if ($max==0)
+ return 0;
+
+ for ($i=0; $i<$max; $i++)
+ {
+ $array[]=Database::fetch_array($Res, $i);
+ }
+ return $array;
+ }
+
+ /**
+ * Audit action from the administration menu
+ * @param $p_module description of the action
+ */
+ static function audit_admin($p_module)
+ {
+ $cn=new Database();
+ $sql="insert into audit_connect
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
+
+ $cn->exec_sql($sql,
+ array(
+ $_SESSION[SESSION_KEY.'g_user'],
+ $_SERVER["REMOTE_ADDR"],
+ $p_module,
+ $_SERVER['REQUEST_URI'],
+ 'ADMIN'));
+ }
+
+ function audit($action='AUDIT', $p_module="")
+ {
+ global $audit;
+ if ($audit)
+ {
+ if ($p_module==""&&isset($_REQUEST['ac']))
+ {
+ $p_module=$_REQUEST['ac'];
+ }
+ $cn=new Database();
+ if (isset($_REQUEST['gDossier']))
+ $p_module.=" dossier : ".$_REQUEST['gDossier'];
+ $sql="insert into audit_connect
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
+
+ $cn->exec_sql($sql,
+ array(
+ $_SESSION[SESSION_KEY.'g_user'],
+ $_SERVER["REMOTE_ADDR"],
+ $p_module,
+ $_SERVER['REQUEST_URI'],
+ $action));
+ }
+ }
+
+ function save_profile($p_id)
+ {
+ $count=$this->db->get_value("select count(*) from profile_user where
user_name=$1", array($this->login));
+ if ($count==0)
+ {
+ $this->db->exec_sql("insert into profile_user(p_id,user_name)
values
($1,$2)", array($p_id, $this->login));
- }
- else
- {
- $this->db->exec_sql("update profile_user set p_id=$1
where user_name=$2", array($p_id, $this->login));
- }
- }
- /**
- *return the profile (p_id)
- * @return profile.p_id
- */
- function get_profile()
- {
- $profile = $this->db->get_value("select p_id from profile_user
where
+ }
+ else
+ {
+ $this->db->exec_sql("update profile_user set p_id=$1 where
user_name=$2", array($p_id, $this->login));
+ }
+ }
+
+ /**
+ * return the profile (p_id)
+ * @return profile.p_id
+ */
+ function get_profile()
+ {
+ $profile=$this->db->get_value("select p_id from profile_user where
lower(user_name)=lower($1)",
array($this->login));
- return $profile;
- }
- /**
- * Compute the SQL string for the writable profile,
- * the subselect for p_id , example
- * p_id in $g_user->get_writable_profile.
- * The administrator can access all the profiles
- * @return SQL string with the subselect for p_id
- */
- function get_writable_profile()
- {
- if ( $this->admin != 1)
- {
- $sql = " (select p_granted "
- . " from user_sec_action_profile "
- . " where ua_right='W' and
p_id=".$this->get_profile().") ";
- } else {
- $sql = "(select p_id from profile)";
- }
- return $sql;
- }
- /**
- * Compute the SQL string for the readable profile,
- * the subselect for p_id , example
- * p_id in $g_user->get_readable_profile.
- * The administrator can read all the profiles
- * @return SQL string with the subselect for p_id
- */
- function get_readable_profile()
- {
- if ( $this->admin != 1)
- {
- $sql = " (select p_granted "
- . " from user_sec_action_profile "
- . " where ua_right in ('W','R') and
p_id=".$this->get_profile().") ";
- } else {
- $sql = "(select p_id from profile)";
- }
- return $sql;
- }
- /**
- * Check if the current user can add an action in the profile given
- * in parameter
- * @param type $p_profile profile.p_id = action_gestion.ag_dest
- * @return boolean
- */
- function can_add_action($p_profile)
+ return $profile;
+ }
+
+ /**
+ * Compute the SQL string for the writable profile,
+ * the subselect for p_id , example
+ * p_id in $g_user->get_writable_profile.
+ * The administrator can access all the profiles
+ * @return SQL string with the subselect for p_id
+ */
+ function get_writable_profile()
+ {
+ if ($this->admin!=1)
+ {
+ $sql=" (select p_granted "
+ ." from user_sec_action_profile "
+ ." where ua_right='W' and
p_id=".$this->get_profile().") ";
+ }
+ else
+ {
+ $sql="(select p_id from profile)";
+ }
+ return $sql;
+ }
+
+ /**
+ * Compute the SQL string for the readable profile,
+ * the subselect for p_id , example
+ * p_id in $g_user->get_readable_profile.
+ * The administrator can read all the profiles
+ * @return SQL string with the subselect for p_id
+ */
+ function get_readable_profile()
+ {
+ if ($this->admin!=1)
+ {
+ $sql=" (select p_granted "
+ ." from user_sec_action_profile "
+ ." where ua_right in ('W','R') and
p_id=".$this->get_profile().") ";
+ }
+ else
{
- $r=$this->db->get_value (' select count(*)
+ $sql="(select p_id from profile)";
+ }
+ return $sql;
+ }
+
+ /**
+ * Check if the current user can add an action in the profile given
+ * in parameter
+ * @param type $p_profile profile.p_id = action_gestion.ag_dest
+ * @return boolean
+ */
+ function can_add_action($p_profile)
+ {
+ $r=$this->db->get_value(' select count(*)
from user_sec_action_profile
where p_granted=$2
- and p_id=$1',
- array($this->get_profile(),$p_profile));
- if ($r == 0 )
- {
- return false;
- }
- return true;
+ and p_id=$1', array($this->get_profile(), $p_profile));
+ if ($r==0)
+ {
+ return false;
}
- /**
- *Check if the profile of the user can write for this profile
- * @param $dtoc action_gestion.ag_id
- * @return true if he can write otherwise false
- */
- function can_write_action($dtoc)
- {
- if ( $this->Admin() == 1 ) return TRUE;
- if ( $this->get_status_security_action()==0) return
TRUE;
- $profile = $this->get_profile();
- $r = $this->db->get_value(" select count(*) from
action_gestion where ag_id=$1 and ag_dest in
+ return true;
+ }
+
+ /**
+ * Check if the profile of the user can write for this profile
+ * @param $dtoc action_gestion.ag_id
+ * @return true if he can write otherwise false
+ */
+ function can_write_action($dtoc)
+ {
+ if ($this->Admin()==1)
+ return TRUE;
+ if ($this->get_status_security_action()==0)
+ return TRUE;
+ $profile=$this->get_profile();
+ $r=$this->db->get_value(" select count(*) from action_gestion where
ag_id=$1 and ag_dest in
(select p_granted from user_sec_action_profile
where ua_right in ('W','O') and p_id=$2) ", array($dtoc, $profile));
- if ($r == 0)
- return FALSE;
- return true;
- }
- /**
- *Check if the profile of the user can write AND delete for this
profile
- * @param $dtoc action_gestion.ag_id
- * @return true if he can write otherwise false
- */
- function can_delete_action($dtoc)
- {
- if ( $this->Admin() == 1 ) return TRUE;
- if ( $this->get_status_security_action()==0) return
TRUE;
- $profile = $this->get_profile();
- $r = $this->db->get_value(" select count(*) from
action_gestion where ag_id=$1 and ag_dest in
+ if ($r==0)
+ return FALSE;
+ return true;
+ }
+
+ /**
+ * Check if the profile of the user can write AND delete for this profile
+ * @param $dtoc action_gestion.ag_id
+ * @return true if he can write otherwise false
+ */
+ function can_delete_action($dtoc)
+ {
+ if ($this->Admin()==1)
+ return TRUE;
+ if ($this->get_status_security_action()==0)
+ return TRUE;
+ $profile=$this->get_profile();
+ $r=$this->db->get_value(" select count(*) from action_gestion where
ag_id=$1 and ag_dest in
(select p_granted from user_sec_action_profile
where ua_right='W' and p_id=$2) ", array($dtoc, $profile));
- if ($r == 0)
- return FALSE;
- return true;
- }
-
- /**
- *Check if the profile of the user can write for this profile
- * @param $dtoc action_gestion.ag_id
- * @return true if he can write otherwise false
- */
- function can_read_action($dtoc)
- {
- if ( $this->Admin() == 1 ) return true;
- $profile = $this->get_profile();
- $r = $this->db->get_value(" select count(*) from action_gestion
where ag_id=$1 and (ag_dest in
- (select p_granted from user_sec_action_profile
where p_id=$2) or ag_owner=$3)", array($dtoc, $profile, $this->login));
- if ($r == 0)
- return false;
- return true;
- }
- /**
- *Check if the profile of the user can write for this repository
- * @param $p_repo stock_repository.r_id
- * @return true if he can write otherwise false
- */
- function can_write_repo($p_repo)
- {
- if ( $this->Admin() == 1 ) return true;
- $profile=$this->get_profile();
- $r=$this->db->get_value("select count(*)
+ if ($r==0)
+ return FALSE;
+ return true;
+ }
+
+ /**
+ * Check if the profile of the user can write for this profile
+ * @param $dtoc action_gestion.ag_id
+ * @return true if he can write otherwise false
+ */
+ function can_read_action($dtoc)
+ {
+ if ($this->Admin()==1)
+ return true;
+ $profile=$this->get_profile();
+ $r=$this->db->get_value(" select count(*) from action_gestion where
ag_id=$1 and (ag_dest in
+ (select p_granted from user_sec_action_profile
where p_id=$2) or ag_owner=$3)",
+ array($dtoc, $profile, $this->login));
+ if ($r==0)
+ return false;
+ return true;
+ }
+
+ /**
+ * Check if the profile of the user can write for this repository
+ * @param $p_repo stock_repository.r_id
+ * @return true if he can write otherwise false
+ */
+ function can_write_repo($p_repo)
+ {
+ if ($this->Admin()==1)
+ return true;
+ $profile=$this->get_profile();
+ $r=$this->db->get_value("select count(*)
from profile_sec_repository
where
r_id=$1
and p_id =$2
- and ur_right='W'",array($p_repo,$profile));
- if ( $r==0)
- return false;
+ and ur_right='W'", array($p_repo, $profile));
+ if ($r==0)
+ return false;
+ return true;
+ }
+
+ /**
+ * Check if the profile of the user can read for this repository
+ * @param $p_repo stock_repository.r_id
+ * @return true if he read write otherwise false
+ */
+ function can_read_repo($p_repo)
+ {
+ if ($this->Admin()==1)
return true;
- }
- /**
- *Check if the profile of the user can read for this repository
- * @param $p_repo stock_repository.r_id
- * @return true if he read write otherwise false
- */
- function can_read_repo($p_repo)
- {
- if ( $this->Admin() == 1 ) return true;
- $profile=$this->get_profile();
- $r=$this->db->get_value("select count(*)
+ $profile=$this->get_profile();
+ $r=$this->db->get_value("select count(*)
from profile_sec_repository
where
r_id=$1
and p_id =$2
- ",array($p_repo,$profile));
- if ( $r==0)
- return false;
- return true;
+ ", array($p_repo, $profile));
+ if ($r==0)
+ return false;
+ return true;
+ }
+
+ function save_password($p_pass1, $p_pass2)
+ {
+ if ($p_pass1==$p_pass2)
+ {
+ $repo=new Database();
+ $l_pass=md5($_POST['pass_1']);
+ $repo->exec_sql("update ac_users set use_pass=$1 where
use_login=$2",
+ array($l_pass, $_SESSION[SESSION_KEY.'g_user']));
+ $_SESSION[SESSION_KEY.'g_pass']=$_POST['pass_1'];
}
- function save_password($p_pass1, $p_pass2) {
- if ($p_pass1 == $p_pass2) {
- $repo = new Database();
- $l_pass = md5($_POST['pass_1']);
- $repo->exec_sql("update ac_users set use_pass=$1 where
use_login=$2", array($l_pass, $_SESSION[SESSION_KEY.'g_user']));
- $_SESSION[SESSION_KEY.'g_pass'] = $_POST['pass_1'];
- } else {
+ else
+ {
alert(_("Les mots de passe ne correspondent pas. Mot de passe
inchangé"));
}
}
+
/**
* Save the password from PREFERENCE MODULE
* @param type $p_email
@@ -1505,104 +1593,108 @@ class User
function save_email($p_email)
{
$repo=new Database();
- $repo->exec_sql("update ac_users set use_email=$1 where use_login=$2",
array($p_email, $_SESSION[SESSION_KEY.'g_user']));
+ $repo->exec_sql("update ac_users set use_email=$1 where use_login=$2",
+ array($p_email, $_SESSION[SESSION_KEY.'g_user']));
}
+
/**
* Remove a user and all his privileges
* So it cannot connect anymore and all his privileges are removed from
* the dossier
*
*/
- static function revoke_access($p_login,$p_dossier) {
+ static function revoke_access($p_login, $p_dossier)
+ {
// connect to the repository
$repo_cnx=new Database();
-
+
// Retrieve the user
- $user=$repo_cnx->get_array('select use_id,use_login from ac_users
where use_login=$1',
- array($p_login));
- if ( ! $user ) return false;
-
+ $user=$repo_cnx->get_array('select use_id,use_login from ac_users
where use_login=$1', array($p_login));
+ if (!$user)
+ return false;
+
// remove him from jnt_use_dos
$repo_cnx->exec_sql("delete from jnt_use_dos WHERE use_id=$1 and
dos_id=$2",
- array($user[0]['use_id'],$p_dossier));
+ array($user[0]['use_id'], $p_dossier));
// Remove user from user's dossier
$cn_dossier=new Database($p_dossier);
- $cn_dossier->exec_sql("delete from profile_user where
user_name=$1",array($p_login));
- $cn_dossier->exec_sql("delete from user_sec_act where
ua_login=$1",array($p_login));
-
+ $cn_dossier->exec_sql("delete from profile_user where user_name=$1",
array($p_login));
+ $cn_dossier->exec_sql("delete from user_sec_act where ua_login=$1",
array($p_login));
}
-
+
/**
* Grant access to folder, grant administrator profile , all the ledgers
and all the action
*
*/
- static function grant_admin_access($p_login,$p_dossier)
+ static function grant_admin_access($p_login, $p_dossier)
{
- $repo_cnx=new Database();
+ $repo_cnx=new Database();
$user=$repo_cnx->get_array("select use_id,use_login
from ac_users
where use_login=$1", array($p_login));
- if ( ! $user ) return false;
+ if (!$user)
+ return false;
$cn_dossier=new Database($p_dossier);
// if not access to DB
- if (
+ if (
$repo_cnx->get_value("select count(*) from jnt_use_dos where
use_id=$1 and dos_id=$2",
- array($user[0]['use_id'],$p_dossier)) == 0
- )
+ array($user[0]['use_id'], $p_dossier))==0
+ )
{
$repo_cnx->exec_sql("insert into jnt_use_dos(use_id,dos_id) values
($1,$2)",
- array($user[0]['use_id'], $p_dossier));
+ array($user[0]['use_id'], $p_dossier));
}
//------ Give him the admin menu
- if ( $cn_dossier->get_value("select count(*) from profile_user where
user_name=$1",
- array($user[0]['use_login'])) == 0)
+ if ($cn_dossier->get_value("select count(*) from profile_user where
user_name=$1", array($user[0]['use_login']))==0)
{
- $cn_dossier->exec_sql('insert into profile_user(user_name,p_id)
values($1,1)',
- array($user[0]['use_login']));
+ $cn_dossier->exec_sql('insert into profile_user(user_name,p_id)
values($1,1)', array($user[0]['use_login']));
}
// Grant all action + ledger to him
- $cn_dossier->exec_sql("delete from user_sec_act where
ua_login=$1",array($p_login));
+ $cn_dossier->exec_sql("delete from user_sec_act where ua_login=$1",
array($p_login));
$cn_dossier->exec_sql("insert into user_sec_act (ua_login,ua_act_id)"
- ." select $1 ,ac_id from action ",array($p_login));
+ ." select $1 ,ac_id from action ", array($p_login));
- $cn_dossier->exec_sql("delete from user_sec_jrn where
uj_login=$1",array($p_login));
+ $cn_dossier->exec_sql("delete from user_sec_jrn where uj_login=$1",
array($p_login));
$cn_dossier->exec_sql("insert into
user_sec_jrn(uj_login,uj_jrn_id,uj_priv)"
- ." select $1,jrn_def_id,'W' from jrn_def",
- array($p_login));
-
-
+ ." select $1,jrn_def_id,'W' from jrn_def", array($p_login));
}
+
static function remove_inexistant_user($p_dossier)
{
$cnx_repo=new Database();
- $name=$cnx_repo->format_name($p_dossier,'dos');
- if ($cnx_repo->exist_database($name) == 0 )return;
+ $name=$cnx_repo->format_name($p_dossier, 'dos');
+ if ($cnx_repo->exist_database($name)==0)
+ return;
$cnx_dossier=new Database($p_dossier);
- if ($cnx_dossier->exist_table('profile_user'))
- $a_user=$cnx_dossier->get_array('select user_name from profile_user');
- else
- return;
+ if ($cnx_dossier->exist_table('profile_user'))
+ $a_user=$cnx_dossier->get_array('select user_name from
profile_user');
+ else
+ return;
- if ( ! $a_user ) return;
+ if (!$a_user)
+ return;
$nb=count($a_user);
- for ($i=0;$i < $nb;$i++) {
- if ( $cnx_repo->get_value('select count(*) from ac_users where
use_login=$1',
- array($a_user[$i]['user_name'])) == 0) {
- if ($cnx_dossier->exist_table('user_sec_jrn'))
- $cnx_dossier->exec_sql("delete from user_sec_jrn where
uj_login=$1",array($a_user[$i]['user_name']));
- $cnx_dossier->exec_sql("delete from profile_user where
user_name=$1",array($a_user[$i]['user_name']));
- if ($cnx_dossier->exist_table('user_sec_act'))
- $cnx_dossier->exec_sql("delete from user_sec_act
where ua_login=$1",array($a_user[$i]['user_name']));
- if ($cnx_dossier->exist_table('user_sec_jrn'))
- $cnx_dossier->exec_sql("delete from user_sec_jrn where
uj_login=$1",array($a_user[$i]['user_name']));
- if
($cnx_dossier->exist_table('user_active_security'))
- $cnx_dossier->exec_sql("delete from user_active_security
where us_login=$1",array($a_user[$i]['user_name']));
+ for ($i=0; $i<$nb; $i++)
+ {
+ if ($cnx_repo->get_value('select count(*) from ac_users where
use_login=$1', array($a_user[$i]['user_name']))==0)
+ {
+ if ($cnx_dossier->exist_table('user_sec_jrn'))
+ $cnx_dossier->exec_sql("delete from user_sec_jrn where
uj_login=$1", array($a_user[$i]['user_name']));
+ $cnx_dossier->exec_sql("delete from profile_user where
user_name=$1", array($a_user[$i]['user_name']));
+ if ($cnx_dossier->exist_table('user_sec_act'))
+ $cnx_dossier->exec_sql("delete from user_sec_act where
ua_login=$1", array($a_user[$i]['user_name']));
+ if ($cnx_dossier->exist_table('user_sec_jrn'))
+ $cnx_dossier->exec_sql("delete from user_sec_jrn where
uj_login=$1", array($a_user[$i]['user_name']));
+ if ($cnx_dossier->exist_table('user_active_security'))
+ $cnx_dossier->exec_sql("delete from user_active_security
where us_login=$1",
+ array($a_user[$i]['user_name']));
}
}
}
+
/**
* Check the security on ledger for the user , it returns 1 if the
security
* on ledgers is enabled, otherwise 0
@@ -1611,10 +1703,11 @@ class User
{
$security=$this->db->get_value("select us_ledger from
user_active_security
where
- us_login=$1",[$this->login]);
- $n_security =($security=="Y")?1:0;
+ us_login=$1", [$this->login]);
+ $n_security=($security=="Y")?1:0;
return $n_security;
}
+
/**
* Set the flag in the table user_active_security
* @param int $p_value 1==enable , 0 = disable
@@ -1622,16 +1715,22 @@ class User
*/
function set_status_security_ledger($p_value)
{
- if ($p_value != 0 && $p_value != 1) throw new Exception (_("Valeur
invalide"));
- $exist=$this->db->get_value("select count(*) from user_active_security
where us_login=$1",
- [$this->login]);
+ if ($p_value!=0&&$p_value!=1)
+ throw new Exception(_("Valeur invalide"));
+ $exist=$this->db->get_value("select count(*) from user_active_security
where us_login=$1", [$this->login]);
$flag=($p_value==1)?"Y":"N";
- if ( $exist == 0) {
- $this->db->exec_sql("insert into user_active_security
(us_login,us_ledger,us_action) values ($1,$2,$3)",[$this->login,$flag,'Y']);
- } else {
- $this->db->exec_sql("update user_active_security set us_ledger=$1
where us_login = $2",[$flag,$this->login]);
+ if ($exist==0)
+ {
+ $this->db->exec_sql("insert into user_active_security
(us_login,us_ledger,us_action) values ($1,$2,$3)",
+ [$this->login, $flag, 'Y']);
+ }
+ else
+ {
+ $this->db->exec_sql("update user_active_security set us_ledger=$1
where us_login = $2",
+ [$flag, $this->login]);
}
}
+
/**
* Check the security on ledger for the user , it returns 1 if the
security
* on ledgers is enabled, otherwise 0
@@ -1640,10 +1739,11 @@ class User
{
$security=$this->db->get_value("select us_action from
user_active_security
where
- us_login=$1",[$this->login]);
- $n_security =($security=="Y")?1:0;
+ us_login=$1", [$this->login]);
+ $n_security=($security=="Y")?1:0;
return $n_security;
}
+
/**
* Set the flag in the table user_active_security
* @param int $p_value 1==enable , 0 = disable
@@ -1651,31 +1751,38 @@ class User
*/
function set_status_security_action($p_value)
{
- if ($p_value != 0 && $p_value != 1) throw new Exception (_("Valeur
invalide"));
- $exist=$this->db->get_value("select count(*) from user_active_security
where us_login=$1",
- [$this->login]);
+ if ($p_value!=0&&$p_value!=1)
+ throw new Exception(_("Valeur invalide"));
+ $exist=$this->db->get_value("select count(*) from user_active_security
where us_login=$1", [$this->login]);
$flag=($p_value==1)?"Y":"N";
- if ( $exist == 0) {
- $this->db->exec_sql("insert into user_active_security
(us_login,us_action,us_ledger) values ($1,$2,$3)",[$this->login,$flag,'Y']);
- } else {
- $this->db->exec_sql("update user_active_security set us_action=$1
where us_login = $2",[$flag,$this->login]);
+ if ($exist==0)
+ {
+ $this->db->exec_sql("insert into user_active_security
(us_login,us_action,us_ledger) values ($1,$2,$3)",
+ [$this->login, $flag, 'Y']);
+ }
+ else
+ {
+ $this->db->exec_sql("update user_active_security set us_action=$1
where us_login = $2",
+ [$flag, $this->login]);
}
}
- /**
- *
- */
+ /**
+ *
+ */
function get_first_week_day()
- {
- $repocn=new Database();
- $result=$repocn->get_value("select parameter_value from
user_global_pref where parameter_type=$1 and user_id=$2 ",
- array("first_week_day",$this->login));
- if ($repocn->count() == 0 ) {
- $this->save_global_preference("first_week_day",1);
- return 1;
- }
- return $result;
- }
+ {
+ $repocn=new Database();
+ $result=$repocn->get_value("select parameter_value from
user_global_pref where parameter_type=$1 and user_id=$2 ",
+ array("first_week_day", $this->login));
+ if ($repocn->count()==0)
+ {
+ $this->save_global_preference("first_week_day", 1);
+ return 1;
+ }
+ return $result;
+ }
+
}
?>
\ No newline at end of file
diff --git a/include/constant.php b/include/constant.php
index 0e44686..8a5449d 100644
--- a/include/constant.php
+++ b/include/constant.php
@@ -116,7 +116,7 @@ if ( !defined ("NOALYSS_PACKAGE_REPOSITORY")) {
if ( ! defined ("SYSINFO_DISPLAY")) {
define ("SYSINFO_DISPLAY",TRUE);
}
-define ("DBVERSION",163);
+define ("DBVERSION",164);
define ("MONO_DATABASE",25);
define ("DBVERSIONREPO",20);
define ('NOTFOUND','--not found--');
@@ -596,8 +596,10 @@ function noalyss_class_autoloader($class) {
"sort_table" => "lib/sort_table.class.php",
"table_data_sql" => "lib/table_data_sql.class.php",
"zip_extended" => "lib/zip_extended.class.php",
- "document_state_mtable"=>"class/document_state_mtable.class.php"
-
+ "document_state_mtable"=>"class/document_state_mtable.class.php",
+ "noalyss\mobile"=>"class/mobile.class.php",
+ "profile_mobile_sql"=>"database/profile_mobile_sql.class.php",
+ "mobile_device_mtable"=>"class/mobile_device_mtable.class.php"
);
if ( isset ($aClass[$class]) ) {
require_once NOALYSS_INCLUDE."/".$aClass[$class];
diff --git a/include/database/profile_menu_sql.class.php
b/include/database/profile_menu_sql.class.php
index e11ddb5..6950144 100644
--- a/include/database/profile_menu_sql.class.php
+++ b/include/database/profile_menu_sql.class.php
@@ -36,7 +36,7 @@ require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
class Profile_Menu_sql extends Table_Data_SQL
{
- function __construct(&$p_cn,$p_id=-1)
+ function __construct(&$p_cn, $p_id=-1)
{
$this->table="public.profile_menu";
$this->primary_key="pm_id";
@@ -48,7 +48,7 @@ class Profile_Menu_sql extends Table_Data_SQL
, "p_order"=>"p_order"
, "p_type_display"=>"p_type_display"
, "pm_default"=>"pm_default"
- ,"pm_id_dep"=>"pm_id_dep"
+ , "pm_id_dep"=>"pm_id_dep"
);
$this->type=array(
diff --git a/include/database/profile_menu_sql.class.php
b/include/database/profile_mobile_sql.class.php
similarity index 50%
copy from include/database/profile_menu_sql.class.php
copy to include/database/profile_mobile_sql.class.php
index e11ddb5..d52ae92 100644
--- a/include/database/profile_menu_sql.class.php
+++ b/include/database/profile_mobile_sql.class.php
@@ -1,6 +1,7 @@
<?php
-/*
+/**
+ * Autogenerated file
* This file is part of NOALYSS.
*
* NOALYSS is free software; you can redistribute it and/or modify
@@ -17,58 +18,54 @@
* along with NOALYSS; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-// Copyright Author Dany De Bontridder danydb@aevalys.eu
+require_once NOALYSS_INCLUDE.'/lib/data_sql.class.php';
+require_once NOALYSS_INCLUDE.'/class/database.class.php';
+
/**
- * @file
- * @brief Manage the table public.profile_menu
+ * class_profile_mobile_sql.php
*
- *
- Example
- @code
-
- @endcode
- */
-require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
+ * @file
+ * @brief abstract of the table public.profile_mobile */
/**
- * @brief Manage the table public.profile_menu
+ * @class Profile_Mobile_SQL
+ * @brief ORM abstract of the table public.profile_mobile
*/
-class Profile_Menu_sql extends Table_Data_SQL
+
+class Profile_Mobile_SQL extends \Table_Data_SQL
{
- function __construct(&$p_cn,$p_id=-1)
+ function __construct(DatabaseCore $p_cn, $p_id=-1)
{
- $this->table="public.profile_menu";
- $this->primary_key="pm_id";
-
+ $this->table="public.profile_mobile";
+ $this->primary_key="pmo_id";
+ /*
+ * List of columns
+ */
$this->name=array(
- "pm_id"=>"pm_id", "me_code"=>"me_code"
- , "me_code_dep"=>"me_code_dep"
+ "pmo_id"=>"pmo_id"
+ , "me_code"=>"me_code"
+ , "pmo_order"=>"pmo_order"
, "p_id"=>"p_id"
- , "p_order"=>"p_order"
- , "p_type_display"=>"p_type_display"
- , "pm_default"=>"pm_default"
- ,"pm_id_dep"=>"pm_id_dep"
+ , "pmo_default"=>"pmo_default"
);
-
+ /*
+ * Type of columns
+ */
$this->type=array(
- "pm_id"=>"number",
- "me_code"=>"text"
- , "me_code_dep"=>"text"
- , "p_id"=>"number"
- , "p_order"=>"number"
- , "p_type_display"=>"text"
- , "pm_default"=>"text"
- , "pm_id_dep"=>"number"
+ "pmo_id"=>"numeric"
+ , "me_code"=>"text"
+ , "pmo_order"=>"numeric"
+ , "p_id"=>"numeric"
+ , "pmo_default"=>"text"
);
$this->default=array(
- "pm_id"=>"auto"
+ "pmo_id"=>"auto"
);
+ $this->date_format="DD.MM.YYYY";
parent::__construct($p_cn, $p_id);
}
}
-
-?>
diff --git a/include/lib/message_javascript.php
b/include/lib/message_javascript.php
index 68e6241..792b7d7 100644
--- a/include/lib/message_javascript.php
+++ b/include/lib/message_javascript.php
@@ -113,5 +113,5 @@ content[77]="<?php echo htmlspecialchars(_("Permet de
chercher dans le suivi pou
content[78]="<?php echo htmlspecialchars($file_too_large,ENT_QUOTES)?>";
content[79]="<?php echo htmlspecialchars(_("Les postes comptables sont entre
[] , les fiches entre {} et les postes analytiques entre {{ }}"))?>";
-
+content[80]="<?php echo htmlspecialchars(_("Oui pour charger les fichiers
javascripts et CSS standards"),ENT_QUOTES)?>";
</script>
diff --git a/include/profile.inc.php b/include/profile.inc.php
index d48cd6a..41d0bc8 100644
--- a/include/profile.inc.php
+++ b/include/profile.inc.php
@@ -387,7 +387,7 @@ for ($i=0; $i<Database::num_row($ret); $i++)
$gDossier, $row->p_id);
echo '<tr>';
echo "<td>".$js.$row->p_name.'</a>'.'</td>';
- echo td($row->p_desc);
+ echo td($row->p_desc);
echo td($row->with_calc);
echo td($row->with_direct_form);
echo '</tr>';
@@ -399,7 +399,8 @@ echo "<td>".$js._("Ajouter un profil")." </td>";
echo '</tr>';
echo '</table>';
echo '</div>';
-
+$profile_mobile=Mobile_Device_MTable::build(0,90);
+$profile_mobile->create_js_script();
//*******************************************************
// Show details of the selected profile
diff --git a/include/sql/patch/upgrade163.sql b/include/sql/patch/upgrade163.sql
new file mode 100644
index 0000000..5bc3fdf
--- /dev/null
+++ b/include/sql/patch/upgrade163.sql
@@ -0,0 +1,22 @@
+begin;
+
+drop table if exists profile_mobile;
+create table profile_mobile (pmo_id serial primary key , me_code text not null
, pmo_order int not null, p_id int not null,pmo_default char default '1');
+
+alter table profile_mobile add constraint profile_mobile_profile_fk foreign
key (p_id) references profile (p_id);
+alter table profile_mobile add constraint profile_mobile_menu_ref_fk foreign
key (me_code) references menu_ref (me_code);
+alter table profile_mobile add constraint profile_mobile_code_uq unique
(p_id,me_code);
+
+comment on table profile_mobile is 'Menu for mobile device';
+comment on column profile_mobile.pmo_id is 'primary key';
+comment on column profile_mobile.me_code is 'Code of menu_ref to execute';
+comment on column profile_mobile.pmo_order is 'item order in menu';
+comment on column profile_mobile.p_id is 'Profile id ';
+comment on column profile_mobile.pmo_default is 'possible values are 1 , the
default HTML header (javascript,CSS,...) is loaded , 0 nothing is loaded from
noalyss ';
+
+insert into profile_mobile (p_id,me_code,pmo_order) select p_id , 'AGENDA',10
from profile;
+insert into profile_mobile (p_id,me_code,pmo_order) select p_id , 'LOGOUT',20
from profile;
+
+
+insert into version (val,v_description) values (164,'Menu for small device :
mobile');
+commit ;
diff --git a/include/template/calendar.php b/include/template/calendar.php
index 88effb6..e402e4e 100644
--- a/include/template/calendar.php
+++ b/include/template/calendar.php
@@ -23,7 +23,8 @@ $nDay=$nFirstDay;
for ($i=0;$i<=6;$i++){
echo "<th>";
$nDay=($nDay>6)?0:$nDay;
- echo $week[$nDay];
+ echo '<span class="d-none d-sm-block ">'.$week[$nDay].'</span>';
+ echo '<span class=" d-block
d-sm-none">'.substr($week[$nDay],0,2).'</span>';
$nDay++;
echo "</th>";
}
@@ -36,18 +37,27 @@ $nCol=0;
$today_month=date('m');
$today_day=date('j');
while ($ind <= $this->day) {
- if ( $nCol == 0 ) echo "<tr>";
+ if ($nCol==0)
+ {
+ echo "<tr>";
+ }
$class="workday";
- if ( $week == 0 || $week == 6) $class="weekend";
+ if ($week==0||$week==6)
+ {
+ $class="weekend";
+ }
// compute the date
$timestamp_date=mktime(0,0,0,$this->month,$ind,$this->year);
$date_calendar=date('w',$timestamp_date);
$st="";
- if ( $today_month==$this->month && $today_day==$ind)
- $st=' style="border:1px solid red" ';
+ if ($today_month==$this->month&&$today_day==$ind)
+ {
+ $st=' style="border:1px solid red" ';
+ }
if ( $date_calendar == $week ) {
echo '<td class="'.$class.'" '.$st.'>'.'<span
class="day">'.$ind."</span>";
- echo $cell[$ind];
+ echo '<span class="d-none d-sm-block ">'.$cell[$ind].'<span>';
+ echo '<span class="d-block d-sm-none">'.$cell[$ind].'<span>';
echo '</td>';
$ind++;$week++;$nCol++;
} else {
diff --git a/include/template/mobile-display_menu.php
b/include/template/mobile-display_menu.php
new file mode 100644
index 0000000..1017c06
--- /dev/null
+++ b/include/template/mobile-display_menu.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * This file is part of NOALYSS.
+ *
+ * PhpCompta 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * PhpCompta 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 PhpCompta; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+if (!defined('ALLOWED'))
+ die('Appel direct ne sont pas permis');
+
+/**
+ * @file
+ * @brief show the mobile menu
+ */
+if (DEBUGNOALYSS>1)
+{
+ echo __FILE__;
+};
+?>
+<img src="<?=NOALYSS_URL?>/image/logo9000.png" width="100%"
style="position:absolute;top:0px;left:0px;z-index:-1;opacity: 11%">
+<div id="mobile_module" >
+<h1>NOALYSS</h1>
+ <ul class="nav nav-pills nav-fill flex-column " >
+ <?php
+ foreach ($aModule as $row):
+ $js="";
+ $style="";
+
+ $style="nav-item-module";
+ if ($row['me_code']=='new_line')
+ {
+ continue;
+ }
+ if ($row['me_url']!='')
+ {
+ $url=$row['me_url'];
+ }
+ elseif ($row['me_javascript']!='')
+ {
+ $url="javascript:void(0)";
+ $js_dossier=str_replace('<DOSSIER>', Dossier::id(),
$row['me_javascript']);
+ $js=sprintf(' onclick="%s"', $js_dossier);
+ }
+ else
+ {
+
$url="mobile.php?gDossier=".Dossier::id()."&ac=".$row['me_code'];
+ }
+ ?>
+ <li class="<?php echo $style ?>">
+ <a class="nav-link border-1 border-dark rounded-2" href="<?php
echo $url ?>" title="<?php echo _($row['me_description']) ?>" <?php echo $js ?>
><?php echo gettext($row['me_menu']) ?></a>
+ </li>
+ <?php
+ endforeach;
+ ?>
+ </ul>
+</div>
- [Noalyss-commit] [noalyss] branch master updated (61b50d7 -> 07fedf5), Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 01/26: Cosmetic #0002047: Historique : montant total n'est pas dans la bonne colonne, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 02/26: Bug The detailled report of sales without VAT does not give any result, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 03/26: New function header_csv($filename), Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 05/26: Merge branch 'master' into b-orion, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 04/26: Code documentation, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 08/26: Task #0002050: Mobile : menu différent,
Dany De Bontridder <=
- [Noalyss-commit] [noalyss] 06/26: Merge branch 'master' into b-orion, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 07/26: Documentation for Doxygen, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 12/26: Code cleaning : extra information are now a fonction, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 10/26: Documentation doxygen, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 19/26: cosmetic : fix icon in followup for the trash can, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 16/26: cosmetic : flashing color for h2.error, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 24/26: Code cleaning Improve doc and test, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 15/26: Bug in print_ledger_purchase for company w/o vat, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 14/26: Code cleaning : extra information are now a fonction, Dany De Bontridder, 2021/08/11
- [Noalyss-commit] [noalyss] 25/26: Improve code : Card_Property is separated from Card (Fiche) , add more phpunit tests, Dany De Bontridder, 2021/08/11