mirror of
https://github.com/YunoHost-Apps/noalyss_ynh.git
synced 2024-09-03 19:46:20 +02:00
367 lines
12 KiB
PHP
367 lines
12 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* 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
|
||
|
*/
|
||
|
|
||
|
// Copyright (2014) Author Dany De Bontridder danydb@aevalys.eu
|
||
|
|
||
|
/**
|
||
|
* @file
|
||
|
* @brief Class to manage distribution keys for Analytic accountancy
|
||
|
*
|
||
|
*/
|
||
|
require_once NOALYSS_INCLUDE.'/database/anc_key_sql.class.php';
|
||
|
|
||
|
class Anc_Key
|
||
|
{
|
||
|
|
||
|
private $key; /*! the distribution key */
|
||
|
/**
|
||
|
* Return the number of keys available.
|
||
|
* Return the number of keys available for the ledger given in parameter
|
||
|
*
|
||
|
* @global $cn database connection
|
||
|
* @param $p_jrn number of the ledger (jrn_def.jrn_def_id
|
||
|
* @return number of available keys
|
||
|
*/
|
||
|
static function key_avaiable($p_jrn)
|
||
|
{
|
||
|
global $cn;
|
||
|
$count=$cn->get_value (' select count(*)
|
||
|
from key_distribution_ledger
|
||
|
join key_distribution using (kd_id)
|
||
|
where
|
||
|
jrn_def_id=$1', array($p_jrn));
|
||
|
return $count;
|
||
|
}
|
||
|
function __construct($p_id=-1)
|
||
|
{
|
||
|
global $cn;
|
||
|
$this->key=new Anc_Key_SQL($cn, $p_id);
|
||
|
$this->a_ledger=null;
|
||
|
$this->a_activity=null;
|
||
|
$this->a_row=null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief display list of available keys
|
||
|
* @param $p_amount amount to distribute
|
||
|
* @param $p_target target to update
|
||
|
* @param $p_ledger is the jrn_def_id
|
||
|
*/
|
||
|
static function display_choice($p_amount, $p_target,$p_ledger)
|
||
|
{
|
||
|
global $cn;
|
||
|
$a_key=$cn->get_array(' select kd_id,
|
||
|
kd_name,
|
||
|
kd_description
|
||
|
from
|
||
|
key_distribution
|
||
|
join key_distribution_ledger using (kd_id)
|
||
|
where
|
||
|
jrn_def_id=$1',
|
||
|
array(
|
||
|
$p_ledger
|
||
|
));
|
||
|
if (empty($a_key))
|
||
|
{
|
||
|
echo _('Aucune clef disponible');
|
||
|
echo _('Allez dans ANCKEY pour en ajouter pour ce journal');
|
||
|
}
|
||
|
include NOALYSS_TEMPLATE.'/anc_key_display_choice.php';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief display a list of keys, choose one to modify it
|
||
|
*
|
||
|
*/
|
||
|
static function display_list()
|
||
|
{
|
||
|
global $cn;
|
||
|
$a_key=$cn->get_array('select b.kd_id,b.kd_name,b.kd_description,
|
||
|
(select sum(ke_percent) from key_distribution_detail as a where a.kd_id=b.kd_id) as distrib
|
||
|
from key_distribution as b order by b.kd_name');
|
||
|
if (empty($a_key))
|
||
|
{
|
||
|
echo _('Aucune clef disponible');
|
||
|
}
|
||
|
include NOALYSS_TEMPLATE.'/anc_key_display_list.php';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Show the detail for a key distribution and let you change it
|
||
|
* for adding or update
|
||
|
*/
|
||
|
function input()
|
||
|
{
|
||
|
global $cn;
|
||
|
|
||
|
$plan=$cn->get_array('
|
||
|
select
|
||
|
pa_id,
|
||
|
pa_name ,
|
||
|
pa_description
|
||
|
from
|
||
|
plan_analytique
|
||
|
order by pa_name');
|
||
|
$count_max=count($plan);
|
||
|
|
||
|
$a_row=$cn->get_array('select ke_id,ke_row,ke_percent from key_distribution_detail
|
||
|
where
|
||
|
kd_id=$1 order by ke_row', array($this->key->getp('id')));
|
||
|
|
||
|
require_once NOALYSS_TEMPLATE.'/anc_key_input.php';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief verify that data are ok
|
||
|
* @param type $p_array
|
||
|
*/
|
||
|
function verify($p_array)
|
||
|
{
|
||
|
$a_percent=$p_array['percent'];
|
||
|
if (count($a_percent)==0)
|
||
|
{
|
||
|
throw new Exception(_('Aucune répartition'));
|
||
|
}
|
||
|
$tot_percent=0;
|
||
|
bcscale(4);
|
||
|
for ($i=0; $i<count($a_percent); $i++)
|
||
|
{
|
||
|
$tot_percent=bcadd($tot_percent, $a_percent[$i]);
|
||
|
}
|
||
|
if ($tot_percent >100)
|
||
|
{
|
||
|
throw new Exception(_('Le total ne vaut pas 100, total calculé = ').$tot_percent);
|
||
|
}
|
||
|
if ($p_array['name_key']=='') {
|
||
|
throw new Exception (_('Le nom ne peut être vide'));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief save the data of a repartition key.
|
||
|
* @param received an array
|
||
|
* index :
|
||
|
* - key_id : key_distribution.kd_id
|
||
|
* - row : array of key_distribution.ke_id (row
|
||
|
* - pa : array of plan_analytic.pa_id (column)
|
||
|
* - po_id : double array,
|
||
|
* first index is the row
|
||
|
* second index is the first plan, the second the second plan...(column)
|
||
|
* - percent array, one per row
|
||
|
* - jrn : array of available ledgers
|
||
|
* @note if po_id == -1 then it is replaced by null, this why the pa_id is needed : to identify
|
||
|
* the column
|
||
|
* @verbatim
|
||
|
|
||
|
'key_id' => string '1' (length=1)
|
||
|
'row' =>
|
||
|
array
|
||
|
0 => string '1' (length=1)
|
||
|
1 => string '2' (length=1)
|
||
|
2 => string '3' (length=1)
|
||
|
'pa' =>
|
||
|
array
|
||
|
0 => string '1' (length=1)
|
||
|
1 => string '2' (length=1)
|
||
|
'po_id' =>
|
||
|
array
|
||
|
0 =>
|
||
|
array
|
||
|
0 => string '1' (length=1)
|
||
|
1 => string '8' (length=1)
|
||
|
1 =>
|
||
|
array
|
||
|
0 => string '2' (length=1)
|
||
|
1 => string '-1' (length=2)
|
||
|
2 =>
|
||
|
array
|
||
|
0 => string '3' (length=1)
|
||
|
1 => string '8' (length=1)
|
||
|
'percent' =>
|
||
|
array
|
||
|
0 => string '50.0000' (length=7)
|
||
|
1 => string '20.0000' (length=7)
|
||
|
2 => string '30.0000' (length=7)
|
||
|
'jrn' =>
|
||
|
array
|
||
|
0 => string '3' (length=1)
|
||
|
1 => string '2' (length=1)
|
||
|
@endverbatim
|
||
|
*
|
||
|
*/
|
||
|
function save($p_array)
|
||
|
{
|
||
|
global $cn;
|
||
|
$this->verify($p_array);
|
||
|
$cn->start();
|
||
|
// for each row
|
||
|
$a_row=$p_array['row'];
|
||
|
$http=new HttpInput();
|
||
|
$a_ledger=$http->extract($p_array,"jrn","string",array());
|
||
|
$a_percent=$p_array['percent'];
|
||
|
$a_po_id=$p_array['po_id'];
|
||
|
$a_plan=$p_array['pa'];
|
||
|
try
|
||
|
{
|
||
|
$this->key->setp('name',$p_array['name_key']);
|
||
|
$this->key->setp('description',$p_array['description_key']);
|
||
|
$this->key->save();
|
||
|
for ($i=0; $i<count($a_row); $i++)
|
||
|
{
|
||
|
//save key_distribution_row
|
||
|
$key_row=new Anc_Key_Detail_SQL($cn);
|
||
|
$key_row->setp('id', $a_row[$i]);
|
||
|
$key_row->setp('key', $this->key->getp('id'));
|
||
|
$key_row->setp('row', $i+1);
|
||
|
$key_row->setp('percent', $a_percent[$i]);
|
||
|
$key_row->save();
|
||
|
//
|
||
|
// Save each activity + percent
|
||
|
$cn->exec_sql('delete from key_distribution_activity where ke_id=$1', array($key_row->getp('id')));
|
||
|
|
||
|
// Don't save row with 0 %
|
||
|
if ($a_percent[$i]==0)
|
||
|
{
|
||
|
$key_row->delete();
|
||
|
continue;
|
||
|
}
|
||
|
for ($j=0; $j<count($a_po_id[$i]); $j++)
|
||
|
{
|
||
|
$activity=new Anc_Key_Activity_SQL($cn);
|
||
|
$activity->setp('detail', $key_row->ke_id);
|
||
|
$value=($a_po_id[$i][$j]==-1)?null:$a_po_id[$i][$j];
|
||
|
$activity->setp('activity', $value);
|
||
|
$activity->setp('plan',$a_plan[$j]);
|
||
|
$activity->save();
|
||
|
}
|
||
|
}
|
||
|
// delete all from key_distribution_ledger
|
||
|
$cn->exec_sql('delete from key_distribution_ledger where kd_id=$1', array($this->key->getp('id')));
|
||
|
for ($k=0; $k<count($a_ledger); $k++)
|
||
|
{
|
||
|
$ledger=new Anc_Key_Ledger_SQL($cn);
|
||
|
$ledger->kd_id=$this->key->getp('id');
|
||
|
$ledger->jrn_def_id=$a_ledger[$k];
|
||
|
$ledger->save();
|
||
|
}
|
||
|
|
||
|
$cn->commit();
|
||
|
}
|
||
|
catch (Exception $e)
|
||
|
{
|
||
|
|
||
|
if ( DEBUG ) { echo $e->getTraceAsString(); } else { echo _('erreur').$e->getMessage();}
|
||
|
record_log($e->getTraceAsString());
|
||
|
$cn->rollback();
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* @brief Call the Anc_Operation::display_form_plan with the right amounts.
|
||
|
* This function compute the array and amount to pass to the Anc_Operation::display_form_plan
|
||
|
* and replace the current table of activity with the value computed from the key.
|
||
|
*
|
||
|
* @global $cn database connection
|
||
|
* @param $p_target Table to be replaced
|
||
|
* @param $p_amount amount to distribute among activities
|
||
|
*/
|
||
|
function fill_table($p_target,$p_amount)
|
||
|
{
|
||
|
global $cn;
|
||
|
/* number is the index of the plan, he's computed from p_target */
|
||
|
$number=preg_replace('/det[0-9]/', '', $p_target);
|
||
|
$number=str_replace('t', '', $number);
|
||
|
$number=str_replace('popup', '', $number);
|
||
|
|
||
|
$op[$number]=$p_amount;
|
||
|
$array['op']=$op;
|
||
|
$a_plan=$cn->get_array('select pa_id from plan_analytique order by pa_id');
|
||
|
for ($i=0;$i < count($a_plan);$i++)
|
||
|
{
|
||
|
$array['pa_id'][$i]=$a_plan[$i]['pa_id'];
|
||
|
}
|
||
|
|
||
|
$a_poste=$cn->get_array('select po_id,ke_percent,pa_id,ke_row
|
||
|
from key_distribution_activity
|
||
|
join key_distribution_detail using (ke_id)
|
||
|
where
|
||
|
kd_id=$1
|
||
|
order by ke_row,pa_id',
|
||
|
array($this->key->getp('id')));
|
||
|
|
||
|
for ($i=0;$i< count($a_poste);$i++)
|
||
|
{
|
||
|
$hplan[$number][$i]=($a_poste[$i]['po_id']==null)?-1:$a_poste[$i]['po_id'];
|
||
|
}
|
||
|
$array['hplan']=$hplan;
|
||
|
|
||
|
$a_amount=$cn->get_array("select distinct ke_row,ke_percent
|
||
|
from key_distribution_activity
|
||
|
join key_distribution_detail using (ke_id)
|
||
|
where
|
||
|
kd_id=$1
|
||
|
and pa_id=$2
|
||
|
order by ke_row",
|
||
|
array($this->key->getp('id'),$a_plan[0]['pa_id']));
|
||
|
bcscale(2);
|
||
|
for ($i=0;$i< count($a_amount);$i++)
|
||
|
{
|
||
|
$val[$number][$i]=bcmul($p_amount,$a_amount[$i]['ke_percent']);
|
||
|
$val[$number][$i]=bcdiv($val[$number][$i],100);
|
||
|
}
|
||
|
$array['val']=$val;
|
||
|
|
||
|
$anc_operation=new Anc_Operation($cn);
|
||
|
// find the div thanks the target which looks like "det4t0"
|
||
|
// det4 is the div id and t0 is the row
|
||
|
if (strpos($p_target, "et")){
|
||
|
// cut off t[0-9]
|
||
|
$pos=strrpos($p_target,"t");
|
||
|
$anc_operation->in_div=substr($p_target,0,$pos);
|
||
|
|
||
|
}
|
||
|
echo $anc_operation->display_form_plan($array, 1, 1, $number, $p_amount,'',false);
|
||
|
|
||
|
}
|
||
|
/**
|
||
|
*@brief show a form for adding a key + button to display it
|
||
|
*
|
||
|
*/
|
||
|
static function key_add()
|
||
|
{
|
||
|
$key=new Anc_Key();
|
||
|
$key->key->setp('name',_('Nouvelle clef'));
|
||
|
$key->key->setp('description',_('Description de la nouvelle clef'));
|
||
|
?>
|
||
|
<input type="button" class="smallbutton" value="<?php echo _('Ajout')?>" onclick="$('key_add_div_id').show()">
|
||
|
<div id="key_add_div_id" style="display: none">
|
||
|
<?php
|
||
|
$key->input();
|
||
|
echo '</div>';
|
||
|
|
||
|
}
|
||
|
/**
|
||
|
*@brief delete the distribution key
|
||
|
*/
|
||
|
function delete ()
|
||
|
{
|
||
|
$this->key->delete();
|
||
|
}
|
||
|
}
|