Task #2321: Sécurité : empêcher changement de numéro de pièce

This commit is contained in:
sparkyx 2024-02-02 16:11:18 +01:00
parent bab6b76a67
commit 5431982223
10 changed files with 467 additions and 454 deletions

View file

@ -29,26 +29,23 @@
- update of analytic content
*
*/
if ( ! defined('ALLOWED')) die(_('Non authorisé'));
if (!defined('ALLOWED')) die(_('Non authorisé'));
$http=new HttpInput();
$http = new HttpInput();
/**
* Check if we receive the needed data (jr_id...)
*/
global $g_user,$cn,$g_parameter;
global $g_user, $cn, $g_parameter;
mb_internal_encoding("UTF-8");
try
{
$action=$http->request('act');
$jr_id=$http->request('jr_id');
$div=$http->request('div'); /* the div source and target for javascript */
$gDossier=dossier::id();
}
catch (Exception $exc)
{
try {
$action = $http->request('act');
$jr_id = $http->request('jr_id');
$div = $http->request('div'); /* the div source and target for javascript */
$gDossier = dossier::id();
} catch (Exception $exc) {
error_log($exc->getTraceAsString());
return;
}
@ -57,18 +54,17 @@ catch (Exception $exc)
*if $_SESSION[SESSION_KEY.'g_user'] is not set : echo a warning
*/
$cn=Dossier::connect();
$g_parameter=new Noalyss_Parameter_Folder($cn);
$cn = Dossier::connect();
$g_parameter = new Noalyss_Parameter_Folder($cn);
$g_user->check();
if ( $g_user->check_dossier(dossier::id(),true)=='X' )
{
if ($g_user->check_dossier(dossier::id(), true) == 'X') {
ob_start();
require_once NOALYSS_TEMPLATE.'/ledger_detail_forbidden.php';
echo HtmlInput::button_close($div);
$html=ob_get_contents();
require_once NOALYSS_TEMPLATE . '/ledger_detail_forbidden.php';
echo HtmlInput::button_close($div);
$html = ob_get_contents();
ob_end_clean();
$html=escape_xml($html);
$html = escape_xml($html);
header('Content-type: text/xml; charset=UTF-8');
echo <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
@ -83,21 +79,24 @@ EOF;
// check if the user can access the ledger where the operation is (view) and
// if he can modify it
$op=new Acc_Operation($cn);
$op->jr_id=$jr_id;
$ledger=$op->get_ledger();
if ($ledger=="")
{
$op = new Acc_Operation($cn);
$op->jr_id = $jr_id;
$ledger = $op->get_ledger();
if ($ledger == "") {
ob_start();
echo HtmlInput::title_box(_("Information"), $div);
require_once NOALYSS_TEMPLATE.'/ledger_detail_forbidden.php';
echo HtmlInput::button_close($div);
$html=ob_get_contents();
echo HtmlInput::title_box(_("Information"), $div);
require_once NOALYSS_TEMPLATE . '/ledger_detail_forbidden.php';
echo HtmlInput::button_close($div);
$html = ob_get_contents();
ob_end_clean();
$html=escape_xml($html);
if ( ! headers_sent()) { header('Content-type: text/xml; charset=UTF-8');} else { echo "HTML".unescape_xml($html);}
$html = escape_xml($html);
if (!headers_sent()) {
header('Content-type: text/xml; charset=UTF-8');
} else {
echo "HTML" . unescape_xml($html);
}
echo <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<data>
@ -108,16 +107,15 @@ EOF;
exit();
}
$access=$g_user->get_ledger_access($ledger);
if ( $access == 'X' )
{
$access = $g_user->get_ledger_access($ledger);
if ($access == 'X') {
ob_start();
echo HtmlInput::title_box(_("Information"), $div);
require_once NOALYSS_TEMPLATE.'/ledger_detail_forbidden.php';
echo HtmlInput::button_close($div);
$html=ob_get_contents();
echo HtmlInput::title_box(_("Information"), $div);
require_once NOALYSS_TEMPLATE . '/ledger_detail_forbidden.php';
echo HtmlInput::button_close($div);
$html = ob_get_contents();
ob_end_clean();
$html=escape_xml($html);
$html = escape_xml($html);
header('Content-type: text/xml; charset=UTF-8');
echo <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
@ -128,474 +126,421 @@ if ( $access == 'X' )
EOF;
exit();
}
$html=var_export($_REQUEST,true);
switch ($action)
{
$html = var_export($_REQUEST, true);
switch ($action) {
///////////////////////////////////////////////////////////////////////////
// remove op
///////////////////////////////////////////////////////////////////////////
case 'rmop':
if ( $access=='W' && $g_user->check_action(RMOPER) == 1)
{
case 'rmop':
if ($access == 'W' && $g_user->check_action(RMOPER) == 1) {
ob_start();
/* get the ledger */
try
{
try {
$cn->start();
$oLedger=new Acc_Ledger($cn,$ledger);
$oLedger->jr_id=$jr_id=$http->request('jr_id',"number");
$oLedger = new Acc_Ledger($cn, $ledger);
$oLedger->jr_id = $jr_id = $http->request('jr_id', "number");
$oLedger->delete();
$cn->commit();
echo _("Opération Effacée");
}
catch (Exception $e)
{
record_log($e);
} catch (Exception $e) {
record_log($e);
$e->getMessage();
$cn->rollback();
}
$html=ob_get_contents();
$html = ob_get_contents();
ob_end_clean();
} else {
$html = _("Effacement refusé");
}
else
{
$html= _("Effacement refusé");
}
break;
break;
//////////////////////////////////////////////////////////////////////
// DE Detail
//////////////////////////////////////////////////////////////////////
case 'de':
ob_start();
case 'de':
ob_start();
try
{
/* get detail op (D/C) */
$op->get();
/* return an obj. ACH / FIN or VEN or null if nothing is found*/
$obj=$op->get_quant();
$oLedger=new Acc_Ledger($cn,$ledger);
if ( $obj==null || $obj->signature == 'ODS' )
{
/* only the details */
require_once NOALYSS_TEMPLATE.'/ledger_detail_misc.php';
}
elseif ( $obj->signature=='ACH')
{
require_once NOALYSS_TEMPLATE.'/ledger_detail_ach.php';
}
elseif ($obj->signature=='FIN')
{
require_once NOALYSS_TEMPLATE.'/ledger_detail_fin.php';
}
elseif ( $obj->signature=='VEN')
{
require_once NOALYSS_TEMPLATE.'/ledger_detail_ven.php';
}
}
catch (Exception $e)
{
record_log($e);
echo Icon_Action::close($div);
echo '<h2 class="error">'._("Désolé il y a une erreur").'</h2>';
}
$html=ob_get_contents();
ob_end_clean();
try {
/* get detail op (D/C) */
$op->get();
/* return an obj. ACH / FIN or VEN or null if nothing is found*/
$obj = $op->get_quant();
break;
$oLedger = new Acc_Ledger($cn, $ledger);
if ($obj == null || $obj->signature == 'ODS') {
/* only the details */
require_once NOALYSS_TEMPLATE . '/ledger_detail_misc.php';
} elseif ($obj->signature == 'ACH') {
require_once NOALYSS_TEMPLATE . '/ledger_detail_ach.php';
} elseif ($obj->signature == 'FIN') {
require_once NOALYSS_TEMPLATE . '/ledger_detail_fin.php';
} elseif ($obj->signature == 'VEN') {
require_once NOALYSS_TEMPLATE . '/ledger_detail_ven.php';
}
} catch (Exception $e) {
record_log($e);
echo Icon_Action::close($div);
echo '<h2 class="error">' . _("Désolé il y a une erreur") . '</h2>';
}
$html = ob_get_contents();
ob_end_clean();
break;
/////////////////////////////////////////////////////////////////////////////
// form for the file
/////////////////////////////////////////////////////////////////////////////
case 'file':
$op->get();
$obj=$op->get_quant(); /* return an obj. ACH / FIN or VEN or null if nothing is found*/
$repo = new Database();
html_min_page_start($_SESSION[SESSION_KEY.'g_theme']);
case 'file':
$op->get();
$obj = $op->get_quant(); /* return an obj. ACH / FIN or VEN or null if nothing is found*/
// if there is a receipt document
if ( $obj->det->jr_pj_name=='')
{
if ( ! isset($_REQUEST['ajax']) ) {
$repo = new Database();
html_min_page_start($_SESSION[SESSION_KEY . 'g_theme']);
// if there is a receipt document
if ($obj->det->jr_pj_name == '') {
if (!isset($_REQUEST['ajax'])) {
echo '<div class="op_detail_frame">';
}else {
} else {
echo "<div>";
}
if ( $access=='W')
{
$check_receipt=sprintf("check_receipt_size('%s','file%s')",
MAX_FILE_SIZE,$div);
echo '<FORM METHOD="POST" ENCTYPE="multipart/form-data" id="form_file" >';
}
if ($access == 'W') {
$check_receipt = sprintf("check_receipt_size('%s','file%s')",
MAX_FILE_SIZE, $div);
echo '<FORM METHOD="POST" ENCTYPE="multipart/form-data" id="form_file" >';
$sp=new ISpan('file'.$div);
$sp->style="display:none;background-color:red;color:white;font-size:12px";
$sp->value=_("Chargement");
echo $sp->input();
echo HtmlInput::hidden('act','loadfile');
echo dossier::hidden();
echo HtmlInput::hidden('jr_id',$jr_id);
echo HtmlInput::hidden('div',$div);
echo '<INPUT TYPE="FILE" id="receipt_id" name="pj" onchange="'.$check_receipt.'">';
$sp = new ISpan('file' . $div);
$sp->style = "display:none;background-color:red;color:white;font-size:12px";
$sp->value = _("Chargement");
echo $sp->input();
echo HtmlInput::hidden('act', 'loadfile');
echo dossier::hidden();
echo HtmlInput::hidden('jr_id', $jr_id);
echo HtmlInput::hidden('div', $div);
echo '<INPUT TYPE="FILE" id="receipt_id" name="pj" onchange="' . $check_receipt . '">';
echo '<p id="receipt_info_id" class="error"></p>';
echo '<p id="receipt_info_id" class="error"></p>';
echo '</FORM>';
}
else
{
if (!isset($_REQUEST['ajax']))
{
echo '</FORM>';
} else {
if (!isset($_REQUEST['ajax'])) {
echo '<div class="op_detail_frame">';
}
else
{
} else {
echo "<div>";
}
}
echo _('Aucun fichier');
}
echo '</div>';
exit();
}
else
{
// There is no document attached to this writing
//
if ( ! isset($_REQUEST['ajax']) ) {
echo _('Aucun fichier');
}
echo '</div>';
exit();
} else {
// There is no document attached to this writing
//
if (!isset($_REQUEST['ajax'])) {
echo '<div class="op_detail_frame">';
}else {
} else {
echo "<div>";
}
echo '<div class="op_detail_frame">';
$x='';
if ($access=='W' && $g_user->check_action (RMRECEIPT) == 1)
{
// Not possible to remove the file thanks a modal dialog box,
// because of the frameset
}
echo '<div class="op_detail_frame">';
$x = '';
if ($access == 'W' && $g_user->check_action(RMRECEIPT) == 1) {
// Not possible to remove the file thanks a modal dialog box,
// because of the frameset
$x=Icon_Action::trash(uniqid(),
sprintf("if (confirm(content[47])) {document.location.href='ajax_misc.php?op=ledger&gDossier=%d&div=%s&jr_id=%s&act=rmf'}",
$gDossier,$div,$jr_id));
$x = Icon_Action::trash(uniqid(),
sprintf("if (confirm(content[47])) {document.location.href='ajax_misc.php?op=ledger&gDossier=%d&div=%s&jr_id=%s&act=rmf'}",
$gDossier, $div, $jr_id));
}
$filename= $obj->det->jr_pj_name;
if ( strlen($obj->det->jr_pj_name) > 60 )
{
$filename=mb_substr($obj->det->jr_pj_name,0,60);
}
$filename = $obj->det->jr_pj_name;
if (strlen($obj->det->jr_pj_name) > 60) {
$filename = mb_substr($obj->det->jr_pj_name, 0, 60);
}
echo HtmlInput::show_receipt_document($jr_id, h($filename));
echo $x;
echo '<p id="receipt_info_id" class="error"></p>';
echo '</div>';
echo '</body></html>';
exit();
}
echo HtmlInput::show_receipt_document($jr_id,h($filename));
echo $x;
echo '<p id="receipt_info_id" class="error"></p>';
echo '</div>';
echo '</body></html>';
exit();
}
/////////////////////////////////////////////////////////////////////////////
// load a file
/////////////////////////////////////////////////////////////////////////////
case 'loadfile':
if ( $access == 'W' && isset ($_FILES))
{
$cn->start();
// remove the file
$grpt=$cn->get_value('select jr_grpt_id from jrn where jr_id=$1',array($jr_id));
$cn->save_receipt($grpt);
$cn->commit();
// Show a link to the new file
$op->get();
$obj=$op->get_quant(); /* return an obj. ACH / FIN or VEN or null if nothing is found*/
html_min_page_start($_SESSION[SESSION_KEY.'g_theme']);
if ( ! isset($_REQUEST['ajax']) ) echo "<body class=\"op_detail_frame\">"; else echo "<body>";
echo '<div class="op_detail_frame">';
$x="";
// check if the user can remove a document
if ($g_user->check_action (RMRECEIPT) == 1) {
// Not possible to remove the file thanks a modal dialog box,
// because of the frameset
$x=Icon_Action::trash(uniqid(),
case 'loadfile':
if ($access == 'W' && isset ($_FILES)) {
$cn->start();
// remove the file
$grpt = $cn->get_value('select jr_grpt_id from jrn where jr_id=$1', array($jr_id));
$cn->save_receipt($grpt);
$cn->commit();
// Show a link to the new file
$op->get();
$obj = $op->get_quant(); /* return an obj. ACH / FIN or VEN or null if nothing is found*/
html_min_page_start($_SESSION[SESSION_KEY . 'g_theme']);
if (!isset($_REQUEST['ajax'])) echo "<body class=\"op_detail_frame\">"; else echo "<body>";
echo '<div class="op_detail_frame">';
$x = "";
// check if the user can remove a document
if ($g_user->check_action(RMRECEIPT) == 1) {
// Not possible to remove the file thanks a modal dialog box,
// because of the frameset
$x = Icon_Action::trash(uniqid(),
sprintf("if (confirm(content[47])) {document.location.href='ajax_misc.php?op=ledger&gDossier=%d&div=%s&jr_id=%s&act=rmf'}",
$gDossier,$div,$jr_id));
}
$filename= $obj->det->jr_pj_name;
echo HtmlInput::show_receipt_document($jr_id,h($filename));
echo $x;
$gDossier, $div, $jr_id));
}
$filename = $obj->det->jr_pj_name;
echo HtmlInput::show_receipt_document($jr_id, h($filename));
echo $x;
echo '</div>';
echo '</body></html>';
}
exit();
echo '</div>';
echo '</body></html>';
}
exit();
/////////////////////////////////////////////////////////////////////////////
// remove a file
/////////////////////////////////////////////////////////////////////////////
case 'rmf':
if ( $access == 'W' && $g_user->check_action (RMRECEIPT) == 1)
{
$repo=new Database();
html_min_page_start($_SESSION[SESSION_KEY.'g_theme']);
echo '<div class="op_detail_frame">';
$check_receipt=sprintf("check_receipt_size('%s','file%s')",
MAX_FILE_SIZE,$div);
echo '<FORM METHOD="POST" ENCTYPE="multipart/form-data" id="form_file">';
$sp=new ISpan('file'.$div);
$sp->style="display:none;width:155px;height:15px;background-color:red;color:white;font-size:10px";
$sp->value=_("Chargement");
echo $sp->input();
case 'rmf':
if ($access == 'W' && $g_user->check_action(RMRECEIPT) == 1) {
$repo = new Database();
html_min_page_start($_SESSION[SESSION_KEY . 'g_theme']);
echo '<div class="op_detail_frame">';
$check_receipt = sprintf("check_receipt_size('%s','file%s')",
MAX_FILE_SIZE, $div);
echo '<FORM METHOD="POST" ENCTYPE="multipart/form-data" id="form_file">';
$sp = new ISpan('file' . $div);
$sp->style = "display:none;width:155px;height:15px;background-color:red;color:white;font-size:10px";
$sp->value = _("Chargement");
echo $sp->input();
echo HtmlInput::hidden('act','loadfile');
echo dossier::hidden();
echo HtmlInput::hidden('jr_id',$jr_id);
echo HtmlInput::hidden('div',$div);
echo HtmlInput::hidden('act', 'loadfile');
echo dossier::hidden();
echo HtmlInput::hidden('jr_id', $jr_id);
echo HtmlInput::hidden('div', $div);
echo '<INPUT TYPE="FILE" id="receipt_id" name="pj" onchange="'.$check_receipt.'">';
echo '<p id="receipt_info_id" class="error"></p>';
echo '</FORM>';
$ret=$cn->exec_sql("select jr_pj from jrn where jr_id=$1",array($jr_id));
if (Database::num_row($ret) != 0)
{
$r=Database::fetch_array($ret,0);
$old_oid=$r['jr_pj'];
if (strlen($old_oid) != 0)
{
// check if this pj is used somewhere else
$c=$cn->count_sql("select * from jrn where jr_pj=".$old_oid);
if ( $c == 1 )
$cn->lo_unlink($old_oid);
echo '<INPUT TYPE="FILE" id="receipt_id" name="pj" onchange="' . $check_receipt . '">';
echo '<p id="receipt_info_id" class="error"></p>';
echo '</FORM>';
$ret = $cn->exec_sql("select jr_pj from jrn where jr_id=$1", array($jr_id));
if (Database::num_row($ret) != 0) {
$r = Database::fetch_array($ret, 0);
$old_oid = $r['jr_pj'];
if (strlen($old_oid) != 0) {
// check if this pj is used somewhere else
$c = $cn->count_sql("select * from jrn where jr_pj=" . $old_oid);
if ($c == 1)
$cn->lo_unlink($old_oid);
}
$cn->exec_sql("update jrn set jr_pj=null, jr_pj_name=null, " .
"jr_pj_type=null where jr_id=$1", array($jr_id));
}
$cn->exec_sql("update jrn set jr_pj=null, jr_pj_name=null, ".
"jr_pj_type=null where jr_id=$1",array($jr_id));
}
}
echo '</div>';
exit();
echo '</div>';
exit();
/////////////////////////////////////////////////////////////////////////////
// Save operation detail
/////////////////////////////////////////////////////////////////////////////
case 'save':
ob_start();
$http=new HttpInput();
try
{
$cn->start();
if ( $access=="W")
{
if (isset($_POST['p_ech']) )
{
$ech=$http->post('p_ech');
if ( trim($ech) != '' && isDate($ech) != null)
{
$cn->exec_sql("update jrn set jr_ech=to_date($1,'DD.MM.YYYY') where jr_id=$2",
array($ech,$jr_id));
case 'save':
ob_start();
$http = new HttpInput();
try {
$cn->start();
if ($access == "W") {
if (isset($_POST['p_ech'])) {
$ech = $http->post('p_ech');
if (trim($ech) != '' && isDate($ech) != null) {
$cn->exec_sql("update jrn set jr_ech=to_date($1,'DD.MM.YYYY') where jr_id=$2",
array($ech, $jr_id));
}
else
{
$cn->exec_sql("update jrn set jr_ech=null where jr_id=$1",
array($jr_id));
} else {
$cn->exec_sql("update jrn set jr_ech=null where jr_id=$1",
array($jr_id));
}
}
if (isset($_POST['p_date_paid']) )
{
$ech=$http->post('p_date_paid');
if ( trim($ech) != '' && isDate($ech) != null)
{
$cn->exec_sql("update jrn set jr_date_paid=to_date($1,'DD.MM.YYYY') where jr_id=$2",
array($ech,$jr_id));
}
}
}
else
{
$cn->exec_sql("update jrn set jr_date_paid=null where jr_id=$1",
array($jr_id));
if (isset($_POST['p_date_paid'])) {
$ech = $http->post('p_date_paid');
if (trim($ech) != '' && isDate($ech) != null) {
$cn->exec_sql("update jrn set jr_date_paid=to_date($1,'DD.MM.YYYY') where jr_id=$2",
array($ech, $jr_id));
}
}
$cn->exec_sql("update jrn set jr_comment=$1,jr_pj_number=$2,jr_date=to_date($4,'DD.MM.YYYY'),jr_optype=$5 where jr_id=$3",
array($http->post('lib'),$http->post('npj'),$jr_id,$http->post('p_date'),$http->post('jr_optype')));
$cn->exec_sql("update jrnx set j_date=to_date($1,'DD.MM.YYYY') where j_grpt in (select jr_grpt_id from jrn where jr_id=$2)",
array($http->post('p_date'),$jr_id));
$cn->exec_sql('update operation_analytique set oa_date=j_date from jrnx
} else {
$cn->exec_sql("update jrn set jr_date_paid=null where jr_id=$1",
array($jr_id));
}
}
$oLedger=new Acc_Ledger($cn,$ledger);
$npj=$http->post('npj');
// protect receipt number
if ( ($g_parameter->MY_PJ_SUGGEST == 'A'||$g_user->check_action(UPDRECEIPT)==0) && $oLedger->get_type() !='FIN') {
$npj=$cn->get_value("select jr_pj_number from jrn where jr_id=$1",[$jr_id]);
}
$cn->exec_sql("update jrn set jr_comment=$1,jr_pj_number=$2,jr_date=to_date($4,'DD.MM.YYYY'),jr_optype=$5 where jr_id=$3",
array($http->post('lib'), $npj, $jr_id, $http->post('p_date'), $http->post('jr_optype')));
$cn->exec_sql("update jrnx set j_date=to_date($1,'DD.MM.YYYY') where j_grpt in (select jr_grpt_id from jrn where jr_id=$2)",
array($http->post('p_date'), $jr_id));
$cn->exec_sql('update operation_analytique set oa_date=j_date from jrnx
where
operation_analytique.j_id=jrnx.j_id and
operation_analytique.j_id in (select j_id
from jrnx join jrn on (j_grpt=jr_grpt_id)
where jr_id=$1)
',array($jr_id));
$cn->exec_sql("select comptaproc.jrn_add_note($1,$2)",
array($jr_id , $http->post('jrn_note') ));
$rapt=$_POST['rapt'];
', array($jr_id));
$cn->exec_sql("select comptaproc.jrn_add_note($1,$2)",
array($jr_id, $http->post('jrn_note')));
$rapt = $_POST['rapt'];
if ( $g_parameter->MY_UPDLAB=='Y' && isset ($_POST['j_id']))
{
$a_rowid=$http->post("j_id");
for ($e=0;$e<count($a_rowid);$e++)
{
$id="e_march".$a_rowid[$e]."_label";
$cn->exec_sql('update jrnx set j_text=$1 where j_id=$2', array($http->post($id),$a_rowid[$e]));
if ($g_parameter->MY_UPDLAB == 'Y' && isset ($_POST['j_id'])) {
$a_rowid = $http->post("j_id");
for ($e = 0; $e < count($a_rowid); $e++) {
$id = "e_march" . $a_rowid[$e] . "_label";
$cn->exec_sql('update jrnx set j_text=$1 where j_id=$2', array($http->post($id), $a_rowid[$e]));
}
}
}
if (trim($rapt) != '')
{
$rec=new Acc_Reconciliation ($cn);
$rec->set_jr_id($jr_id);
if (trim($rapt) != '') {
$rec = new Acc_Reconciliation ($cn);
$rec->set_jr_id($jr_id);
if (strpos($rapt,",") != 0 )
{
$aRapt=explode(',',$rapt);
/* reconcialition */
foreach ($aRapt as $rRapt)
{
if ( isNumber($rRapt) == 1 )
{
// Add a "concerned operation to bound these op.together
$rec->insert($rRapt);
if (strpos($rapt, ",") != 0) {
$aRapt = explode(',', $rapt);
/* reconcialition */
foreach ($aRapt as $rRapt) {
if (isNumber($rRapt) == 1) {
// Add a "concerned operation to bound these op.together
$rec->insert($rRapt);
}
}
} else
if (isNumber($rapt) == 1) {
$rec->insert($rapt);
}
}
}
else
if ( isNumber($rapt) == 1 )
{
$rec->insert($rapt);
}
}
if ( isset($_POST['ipaid']))
{
$cn->exec_sql("update jrn set jr_rapt='paid' where jr_id=$1",array($jr_id));
}
else
{
$cn->exec_sql("update jrn set jr_rapt=null where jr_id=$1",array($jr_id));
}
////////////////////////////////////////////////////
// CA
//////////////////////////////////////////////////
$owner = new Noalyss_Parameter_Folder($cn);
if ( $owner->MY_ANALYTIC != "nu" && isset ($_POST['op']) )
{
// for each item, insert into operation_analytique */
$opanc=new Anc_Operation($cn);
$opanc->save_update_form($_POST);
}
//////////////////////////////////////////////////////////////////
//Save other info
//////////////////////////////////////////////////////////////////
$op->save_info($http->post('OTHER'),'OTHER');
$op->save_info($http->post('BON_COMMANDE'),'BON_COMMANDE');
///////////////////////////////////////////////////////////////////
// Save related
//////////////////////////////////////////////////////////////////
$related=$http->post("related","string");
if ($related=="0")
{
throw new Exception('Parameter not send -> related'.__FILE__.__LINE__, 10);
}
$op->insert_related_action($related);
if (isset($_POST['ipaid'])) {
$cn->exec_sql("update jrn set jr_rapt='paid' where jr_id=$1", array($jr_id));
} else {
$cn->exec_sql("update jrn set jr_rapt=null where jr_id=$1", array($jr_id));
}
////////////////////////////////////////////////////
// CA
//////////////////////////////////////////////////
$owner = new Noalyss_Parameter_Folder($cn);
if ($owner->MY_ANALYTIC != "nu" && isset ($_POST['op'])) {
// for each item, insert into operation_analytique */
$opanc = new Anc_Operation($cn);
$opanc->save_update_form($_POST);
}
//////////////////////////////////////////////////////////////////
//Save other info
//////////////////////////////////////////////////////////////////
$op->save_info($http->post('OTHER'), 'OTHER');
$op->save_info($http->post('BON_COMMANDE'), 'BON_COMMANDE');
///////////////////////////////////////////////////////////////////
// Save related
//////////////////////////////////////////////////////////////////
$related = $http->post("related", "string");
if ($related == "0") {
throw new Exception('Parameter not send -> related' . __FILE__ . __LINE__, 10);
}
$op->insert_related_action($related);
}
echo 'OK';
$cn->commit();
} catch (Exception $e) {
$html = ob_get_contents();
ob_end_clean();
record_log($e);
record_log($html);
if (DEBUGNOALYSS > 0) echo $e->getMessage();
echo _("Changement impossible: on ne peut pas changer la date dans une période fermée");
return;
}
echo 'OK';
$cn->commit();
}
catch (Exception $e)
{
$html=ob_get_contents();
ob_end_clean();
record_log($e);
record_log($html);
if ( DEBUGNOALYSS > 0 ) echo $e->getMessage();
echo _( "Changement impossible: on ne peut pas changer la date dans une période fermée");
return;
}
$html=ob_get_contents();
ob_end_clean();
$html = ob_get_contents();
ob_end_clean();
break;
break;
////////////////////////////////////////////////////////////////////////////
// remove a reconciliation
////////////////////////////////////////////////////////////////////////////
case 'rmr':
if ( $access=='W')
{
$rec=new Acc_Reconciliation($cn);
$rec->set_jr_id($jr_id);
$rec->remove($_GET['jr_id2']);
}
break;
case 'rmr':
if ($access == 'W') {
$rec = new Acc_Reconciliation($cn);
$rec->set_jr_id($jr_id);
$rec->remove($_GET['jr_id2']);
}
break;
////////////////////////////////////////////////////////////////////////////
// ask for a date for reversing the operation
////////////////////////////////////////////////////////////////////////////
case 'ask_extdate':
$date=new IDate('p_date');
$html.="<form id=\"form_".$div."\" onsubmit=\"return reverseOperation(this);\">";
$html.=HtmlInput::hidden('jr_id',$_REQUEST['jr_id']).
HtmlInput::hidden('div',$div).
dossier::hidden().
HtmlInput::hidden('act','reverseop');
$html.='<h2 class="info">'._('entrez une date').' </H2>'.$date->input();
$html.=HtmlInput::submit('x','accepter');
$html.=HtmlInput::button_close($div);
$html.='</form>';
break;
case 'ask_extdate':
$date = new IDate('p_date');
$html .= "<form id=\"form_" . $div . "\" onsubmit=\"return reverseOperation(this);\">";
$html .= HtmlInput::hidden('jr_id', $_REQUEST['jr_id']) .
HtmlInput::hidden('div', $div) .
dossier::hidden() .
HtmlInput::hidden('act', 'reverseop');
$html .= '<h2 class="info">' . _('entrez une date') . ' </H2>' . $date->input();
$html .= HtmlInput::submit('x', 'accepter');
$html .= HtmlInput::button_close($div);
$html .= '</form>';
break;
////////////////////////////////////////////////////////////////////////////
// Reverse an operation
////////////////////////////////////////////////////////////////////////////
case 'reverseop':
if ( $access=='W')
{
ob_start();
try
{
$ext_date=$http->request("ext_date","date");
$ext_label=$http->request("ext_label");
$cn->start();
$oLedger=new Acc_Ledger($cn,$ledger);
$oLedger->jr_id=$jr_id;
if ( trim($ext_label) == "" ) {
$ext_label=_("Extourne").$cn->get_value("select jr_comment from jrn where jr_id=$1",[$jr_id]);
case 'reverseop':
if ($access == 'W') {
ob_start();
try {
$ext_date = $http->request("ext_date", "date");
$ext_label = $http->request("ext_label");
$cn->start();
$oLedger = new Acc_Ledger($cn, $ledger);
$oLedger->jr_id = $jr_id;
if (trim($ext_label) == "") {
$ext_label = _("Extourne") . $cn->get_value("select jr_comment from jrn where jr_id=$1", [$jr_id]);
}
$oLedger->reverse($ext_date, $ext_label);
$cn->commit();
echo _("Opération extournée");
} catch (Exception $e) {
record_log($e);
echo $e->getMessage();
$cn->rollback();
}
$oLedger->reverse($ext_date,$ext_label);
$cn->commit();
echo _("Opération extournée");
}
catch (Exception $e)
{
record_log($e);
echo $e->getMessage();
$cn->rollback();
}
}
$html=ob_get_contents();
ob_end_clean();
break;
case 'duplicateop':
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Duplicate operation
///////////////////////////////////////////////////////////////////////////////////////////////////////////
$operation=new Acc_Operation($cn);
$operation->jr_id=$jr_id;
ob_start();
echo HtmlInput::title_box(_("Dupliquer une opération"), $div);
echo $operation->form_clone_operation("cloneit");
$html=ob_get_contents();
ob_end_clean();
break;
$html = ob_get_contents();
ob_end_clean();
break;
case 'duplicateop':
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Duplicate operation
///////////////////////////////////////////////////////////////////////////////////////////////////////////
$operation = new Acc_Operation($cn);
$operation->jr_id = $jr_id;
ob_start();
echo HtmlInput::title_box(_("Dupliquer une opération"), $div);
echo $operation->form_clone_operation("cloneit");
$html = ob_get_contents();
ob_end_clean();
break;
}
$html=escape_xml($html);
if ( ! headers_sent()) { header('Content-type: text/xml; charset=UTF-8');} else { echo "HTML".unescape_xml($html);}
echo <<<EOF
$html = escape_xml($html);
if (!headers_sent()) {
header('Content-type: text/xml; charset=UTF-8');
} else {
echo "HTML" . unescape_xml($html);
}
echo <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<data>
<ctl>$div</ctl>

View file

@ -656,7 +656,13 @@ class Acc_Ledger extends jrn_def_sql
$ret.="<tr><td>";
$ret.=_('Note').'</td><td><pre>'. h($p_array['jrn_note_input']).'</pre>';
$ret.="</td></tr>";
$ret.="<tr><td>"._('PJ Num')." </td><td>".h($e_pj)."</td></tr>";
$span=$this->warn_manual_receipt($p_array);
if ( $g_parameter->MY_PJ_SUGGEST=="A"||$g_user->check_action(UPDRECEIPT)==0)
{
$e_pj=$this->guess_pj();
$span="";
}
$ret.="<tr><td>"._('PJ Num')." </td><td>".h($e_pj).$span."</td></tr>";
$ret.='</table>';
$ret.="<table class=\"result\">";
$ret.="<tr>";
@ -831,7 +837,7 @@ class Acc_Ledger extends jrn_def_sql
if ($p_array!=null)
extract($p_array, EXTR_SKIP);
$add_js="";
if ($g_parameter->MY_PJ_SUGGEST=='Y')
if ($g_parameter->MY_PJ_SUGGEST !='N')
{
$add_js="update_pj();";
}
@ -926,11 +932,18 @@ class Acc_Ledger extends jrn_def_sql
/* suggest PJ ? */
$default_pj='';
if ($g_parameter->MY_PJ_SUGGEST=='Y')
if ($g_parameter->MY_PJ_SUGGEST != 'N')
{
$default_pj=$this->guess_pj();
}
$wPJ->value=(isset($e_pj))?$e_pj:$default_pj;
if ( $g_parameter->MY_PJ_SUGGEST=='A' || $g_user->check_action(UPDRECEIPT)==0)
{
$wPJ->setReadOnly(true);
$wPJ->value=$default_pj;
$wPJ->id="e_pj";
} else {
$wPJ->value=(isset($e_pj))?$e_pj:$default_pj;
}
$ret.='</tr>';
$ret.='<tr >';
$ret.='<td style="width:auto"> '._('Pièce').' </td> ';
@ -3527,6 +3540,35 @@ EOF;
return true;
}
/**
* @brief compare given receipt number and suggested one, if different , it means that the user enters a receipt number
* if e_pj or e_pj_suggest is not set or empty , or if both are equals then will return true,
* it returns only if they exist and are different
* @param $p_array same structure as input
* @return void
*/
protected function verify_autonumber($p_array)
{
if (empty($p_array['e_pj'])) return true;
if (empty($p_array['e_pj_suggest'])) return true;
if ( noalyss_trim($p_array['e_pj'])===noalyss_trim($p_array['e_pj_suggest'])) { return true; }
return false;
}
/**
* @brief warn if the suggested receipt and receipt are different , it means that the user tried to
* number himself
* @param $p_array same structure as input
* @see Acc_Ledger::input()
* @see Acc_Ledger::confirm()
* @return void
*/
protected function warn_manual_receipt($p_array)
{
if ( $this->verify_autonumber($p_array) == false) {
return span (_("Attention ! Numéro de Pièce non automatique mais forcée"),'class="warning"');
}
}
}
?>

View file

@ -505,7 +505,7 @@ class Acc_Ledger_Purchase extends Acc_Ledger
*/
public function insert($p_array=null)
{
global $g_parameter;
global $g_parameter,$g_user;
extract ($p_array, EXTR_SKIP);
$this->verify($p_array) ;
if ( !isset($p_array['jrn_note_input'])) {$p_array['jrn_note_input']='';}
@ -1218,10 +1218,10 @@ class Acc_Ledger_Purchase extends Acc_Ledger
//--
/* if we suggest the next pj, then we need a javascript */
$add_js="";
if ( $g_parameter->MY_PJ_SUGGEST=='Y')
if ( $g_parameter->MY_PJ_SUGGEST !='N')
{
$add_js="update_pj();";
}
}
if ($g_parameter->MY_DATE_SUGGEST == 'Y')
{
$add_js.='get_last_date();';
@ -1253,7 +1253,7 @@ class Acc_Ledger_Purchase extends Acc_Ledger
//--
/* suggest PJ ? */
$default_pj='';
if ( $g_parameter->MY_PJ_SUGGEST=='Y')
if ( $g_parameter->MY_PJ_SUGGEST !='N')
{
$default_pj=$this->guess_pj();
}
@ -1261,7 +1261,11 @@ class Acc_Ledger_Purchase extends Acc_Ledger
$pj=new IText();
$pj->value=(isset($e_pj))?$e_pj:$default_pj;
if ( $g_parameter->MY_PJ_SUGGEST=='A' || $g_user->check_action(UPDRECEIPT)==0)
{
$pj->setReadOnly(true);
$pj->id="e_pj";
}
$pj->table=0;
$pj->name="e_pj";
$pj->size=10;
@ -1507,7 +1511,7 @@ class Acc_Ledger_Purchase extends Acc_Ledger
/* if we suggest the pj n# the run the script */
if ( $g_parameter->MY_PJ_SUGGEST=='Y')
if ( $g_parameter->MY_PJ_SUGGEST !='N')
{
$r.='<script> update_pj();</script>';
}
@ -1527,7 +1531,7 @@ class Acc_Ledger_Purchase extends Acc_Ledger
*/
function confirm($p_array,$p_summary=false)
{
global $g_parameter;
global $g_parameter,$g_user;
extract ($p_array,EXTR_SKIP);
if ( !isset($p_array['jrn_note_input'])) {$p_array['jrn_note_input']='';}
// we don't need to verify if we need only a feedback
@ -1571,16 +1575,19 @@ class Acc_Ledger_Purchase extends Acc_Ledger
$r.="</tr>";
}
$r.='<tr>';
$span=$this->warn_manual_receipt($p_array);
if ( ! $p_summary) {
$r.='<td>' . _('Numéro Pièce') .'</td><td>'. hb($e_pj) . '</td>';
$r.='<td>' . _('Numéro Pièce') .$span.'</td><td>'. hb($e_pj) . '</td>';
} else {
if ( $g_parameter->MY_PJ_SUGGEST=="A" || $g_user->check_action(UPDRECEIPT)==0) $e_pj=$this->pj;
if ( strcmp($this->pj,$e_pj) != 0 )
{
$r.='<td>' . _('Numéro Pièce') .'</td><td>'. hb($this->pj) .
$r.='<td>' . _('Numéro Pièce').$span .'</td><td>'. hb($this->pj) .
'<span class="notice"> '._('Attention numéro pièce existante, elle a du être adaptée').'</span></td>';
} else {
$r.='<td>' . _('Numéro Pièce') .'</td><td>'. hb($this->pj) . '</td>';
$r.='<td>' . _('Numéro Pièce') .$span.'</td><td>'. hb($this->pj) . '</td>';
}
}
$r.='</tr>';

View file

@ -256,7 +256,7 @@ class Acc_Ledger_Sale extends Acc_Ledger {
*/
public function insert($p_array = null) {
global $g_parameter;
global $g_parameter,$g_user;
// load ledger definition
$this->load();
extract($p_array, EXTR_SKIP);
@ -816,7 +816,7 @@ class Acc_Ledger_Sale extends Acc_Ledger {
*/
function confirm($p_array, $p_summary = false) {
global $g_parameter;
global $g_parameter,$g_user;
extract($p_array, EXTR_SKIP);
if ( !isset($p_array['jrn_note_input'])) {$p_array['jrn_note_input']='';}
// don't need to verify for a summary
@ -859,16 +859,18 @@ class Acc_Ledger_Sale extends Acc_Ledger {
$r.="</tr>";
}
$r.='<tr>';
$span=$this->warn_manual_receipt($p_array);
if ( ! $p_summary) {
$r.='<td>' . _('Numéro Pièce') .'</td><td>'. hb($e_pj) . '</td>';
$r.='<td>' . _('Numéro Pièce') .$span.'</td><td>'. hb($e_pj) . '</td>';
} else {
if ( $g_parameter->MY_PJ_SUGGEST=="A" ||$g_user->check_action(UPDRECEIPT)==0)
$e_pj=$this->pj;
if ( strcmp($this->pj,$e_pj) != 0 )
{
$r.='<td>' . _('Numéro Pièce') .'</td><td>'. hb($this->pj) .
$r.='<td>' . _('Numéro Pièce') .$span.'</td><td>'. hb($this->pj) .
'<span class="notice"> '._('Attention numéro pièce existante, elle a du être adaptée').'</span></td>';
} else {
$r.='<td>' . _('Numéro Pièce') .'</td><td>'. hb($this->pj) . '</td>';
$r.='<td>' . _('Numéro Pièce') .$span.'</td><td>'. hb($this->pj) . '</td>';
}
}
$r.='</tr>';
@ -1352,7 +1354,7 @@ EOF;
}
/* if we suggest the next pj, then we need a javascript */
$add_js = "";
if ($g_parameter->MY_PJ_SUGGEST == 'Y') {
if ($g_parameter->MY_PJ_SUGGEST != 'N') {
$add_js = "update_pj();";
}
if ($g_parameter->MY_DATE_SUGGEST == 'Y') {
@ -1387,11 +1389,16 @@ EOF;
//--
/* suggest PJ ? */
$default_pj = '';
if ($g_parameter->MY_PJ_SUGGEST == 'Y') {
if ($g_parameter->MY_PJ_SUGGEST != 'N') {
$default_pj = $this->guess_pj();
}
$pj = new IText();
if ( $g_parameter->MY_PJ_SUGGEST=='A'||$g_user->check_action(UPDRECEIPT)==0)
{
$pj->setReadOnly(true);
$pj->id="e_pj";
}
$pj->table = 0;
$pj->name = "e_pj";

View file

@ -259,7 +259,7 @@ $all->style=' class="input_text"';
<div class="form-group">
<label class="w-40" for="p_report">
<?= _("L'exercice commence par un report des soldes)") ?></label>
<?= _("L'exercice commence par un report des soldes") ?></label>
<?=Icon_Action::infobulle(84)?>
<?= $report->input() ?>
</div>
@ -298,13 +298,15 @@ echo Icon_Action::tips($anc_filter->title);
</div>
<div class="form-group">
<label class="w-20" for="p_pj"><?= _("Suggérer le numéro de pièce justificative") ?>
<label class="w-20" for="p_pj"><?= _("Le numéro de pièce justificative") ?>
</label>
<?= $pj_suggest->input("p_pj", $strict_array) ?>
<?php
$receipt_array=array(["label"=>"Suggérer","value"=>"Y"],["label"=>"Automatique","value"=>"A"],["label"=>"Manuel","value"=>"N"]);
?>
<?= $pj_suggest->input("p_pj", $receipt_array) ?>
</div>
<div class="form-group">
<div class="form-group">
<label class="w-20" for="p_date_suggest"><?= _("Suggérer la date") ?></label>
<?= $date_suggest->input("p_date_suggest", $strict_array) ?>
</div>

View file

@ -27,6 +27,7 @@ define ('VIEWDOC',1010); // Voir document pour follow up
define ('PARCATDOC',1050); // modifier type document pour follow up
define ('RMRECEIPT',1110); // Effacer un document d'une pièce comptable
define ('RMOPER',1120); // Effacer une opération comptable
define ('UPDRECEIPT',1130); // change un numéro de pièce
define ('SHARENOTE',1210); // Can share a note
define ('SHARENOTEPUBLIC',1220); // Can create public note
define ('SHARENOTEREMOVE',1230); // Can drop drop of other

View file

@ -59,6 +59,8 @@ global $div,$g_parameter,$cn,$access,$jr_id,$obj;
<td>
<?php
$itext = new IText('npj');
if ($owner->MY_PJ_SUGGEST=='A' || $g_user->check_action(UPDRECEIPT)==0)
$itext->setReadOnly(true);
$itext->value = strip_tags($obj->det->jr_pj_number);
echo td(_('Pièce')) . td($itext->input());
?>

View file

@ -8,6 +8,7 @@ require_once NOALYSS_TEMPLATE.'/ledger_detail_top.php';
// find out exercice
$periode_id=new Periode($cn,$obj->det->jr_tech_per);
$exercice=$periode_id->get_exercice();
$owner = new Noalyss_Parameter_Folder($cn);
?>
<?php
?>
@ -54,6 +55,8 @@ require_once NOALYSS_TEMPLATE.'/ledger_detail_top.php';
<td>
<?php
$itext=new IText('npj');
if ($owner->MY_PJ_SUGGEST=='A' || $g_user->check_action(UPDRECEIPT)==0)
$itext->setReadOnly(true);
$itext->value=strip_tags($obj->det->jr_pj_number??"");
echo td(_('Pièce')).td($itext->input());
?>

View file

@ -71,6 +71,8 @@ $str_anc = "";
<?php
$itext = new IText('npj');
$itext->value = strip_tags($obj->det->jr_pj_number);
if ($owner->MY_PJ_SUGGEST=='A' || $g_user->check_action(UPDRECEIPT)==0)
$itext->setReadOnly(true);
echo td(_('Pièce')) . td($itext->input());
?>
</td>

View file

@ -1 +1,3 @@
insert into action (ac_id,ac_description,ac_module,ac_code) values (1130,'Modifier le numéro de pièce','compta','UPDRECEIPT');