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)
*/
private function get_row_sql($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');
$Res=$this->db->exec_sql("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=".$this->id." and ".$periode.
" order by j_date");
return $this->get_row_sql($Res);
}
/*!
* \brief Get data for accounting entry between 2 date
*
* \param $p_from date from
* \param $p_to end date
*\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 select j_id from letter_deb)';
break;
case '2':
$sql_let=' and j_id not in (select j_id from letter_cred union 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();
}
$Res=$this->db->exec_sql("select 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,".
" 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,
coalesce(comptaproc.get_letter_jnt(j_id),-1) as letter ".
",pcm_lib ".
",jr_tech_per,p_exercice,jrn_def_name,jrn_def_code".
" from jrnx left join jrn_def on (jrn_def_id=j_jrn_def )".
" left join jrn on (jr_grpt_id=j_grpt)".
" left join tmp_pcmn on (j_poste=pcm_val)".
" left 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));
return $this->get_row_sql($Res);
}
/*!\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="";
echo '
'.$this->id." ".$this->name.'
';
if ( $from_div == 0)
echo "