Task #001381 : favori de filtre , ajout des favoris de filtre dans les
recherches.
This commit is contained in:
parent
af4953a9b3
commit
6152d092fb
12 changed files with 1522 additions and 951 deletions
|
|
@ -196,7 +196,17 @@ $path = array(
|
|||
// Update, insert or delete accounting frmo CFGPCMN
|
||||
"accounting"=>"ajax_accounting",
|
||||
// Show detail of an ANC operation
|
||||
"anc_detail_op"=>"ajax_anc_detail_operation"
|
||||
"anc_detail_op"=>"ajax_anc_detail_operation",
|
||||
// Display the list of filter saved
|
||||
"display_search_filter"=>"ajax_search_filter",
|
||||
// Save search filter
|
||||
"save_filter"=>"ajax_search_filter",
|
||||
// Load a search filter
|
||||
"load_filter"=>"ajax_search_filter",
|
||||
// search operation to reconcile
|
||||
'search_op'=>'ajax_search_operation',
|
||||
// delete operation
|
||||
'delete_search_operation'=>'ajax_search_filter'
|
||||
) ;
|
||||
|
||||
if (array_key_exists($op, $path)) {
|
||||
|
|
@ -406,9 +416,7 @@ EOF;
|
|||
EOF;
|
||||
|
||||
break;
|
||||
case 'search_op':
|
||||
require_once NOALYSS_INCLUDE.'/search.inc.php';
|
||||
break;
|
||||
|
||||
case 'add_plugin':
|
||||
$me_code = new IText('me_code');
|
||||
$me_file = new IText('me_file');
|
||||
|
|
@ -451,5 +459,5 @@ EOF;
|
|||
break;
|
||||
|
||||
default:
|
||||
var_dump($_GET);
|
||||
var_dump($_REQUEST);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1215,3 +1215,159 @@ function document_remove(p_dossier,p_div,p_jrid)
|
|||
}
|
||||
});
|
||||
}
|
||||
/***
|
||||
* @brief receive an object and display a list of filter + form to save one
|
||||
* fill up the span (id : {div}search_filter_span) with the name of the selected filter
|
||||
* Object = '{'div':'','type':'ALL','all_type':1,'dossier':'10104'}'
|
||||
* @see Acc_Ledger_Search
|
||||
*/
|
||||
function manage_search_filter(p_obj) {
|
||||
waiting_box();
|
||||
new Ajax.Request("ajax_misc.php", {
|
||||
method:'get',
|
||||
parameters:{"op":"display_search_filter","gDossier":p_obj.dossier,"div":p_obj.div,"ledger_type":p_obj.ledger_type,"all_type":p_obj.all_type},
|
||||
onSuccess:function(req) {
|
||||
remove_waiting_box();
|
||||
var x=posX;
|
||||
var y=posY-20;
|
||||
create_div({'id':'boxfilter'+p_obj.div,'cssclass':'inner_box','html':req.responseText,'style':'top:'+y+'px;left:'+x+'px;position:absolute;width:400px'});
|
||||
$('boxfilter'+p_obj.div).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Send data from the form and record a new filter , the ajax answer is a json object
|
||||
* with the attribute filter_name,filter_id,status,message
|
||||
*
|
||||
* @param p_div prefix id of all concerned DOM Element
|
||||
* @param p_dossier
|
||||
* @see Acc_Ledger_Search
|
||||
*/
|
||||
function save_filter(p_div,p_dossier) {
|
||||
var elt=['ledger_type','nb_jrn','date_start','date_end','date_paid_start','date_paid_end','desc','amount_min','amount_max','qcode','accounting'];
|
||||
var eltValue={};
|
||||
eltValue['gDossier']=p_dossier;
|
||||
eltValue['op']="save_filter";
|
||||
eltValue['div']=p_div;
|
||||
eltValue['filter_name']=$(p_div+"filter_new").value;
|
||||
// Get all elt from the form
|
||||
for ( var i = 0 ; i < elt.length;i++) {
|
||||
var idx=elt[i];
|
||||
eltValue[idx]=$(p_div+elt[i]).value;
|
||||
|
||||
}
|
||||
//ledger's list r_jrn
|
||||
if (eltValue['nb_jrn'] > 0) {
|
||||
eltValue['r_jrn']=[];
|
||||
for (i=0;i<eltValue['nb_jrn'];i++) {
|
||||
var idx=p_div+'r_jrn['+i+']';
|
||||
eltValue['r_jrn'+i]=$(idx).value
|
||||
|
||||
}
|
||||
}
|
||||
//unpaid
|
||||
eltValue['unpaid']=$(p_div+"unpaid").checked;
|
||||
new Ajax.Request('ajax_misc.php', {
|
||||
method:"POST",
|
||||
parameters:eltValue,
|
||||
onSuccess:function (req) {
|
||||
try {
|
||||
var answer=req.responseJSON;
|
||||
if ( answer.status == 'OK') {
|
||||
var new_item=document.createElement('li');
|
||||
new_item.innerHTML=answer.filter_name;
|
||||
$(p_div+'button_list').appendChild(new_item);
|
||||
$(p_div+"filter_new").value="";
|
||||
} else {
|
||||
throw answer.message;
|
||||
}
|
||||
} catch (e) {
|
||||
smoke.alert(e.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Load a search filter and fill up the form search
|
||||
* @param p_div prefix id of all concerned DOM Element
|
||||
* @param p_dossier
|
||||
* @param p_filter_id filter id (SQL user_filter.id)
|
||||
* @see Acc_Ledger_Search
|
||||
*/
|
||||
function load_filter(p_div,p_dossier,p_filter_id) {
|
||||
new Ajax.Request('ajax_misc.php',{
|
||||
method:"get",
|
||||
parameters:{"gDossier":p_dossier,"div":p_div,"op":"load_filter","filter_id":p_filter_id},
|
||||
onSuccess:function (req) {
|
||||
try {
|
||||
var answer=req.responseJSON;
|
||||
console.log(answer);
|
||||
var elt=['ledger_type','date_start','date_end','date_paid_start','date_paid_end','desc','amount_min','amount_max','qcode','accounting'];
|
||||
for (var i=0;i<elt.length;i++) {
|
||||
var idx=elt[i];
|
||||
$(p_div+idx).value=answer[elt[i]]
|
||||
}
|
||||
// fillup the r_jrn array
|
||||
var eltLedgerId=$("ledger_id"+p_div);
|
||||
eltLedgerId.innerHTML="";
|
||||
var eltHidden=document.createElement("input");
|
||||
eltHidden.setAttribute("name",p_div+"nb_jrn");
|
||||
eltHidden.setAttribute("type","hidden");
|
||||
eltHidden.setAttribute("id",p_div+"nb_jrn");
|
||||
eltHidden.setAttribute("value",answer.nb_jrn);
|
||||
eltLedgerId.appendChild(eltHidden);
|
||||
|
||||
for ( var i=0;i < answer.nb_jrn;i++) {
|
||||
// create hidden element and add them into eltLedgerId
|
||||
var eltHidden=document.createElement("input");
|
||||
|
||||
eltHidden.setAttribute("name",p_div+"r_jrn["+i+"]");
|
||||
eltHidden.setAttribute("type","hidden");
|
||||
eltHidden.setAttribute("id",p_div+"r_jrn["+i+"]");
|
||||
eltHidden.setAttribute("value",answer.r_jrn[i]);
|
||||
eltLedgerId.appendChild(eltHidden);
|
||||
}
|
||||
if ( answer.unpaid == 'false') {
|
||||
$(p_div+"unpaid").checked=false;
|
||||
}
|
||||
if ( answer.unpaid == 'true') {
|
||||
$(p_div+"unpaid").checked=true;
|
||||
}
|
||||
|
||||
|
||||
} catch (e) {
|
||||
smoke.alert(e.message);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* @brief delete a saved search filter from the db, it is limited to the current
|
||||
* user
|
||||
* @parameter p_div
|
||||
identification des elements LI manageli{div}_{filter_id}
|
||||
identification element UL manage{div}
|
||||
@parameter p_filter_id SQL user_filter.id
|
||||
*/
|
||||
|
||||
function delete_filter (p_div,p_dossier,p_filter_id) {
|
||||
new Ajax.Request("ajax_misc",{
|
||||
parameters:{"gDossier":p_dossier,"div":p_div,"filter_id":p_filter_id,'op':"delete_search_operation"},
|
||||
method:"POST",
|
||||
onSuccess:function (req) {
|
||||
try {
|
||||
var answer=req.evalJSON;
|
||||
|
||||
var child=$("manageli"+p_div+"_"+p_filter_id);
|
||||
console.log(child)
|
||||
if ( child ) {$("manage"+p_div).removeChild(child); }
|
||||
}catch (e) {
|
||||
console.log(e.message)
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
|
@ -20,10 +20,12 @@
|
|||
/*! \file
|
||||
* \brief Search module
|
||||
*/
|
||||
define('ALLOWED',TRUE);
|
||||
require_once '../include/constant.php';
|
||||
require_once NOALYSS_INCLUDE.'/class/dossier.class.php';
|
||||
include_once NOALYSS_INCLUDE.'/lib/ac_common.php';
|
||||
require_once NOALYSS_INCLUDE.'/class/acc_ledger.class.php';
|
||||
require_once NOALYSS_INCLUDE.'/class/acc_ledger_search.class.php';
|
||||
|
||||
html_page_start($_SESSION['g_theme']);
|
||||
|
||||
|
|
@ -55,9 +57,8 @@ if ( $act=='X')
|
|||
}
|
||||
// display a search box
|
||||
|
||||
$ledger=new Acc_Ledger($cn,0);
|
||||
$ledger->type='ALL';
|
||||
$search_box=$ledger->search_form('ALL',1);
|
||||
$ledger=new Acc_Ledger_Search('ALL');
|
||||
$search_box=$ledger->search_form();
|
||||
echo '<div class="content">';
|
||||
|
||||
echo '<form method="GET">';
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ if (!file_exists('authorized_debug'))
|
|||
exit();
|
||||
}
|
||||
define('ALLOWED', 1);
|
||||
html_page_start();
|
||||
html_page_start("Classic 692");
|
||||
|
||||
/*
|
||||
* Loading of all scenario
|
||||
|
|
|
|||
182
include/ajax/ajax_search_filter.php
Normal file
182
include/ajax/ajax_search_filter.php
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
<?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 (2016) Author Dany De Bontridder <dany@alchimerys.be>
|
||||
|
||||
if (!defined('ALLOWED'))
|
||||
die('Appel direct ne sont pas permis');
|
||||
|
||||
require NOALYSS_INCLUDE.'/database/user_filter_sql.class.php';
|
||||
$cn=Dossier::connect();
|
||||
$dossier_id=Dossier::id();
|
||||
global $g_user;
|
||||
/**
|
||||
* @file
|
||||
* @brief Managed the search filter
|
||||
*/
|
||||
$http=new HttpInput();
|
||||
//---------------------------------------------------------------------------
|
||||
// Record the the search filter
|
||||
//---------------------------------------------------------------------------
|
||||
$op=$http->request("op");
|
||||
if ($op=='save_filter')
|
||||
{
|
||||
$answer=[];
|
||||
$answer['filter_name']="";
|
||||
$answer['status']='NOK';
|
||||
$answer['filter_id']=0;
|
||||
$answer['message']="";
|
||||
try
|
||||
{
|
||||
$new=new User_filter_SQL($cn, -1);
|
||||
$new->setp("login", $g_user->login);
|
||||
$new->setp("nb_jrn", $http->post("nb_jrn", 'number'));
|
||||
$new->setp("date_start", $http->post("date_start", 'string', NULL));
|
||||
$new->setp("date_end", $http->post("date_end", 'string', NULL));
|
||||
$new->setp("description", $http->post("desc", 'string', NULL));
|
||||
$new->setp("amount_min", $http->post("amount_min", 'number', NULL));
|
||||
$new->setp("amount_max", $http->post("amount_max", 'number', NULL));
|
||||
$new->setp("qcode", $http->post("qcode", 'string', NULL));
|
||||
$new->setp("accounting", $http->post("accounting", 'string', NULL));
|
||||
$new->setp("date_paid_start",
|
||||
$http->post("date_paid_start", 'string', NULL));
|
||||
$new->setp("date_paid_end", $http->post("date_paid_end", 'string', NULL));
|
||||
$new->setp("ledger_type", $http->post("ledger_type", 'string'));
|
||||
$new->setp("unpaid", $http->post("unpaid", 'string', NULL));
|
||||
$new->setp("filter_name", h($http->post("filter_name", 'string')));
|
||||
$aJrn=[];
|
||||
$max=$http->post("nb_jrn");
|
||||
for ($i=0; $i<$max; $i++)
|
||||
{
|
||||
$aJrn[]=$http->post("r_jrn".$i, "number");
|
||||
}
|
||||
$new->setp("r_jrn", join(',', $aJrn));
|
||||
if (strlen($new->getp("filter_name"))==0)
|
||||
{
|
||||
throw new Exception(_("Nom ne peut être vide"));
|
||||
}
|
||||
$new->save();
|
||||
$answer['filter_name']=sprintf("<a onclick=\"load_filter('%s','%s','%s')\">%s</a>",
|
||||
trim($http->post('div')), $dossier_id, $new->getp('id'),
|
||||
$new->getp("filter_name"));
|
||||
$answer['filter_id']=$new->getp("id");
|
||||
$answer['status']='OK';
|
||||
}
|
||||
catch (Exception $ex)
|
||||
{
|
||||
$answer['status']='NOK';
|
||||
$answer['message']=$ex->getMessage();
|
||||
}
|
||||
header('Content-Type: application/json;charset=utf-8');
|
||||
echo json_encode($answer);
|
||||
return;
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
// Load a filter
|
||||
//------------------------------------------------------------------------------
|
||||
if ($op=="load_filter")
|
||||
{
|
||||
$filter_id=$http->get("filter_id", "number");
|
||||
$div=$http->get("div");
|
||||
$answer=[];
|
||||
$answer['status']='OK';
|
||||
$answer['filter_id']=0;
|
||||
$answer['message']="";
|
||||
$filter=new User_filter_SQL($cn, $filter_id);
|
||||
$record=$filter->to_array();
|
||||
|
||||
$record['desc']=$record['description'];
|
||||
$record['r_jrn']=explode(",", $record['r_jrn']);
|
||||
|
||||
$result=array_merge($answer, $record);
|
||||
|
||||
|
||||
header('Content-Type: application/json;charset=utf-8');
|
||||
echo json_encode($result);
|
||||
return;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// Display all the existing search filters and allow to load or delete them
|
||||
// id of the box is "boxfilter"+{p_div}
|
||||
//------------------------------------------------------------------------------
|
||||
if ($op=="display_search_filter")
|
||||
{
|
||||
$p_div=$http->get("div");
|
||||
$ledger_type=$http->get("ledger_type");
|
||||
|
||||
echo HtmlInput::title_box(_("Filtre"), "boxfilter".$p_div);
|
||||
// Make a list of all search filters with the same ledger_type of the current
|
||||
// user
|
||||
$result=$cn->get_array("
|
||||
select id, filter_name,ledger_type
|
||||
from user_filter
|
||||
where
|
||||
login = $1
|
||||
and ledger_type=$2
|
||||
order by 2 asc
|
||||
", [$g_user->login, $ledger_type]);
|
||||
$nb_result=count($result);
|
||||
printf('<ul class="select_table" id="manage%s">', $p_div);
|
||||
for ($i=0; $i<$nb_result; $i++)
|
||||
{
|
||||
printf(' <li id="manageli%s_%d">', $p_div, $result[$i]["id"]);
|
||||
$rmAction=sprintf("delete_filter('%s','%s','%s')", $p_div, $dossier_id,
|
||||
$result[$i]['id']);
|
||||
printf('<a class="tinybutton" style="display:inline" id="" onclick="'.$rmAction.'">'.SMALLX.'</a>'
|
||||
);
|
||||
printf("<a style=\"display:inline\" onclick=\"load_filter('%s','%s','%s')\">",
|
||||
$p_div, $dossier_id, $result[$i]["id"]);
|
||||
echo $result[$i]["filter_name"];
|
||||
echo '</a>';
|
||||
|
||||
printf("</li>");
|
||||
}
|
||||
return;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// Delete a filter_id
|
||||
// Check if this filter belong to current user
|
||||
//------------------------------------------------------------------------------
|
||||
if ($op=="delete_search_operation")
|
||||
{
|
||||
$answer=[];
|
||||
$answer['filter_name']="";
|
||||
$answer['status']='NOK';
|
||||
$answer['filter_id']=0;
|
||||
$answer['message']="";
|
||||
try
|
||||
{
|
||||
$p_div=$http->post("div");
|
||||
$filter_id=$http->post("filter_id", "number");
|
||||
|
||||
$answer['div']=$p_div;
|
||||
|
||||
$cn->exec_sql("delete from user_filter where id=$1 and login=$2",[$filter_id,$g_user->login]);
|
||||
|
||||
$answer['filter_id']=$filter_id;
|
||||
$answer['status']="OK";
|
||||
}
|
||||
catch (Exception $ex)
|
||||
{
|
||||
$answer['message']=$ex->getMessage();
|
||||
}
|
||||
header('Content-Type: application/json;charset=utf-8');
|
||||
echo json_encode($answer);
|
||||
return;
|
||||
}
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
if ( ! defined ('ALLOWED') ) die('Appel direct ne sont pas permis');
|
||||
require_once NOALYSS_INCLUDE.'/class/dossier.class.php';
|
||||
require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
|
||||
require_once NOALYSS_INCLUDE.'/class/acc_ledger.class.php';
|
||||
require_once NOALYSS_INCLUDE.'/class/acc_ledger_search.class.php';
|
||||
|
||||
global $ĥttp;
|
||||
$gDossier=dossier::id();
|
||||
|
|
@ -38,17 +38,15 @@ require_once NOALYSS_INCLUDE.'/class/user.class.php';
|
|||
|
||||
$base=basename($_SERVER['SCRIPT_NAME']);
|
||||
$inside=false;
|
||||
$ledger=new Acc_Ledger($cn,0);
|
||||
$ledger->type='ALL';
|
||||
if (isset($_GET['amount_id']))
|
||||
{
|
||||
put_global(array(
|
||||
array("key"=>'amount_min','value'=>$_GET['amount_id']),
|
||||
array("key"=>'amount_max','value'=>$_GET['amount_id'])
|
||||
));
|
||||
array("key"=>'amount_min','value'=>$_GET['amount_id']),
|
||||
array("key"=>'amount_max','value'=>$_GET['amount_id'])
|
||||
));
|
||||
}
|
||||
|
||||
$search_box=$ledger->search_form('ALL',1,'search_op');
|
||||
$ledger=new Acc_Ledger_Search('ALL',1,'search_op');
|
||||
|
||||
if ($base == 'recherche.php' || $base == 'do.php')
|
||||
{
|
||||
|
|
@ -66,7 +64,7 @@ if ($base == 'recherche.php' || $base == 'do.php')
|
|||
$inside=true;
|
||||
}
|
||||
|
||||
echo $search_box;
|
||||
echo $ledger->search_form();
|
||||
echo HtmlInput::submit("viewsearch",_("Recherche"));
|
||||
echo HtmlInput::button_close('search_op');
|
||||
echo '</form>';
|
||||
|
|
@ -617,459 +617,9 @@ class Acc_Ledger extends jrn_def_sql
|
|||
return $pj_pref.$pj_seq;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Show all the operation
|
||||
* @param$sql is the sql stmt, normally created by build_search_sql
|
||||
* @param$offset the offset
|
||||
* @param$p_paid if we want to see info about payment
|
||||
@code
|
||||
// Example
|
||||
// Build the sql
|
||||
list($sql,$where)=$Ledger->build_search_sql($_GET);
|
||||
// Count nb of line
|
||||
$max_line=$this->db->count_sql($sql);
|
||||
|
||||
$step=$_SESSION['g_pagesize'];
|
||||
$page=(isset($_GET['offset']))?$_GET['page']:1;
|
||||
$offset=(isset($_GET['offset']))?$_GET['offset']:0;
|
||||
// create the nav. bar
|
||||
$bar=navigation_bar($offset,$max_line,$step,$page);
|
||||
// show a part
|
||||
list($count,$html)= $Ledger->list_operation($sql,$offset,0);
|
||||
echo $html;
|
||||
// show nav bar
|
||||
echo $bar;
|
||||
|
||||
@endcode
|
||||
* @see build_search_sql
|
||||
* @see display_search_form
|
||||
* @see search_form
|
||||
|
||||
* @return HTML string
|
||||
*/
|
||||
public function list_operation_to_reconcile($sql, $p_target)
|
||||
{
|
||||
global $g_parameter, $g_user;
|
||||
$gDossier=dossier::id();
|
||||
$limit=" LIMIT ".MAX_RECONCILE;
|
||||
// Sort
|
||||
// Count
|
||||
$count=$this->db->count_sql($sql);
|
||||
// Add the limit
|
||||
$sql.=" order by jr_date asc ".$limit;
|
||||
|
||||
// Execute SQL stmt
|
||||
$Res=$this->db->exec_sql($sql);
|
||||
|
||||
//starting from here we can refactor, so that instead of returning the generated HTML,
|
||||
//this function returns a tree structure.
|
||||
|
||||
$r="";
|
||||
|
||||
|
||||
$Max=Database::num_row($Res);
|
||||
|
||||
if ($Max==0)
|
||||
return array(0, _("Aucun enregistrement trouvé"));
|
||||
$r.=HtmlInput::hidden("target", $p_target);
|
||||
$r.='<table class="result">';
|
||||
|
||||
|
||||
$r.="<tr >";
|
||||
$r.="<th>"._("Selection")."</th>";
|
||||
$r.="<th>"._("Internal")."</th>";
|
||||
|
||||
if ($this->type=='ALL')
|
||||
{
|
||||
$r.=th(_('Journal'));
|
||||
}
|
||||
|
||||
$r.='<th>'._("Date").'</th>';
|
||||
$r.='<th>'._("Pièce").'</td>';
|
||||
$r.=th(_('tiers'));
|
||||
$r.='<th>'._("Description").'</th>';
|
||||
$r.=th(_('Notes'), ' ');
|
||||
$r.='<th>'._("Montant").'</th>';
|
||||
$r.="<th>"._('Concerne')."</th>";
|
||||
$r.="</tr>";
|
||||
// Total Amount
|
||||
$tot=0.0;
|
||||
$gDossier=dossier::id();
|
||||
$str_dossier=Dossier::id();
|
||||
for ($i=0; $i<$Max; $i++)
|
||||
{
|
||||
|
||||
|
||||
$row=Database::fetch_array($Res, $i);
|
||||
|
||||
if ($i%2==0)
|
||||
$tr='<TR class="odd">';
|
||||
else
|
||||
$tr='<TR class="even">';
|
||||
$r.=$tr;
|
||||
// Radiobox
|
||||
//
|
||||
|
||||
$r.='<td><INPUT TYPE="CHECKBOX" name="jr_concerned'.$row['jr_id'].'" ID="jr_concerned'.$row['jr_id'].'" value="'.$row['quick_code'].'"> </td>';
|
||||
//internal code
|
||||
// button modify
|
||||
$r.="<TD>";
|
||||
// If url contains
|
||||
//
|
||||
|
||||
$href=basename($_SERVER['PHP_SELF']);
|
||||
|
||||
|
||||
$r.=sprintf('<A class="detail" style="text-decoration:underline" HREF="javascript:modifyOperation(\'%s\',\'%s\')" >%s </A>',
|
||||
$row['jr_id'], $gDossier, $row['jr_internal']);
|
||||
$r.="</TD>";
|
||||
if ($this->type=='ALL')
|
||||
$r.=td($row['jrn_def_name']);
|
||||
// date
|
||||
$r.="<TD>";
|
||||
$r.=$row['str_jr_date'];
|
||||
$r.="</TD>";
|
||||
|
||||
// pj
|
||||
$r.="<TD>";
|
||||
$r.=$row['jr_pj_number'];
|
||||
$r.="</TD>";
|
||||
|
||||
// Tiers
|
||||
$other=($row['quick_code']!='')?'['.$row['quick_code'].'] '.$row['name'].' '.$row['first_name']:'';
|
||||
$r.=td($other);
|
||||
// comment
|
||||
$r.="<TD>";
|
||||
$tmp_jr_comment=h($row['jr_comment']);
|
||||
$r.=$tmp_jr_comment;
|
||||
$r.="</TD>";
|
||||
$r.=td(h($row['n_text']), ' style="font-size:0.87em"');
|
||||
// Amount
|
||||
// If the ledger is financial :
|
||||
// the credit must be negative and written in red
|
||||
$positive=0;
|
||||
|
||||
// Check ledger type :
|
||||
if ($row['jrn_def_type']=='FIN')
|
||||
{
|
||||
$positive=$this->db->get_value("select qf_amount from quant_fin where jr_id=$1",
|
||||
array($row['jr_id']));
|
||||
if ($this->db->count()!=0)
|
||||
$positive=($positive<0)?1:0;
|
||||
}
|
||||
$r.="<TD align=\"right\">";
|
||||
|
||||
$r.=( $positive!=0 )?"<font color=\"red\"> - ".nbm($row['jr_montant'])."</font>":nbm($row['jr_montant']);
|
||||
$r.="</TD>";
|
||||
|
||||
|
||||
|
||||
// Rapprochement
|
||||
$rec=new Acc_Reconciliation($this->db);
|
||||
$rec->set_jr_id($row['jr_id']);
|
||||
$a=$rec->get();
|
||||
$r.="<TD>";
|
||||
if ($a!=null)
|
||||
{
|
||||
|
||||
foreach ($a as $key=> $element)
|
||||
{
|
||||
$operation=new Acc_Operation($this->db);
|
||||
$operation->jr_id=$element;
|
||||
$l_amount=$this->db->get_value("select jr_montant from jrn ".
|
||||
" where jr_id=$1", array($element));
|
||||
$r.="<A class=\"detail\" HREF=\"javascript:modifyOperation('".$element."',".$gDossier.")\" > ".$operation->get_internal()."[".nbm($l_amount)."]</A>";
|
||||
}//for
|
||||
}// if ( $a != null ) {
|
||||
$r.="</TD>";
|
||||
|
||||
if ($row['jr_valid']=='f')
|
||||
{
|
||||
$r.="<TD>"._("Opération annulée")."</TD>";
|
||||
}
|
||||
// end row
|
||||
$r.="</tr>";
|
||||
}
|
||||
$r.='</table>';
|
||||
return array($count, $r);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Show all the operation
|
||||
* @param$sql is the sql stmt, normally created by build_search_sql
|
||||
* @param$offset the offset
|
||||
* @param$p_paid if we want to see info about payment
|
||||
\code
|
||||
// Example
|
||||
// Build the sql
|
||||
list($sql,$where)=$Ledger->build_search_sql($_GET);
|
||||
// Count nb of line
|
||||
$max_line=$cn->count_sql($sql);
|
||||
|
||||
$step=$_SESSION['g_pagesize'];
|
||||
$page=(isset($_GET['offset']))?$_GET['page']:1;
|
||||
$offset=(isset($_GET['offset']))?$_GET['offset']:0;
|
||||
// create the nav. bar
|
||||
$bar=navigation_bar($offset,$max_line,$step,$page);
|
||||
// show a part
|
||||
list($count,$html)= $Ledger->list_operation($sql,$offset,0);
|
||||
echo $html;
|
||||
// show nav bar
|
||||
echo $bar;
|
||||
|
||||
\endcode
|
||||
* \see build_search_sql
|
||||
* \see display_search_form
|
||||
* \see search_form
|
||||
|
||||
* \return HTML string
|
||||
*/
|
||||
public function list_operation($sql, $offset, $p_paid=0)
|
||||
{
|
||||
global $g_parameter, $g_user;
|
||||
bcscale(2);
|
||||
$table=new Sort_Table();
|
||||
$gDossier=dossier::id();
|
||||
$amount_paid=0.0;
|
||||
$amount_unpaid=0.0;
|
||||
$limit=($_SESSION['g_pagesize']!=-1)?" LIMIT ".$_SESSION['g_pagesize']:"";
|
||||
$offset=($_SESSION['g_pagesize']!=-1)?" OFFSET ".Database::escape_string($offset):"";
|
||||
$order=" order by jr_date_order asc,jr_internal asc";
|
||||
// Sort
|
||||
$url="?".CleanUrl();
|
||||
$str_dossier=dossier::get();
|
||||
$table->add(_("Date"), $url,
|
||||
'order by jr_date asc,substring(jr_pj_number,\'[0-9]+$\')::numeric asc',
|
||||
'order by jr_date desc,substring(jr_pj_number,\'[0-9]+$\')::numeric desc',
|
||||
"da", "dd");
|
||||
$table->add(_('Echeance'), $url, " order by jr_ech asc",
|
||||
" order by jr_ech desc", 'ea', 'ed');
|
||||
$table->add(_('Paiement'), $url, " order by jr_date_paid asc",
|
||||
" order by jr_date_paid desc", 'eap', 'edp');
|
||||
$table->add(_('Pièce'), $url,
|
||||
' order by substring(jr_pj_number,\'[0-9]+$\')::numeric asc ',
|
||||
' order by substring(jr_pj_number,\'[0-9]+$\')::numeric desc ',
|
||||
"pja", "pjd");
|
||||
$table->add(_('Tiers'), $url, " order by name asc",
|
||||
" order by name desc", 'na', 'nd');
|
||||
$table->add(_('Montant'), $url, " order by jr_montant asc",
|
||||
" order by jr_montant desc", "ma", "md");
|
||||
$table->add(_("Description"), $url, "order by jr_comment asc",
|
||||
"order by jr_comment desc", "ca", "cd");
|
||||
|
||||
$ord=(!isset($_GET['ord']))?'da':$_GET['ord'];
|
||||
$order=$table->get_sql_order($ord);
|
||||
|
||||
// Count
|
||||
$count=$this->db->count_sql($sql);
|
||||
// Add the limit
|
||||
$sql.=$order.$limit.$offset;
|
||||
// Execute SQL stmt
|
||||
$Res=$this->db->exec_sql($sql);
|
||||
|
||||
//starting from here we can refactor, so that instead of returning the generated HTML,
|
||||
//this function returns a tree structure.
|
||||
|
||||
$r="";
|
||||
|
||||
|
||||
$Max=Database::num_row($Res);
|
||||
|
||||
if ($Max==0)
|
||||
return array(0, _("Aucun enregistrement trouvé"));
|
||||
|
||||
$r.='<table class="result">';
|
||||
|
||||
|
||||
$r.="<tr >";
|
||||
$r.="<th>"._("n° interne")."</th>";
|
||||
if ($this->type=='ALL')
|
||||
{
|
||||
$r.=th('Journal');
|
||||
}
|
||||
$r.='<th>'.$table->get_header(0).'</th>';
|
||||
if ($p_paid!=0)
|
||||
$r.='<th>'.$table->get_header(1).'</td>';
|
||||
if ($p_paid!=0)
|
||||
$r.='<th>'.$table->get_header(2).'</th>';
|
||||
$r.='<th>'.$table->get_header(3).'</th>';
|
||||
$r.='<th>'.$table->get_header(4).'</th>';
|
||||
$r.='<th>'.$table->get_header(6).'</th>';
|
||||
$r.=th('Notes', ' style="width:15%"');
|
||||
$r.='<th>'.$table->get_header(5).'</th>';
|
||||
// if $p_paid is not equal to 0 then we have a paid column
|
||||
if ($p_paid!=0)
|
||||
{
|
||||
$r.="<th> "._('Payé')."</th>";
|
||||
}
|
||||
$r.="<th>"._('Concerne')."</th>";
|
||||
$r.="<th>"._('Document')."</th>";
|
||||
$r.="</tr>";
|
||||
// Total Amount
|
||||
$tot=0.0;
|
||||
$gDossier=dossier::id();
|
||||
for ($i=0; $i<$Max; $i++)
|
||||
{
|
||||
|
||||
|
||||
$row=Database::fetch_array($Res, $i);
|
||||
|
||||
if ($i%2==0)
|
||||
$tr='<TR class="odd">';
|
||||
else
|
||||
$tr='<TR class="even">';
|
||||
$r.=$tr;
|
||||
//internal code
|
||||
// button modify
|
||||
$r.="<TD>";
|
||||
// If url contains
|
||||
//
|
||||
|
||||
$href=basename($_SERVER['PHP_SELF']);
|
||||
|
||||
|
||||
$r.=sprintf('<A class="detail" style="text-decoration:underline" HREF="javascript:modifyOperation(\'%s\',\'%s\')" >%s </A>',
|
||||
$row['jr_id'], $gDossier, $row['jr_internal']);
|
||||
$r.="</TD>";
|
||||
if ($this->type=='ALL')
|
||||
$r.=td($row['jrn_def_name']);
|
||||
// date
|
||||
$r.="<TD>";
|
||||
$r.=$row['str_jr_date'];
|
||||
$r.="</TD>";
|
||||
// echeance
|
||||
if ($p_paid!=0)
|
||||
{
|
||||
$r.="<TD>";
|
||||
$r.=$row['str_jr_ech'];
|
||||
$r.="</TD>";
|
||||
$r.="<TD>";
|
||||
$r.=$row['str_jr_date_paid'];
|
||||
$r.="</TD>";
|
||||
}
|
||||
|
||||
// pj
|
||||
$r.="<TD>";
|
||||
$r.=$row['jr_pj_number'];
|
||||
$r.="</TD>";
|
||||
|
||||
// Tiers
|
||||
$other=($row['quick_code']!='')?'['.$row['quick_code'].'] '.$row['name'].' '.$row['first_name']:'';
|
||||
$r.=td($other);
|
||||
// comment
|
||||
$r.="<TD>";
|
||||
$tmp_jr_comment=h($row['jr_comment']);
|
||||
$r.=$tmp_jr_comment;
|
||||
$r.="</TD>";
|
||||
$r.=td(h($row['n_text']), ' style="font-size:0.87em%"');
|
||||
// Amount
|
||||
// If the ledger is financial :
|
||||
// the credit must be negative and written in red
|
||||
$positive=0;
|
||||
|
||||
// Check ledger type :
|
||||
if ($row['jrn_def_type']=='FIN')
|
||||
{
|
||||
$positive=$this->db->get_value("select qf_amount from quant_fin where jr_id=$1",
|
||||
array($row['jr_id']));
|
||||
if ($this->db->count()!=0)
|
||||
$positive=($positive<0)?1:0;
|
||||
}
|
||||
$r.="<TD align=\"right\">";
|
||||
$t_amount=$row['jr_montant'];
|
||||
if ($row['total_invoice']!=null&&$row['total_invoice']!=$row['jr_montant'])
|
||||
$t_amount=$row['total_invoice'];
|
||||
$tot=($positive!=0)?bcsub($tot, $t_amount):bcadd($tot, $t_amount);
|
||||
//STAN $positive always == 0
|
||||
if ($row ['jrn_def_type']=='FIN')
|
||||
{
|
||||
$r.=( $positive!=0 )?"<font color=\"red\"> - ".nbm($t_amount)."</font>":nbm($t_amount);
|
||||
}
|
||||
else
|
||||
{
|
||||
$r.=( $t_amount<0 )?"<font color=\"red\"> ".nbm($t_amount)."</font>":nbm($t_amount);
|
||||
}
|
||||
$r.="</TD>";
|
||||
|
||||
|
||||
// Show the paid column if p_paid is not null
|
||||
if ($p_paid!=0)
|
||||
{
|
||||
$w=new ICheckBox();
|
||||
$w->name="rd_paid".$row['jr_id'];
|
||||
$w->selected=($row['jr_rapt']=='paid')?true:false;
|
||||
// if p_paid == 2 then readonly
|
||||
$w->readonly=( $p_paid==2)?true:false;
|
||||
$h=new IHidden();
|
||||
$h->name="set_jr_id".$row['jr_id'];
|
||||
$r.='<TD>'.$w->input().$h->input().'</TD>';
|
||||
if ($row['jr_rapt']=='paid')
|
||||
$amount_paid=bcadd($amount_paid, $t_amount);
|
||||
else
|
||||
$amount_unpaid=bcadd($amount_unpaid, $t_amount);
|
||||
}
|
||||
|
||||
// Rapprochement
|
||||
$rec=new Acc_Reconciliation($this->db);
|
||||
$rec->set_jr_id($row['jr_id']);
|
||||
$a=$rec->get();
|
||||
$r.="<TD>";
|
||||
if ($a!=null)
|
||||
{
|
||||
|
||||
foreach ($a as $key=> $element)
|
||||
{
|
||||
$operation=new Acc_Operation($this->db);
|
||||
$operation->jr_id=$element;
|
||||
$l_amount=$this->db->get_value("select jr_montant from jrn ".
|
||||
" where jr_id=$1", array($element));
|
||||
$r.="<A class=\"detail\" HREF=\"javascript:modifyOperation('".$element."',".$gDossier.")\" > ".$operation->get_internal()."[".nbm($l_amount)."]</A>";
|
||||
}//for
|
||||
}// if ( $a != null ) {
|
||||
$r.="</TD>";
|
||||
|
||||
if ($row['jr_valid']=='f')
|
||||
{
|
||||
$r.="<TD>"._("Opération annulée")."</TD>";
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
} // else
|
||||
//document
|
||||
if ($row['jr_pj_name']!="")
|
||||
{
|
||||
$r.='<td>'.HtmlInput::show_receipt_document($row['jr_id']).'</td>';
|
||||
}
|
||||
else
|
||||
$r.="<TD></TD>";
|
||||
|
||||
// end row
|
||||
$r.="</tr>";
|
||||
}
|
||||
$amount_paid=round($amount_paid, 4);
|
||||
$amount_unpaid=round($amount_unpaid, 4);
|
||||
$tot=round($tot, 4);
|
||||
$r.="<TR>";
|
||||
$r.='<TD COLSPAN="5">Total</TD>';
|
||||
$r.='<TD ALIGN="RIGHT">'.nbm($tot)."</TD>";
|
||||
$r.="</tr>";
|
||||
if ($p_paid!=0)
|
||||
{
|
||||
$r.="<TR>";
|
||||
$r.='<TD COLSPAN="5">'._("Payé").'</TD>';
|
||||
$r.='<TD ALIGN="RIGHT">'.nbm($amount_paid)."</TD>";
|
||||
$r.="</tr>";
|
||||
$r.="<TR>";
|
||||
$r.='<TD COLSPAN="5">'._("Non payé").'</TD>';
|
||||
$r.='<TD ALIGN="RIGHT">'.nbm($amount_unpaid)."</TD>";
|
||||
$r.="</tr>";
|
||||
}
|
||||
$r.="</table>";
|
||||
|
||||
return array($count, $r);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief get_detail gives the detail of row
|
||||
* this array must contains at least the field
|
||||
|
|
@ -2575,475 +2125,7 @@ class Acc_Ledger extends jrn_def_sql
|
|||
$this->db->exec_sql($sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return a HTML string with the form for the search
|
||||
* @param $p_type if the type of ledger possible values=ALL,VEN,ACH,ODS,FIN
|
||||
* @param $all_type_ledger
|
||||
* values :
|
||||
* - 1 means all the ledger of this type
|
||||
* - 0 No have the "Tous les journaux" availables
|
||||
* @param $div is the div (for reconciliation)
|
||||
* @return a HTML String without the tag FORM or DIV
|
||||
*
|
||||
* @see build_search_sql
|
||||
* @see display_search_form
|
||||
* @see list_operation
|
||||
*/
|
||||
function search_form($p_type, $all_type_ledger=1, $div="")
|
||||
{
|
||||
global $g_user;
|
||||
$r="";
|
||||
$bledger_param=json_encode(array(
|
||||
'dossier'=>$_REQUEST['gDossier'],
|
||||
'type'=>$p_type,
|
||||
'all_type'=>$all_type_ledger,
|
||||
'div'=>$div
|
||||
));
|
||||
|
||||
$bledger_param=str_replace('"', "'", $bledger_param);
|
||||
$bledger=new ISmallButton('l');
|
||||
$bledger->label=_("choix des journaux");
|
||||
$bledger->javascript=" show_ledger_choice($bledger_param)";
|
||||
$f_ledger=$bledger->input();
|
||||
$hid_jrn="";
|
||||
if (isset($_REQUEST[$div.'nb_jrn']))
|
||||
{
|
||||
for ($i=0; $i<$_REQUEST[$div.'nb_jrn']; $i++)
|
||||
{
|
||||
if (isset($_REQUEST[$div."r_jrn"][$i]))
|
||||
$hid_jrn.=HtmlInput::hidden($div.'r_jrn['.$i.']',
|
||||
$_REQUEST[$div."r_jrn"][$i]);
|
||||
}
|
||||
$hid_jrn.=HtmlInput::hidden($div.'nb_jrn', $_REQUEST[$div.'nb_jrn']);
|
||||
} else
|
||||
{
|
||||
$hid_jrn=HtmlInput::hidden($div.'nb_jrn', 0);
|
||||
}
|
||||
/* Compute date for exercice */
|
||||
$period=$g_user->get_periode();
|
||||
$per=new Periode($this->db, $period);
|
||||
$exercice=$per->get_exercice();
|
||||
list($per_start, $per_end)=$per->get_limit($exercice);
|
||||
$date_end=$per_end->last_day();
|
||||
$date_start=$per_start->first_day();
|
||||
|
||||
/* widget for date_start */
|
||||
$f_date_start=new IDate('date_start');
|
||||
/* all periode or only the selected one */
|
||||
if (isset($_REQUEST['date_start']))
|
||||
{
|
||||
$f_date_start->value=$_REQUEST['date_start'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$f_date_start->value=$date_start;
|
||||
}
|
||||
|
||||
/* widget for date_end */
|
||||
$f_date_end=new IDate('date_end');
|
||||
/* all date or only the selected one */
|
||||
if (isset($_REQUEST['date_end']))
|
||||
{
|
||||
$f_date_end->value=$_REQUEST['date_end'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$f_date_end->value=$date_end;
|
||||
}
|
||||
/* widget for date term */
|
||||
$f_date_paid_start=new IDate('date_paid_start');
|
||||
$f_date_paid_end=new IDate('date_paid_end');
|
||||
|
||||
$f_date_paid_start->value=(isset($_REQUEST['date_paid_start']))?$_REQUEST['date_paid_start']:'';
|
||||
$f_date_paid_end->value=(isset($_REQUEST['date_paid_end']))?$_REQUEST['date_paid_end']:'';
|
||||
|
||||
/* widget for desc */
|
||||
$f_descript=new IText('desc');
|
||||
$f_descript->size=40;
|
||||
if (isset($_REQUEST['desc']))
|
||||
{
|
||||
$f_descript->value=$_REQUEST['desc'];
|
||||
}
|
||||
|
||||
/* widget for amount */
|
||||
$f_amount_min=new INum('amount_min');
|
||||
$f_amount_min->value=(isset($_REQUEST['amount_min']))?abs($_REQUEST['amount_min']):0;
|
||||
$f_amount_max=new INum('amount_max');
|
||||
$f_amount_max->value=(isset($_REQUEST['amount_max']))?abs($_REQUEST['amount_max']):0;
|
||||
|
||||
/* input quick code */
|
||||
$f_qcode=new ICard('qcode'.$div);
|
||||
|
||||
$f_qcode->set_attribute('typecard', 'all');
|
||||
/* $f_qcode->set_attribute('p_jrn','0');
|
||||
|
||||
$f_qcode->set_callback('filter_card');
|
||||
*/
|
||||
$f_qcode->set_dblclick("fill_ipopcard(this);");
|
||||
// Add the callback function to filter the card on the jrn
|
||||
//$f_qcode->set_callback('filter_card');
|
||||
$f_qcode->set_function('fill_data');
|
||||
$f_qcode->javascript=sprintf(' onchange="fill_data_onchange(%s);" ',
|
||||
$f_qcode->name);
|
||||
$f_qcode->value=(isset($_REQUEST['qcode'.$div]))?$_REQUEST['qcode'.$div]:'';
|
||||
|
||||
/* $f_txt_qcode=new IText('qcode');
|
||||
$f_txt_qcode->value=(isset($_REQUEST['qcode']))?$_REQUEST['qcode']:'';
|
||||
*/
|
||||
|
||||
/* input poste comptable */
|
||||
$f_accounting=new IPoste('accounting');
|
||||
$f_accounting->value=(isset($_REQUEST['accounting']))?$_REQUEST['accounting']:'';
|
||||
if ($this->id==-1)
|
||||
$jrn=0;
|
||||
else
|
||||
$jrn=$this->id;
|
||||
$f_accounting->set_attribute('jrn', $jrn);
|
||||
$f_accounting->set_attribute('ipopup', 'ipop_account');
|
||||
$f_accounting->set_attribute('label', 'ld');
|
||||
$f_accounting->set_attribute('account', 'accounting');
|
||||
$info=HtmlInput::infobulle(13);
|
||||
|
||||
$f_paid=new ICheckbox('unpaid');
|
||||
$f_paid->selected=(isset($_REQUEST['unpaid']))?true:false;
|
||||
|
||||
$r.=dossier::hidden();
|
||||
$r.=HtmlInput::hidden('ledger_type', $this->type);
|
||||
$r.=HtmlInput::hidden('ac', $_REQUEST['ac']);
|
||||
ob_start();
|
||||
require_once NOALYSS_TEMPLATE.'/ledger_search.php';
|
||||
$r.=ob_get_contents();
|
||||
ob_end_clean();
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief this function will create a sql stmt to use to create the list for
|
||||
* the ledger,
|
||||
* @param $p_array is usually the $_GET,
|
||||
* @param $p_order the order of the row
|
||||
* @param $p_where is the sql condition if not null then the $p_array will not be used
|
||||
* \note the p_action will be used to filter the ledger but gl means ALL
|
||||
* struct array $p_array
|
||||
\verbatim
|
||||
(
|
||||
[gDossier] => 13
|
||||
[p_jrn] => -1
|
||||
[date_start] =>
|
||||
[date_end] =>
|
||||
[amount_min] => 0
|
||||
[amount_max] => 0
|
||||
[desc] =>
|
||||
[search] => Rechercher
|
||||
[p_action] => ven
|
||||
[sa] => l
|
||||
)
|
||||
\endverbatim
|
||||
* \return an array with a valid sql statement, an the where clause => array[sql] array[where]
|
||||
* \see list_operation
|
||||
* \see display_search_form
|
||||
* \see search_form
|
||||
*/
|
||||
public function build_search_sql($p_array, $p_order="", $p_where="")
|
||||
{
|
||||
$sql="select jr_id ,
|
||||
jr_montant,
|
||||
substr(jr_comment,1,60) as jr_comment,
|
||||
to_char(jr_ech,'DD.MM.YY') as str_jr_ech,
|
||||
to_char(jr_date,'DD.MM.YY') as str_jr_date,
|
||||
jr_date as jr_date_order,
|
||||
jr_grpt_id,
|
||||
jr_rapt,
|
||||
jr_internal,
|
||||
jrn_def_id,
|
||||
jrn_def_name,
|
||||
jrn_def_ech,
|
||||
jrn_def_type,
|
||||
jr_valid,
|
||||
jr_tech_per,
|
||||
jr_pj_name,
|
||||
p_closed,
|
||||
jr_pj_number,
|
||||
n_text,
|
||||
case
|
||||
when jrn_def_type='VEN' then
|
||||
(select ad_value from fiche_detail where ad_id=1
|
||||
and f_id=(select max(qs_client) from quant_sold join jrnx using (j_id) join jrn as e on (e.jr_grpt_id=j_grpt) where e.jr_id=x.jr_id))
|
||||
when jrn_def_type = 'ACH' then
|
||||
(select ad_value from fiche_detail where ad_id=1
|
||||
and f_id=(select max(qp_supplier) from quant_purchase join jrnx using (j_id) join jrn as e on (e.jr_grpt_id=j_grpt) where e.jr_id=x.jr_id))
|
||||
when jrn_def_type = 'FIN' then
|
||||
(select ad_value from fiche_detail where ad_id=1
|
||||
and f_id=(select qf_other from quant_fin where quant_fin.jr_id=x.jr_id))
|
||||
end as name,
|
||||
case
|
||||
when jrn_def_type='VEN' then (select ad_value from fiche_detail where ad_id=32 and f_id=(select max(qs_client) from quant_sold join jrnx using (j_id) join jrn as e on (e.jr_grpt_id=j_grpt) where e.jr_id=x.jr_id))
|
||||
when jrn_def_type = 'ACH' then (select ad_value from fiche_detail where ad_id=32 and f_id=(select max(qp_supplier) from quant_purchase join jrnx using (j_id) join jrn as e on (e.jr_grpt_id=j_grpt) where e.jr_id=x.jr_id))
|
||||
when jrn_def_type = 'FIN' then (select ad_value from fiche_detail where ad_id=32 and f_id=(select qf_other from quant_fin where quant_fin.jr_id=x.jr_id))
|
||||
end as first_name,
|
||||
case
|
||||
when jrn_def_type='VEN' then (select ad_value from fiche_detail where ad_id=23 and f_id=(select max(qs_client) from quant_sold join jrnx using (j_id) join jrn as e on (e.jr_grpt_id=j_grpt) where e.jr_id=x.jr_id))
|
||||
when jrn_def_type = 'ACH' then (select ad_value from fiche_detail where ad_id=23 and f_id=(select max(qp_supplier) from quant_purchase join jrnx using (j_id) join jrn as e on (e.jr_grpt_id=j_grpt) where e.jr_id=x.jr_id))
|
||||
when jrn_def_type = 'FIN' then (select ad_value from fiche_detail where ad_id=23 and f_id=(select qf_other from quant_fin where quant_fin.jr_id=x.jr_id))
|
||||
end as quick_code,
|
||||
case
|
||||
when jrn_def_type='VEN' then
|
||||
(select sum(qs_price)+sum(vat) from
|
||||
(select qs_internal,qs_price,case when qs_vat_sided<>0 then 0 else qs_vat end as vat from quant_sold where qs_internal=X.jr_internal) as ven_invoice
|
||||
)
|
||||
when jrn_def_type = 'ACH' then
|
||||
(
|
||||
select sum(qp_price)+sum(vat)+sum(qp_nd_tva)+sum(qp_nd_tva_recup)
|
||||
from
|
||||
(select qp_internal,qp_price,qp_nd_tva,qp_nd_tva_recup,qp_vat-qp_vat_sided as vat from quant_purchase where qp_internal=X.jr_internal) as invoice_purchase
|
||||
)
|
||||
else null
|
||||
end as total_invoice,
|
||||
jr_date_paid,
|
||||
to_char(jr_date_paid,'DD.MM.YY') as str_jr_date_paid
|
||||
from
|
||||
jrn as X left join jrn_note using(jr_id)
|
||||
join jrn_def on jrn_def_id=jr_def_id
|
||||
join parm_periode on p_id=jr_tech_per";
|
||||
|
||||
if (!empty($p_array))
|
||||
extract($p_array, EXTR_SKIP);
|
||||
|
||||
if (isset($op))
|
||||
$r_jrn=(isset(${$op."r_jrn"}))?${$op."r_jrn"}:-1;
|
||||
else
|
||||
{
|
||||
$r_jrn=(isset($r_jrn))?$r_jrn:-1;
|
||||
}
|
||||
|
||||
/* if no variable are set then give them a default
|
||||
* value */
|
||||
if ($p_array==null||empty($p_array)||!isset($amount_min))
|
||||
{
|
||||
$amount_min=0;
|
||||
$amount_max=0;
|
||||
|
||||
$desc='';
|
||||
$qcode=(isset($qcode))?$qcode:"";
|
||||
if (isset($qcodesearch_op))
|
||||
$qcode=$qcodesearch_op;
|
||||
$accounting=(isset($accounting))?$accounting:"";
|
||||
$periode=new Periode($this->db);
|
||||
$g_user=new User($this->db);
|
||||
$p_id=$g_user->get_periode();
|
||||
if ($p_id!=null)
|
||||
{
|
||||
list($date_start, $date_end)=$periode->get_date_limit($p_id);
|
||||
}
|
||||
}
|
||||
|
||||
/* if p_jrn : 0 if means all ledgers, if -1 means all ledger of this
|
||||
* type otherwise only one ledger */
|
||||
$fil_ledger='';
|
||||
$fil_amount='';
|
||||
$fil_date='';
|
||||
$fil_desc='';
|
||||
$fil_sec='';
|
||||
$fil_qcode='';
|
||||
$fil_account='';
|
||||
$fil_paid='';
|
||||
$fil_date_paid='';
|
||||
|
||||
$and='';
|
||||
$g_user=new User($this->db);
|
||||
$p_action=$ledger_type;
|
||||
if ($p_action=='')
|
||||
$p_action='ALL';
|
||||
if ($r_jrn==-1)
|
||||
{
|
||||
|
||||
/* from compta.php the p_action is quick_writing instead of ODS */
|
||||
if ($p_action=='quick_writing')
|
||||
$p_action='ODS';
|
||||
|
||||
|
||||
$fil_ledger=$g_user->get_ledger_sql($p_action, 3);
|
||||
$and=' and ';
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if ($p_action=='quick_writing')
|
||||
$p_action='ODS';
|
||||
|
||||
$aLedger=$g_user->get_ledger($p_action, 3);
|
||||
$fil_ledger='';
|
||||
$sp='';
|
||||
for ($i=0; $i<count($r_jrn); $i++)
|
||||
{
|
||||
if (isset($r_jrn[$i]))
|
||||
{
|
||||
$a=$r_jrn[$i];
|
||||
$fil_ledger.=$sp.$a;
|
||||
$sp=',';
|
||||
}
|
||||
}
|
||||
$fil_ledger=' jrn_def_id in ('.$fil_ledger.')';
|
||||
$and=' and ';
|
||||
|
||||
/* no ledger selected */
|
||||
if ($sp=='')
|
||||
{
|
||||
$fil_ledger='';
|
||||
$and='';
|
||||
}
|
||||
}
|
||||
|
||||
/* format the number */
|
||||
$amount_min=abs(toNumber($amount_min));
|
||||
$amount_max=abs(toNumber($amount_max));
|
||||
if ($amount_min>0&&isNumber($amount_min))
|
||||
{
|
||||
$fil_amount=$and.' jr_montant >='.$amount_min;
|
||||
$and=' and ';
|
||||
}
|
||||
if ($amount_max>0&&isNumber($amount_max))
|
||||
{
|
||||
$fil_amount.=$and.' jr_montant <='.$amount_max;
|
||||
$and=' and ';
|
||||
}
|
||||
/* -------------------------------------------------------------------------- *
|
||||
* if both amount are the same then we need to search into the detail
|
||||
* and we reset the fil_amount
|
||||
* -------------------------------------------------------------------------- */
|
||||
if (isNumber($amount_min)&&
|
||||
isNumber($amount_max)&&
|
||||
$amount_min>0&&
|
||||
bccomp($amount_min, $amount_max, 2)==0)
|
||||
{
|
||||
$fil_amount=$and.' ( ';
|
||||
|
||||
// Look in detail
|
||||
$fil_amount.='jr_grpt_id in ( select distinct j_grpt from jrnx where j_montant = '.$amount_min.') ';
|
||||
|
||||
//and the total operation
|
||||
$fil_amount.=' or ';
|
||||
$fil_amount.=' jr_montant = '.$amount_min;
|
||||
|
||||
$fil_amount.=')';
|
||||
$and=" and ";
|
||||
}
|
||||
// date
|
||||
if (isset($date_start)&&isDate($date_start)!=null)
|
||||
{
|
||||
$fil_date=$and." jr_date >= to_date('".$date_start."','DD.MM.YYYY')";
|
||||
$and=" and ";
|
||||
}
|
||||
if (isset($date_end)&&isDate($date_end)!=null)
|
||||
{
|
||||
$fil_date.=$and." jr_date <= to_date('".$date_end."','DD.MM.YYYY')";
|
||||
$and=" and ";
|
||||
}
|
||||
// date paiement
|
||||
if (isset($date_paid_start)&&isDate($date_paid_start)!=null)
|
||||
{
|
||||
$fil_date_paid=$and." jr_date_paid >= to_date('".$date_paid_start."','DD.MM.YYYY')";
|
||||
$and=" and ";
|
||||
}
|
||||
if (isset($date_paid_end)&&isDate($date_paid_end)!=null)
|
||||
{
|
||||
$fil_date_paid.=$and." jr_date_paid <= to_date('".$date_paid_end."','DD.MM.YYYY')";
|
||||
$and=" and ";
|
||||
}
|
||||
// comment
|
||||
if (isset($desc)&&$desc!=null)
|
||||
{
|
||||
$desc=sql_string($desc);
|
||||
$fil_desc=$and." ( upper(jr_comment) like upper('%".$desc."%') or upper(jr_pj_number) like upper('%".$desc."%') ".
|
||||
" or upper(jr_internal) like upper('%".$desc."%')
|
||||
or jr_grpt_id in (select j_grpt from jrnx where j_text ~* '".$desc."')
|
||||
or jr_id in (select jr_id from jrn_info where ji_value is not null and ji_value ~* '$desc')
|
||||
)";
|
||||
$and=" and ";
|
||||
}
|
||||
// Poste
|
||||
if (isset($accounting)&&$accounting!=null)
|
||||
{
|
||||
$fil_account=$and." jr_grpt_id in (select j_grpt
|
||||
from jrnx where j_poste::text like '".sql_string($accounting)."%' ) ";
|
||||
$and=" and ";
|
||||
}
|
||||
// Quick Code
|
||||
if (isset($qcodesearch_op))
|
||||
$qcode=$qcodesearch_op;
|
||||
if (isset($qcode)&&$qcode!=null)
|
||||
{
|
||||
$fil_qcode=$and." jr_grpt_id in ( select j_grpt from
|
||||
jrnx where trim(j_qcode) = upper(trim('".sql_string($qcode)."')))";
|
||||
$and=" and ";
|
||||
}
|
||||
|
||||
// Only the unpaid
|
||||
if (isset($unpaid))
|
||||
{
|
||||
$fil_paid=$and.SQL_LIST_UNPAID_INVOICE;
|
||||
$and=" and ";
|
||||
}
|
||||
$repo=new Database();
|
||||
$g_user=new User($repo);
|
||||
$g_user->Check();
|
||||
$g_user->check_dossier(dossier::id());
|
||||
|
||||
if ($g_user->admin==0&&$g_user->is_local_admin()==0)
|
||||
{
|
||||
$fil_sec=$and." jr_def_id in ( select uj_jrn_id ".
|
||||
" from user_sec_jrn where ".
|
||||
" uj_login='".sql_string($_SESSION['g_user'])."'".
|
||||
" and uj_priv in ('R','W'))";
|
||||
}
|
||||
$where=$fil_ledger.$fil_amount.$fil_date.$fil_desc.$fil_sec.$fil_amount.$fil_qcode.$fil_paid.$fil_account.$fil_date_paid;
|
||||
$sql.=" where ".$where;
|
||||
return array($sql, $where);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return a html string with the search_form
|
||||
* \return a HTML string with the FORM
|
||||
* \see build_search_sql
|
||||
* \see search_form
|
||||
* \see list_operation
|
||||
*/
|
||||
function display_search_form()
|
||||
{
|
||||
$r='';
|
||||
$type=$this->type;
|
||||
|
||||
if ($type=="")
|
||||
$type='ALL';
|
||||
$r.='<div id="search_form" style="display:none">';
|
||||
$r.=HtmlInput::anchor_hide('⨉',
|
||||
'$(\'search_form\').style.display=\'none\';');
|
||||
$r.=h2('Recherche', 'class="title"');
|
||||
$r.='<FORM METHOD="GET">';
|
||||
$r.=$this->search_form($type);
|
||||
$r.=HtmlInput::submit('search', _('Rechercher'));
|
||||
$r.=HtmlInput::hidden('ac', $_REQUEST['ac']);
|
||||
|
||||
/* when called from commercial.php some hidden values are needed */
|
||||
if (isset($_REQUEST['sa']))
|
||||
$r.=HtmlInput::hidden("sa", $_REQUEST['sa']);
|
||||
if (isset($_REQUEST['sb']))
|
||||
$r.=HtmlInput::hidden("sb", $_REQUEST['sb']);
|
||||
if (isset($_REQUEST['sc']))
|
||||
$r.=HtmlInput::hidden("sc", $_REQUEST['sc']);
|
||||
if (isset($_REQUEST['f_id']))
|
||||
$r.=HtmlInput::hidden("f_id", $_REQUEST['f_id']);
|
||||
|
||||
$r.='</FORM>';
|
||||
|
||||
$r.='</div>';
|
||||
$button=new IButton('tfs');
|
||||
$button->label=_("Filtrer");
|
||||
$button->javascript="toggleHideShow('search_form','tfs');";
|
||||
|
||||
$r.=$button->input();
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief return the last p_limit operation into an array
|
||||
|
|
|
|||
1040
include/class/acc_ledger_search.class.php
Normal file
1040
include/class/acc_ledger_search.class.php
Normal file
File diff suppressed because it is too large
Load diff
92
include/database/user_filter_sql.class.php
Normal file
92
include/database/user_filter_sql.class.php
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Autogenerated file
|
||||
* This file is part of NOALYSS.
|
||||
*
|
||||
* NOALYSS 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.
|
||||
*
|
||||
* NOALYSS 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 NOALYSS; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
* author : Dec 2017 , Dany De Bontridder (danydb@noalyss.eu)
|
||||
*/
|
||||
require_once NOALYSS_INCLUDE.'/lib/noalyss_sql.class.php';
|
||||
require_once NOALYSS_INCLUDE.'/lib/database.class.php';
|
||||
|
||||
/**
|
||||
* class_user_filter_sql.php
|
||||
*
|
||||
* @file
|
||||
* @brief abstract of the table public.user_filter
|
||||
*/
|
||||
class User_filter_SQL extends Noalyss_SQL
|
||||
{
|
||||
|
||||
function __construct(Database $p_cn, $p_id=-1)
|
||||
{
|
||||
$this->table="public.user_filter";
|
||||
$this->primary_key="id";
|
||||
/*
|
||||
* List of columns
|
||||
*/
|
||||
$this->name=array(
|
||||
"id"=>"id"
|
||||
, "login"=>"login"
|
||||
, "nb_jrn"=>"nb_jrn"
|
||||
, "date_start"=>"date_start"
|
||||
, "date_end"=>"date_end"
|
||||
, "description"=>"description"
|
||||
, "amount_min"=>"amount_min"
|
||||
, "amount_max"=>"amount_max"
|
||||
, "qcode"=>"qcode"
|
||||
, "accounting"=>"accounting"
|
||||
, "r_jrn"=>"r_jrn"
|
||||
, "date_paid_start"=>"date_paid_start"
|
||||
, "date_paid_end"=>"date_paid_end"
|
||||
, "ledger_type"=>"ledger_type"
|
||||
, "all_ledger"=>"all_ledger"
|
||||
,"unpaid"=>"unpaid"
|
||||
,'filter_name'=>"filter_name"
|
||||
);
|
||||
/*
|
||||
* Type of columns
|
||||
*/
|
||||
$this->type=array(
|
||||
"id"=>"numeric"
|
||||
, "login"=>"text"
|
||||
, "nb_jrn"=>"numeric"
|
||||
, "date_start"=>"text"
|
||||
, "date_end"=>"text"
|
||||
, "description"=>"text"
|
||||
, "amount_min"=>"numeric"
|
||||
, "amount_max"=>"numeric"
|
||||
, "qcode"=>"text"
|
||||
, "accounting"=>"text"
|
||||
, "r_jrn"=>"text"
|
||||
, "date_paid_start"=>"text"
|
||||
, "date_paid_end"=>"text"
|
||||
, "ledger_type"=>"text"
|
||||
, "all_ledger"=>"numeric"
|
||||
,"unpaid"=>"text"
|
||||
,"filter_name"=>"text"
|
||||
);
|
||||
|
||||
|
||||
$this->default=array(
|
||||
"id"=>"auto"
|
||||
);
|
||||
|
||||
$this->date_format="DD.MM.YYYY";
|
||||
parent::__construct($p_cn, $p_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -32,33 +32,29 @@ require_once NOALYSS_INCLUDE.'/class/acc_ledger_purchase.class.php';
|
|||
require_once NOALYSS_INCLUDE.'/class/acc_ledger_fin.class.php';
|
||||
require_once NOALYSS_INCLUDE.'/class/acc_ledger_sold.class.php';
|
||||
require_once NOALYSS_INCLUDE.'/class/acc_ledger.class.php';
|
||||
require_once NOALYSS_INCLUDE.'/class/acc_ledger_search.class.php';
|
||||
global $g_user,$cn,$http;
|
||||
$p_array = $_GET;
|
||||
$ledger_type=$http->get("ledger_type","string", 'ALL');
|
||||
|
||||
$Ledger=new Acc_Ledger_Search($ledger_type,0,'search_op');
|
||||
switch($ledger_type)
|
||||
{
|
||||
case 'ACH':
|
||||
$Ledger = new Acc_Ledger_Purchase($cn, 0);
|
||||
$ask_pay=1;
|
||||
break;
|
||||
case 'ODS':
|
||||
$Ledger=new Acc_Ledger($cn,0);
|
||||
$ask_pay=0;
|
||||
$p_array['ledger_type']='ODS';
|
||||
$Ledger->type='ODS';
|
||||
break;
|
||||
case 'ALL':
|
||||
$Ledger=new Acc_Ledger($cn,0);
|
||||
$ask_pay=0;
|
||||
$p_array['ledger_type']='ALL';
|
||||
$Ledger->type='ALL';
|
||||
break;
|
||||
case 'VEN':
|
||||
$Ledger=new Acc_Ledger_Sold($cn,0);
|
||||
$ask_pay=1;
|
||||
break;
|
||||
case 'FIN':
|
||||
$Ledger=new Acc_Ledger_Fin($cn,0);
|
||||
$ask_pay=0;
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,15 +1,17 @@
|
|||
<?php
|
||||
//This file is part of NOALYSS and is under GPL
|
||||
//see licence.txt
|
||||
require_once NOALYSS_INCLUDE.'/lib/select_box.class.php';
|
||||
?>
|
||||
<table>
|
||||
<table id="<?=$this->div?>table_search">
|
||||
|
||||
<tr>
|
||||
<td style="text-align:right;width:30em">
|
||||
<?php echo _('Dans le journal')?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $f_ledger; ?>
|
||||
<span id="ledger_id<?php echo $div;?>">
|
||||
<span id="ledger_id<?php echo $this->div;?>">
|
||||
<?php
|
||||
echo $hid_jrn;
|
||||
?>
|
||||
|
|
@ -80,4 +82,9 @@
|
|||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<?php
|
||||
$box=new Select_Box("{$this->div}button","Filtre");
|
||||
$box->add_input(_('Ajout'), $save_filter);
|
||||
$box->add_javascript(_('Gestion Filtre'), $search_filter);
|
||||
echo $box->input();
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,23 +8,24 @@
|
|||
background:white;
|
||||
width:455px;
|
||||
max-width:250px;
|
||||
position:relative;
|
||||
z-index:3;
|
||||
padding:3px;
|
||||
margin:0px;
|
||||
display:none;
|
||||
top:-17px;
|
||||
position:absolute;
|
||||
}
|
||||
div.select_box ul {
|
||||
list-style:none;
|
||||
padding:2px;
|
||||
margin:1px;
|
||||
width:100%;
|
||||
top:10px;
|
||||
|
||||
}
|
||||
div.select_box ul li {
|
||||
padding-top:2px;
|
||||
padding-bottom:2px;
|
||||
margin:2px;
|
||||
margin:2px;
|
||||
}
|
||||
div.select_box a {
|
||||
text-decoration:none;
|
||||
|
|
@ -38,6 +39,12 @@ div.select_box a:hover,div.select_box ul li:hover {
|
|||
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<p>
|
||||
Le CSS est important , surtout la position, il faut qu'il soit dans
|
||||
un élément positionné en absolu.
|
||||
</p>
|
||||
<p style="position: absolute">
|
||||
<?php
|
||||
require NOALYSS_INCLUDE.'/lib/select_box.class.php';
|
||||
$a=new Select_Box("test","click me !");
|
||||
|
|
@ -50,4 +57,6 @@ div.select_box a:hover,div.select_box ul li:hover {
|
|||
echo $a->input();
|
||||
|
||||
?>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
Loading…
Add table
Add a link
Reference in a new issue