db=$p_cn;
$this->id=$p_id;
}
/**
*@brief get the row thanks the resource
*@return double array (j_date,deb_montant,cred_montant,description,jrn_name,j_debit,jr_internal)
* (tot_deb,tot_credit)
* @deprecated since version 6920
*/
private function get_row_sql_deprecated($Res)
{
$array=array();
$tot_cred=0.0;
$tot_deb=0.0;
$Max=Database::num_row($Res);
if ( $Max == 0 ) return null;
for ($i=0;$i<$Max;$i++)
{
$array[]=Database::fetch_array($Res,$i);
if ($array[$i]['j_debit']=='t')
{
$tot_deb+=$array[$i]['deb_montant'] ;
}
else
{
$tot_cred+=$array[$i]['cred_montant'] ;
}
}
$this->row=$array;
$this->tot_deb=$tot_deb;
$this->tot_cred=$tot_cred;
return array($array,$tot_deb,$tot_cred);
}
/*!
* \brief Get data for accounting entry between 2 periode
*
* \param $p_from periode from
* \param $p_to end periode
* \return double array (j_date,deb_montant,cred_montant,description,jrn_name,j_debit,jr_internal)
* (tot_deb,tot_credit
*
*/
function get_row($p_from,$p_to)
{
$periode=sql_filter_per($this->db,$p_from,$p_to,'p_id','jr_tech_per');
$this->row=$this->db->get_array("select distinct j_id,jr_id,to_char(j_date,'DD.MM.YYYY') as j_date_fmt,j_date,".
"case when j_debit='t' then j_montant else 0 end as deb_montant,".
"case when j_debit='f' then j_montant else 0 end as cred_montant,".
" jr_comment as description,jrn_def_name as jrn_name,".
"j_debit, jr_internal,jr_pj_number ".
" from jrnx left join jrn_def on jrn_def_id=j_jrn_def ".
" left join jrn on jr_grpt_id=j_grpt".
" where j_poste=$1 and $periode ".
" order by j_date",array($this->id));
$res_saldo = $this->db->exec_sql(
"select sum(deb_montant),sum(cred_montant) from
(select case when j_debit='t' then j_montant else 0 end as deb_montant,
case when j_debit='f' then j_montant else 0 end as cred_montant
from jrnx
left join jrn_def
on jrn_def_id=j_jrn_def
left join jrn on jr_grpt_id=j_grpt
where j_poste=$1 and $periode ) as m
",array($this->id));
$this->tot_deb=$this->tot_cred=0;
if ( Database::num_row($res_saldo) > 0 ) {
$this->tot_deb=Database::fetch_result($res_saldo, 0, 0);
$this->tot_cred=Database::fetch_result($res_saldo, 0, 1);
}
return array($this->row,$this->tot_deb,$this->tot_cred);
}
/*!
* \brief Get data for accounting entry between 2 date
*
*\param $p_from date from DD.MM.YYYY
*\param $p_to end date DD.MM.YYYY
*\param $let 0 means all rows, 1 only lettered, 2 only unlettered
*\param $solded 0 means all account, 1 means only accounts with a saldo <> 0
*\note the data are filtered by the access of the current user
* \return double array (j_date,deb_montant,cred_montant,description,jrn_name,j_debit,jr_internal)
* (tot_deb,tot_credit
*
*/
function get_row_date($p_from,$p_to,$let=0,$solded=0)
{
global $g_user;
$filter_sql=$g_user->get_ledger_sql('ALL',3);
$sql_let='';
switch ($let)
{
case 0:
break;
case 1:
$sql_let=' and j_id in (select j_id from letter_cred union all select j_id from letter_deb)';
break;
case '2':
$sql_let=' and j_id not in (select j_id from letter_cred union all select j_id from letter_deb) ';
break;
}
if ( $solded == 1)
{
$filter=str_replace('jrn_def_id','jr_def_id',$filter_sql);
$bal_sql="select sum(amount_deb) as s_deb,sum(amount_cred) as s_cred, j_poste
from
(select case when j_debit='t' then j_montant else 0 end as amount_deb,
case when j_debit='f' then j_montant else 0 end as amount_cred,
j_poste
from jrnx join jrn on (j_grpt = jr_grpt_id)
where
j_poste=$1 and
$filter and
( to_date($2,'DD.MM.YYYY') <= j_date and
to_date($3,'DD.MM.YYYY') >= j_date )) as signed_amount
group by j_poste
";
$r=$this->db->get_array($bal_sql,array($this->id,$p_from,$p_to));
if ( $this->db->count() == 0 ) return array();
if ($r[0]['s_deb']==$r[0]['s_cred']) return array();
}
$this->row=$this->db->get_array("
with sqlletter as (select j_id,jl_id from letter_cred union all select j_id , jl_id from letter_deb )
select j_id,jr_id,to_char(j_date,'DD.MM.YYYY') as j_date_fmt,j_date,
j_qcode
,case when j_debit='t' then j_montant else 0 end as deb_montant,
case when j_debit='f' then j_montant else 0 end as cred_montant,
case when j_text is null or j_text = '' then jr_comment
else jr_comment||' '||j_text end
as description,jrn_def_name as jrn_name,
j_debit, jr_internal,jr_pj_number
,(select distinct jl_id from sqlletter where sqlletter.j_id=j1.j_id ) as letter
,pcm_lib
,jr_optype
,jr_tech_per
,p_exercice
,jrn_def_name
,jrn_def_code
,(with cred as (select jl_id, sum(j_montant) as amount_cred from letter_cred left join jrnx using (j_id) group by jl_id ),
deb as (select jl_id, sum(j_montant) as amount_deb from letter_deb left join jrnx using (j_id) group by jl_id )
select amount_deb-amount_cred
from
cred
full join deb using (jl_id) where jl_id=(select distinct jl_id from sqlletter where sqlletter.j_id=j1.j_id )) as delta_letter
from jrnx as j1
join jrn_def on (jrn_def_id=j_jrn_def )
join jrn on (jr_grpt_id=j_grpt)
join tmp_pcmn on (j_poste=pcm_val)
join parm_periode on (p_id=jr_tech_per)
where j_poste=$1 and
( to_date($2,'DD.MM.YYYY') <= j_date and
to_date($3,'DD.MM.YYYY') >= j_date )
and $filter_sql $sql_let
order by j_date,substring(jr_pj_number,'[0-9]+$') asc",array($this->id,$p_from,$p_to));
$res_saldo = $this->db->exec_sql("select sum(deb_montant),sum(cred_montant) from
(select case when j_debit='t' then j_montant else 0 end as deb_montant,
case when j_debit='f' then j_montant else 0 end as cred_montant
from jrnx
join jrn_def on (jrn_def_id=j_jrn_def )
join jrn on (jr_grpt_id=j_grpt)
join tmp_pcmn on (j_poste=pcm_val)
join parm_periode on (p_id=jr_tech_per)
where j_poste=$1 and
( to_date($2,'DD.MM.YYYY') <= j_date and
to_date($3,'DD.MM.YYYY') >= j_date )
and $filter_sql $sql_let ) as m",array($this->id,$p_from,$p_to));
$this->tot_deb=$this->tot_cred=0;
if ( Database::num_row($res_saldo) > 0 ) {
$this->tot_deb=Database::fetch_result($res_saldo, 0, 0);
$this->tot_cred=Database::fetch_result($res_saldo, 0, 1);
}
return array($this->row,$this->tot_deb,$this->tot_cred);
}
/*!\brief Return the name of a account
* it doesn't change any data member
* \return string with the pcm_lib
*/
function get_name()
{
$ret=$this->db->exec_sql(
"select pcm_lib from tmp_pcmn where
pcm_val=$1",array($this->id));
if ( Database::num_row($ret) != 0)
{
$r=Database::fetch_array($ret);
$this->name=$r['pcm_lib'];
}
else
{
$this->name=_("Poste inconnu");
}
return $this->name;
}
/*!\brief check if the poste exist in the tmp_pcmn
*\return the number of line (normally 1 or 0)
*/
function do_exist()
{
$sql="select pcm_val from tmp_pcmn where pcm_val= $1";
$ret=$this->db->exec_sql($sql,array($this->id));
return Database::num_row($ret) ;
}
/*!\brief Get all the value for this object from the database
* the data member are set
* \return false if this account doesn't exist otherwise true
*/
function load()
{
$ret=$this->db->exec_sql("select pcm_lib,pcm_val_parent from
tmp_pcmn where pcm_val=$1",array($this->id));
$r=Database::fetch_all($ret);
if ( ! $r ) return false;
$this->label=$r[0]['pcm_lib'];
$this->parent=$r[0]['pcm_val_parent'];
return true;
}
/*!\brief Get all the value for this object from the database
* the data member are set
* \return false if this account doesn't exist otherwise true
*/
function get()
{
echo "OBSOLETE Acc_Account_Ledger->get(), a remplacer par Acc_Account_Ledger->load()";
return $this->load();
}
/*!
* \brief give the balance of an account
*
* \return
* balance of the account
*
*/
function get_solde($p_cond=" true ")
{
$Res=$this->db->exec_sql("select sum(deb) as sum_deb, sum(cred) as sum_cred from
( select j_poste,
case when j_debit='t' then j_montant else 0 end as deb,
case when j_debit='f' then j_montant else 0 end as cred
from jrnx join tmp_pcmn on j_poste=pcm_val
where
j_poste::text like ('$this->id'::text) and
$p_cond
) as m ");
$Max=Database::num_row($Res);
if ($Max==0) return 0;
$r=Database::fetch_array($Res,0);
return abs($r['sum_deb']-$r['sum_cred']);
}
/*!
* \brief give the balance of an account
* \return
* balance of the account
*
*/
function get_solde_detail($p_cond="")
{
if ( $p_cond != "") $p_cond=" and ".$p_cond;
$sql="select sum(deb) as sum_deb, sum(cred) as sum_cred from
( select j_poste,
case when j_debit='t' then j_montant else 0 end as deb,
case when j_debit='f' then j_montant else 0 end as cred
from jrnx
where
j_poste::text like ('$this->id'::text)
$p_cond
) as m ";
$Res=$this->db->exec_sql($sql);
$Max=Database::num_row($Res);
if ($Max==0)
{
return array('debit'=>0,
'credit'=>0,
'solde'=>0) ;
}
$r=Database::fetch_array($Res,0);
// if p_start is < p_end the query returns null to avoid any problem
// we set it to 0
if ($r['sum_deb']=='')
$r['sum_deb']=0.0;
if ($r['sum_cred']=='')
$r['sum_cred']=0.0;
return array('debit'=>$r['sum_deb'],
'credit'=>$r['sum_cred'],
'solde'=>abs(bcsub($r['sum_deb'],$r['sum_cred'])));
}
/*!
* \brief isTva tell is a poste is used for VAT
* \param none
*
*
* \return 1 is Yes otherwise 0
*/
function isTVA()
{
// Load TVA array
$a_TVA=$this->db->get_array('select tva_poste
from tva_rate');
foreach ( $a_TVA as $line_tva)
{
if ( $line_tva['tva_poste'] == '' )
continue;
list($tva_deb,$tva_cred)=explode(',',$line_tva['tva_poste']);
if ( $this->id == $tva_deb ||
$this->id == $tva_cred )
{
return 1;
}
}
return 0;
}
/*!
* \brief HtmlTable, display a HTML of a poste for the asked period
* \param $p_array array for filter
* \param $let lettering of operation 0
* \return -1 if nothing is found otherwise 0
*/
function HtmlTable($p_array=null,$let=0 , $from_div=0)
{
if ( $p_array==null)$p_array=$_REQUEST;
$this->get_name();
list($array,$tot_deb,$tot_cred)=$this->get_row_date( $p_array['from_periode'],
$p_array['to_periode'],$let
);
if ( count($this->row ) == 0 )
return -1;
$rep="";
if ( $from_div == 1)
echo "