From 0b4c6fb0ee77bb2481b57cb5811d63784774087a Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sun, 10 Dec 2023 11:49:47 +0100 Subject: [PATCH 01/26] Bug from merging --- include/lib/select_box.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/include/lib/select_box.class.php b/include/lib/select_box.class.php index 56bfb10fb..f27ef130f 100644 --- a/include/lib/select_box.class.php +++ b/include/lib/select_box.class.php @@ -38,7 +38,6 @@ class Select_Box private $position; //!< change depending if we are in an absolute block or not protected $style_box; protected $value; - public $style_box; /** * Default constructor * @param type $p_id javascript DOMid From 32bd3139db4c7ed0197d41603d18978ba632f27a Mon Sep 17 00:00:00 2001 From: sparkyx Date: Fri, 12 Jan 2024 12:59:23 +0100 Subject: [PATCH 02/26] OPTION_CARD : Correct options for FollowUp --- include/class/card_multiple.class.php | 2 +- include/template/form_ledger_detail.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/class/card_multiple.class.php b/include/class/card_multiple.class.php index b7a2f3c82..d9932d250 100644 --- a/include/class/card_multiple.class.php +++ b/include/class/card_multiple.class.php @@ -146,7 +146,7 @@ class Card_Multiple select contact_option_ref_id from action_person_option join action_person a on (a.ap_id=action_person_id) - where f_id=$2)",[$p_action_person_id,$fiche_id]); + where f_id=$2 and ag_id=$3)",[$p_action_person_id,$fiche_id,$ag_id]); // delete disable $cn->exec_sql("delete diff --git a/include/template/form_ledger_detail.php b/include/template/form_ledger_detail.php index e72cd2bc5..37e192928 100644 --- a/include/template/form_ledger_detail.php +++ b/include/template/form_ledger_detail.php @@ -7,7 +7,7 @@ */ $default_currency=new Acc_Currency(Dossier::connect(),0); - +\Noalyss\Dbg::echo_file(__FILE__); ?>

get_name()?>

From fcc7ef8c03d7a9c82dda7f1b14832ffd995ca62d Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sat, 13 Jan 2024 18:47:42 +0100 Subject: [PATCH 03/26] Get empty upgrade.sql --- sql/upgrade.sql | 96 ------------------------------------------------- 1 file changed, 96 deletions(-) diff --git a/sql/upgrade.sql b/sql/upgrade.sql index 03abdc0a2..e69de29bb 100644 --- a/sql/upgrade.sql +++ b/sql/upgrade.sql @@ -1,96 +0,0 @@ - - --- protect against wrong card in fiche_detail - -CREATE OR REPLACE FUNCTION comptaproc.fiche_detail_check_qcode() - RETURNS trigger - LANGUAGE plpgsql -AS $function$ -declare - i record; -begin - if NEW.ad_id=23 and NEW.ad_value != OLD.ad_value then - update jrnx set j_qcode=NEW.ad_value where j_qcode = OLD.ad_value; - update op_predef_detail set opd_poste=NEW.ad_value where opd_poste=OLD.ad_value; - for i in select ad_id from attr_def where ad_type = 'card' or ad_id=25 loop - update fiche_detail set ad_value=NEW.ad_value where ad_value=OLD.ad_value and ad_id=i.ad_id; - if i.ad_id=19 then - update stock_goods set sg_code=NEW.ad_value where sg_code=OLD.ad_value; - end if; - - end loop; - end if; -return NEW; -end; -$function$; - -drop trigger if exists fiche_detail_check_qcode_trg on public.fiche_detail ; -drop function comptaproc.fiche_detail_qcode_upd(); - -create trigger fiche_detail_check_qcode_trg before insert -or update on -public.fiche_detail for each row execute function comptaproc.fiche_detail_check_qcode(); - - - -update fiche_detail set ad_value=ad_value where ad_id in (select ad_id from attr_def where ad_type='card'); - -insert into parameter values ('MY_REPORT','N') ON CONFLICT DO NOTHING; - -update menu_ref set me_file='payment_method.inc.php' where me_code='CFGPAY'; - -update menu_ref set me_menu='Principal' where me_code='COMPANY'; -update menu_ref set me_menu='Financier' where me_code='MENUFIN'; - -CREATE OR REPLACE FUNCTION comptaproc.set_tech_user() - RETURNS trigger -AS $function$ -declare - /* variable */ - noalyss_user text; -begin - new.tech_user := current_setting('noalyss.user_login'); - new.tech_date := now(); - return NEW; - -exception when others then - new.tech_date := now(); - new.tech_user := current_user; - return NEW; -end ; -$function$ -LANGUAGE plpgsql; - -drop table if exists operation_exercice_detail; -drop table if exists operation_exercice; - -create table operation_exercice -( - oe_id bigint generated by default as identity primary key, - oe_date date null, - oe_type text not null check (oe_type = 'opening' or oe_type = 'closing'), - oe_text text , - oe_dossier_id int not null, - oe_exercice int not null, - jr_internal text, - oe_transfer_date timestamp, - tech_user text, - tech_date timestamp default now() -); - -create table operation_exercice_detail -( - oed_id bigint generated by default as identity primary key, - oe_id bigint references operation_exercice (oe_id) on update cascade on delete cascade not null, - oed_poste account_type , - oed_qcode text , - oed_label text, - oed_amount numeric (20,4), - oed_debit bool -); - -create trigger trg_set_tech_user before insert or update on operation_exercice for each row execute function comptaproc.set_tech_user(); - -update menu_ref set me_code='OPCL' , me_menu='Ouvert./Fermeture',me_file='operation_exercice.inc.php',me_description='Opération de cloture ou d''ouverture d''exercice' - ,me_description_etendue ='Ecriture d''ouverture ou de fermeture , , reporte les soldes des comptes de l''année passé du poste comptable 0xxx à 5xxxx sur l''année courante ou ferme les comptes de 6 à 7 de l''année ' -where me_code='OPEN'; \ No newline at end of file From 49b769b98e7ed97a2bd6866d84c226c79d17b4bc Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sun, 11 Feb 2024 16:01:16 +0100 Subject: [PATCH 04/26] version 9.2 --- html/image/logo9000.png | Bin 33156 -> 33905 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/html/image/logo9000.png b/html/image/logo9000.png index a5d1eee8c56b5fcc0e212180fcefa0e3f6f71b59..88b84c5038e3c06b6522ef6bfd47ed1150a230a2 100644 GIT binary patch literal 33905 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

h*&@ipi6i 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 XC+cuC@R>S)1O7;f%ZrtZ7<~I5;a2Ts literal 33156 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

-UV4UaX|l33JjkKi25U0tYHhIo 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%0AA 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 QgPVg87m*RJ5Y+SiAKdDC&;S4c From 7a91dcfd73003ec492c70e045f3addd4d62eb0f4 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Wed, 31 Jan 2024 07:38:09 +0100 Subject: [PATCH 05/26] =?UTF-8?q?Tableau=20de=20bord=20:=20position=20des?= =?UTF-8?q?=20d=C3=A9tail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/js/noalyss_script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/js/noalyss_script.js b/html/js/noalyss_script.js index c70142b90..dace8e4b0 100644 --- a/html/js/noalyss_script.js +++ b/html/js/noalyss_script.js @@ -4180,7 +4180,7 @@ function event_display_detail(p_dossier,p_detail) { return; } if ( ! document.getElementById(dgbox)) { - var div_style="position:absolute;"+";top:30%"; + var div_style="position:fixed;"+";top:30%"; add_div({id:dgbox,cssclass:'inner_box',html:loading(),style:div_style,drag:true}); } From 66ee255c18b9856e65679adbe5ccfeff16d7c325 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Wed, 31 Jan 2024 07:38:54 +0100 Subject: [PATCH 06/26] =?UTF-8?q?SUIVI=20:=20d=C3=A9tail=20,=20montre=20no?= =?UTF-8?q?m=20et=20pr=C3=A9nom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/class/follow_up.class.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/include/class/follow_up.class.php b/include/class/follow_up.class.php index 6c8c16c1c..a3559e61f 100644 --- a/include/class/follow_up.class.php +++ b/include/class/follow_up.class.php @@ -332,7 +332,8 @@ class Follow_Up { $tiers=new Fiche($this->db); $tiers->get_by_qcode($this->qcode_dest); - $qcode_dest_label=$tiers->strAttribut(1); + $qcode_dest_label=strtoupper($tiers->strAttribut(1)); + $qcode_dest_label.=" ".$tiers->strAttribut(ATTR_DEF_FIRST_NAME); $this->f_id_dest=$tiers->id; } else @@ -363,7 +364,9 @@ class Follow_Up $w->set_function('fill_data'); $w->javascript=sprintf(' onchange="fill_data_onchange(\'%s\');" ', $w->name); + $sp=new ISpan(); + $sp->extra='class="text-"'; $sp->name='qcode_dest_label'; $sp->value=$qcode_dest_label; @@ -401,7 +404,8 @@ class Follow_Up $fiche_contact->get_by_qcode($this->ag_contact); if ($fiche_contact->id!=0) { - $spcontact->value=$fiche_contact->strAttribut(ATTR_DEF_NAME); + $spcontact->value=strtoupper($fiche_contact->strAttribut(ATTR_DEF_NAME)??""); + $spcontact->value.=" ".$fiche_contact->strAttribut(ATTR_DEF_FIRST_NAME); } From 4da519b10225570b6a91a55e6c17af1a44b7d92f Mon Sep 17 00:00:00 2001 From: sparkyx Date: Wed, 31 Jan 2024 07:39:24 +0100 Subject: [PATCH 07/26] =?UTF-8?q?Task=20#2219=20Suivi=20Cosm=C3=A9tique=20?= =?UTF-8?q?et=20PHP8.1=20Compatibility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/template/follow_up-display.php | 28 ++++++++++++++++++++----- include/template/ledger_detail_misc.php | 2 +- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/template/follow_up-display.php b/include/template/follow_up-display.php index 1c64f9fae..f3851b047 100644 --- a/include/template/follow_up-display.php +++ b/include/template/follow_up-display.php @@ -8,7 +8,7 @@ $uniq=uniqid("tab",TRUE); -
+
@@ -48,12 +48,18 @@ $uniq=uniqid("tab",TRUE); search().$w->input(); ?> + + + - - + + + + + dt_id)):?> @@ -492,8 +506,8 @@ if ( $this->ag_id > 0 && Document_Option::is_enable_operation_detail($this->dt_i - +

@@ -519,6 +533,9 @@ endif; ?> **********************************************************************************************************************/ ?>

+
-"FOLLOW", @@ -609,6 +626,7 @@ catch(exception) { alert('
+ Document créé le ag_timestamp ?> par ag_owner?> diff --git a/include/template/ledger_detail_misc.php b/include/template/ledger_detail_misc.php index c0c63d6be..0655bf92c 100644 --- a/include/template/ledger_detail_misc.php +++ b/include/template/ledger_detail_misc.php @@ -54,7 +54,7 @@ require_once NOALYSS_TEMPLATE.'/ledger_detail_top.php';
From ded3cf9a27ced1c421043d412d2ddd74a28d8ee8 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Wed, 31 Jan 2024 08:03:35 +0100 Subject: [PATCH 08/26] =?UTF-8?q?SUIVI=20:=20ajout=20pr=C3=A9nom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/fid.php | 28 +++++++++++++--------------- include/class/follow_up.class.php | 4 ++-- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/html/fid.php b/html/fid.php index 6fc1fa3eb..f7d17666a 100644 --- a/html/fid.php +++ b/html/fid.php @@ -115,7 +115,7 @@ if ( isset($_SESSION[SESSION_KEY.'isValid']) && $_SESSION[SESSION_KEY.'isValid'] $filter_card=$d; $filter_card=noalyss_str_replace('[sql]','',$d); } - $sql="select vw_name,vw_addr,vw_cp,vw_buy,vw_sell,tva_id + $sql="select vw_name,vw_first_name,vw_addr,vw_cp,vw_buy,vw_sell,tva_id from vw_fiche_attr where quick_code=upper($1)". $filter_card; @@ -141,20 +141,18 @@ if ( isset($_SESSION[SESSION_KEY.'isValid']) && $_SESSION[SESSION_KEY.'isValid'] $tva_id=($tva_id==null)?" ":noalyss_str_replace('"','',$tva_id); /* store the answer in an array and transform it later into a JSON object */ $tmp=array(); - $tmp[]=array('flabel',$fLabel); - $tmp[]=array('name',$name); - $tmp[]=array('ftva_id',$fTva_id); - $tmp[]=array('tva_id',$tva_id); - $tmp[]=array('fPrice_sale',$fPrice_sale); - $tmp[]=array('sell',$sell); - $tmp[]=array('fPrice_purchase',$fPrice_purchase); - $tmp[]=array('buy',$buy); - $a='{"answer":"ok"'; - for ($o=0;$o < count($tmp);$o++) - { - $a.=sprintf(',"%s":"%s"',$tmp[$o][0],$tmp[$o][1]); - } - $a.='}'; + //$tmp[]=array('flabel',$fLabel); + $tmp['flabel']=$fLabel; + //$tmp[]=array('name',$name); + $tmp['name']=$name." ".$array[0]['vw_first_name']; + $tmp['ftva_id']=$fTva_id; + $tmp['tva_id']=$tva_id; + $tmp['fPrice_sale']=$fPrice_sale; + $tmp['sell']=$sell; + $tmp['fPrice_purchase']=$fPrice_purchase; + $tmp['buy']=$buy; + $tmp["answer"]="ok"; + $a=json_encode($tmp); } else $a='{"answer":"unauthorized"}'; diff --git a/include/class/follow_up.class.php b/include/class/follow_up.class.php index a3559e61f..c4f260a09 100644 --- a/include/class/follow_up.class.php +++ b/include/class/follow_up.class.php @@ -333,7 +333,7 @@ class Follow_Up $tiers=new Fiche($this->db); $tiers->get_by_qcode($this->qcode_dest); $qcode_dest_label=strtoupper($tiers->strAttribut(1)); - $qcode_dest_label.=" ".$tiers->strAttribut(ATTR_DEF_FIRST_NAME); + $qcode_dest_label.=" ".$tiers->strAttribut(ATTR_DEF_FIRST_NAME,0); $this->f_id_dest=$tiers->id; } else @@ -405,7 +405,7 @@ class Follow_Up if ($fiche_contact->id!=0) { $spcontact->value=strtoupper($fiche_contact->strAttribut(ATTR_DEF_NAME)??""); - $spcontact->value.=" ".$fiche_contact->strAttribut(ATTR_DEF_FIRST_NAME); + $spcontact->value.=" ".$fiche_contact->strAttribut(ATTR_DEF_FIRST_NAME,0); } From 0219700f4490917782a8c7fae1c2580ee1ba0e79 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Wed, 31 Jan 2024 08:48:07 +0100 Subject: [PATCH 09/26] =?UTF-8?q?Task=20#2128=20:=20Comptabilit=C3=A9=20fr?= =?UTF-8?q?an=C3=A7aise=20:=20report,=20montre=20le=20solde=20de=20l'ann?= =?UTF-8?q?=C3=A9e=20et=20depuis=20le=20d=C3=A9but=20pour=20les=20fiches,?= =?UTF-8?q?=20postes=20en=20HTML=20et=20PDF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/ajax/ajax_history.php | 2 +- include/class/acc_account_ledger.class.php | 12 ++++++++++++ include/class/fiche.class.php | 14 +++++++++++++- include/export/export_fiche_detail_pdf.php | 15 ++++++++++++++- include/export/export_poste_detail_pdf.php | 15 ++++++++++++++- include/sql/patch/upgrade190.sql | 2 +- 6 files changed, 55 insertions(+), 5 deletions(-) diff --git a/include/ajax/ajax_history.php b/include/ajax/ajax_history.php index 56a736be1..51e2cdfb8 100644 --- a/include/ajax/ajax_history.php +++ b/include/ajax/ajax_history.php @@ -110,7 +110,7 @@ if ( isset($_GET['f_id'])) ob_start(); require_once NOALYSS_TEMPLATE.'/history_top.php'; - $detail_card=HtmlInput::card_detail($fiche->strAttribut(ATTR_DEF_QUICKCODE),$fiche->getName()); + $detail_card=HtmlInput::card_detail($fiche->strAttribut(ATTR_DEF_QUICKCODE),$fiche->getName()." ".$fiche->strAttribut(ATTR_DEF_FIRST_NAME,0)); echo h2( $fiche->getName().'['.$fiche->strAttribut(ATTR_DEF_QUICKCODE).']',' class="title" '); echo '

'.$detail_card.'

'; diff --git a/include/class/acc_account_ledger.class.php b/include/class/acc_account_ledger.class.php index 61d33887e..2e3aa4079 100644 --- a/include/class/acc_account_ledger.class.php +++ b/include/class/acc_account_ledger.class.php @@ -448,6 +448,7 @@ class Acc_Account_Ledger { if ( $p_array==null)$p_array=$_REQUEST; + global $g_parameter; $this->get_name(); list($array,$tot_deb,$tot_cred)=$this->get_row_date( $p_array['from_periode'], $p_array['to_periode'],$let @@ -592,6 +593,17 @@ class Acc_Account_Ledger echo "
". "". ""; + // take saldo from 1st day until last + if ($g_parameter->MY_REPORT=='N') { + $solde_until_now=$this->get_solde_detail(" j_date <= to_date('{$p_array['to_periode']}','DD.MM.YYYY') "); + echo ''; + echo td(_("Solde global")); + echo td("D : ".nbm($solde_until_now['debit']),'class="num"'); + echo td("C : ".nbm($solde_until_now['credit']),'class="num"'); + echo td("Delta : ".nbm($solde_until_now['solde'])." ".$this->get_amount_side($solde_until_now['debit']-$solde_until_now['credit']),'class="num"'); + echo ''; + + } echo ''; echo ''; diff --git a/include/class/fiche.class.php b/include/class/fiche.class.php index 62e124acb..fd1028383 100644 --- a/include/class/fiche.class.php +++ b/include/class/fiche.class.php @@ -965,6 +965,7 @@ class Fiche { if ( $p_array == null) $p_array=$_REQUEST; + global $g_parameter; $progress=0; // if from_periode is greater than to periode then swap the values if (cmpDate($p_array['from_periode'],$p_array['to_periode']) > 0) @@ -1085,7 +1086,7 @@ class Fiche $old_exercice=$op['p_exercice']; } - $solde_type=($sum_deb>$sum_cred)?_("solde débiteur"):_("solde créditeur"); + $solde_type=_("Année ").($sum_deb>$sum_cred)?_("solde débiteur"):_("solde créditeur"); $solde_side=($sum_deb>$sum_cred)?"D":"C"; $diff=abs(bcsub($sum_deb,$sum_cred)); echo ''; @@ -1109,6 +1110,17 @@ class Fiche "". "". ""; + // take saldo from 1st day until last + if ($g_parameter->MY_REPORT=='N') { + $solde_until_now=$this->get_solde_detail(" j_date <= to_date('{$p_array['to_periode']}','DD.MM.YYYY') "); + echo ''; + echo td(_("Solde global")); + echo td("D : ".nbm($solde_until_now['debit']),'class="num"'); + echo td("C : ".nbm($solde_until_now['credit']),'class="num"'); + echo td("Delta : ".nbm($solde_until_now['solde'])." ".$this->get_amount_side($solde_until_now['debit']-$solde_until_now['credit']),'class="num"'); + echo ''; + + } echo ''; echo ''; diff --git a/include/export/export_fiche_detail_pdf.php b/include/export/export_fiche_detail_pdf.php index 7034c644a..4f623caf5 100644 --- a/include/export/export_fiche_detail_pdf.php +++ b/include/export/export_fiche_detail_pdf.php @@ -28,7 +28,7 @@ include_once("lib/ac_common.php"); include_once("lib/impress.class.php"); require_once NOALYSS_INCLUDE.'/header_print.php'; $http=new HttpInput(); - +global $g_parameter; $f_id=$http->request("f_id", "number"); $from_periode=$http->get("from_periode","date"); $to_periode=$http->get("to_periode","date"); @@ -229,6 +229,19 @@ $pdf->write_cell(160,5,'Solde '.$solde,0,0,'R'); $pdf->write_cell(30,5,$str_diff_solde,0,0,'R'); $pdf->line_new(); +// take saldo from 1st day until last +if ($g_parameter->MY_REPORT=='N') { + + $solde_until_now=$Fiche->get_solde_detail(" j_date <= to_date('$to_periode','DD.MM.YYYY') "); + + $pdf->write_cell(40,5,"Solde global",0,0,'R'); + $pdf->write_cell(40,5,"D : ".nbm($solde_until_now['debit']),0,0,'R'); + $pdf->write_cell(40,5,"C : ".nbm($solde_until_now['credit']),0,0,'R'); + $pdf->write_cell(40,5,"Delta : ".nbm($solde_until_now['solde'])." ".$Fiche->get_amount_side($solde_until_now['debit']-$solde_until_now['credit']),0,0,'R'); + $pdf->line_new(); + +} + $fDate=date('dmy-Hi'); $pdf->Output('fiche-'.$fDate.'.pdf','D'); diff --git a/include/export/export_poste_detail_pdf.php b/include/export/export_poste_detail_pdf.php index 8559aa45e..cda145a4a 100644 --- a/include/export/export_poste_detail_pdf.php +++ b/include/export/export_poste_detail_pdf.php @@ -25,6 +25,8 @@ if ( ! defined ('ALLOWED') ) die('Appel direct ne sont pas permis'); require_once NOALYSS_INCLUDE.'/lib/ac_common.php'; require_once NOALYSS_INCLUDE.'/header_print.php'; +global $g_parameter; + $http=new HttpInput(); $poste_id=$http->request("poste_id"); @@ -32,7 +34,6 @@ $from_periode=$http->request("from_periode"); $to_periode=$http->request("to_periode"); $ople=$http->request("ople"); $poste_fille=$http->request("poste_fille","string",-1); - $gDossier=dossier::id(); /* Security */ @@ -247,6 +248,18 @@ foreach ($a_poste as $poste) $pdf->write_cell(30,5,$str_diff_solde,0,0,'R'); $pdf->line_new(); + // take saldo from 1st day until last + if ($g_parameter->MY_REPORT=='N') { + + $solde_until_now=$Poste->get_solde_detail(" j_date <= to_date('$to_periode','DD.MM.YYYY') "); + + $pdf->write_cell(40,5,"Solde global",0,0,'R'); + $pdf->write_cell(40,5,"D : ".nbm($solde_until_now['debit']),0,0,'R'); + $pdf->write_cell(40,5,"C : ".nbm($solde_until_now['credit']),0,0,'R'); + $pdf->write_cell(40,5,"Delta : ".nbm($solde_until_now['solde'])." ".$Poste->get_amount_side($solde_until_now['debit']-$solde_until_now['credit']),0,0,'R'); + $pdf->line_new(); + + } } $fDate=date('dmy-Hi'); $pdf->Output('poste-'.$fDate.'-'.$poste_id.'.pdf','D'); diff --git a/include/sql/patch/upgrade190.sql b/include/sql/patch/upgrade190.sql index e58122b77..8ef59c4e1 100644 --- a/include/sql/patch/upgrade190.sql +++ b/include/sql/patch/upgrade190.sql @@ -35,7 +35,7 @@ create trigger fiche_detail_check_qcode_trg before insert update fiche_detail set ad_value=ad_value where ad_id in (select ad_id from attr_def where ad_type='card'); -insert into parameter values ('MY_REPORT','N') ON CONFLICT DO NOTHING; +insert into parameter values ('MY_REPORT','Y') ON CONFLICT DO NOTHING; update menu_ref set me_file='payment_method.inc.php' where me_code='CFGPAY'; From 86048860341801f88d708dc22aa87232cae9b8a8 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Fri, 2 Feb 2024 16:11:18 +0100 Subject: [PATCH 10/26] =?UTF-8?q?Task=20#2321:=20S=C3=A9curit=C3=A9=20:=20?= =?UTF-8?q?emp=C3=AAcher=20changement=20de=20num=C3=A9ro=20de=20pi=C3=A8ce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/ajax/ajax_ledger.php | 797 +++++++++----------- include/class/acc_ledger.class.php | 50 +- include/class/acc_ledger_purchase.class.php | 29 +- include/class/acc_ledger_sale.class.php | 23 +- include/company.inc.php | 12 +- include/constant.security.php | 1 + include/template/ledger_detail_ach.php | 2 + include/template/ledger_detail_misc.php | 3 + include/template/ledger_detail_ven.php | 2 + sql/upgrade.sql | 2 + 10 files changed, 467 insertions(+), 454 deletions(-) diff --git a/include/ajax/ajax_ledger.php b/include/ajax/ajax_ledger.php index 5a636d361..001ef0ac0 100644 --- a/include/ajax/ajax_ledger.php +++ b/include/ajax/ajax_ledger.php @@ -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 << @@ -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 << @@ -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 << @@ -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 '

'._("Désolé il y a une erreur").'

'; - } - $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 '

' . _("Désolé il y a une erreur") . '

'; + } + $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 '
'; - }else { + } else { echo "
"; - } - if ( $access=='W') - { - $check_receipt=sprintf("check_receipt_size('%s','file%s')", - MAX_FILE_SIZE,$div); - echo '
'; + } + if ($access == 'W') { + $check_receipt = sprintf("check_receipt_size('%s','file%s')", + MAX_FILE_SIZE, $div); + echo ''; - $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 ''; + $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 ''; - echo '

'; + echo '

'; - echo ''; - } - else - { - if (!isset($_REQUEST['ajax'])) - { + echo ''; + } else { + if (!isset($_REQUEST['ajax'])) { echo '
'; - } - else - { + } else { echo "
"; - } - + } - echo _('Aucun fichier'); - } - echo '
'; - exit(); - } - else - { - // There is no document attached to this writing - // - if ( ! isset($_REQUEST['ajax']) ) { + + echo _('Aucun fichier'); + } + echo '
'; + exit(); + } else { + // There is no document attached to this writing + // + if (!isset($_REQUEST['ajax'])) { echo '
'; - }else { + } else { echo "
"; - } - echo '
'; - $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 '
'; + $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 '

'; + echo '
'; + echo ''; + exit(); } - echo HtmlInput::show_receipt_document($jr_id,h($filename)); - echo $x; - echo '

'; - echo '
'; - echo ''; - 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 ""; else echo ""; - echo '
'; - $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 ""; else echo ""; + echo '
'; + $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 '
'; - echo ''; - } - exit(); + echo '
'; + echo ''; + } + 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 '
'; - $check_receipt=sprintf("check_receipt_size('%s','file%s')", - MAX_FILE_SIZE,$div); - echo '
'; - $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 '
'; + $check_receipt = sprintf("check_receipt_size('%s','file%s')", + MAX_FILE_SIZE, $div); + echo ''; + $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 ''; - echo '

'; - echo ''; - $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 ''; + echo '

'; + echo ''; + $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 '
'; - exit(); + echo '
'; + 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;$eexec_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.="
"; - $html.=HtmlInput::hidden('jr_id',$_REQUEST['jr_id']). - HtmlInput::hidden('div',$div). - dossier::hidden(). - HtmlInput::hidden('act','reverseop'); - - $html.='

'._('entrez une date').'

'.$date->input(); - $html.=HtmlInput::submit('x','accepter'); - $html.=HtmlInput::button_close($div); - $html.=''; - break; + case 'ask_extdate': + $date = new IDate('p_date'); + $html .= "
"; + $html .= HtmlInput::hidden('jr_id', $_REQUEST['jr_id']) . + HtmlInput::hidden('div', $div) . + dossier::hidden() . + HtmlInput::hidden('act', 'reverseop'); + + $html .= '

' . _('entrez une date') . '

' . $date->input(); + $html .= HtmlInput::submit('x', 'accepter'); + $html .= HtmlInput::button_close($div); + $html .= ''; + 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 << $div diff --git a/include/class/acc_ledger.class.php b/include/class/acc_ledger.class.php index dd6b85c2a..9f773de79 100644 --- a/include/class/acc_ledger.class.php +++ b/include/class/acc_ledger.class.php @@ -656,7 +656,13 @@ class Acc_Ledger extends jrn_def_sql $ret.="
"; - $ret.=""; + $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.=""; $ret.='
+ input()?> +
+ + can_write_action($this->ag_id) == true ): if ( $ag_contact->extra != "" ): @@ -65,7 +71,15 @@ $uniq=uniqid("tab",TRUE); ?>
+ input(); + ?> +
value=strip_tags($obj->det->jr_pj_number); + $itext->value=strip_tags($obj->det->jr_pj_number??""); echo td(_('Pièce')).td($itext->input()); ?>
$solde_type".nbm(abs($diff))."
".nbm($diff)."
"; $ret.=_('Note').'
'. h($p_array['jrn_note_input']).'
'; $ret.="
"._('PJ Num')." ".h($e_pj)."
"._('PJ Num')." ".h($e_pj).$span."
'; $ret.=""; $ret.=""; @@ -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.=''; $ret.=''; $ret.=' '; @@ -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"'); + } + } } ?> diff --git a/include/class/acc_ledger_purchase.class.php b/include/class/acc_ledger_purchase.class.php index 6f32d645c..9722f4ee7 100644 --- a/include/class/acc_ledger_purchase.class.php +++ b/include/class/acc_ledger_purchase.class.php @@ -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.=''; } @@ -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.=""; } $r.=''; + + $span=$this->warn_manual_receipt($p_array); if ( ! $p_summary) { - $r.=''; + $r.=''; } 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.=''; } else { - $r.=''; + $r.=''; } } $r.=''; diff --git a/include/class/acc_ledger_sale.class.php b/include/class/acc_ledger_sale.class.php index 69da7c3aa..bfee92fa6 100644 --- a/include/class/acc_ledger_sale.class.php +++ b/include/class/acc_ledger_sale.class.php @@ -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.=""; } $r.=''; + $span=$this->warn_manual_receipt($p_array); if ( ! $p_summary) { - $r.=''; + $r.=''; } 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.=''; } else { - $r.=''; + $r.=''; } } $r.=''; @@ -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"; diff --git a/include/company.inc.php b/include/company.inc.php index e8ce0b45f..da840f17c 100644 --- a/include/company.inc.php +++ b/include/company.inc.php @@ -259,7 +259,7 @@ $all->style=' class="input_text"';
+ input() ?>
@@ -298,13 +298,15 @@ echo Icon_Action::tips($anc_filter->title);
-
- -
+
input("p_date_suggest", $strict_array) ?>
diff --git a/include/constant.security.php b/include/constant.security.php index fa8d3ef3d..b8a307e01 100644 --- a/include/constant.security.php +++ b/include/constant.security.php @@ -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 diff --git a/include/template/ledger_detail_ach.php b/include/template/ledger_detail_ach.php index 6285e910d..f10c09a3c 100644 --- a/include/template/ledger_detail_ach.php +++ b/include/template/ledger_detail_ach.php @@ -59,6 +59,8 @@ global $div,$g_parameter,$cn,$access,$jr_id,$obj;
diff --git a/sql/upgrade.sql b/sql/upgrade.sql index 8b1378917..517ad5398 100644 --- a/sql/upgrade.sql +++ b/sql/upgrade.sql @@ -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'); + From af9e4c330a613d7d97a5626e3c7bf3c629ab73b8 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sat, 3 Feb 2024 10:48:16 +0100 Subject: [PATCH 11/26] Filtre ne fonctionne pas tva_search_id est vide --- include/ajax/ajax_search_filter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/ajax/ajax_search_filter.php b/include/ajax/ajax_search_filter.php index 7020e9bae..7301c4ba3 100644 --- a/include/ajax/ajax_search_filter.php +++ b/include/ajax/ajax_search_filter.php @@ -61,7 +61,7 @@ if ($op=='save_filter') $new->setp("operation_filter", $http->post("operation_filter", 'string', NULL)); $new->setp("filter_name", h($http->post("filter_name", 'string'))); $new->setp("uf_currency_code", h($http->post("p_currency_code", 'number',-1))); - $new->setp("tva_id_search", h($http->post("tva_id_search", 'number',null))); + $new->setp("tva_id_search", h($http->post("tva_id_search", 'string',null))); $tag=$http->post("tag","string",''); if (is_array($tag) ) From fc23fb16715f9d0e6fc10168983fbb97ffa37c60 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sat, 3 Feb 2024 11:08:16 +0100 Subject: [PATCH 12/26] =?UTF-8?q?S=C3=A9curit=C3=A9=20:=20bloquer=20le=20c?= =?UTF-8?q?hangement=20de=20date=20des=20op=C3=A9rations,=20Renforce=20mod?= =?UTF-8?q?e=20strict=20:=20change=20de=20date=20impossible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/ajax/ajax_ledger.php | 15 ++++++++++----- include/constant.security.php | 1 + include/template/ledger_detail_ach.php | 3 +++ include/template/ledger_detail_fin.php | 4 ++++ include/template/ledger_detail_misc.php | 3 +++ include/template/ledger_detail_ven.php | 5 ++++- sql/upgrade.sql | 3 +++ 7 files changed, 28 insertions(+), 6 deletions(-) diff --git a/include/ajax/ajax_ledger.php b/include/ajax/ajax_ledger.php index 001ef0ac0..f866c664d 100644 --- a/include/ajax/ajax_ledger.php +++ b/include/ajax/ajax_ledger.php @@ -132,7 +132,7 @@ switch ($action) { // remove op /////////////////////////////////////////////////////////////////////////// case 'rmop': - if ($access == 'W' && $g_user->check_action(RMOPER) == 1) { + if ($access == 'W' && $g_user->check_action(RMOPER) == 1 && $g_parameter->MY_STRICT=='N') { ob_start(); /* get the ledger */ try { @@ -345,7 +345,7 @@ switch ($action) { $http = new HttpInput(); try { $cn->start(); - if ($access == "W") { + if ($access == "W" ) { if (isset($_POST['p_ech'])) { $ech = $http->post('p_ech'); if (trim($ech) != '' && isDate($ech) != null) { @@ -372,15 +372,20 @@ switch ($action) { } } $oLedger=new Acc_Ledger($cn,$ledger); - $npj=$http->post('npj'); + $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]); } + // protect date in strict mode + $date=$http->post("p_date"); + if ( $g_parameter->MY_STRICT=='Y' && $g_user->check_action(UPDDATE)==0) { + $date=$cn->get_value("select to_char(jr_date,'DD.MM.YYYY') 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'))); + array($http->post('lib'), $npj, $jr_id,$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)); + array($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 diff --git a/include/constant.security.php b/include/constant.security.php index b8a307e01..a6de1d91c 100644 --- a/include/constant.security.php +++ b/include/constant.security.php @@ -28,6 +28,7 @@ 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 ('UPDDATE',1140); // change date operation define ('SHARENOTE',1210); // Can share a note define ('SHARENOTEPUBLIC',1220); // Can create public note define ('SHARENOTEREMOVE',1230); // Can drop drop of other diff --git a/include/template/ledger_detail_ach.php b/include/template/ledger_detail_ach.php index f10c09a3c..aadb8e91d 100644 --- a/include/template/ledger_detail_ach.php +++ b/include/template/ledger_detail_ach.php @@ -21,6 +21,9 @@ global $div,$g_parameter,$cn,$access,$jr_id,$obj; value = format_date($obj->det->jr_date); + if ( $g_parameter->MY_STRICT=='Y' && $g_user->check_action(UPDDATE)==0) { + $date->setReadOnly(true); + } echo td(_('Date')) . td($date->input()); ?> diff --git a/include/template/ledger_detail_fin.php b/include/template/ledger_detail_fin.php index 215d8cfc9..b6e944784 100644 --- a/include/template/ledger_detail_fin.php +++ b/include/template/ledger_detail_fin.php @@ -2,6 +2,7 @@ //This file is part of NOALYSS and is under GPL //see licence.txt $str_anc=""; +global $g_parameter,$g_user; ?>
MY_STRICT=='Y' && $g_user->check_action(UPDDATE)==0) { + $date->setReadOnly(true); +} $date->value=format_date($obj->det->jr_date); echo td(_('Date')).td($date->input()); diff --git a/include/template/ledger_detail_misc.php b/include/template/ledger_detail_misc.php index bbd7df138..57fe1f5e9 100644 --- a/include/template/ledger_detail_misc.php +++ b/include/template/ledger_detail_misc.php @@ -27,6 +27,9 @@ $owner = new Noalyss_Parameter_Folder($cn);
MY_STRICT=='Y' && $g_user->check_action(UPDDATE)==0) { + $date->setReadOnly(true); + } $date->value = format_date($obj->det->jr_date); echo td(_('Date')) . td($date->input()); ?> diff --git a/sql/upgrade.sql b/sql/upgrade.sql index 517ad5398..c89bc475c 100644 --- a/sql/upgrade.sql +++ b/sql/upgrade.sql @@ -1,3 +1,6 @@ insert into action (ac_id,ac_description,ac_module,ac_code) values (1130,'Modifier le numéro de pièce','compta','UPDRECEIPT'); +insert into action (ac_id,ac_description,ac_module,ac_code) values (1140,'Modifier la date d''une operation' ,'compta','UPDDATE'); +insert into user_sec_act(ua_login,ua_act_id) select distinct ua_login,1130 from user_sec_act; +insert into user_sec_act(ua_login,ua_act_id) select distinct ua_login,1140 from user_sec_act; From 057c2e6acc457242c1b53e99f1257717421a17b1 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sat, 3 Feb 2024 14:16:14 +0100 Subject: [PATCH 13/26] =?UTF-8?q?Task=20#02326:=20Suivi=20:=20possibilit?= =?UTF-8?q?=C3=A9=20de=20charger=20plusieurs=20documents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/class/document.class.php | 7 +++++-- include/class/follow_up.class.php | 3 ++- include/template/follow_up-display.php | 21 ++++++++++++++++++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/include/class/document.class.php b/include/class/document.class.php index 6a6881d25..82b0b8055 100644 --- a/include/class/document.class.php +++ b/include/class/document.class.php @@ -451,7 +451,6 @@ class Document * all the needed data are in $_FILES we don't increment the seq * $_FILES : array containing by default $_FILES * @param int $p_ag_id ACTION_GESTION.AG_ID - * @param int $agc_id ACTION_GESTION_COMMENT.AGC_ID * @returns array of int DOCUMENT.D_ID (id of saved documents ) * */ @@ -498,8 +497,12 @@ class Document // insert into the table $sql="insert into document (ag_id, d_lob,d_filename,d_mimetype,d_number,d_description)" . " values ($1,$2,$3,$4,$5,$6) returning d_id"; - $document_saved[]=$this->db->get_value($sql, + $document_id=$this->db->get_value($sql, array($p_ag_id, $this->d_lob, $this->d_filename, $this->d_mimetype, 1, $this->d_description)); + + + $document_saved[]=$document_id; + } } /* end for */ $this->db->commit(); diff --git a/include/class/follow_up.class.php b/include/class/follow_up.class.php index c4f260a09..8a3b426aa 100644 --- a/include/class/follow_up.class.php +++ b/include/class/follow_up.class.php @@ -995,7 +995,8 @@ class Follow_Up where agc_id = $4 " , array(strip_tags($this->ag_description), $this->ag_description, $_SESSION[SESSION_KEY.'g_user'], $this->ag_description_id)); - + $this->db->exec_sql("insert into action_comment_document(document_id,action_gestion_comment_id) values ($1,$2)", + [$document_id,$this->ag_description_id]); } $this->insert_operation(); $this->insert_action(); diff --git a/include/template/follow_up-display.php b/include/template/follow_up-display.php index f3851b047..e9156d542 100644 --- a/include/template/follow_up-display.php +++ b/include/template/follow_up-display.php @@ -3,6 +3,7 @@ //This file is part of NOALYSS and is under GPL //see licence.txt $uniq=uniqid("tab",TRUE); +$dossier_id=Dossier::id(); ?>
input(); echo '
'; } + // link to files to download + $aFile=$this->db->get_array('select d_id,d_filename,d_description,d_mimetype + from action_comment_document + join document on (d_id=document_id) where action_gestion_comment_id=$1' + , array($this->ag_id)); + if ( ! empty ($aFile)) { + echo '
'; + echo _("Fichiers :"); + foreach ($aFile as $file) + { + $url="export.php?".http_build_query(array("act"=>'RAW:document' + ,"gDossier"=>$dossier_id + ,"d_id"=>$file["d_id"])); + printf('%s', + $url,h($file['d_filename'])); + } + echo '
'; + } //---------------------------------- Comment ----------------------------------------------------------------------- @@ -391,7 +410,7 @@ function small(p_id_textarea){ echo ''; } } - $dossier_id=Dossier::id(); + if ( count($acomment) > 0 && Document_Option::can_add_comment($ag_id) && Document_Option::option_comment($this->dt_id) == "SOME_FIXED") From 5d783369c48404547a4d172275bae76a7938ec6c Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sat, 3 Feb 2024 14:20:46 +0100 Subject: [PATCH 14/26] =?UTF-8?q?FOLLOWUP=20:=20Cosmetic=20=20nombre=20pi?= =?UTF-8?q?=C3=A8ces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/template/follow_up-display.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/template/follow_up-display.php b/include/template/follow_up-display.php index e9156d542..903d39dfa 100644 --- a/include/template/follow_up-display.php +++ b/include/template/follow_up-display.php @@ -529,7 +529,10 @@ if ( $this->ag_id > 0 && Document_Option::is_enable_operation_detail($this->dt_i

- +

Date: Sat, 3 Feb 2024 15:30:05 +0100 Subject: [PATCH 15/26] integre changement SQL --- include/class/acc_ledger.class.php | 2 +- include/constant.php | 2 +- include/sql/patch/upgrade193.sql | 11 +++++++++++ sql/upgrade.sql | 6 ------ 4 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 include/sql/patch/upgrade193.sql diff --git a/include/class/acc_ledger.class.php b/include/class/acc_ledger.class.php index 9f773de79..1ee0c9ab0 100644 --- a/include/class/acc_ledger.class.php +++ b/include/class/acc_ledger.class.php @@ -617,7 +617,7 @@ class Acc_Ledger extends jrn_def_sql */ function confirm($p_array, $p_readonly=false) { - global $g_parameter; + global $g_parameter,$g_user; $http=new HttpInput(); $msg=array(); if (!$p_readonly) diff --git a/include/constant.php b/include/constant.php index 375b47214..ed6d1201b 100644 --- a/include/constant.php +++ b/include/constant.php @@ -123,7 +123,7 @@ if (!defined("NOALYSS_PACKAGE_REPOSITORY")) { if (!defined("SYSINFO_DISPLAY")) { define("SYSINFO_DISPLAY", TRUE); } -define("DBVERSION", 193); +define("DBVERSION", 194); define("MONO_DATABASE", 25); define("DBVERSIONREPO", 20); define('NOTFOUND', '--not found--'); diff --git a/include/sql/patch/upgrade193.sql b/include/sql/patch/upgrade193.sql new file mode 100644 index 000000000..675c596c1 --- /dev/null +++ b/include/sql/patch/upgrade193.sql @@ -0,0 +1,11 @@ +begin; + +insert into action (ac_id,ac_description,ac_module,ac_code) values (1130,'Modifier le numéro de pièce','compta','UPDRECEIPT') on conflict do nothing; +insert into action (ac_id,ac_description,ac_module,ac_code) values (1140,'Modifier la date d''une operation' ,'compta','UPDDATE') on conflict do nothing; + +insert into user_sec_act(ua_login,ua_act_id) select distinct ua_login,1130 from user_sec_act; +insert into user_sec_act(ua_login,ua_act_id) select distinct ua_login,1140 from user_sec_act; + + +insert into version (val,v_description) values (194,'Renforcement sécurité'); +commit; \ No newline at end of file diff --git a/sql/upgrade.sql b/sql/upgrade.sql index c89bc475c..e69de29bb 100644 --- a/sql/upgrade.sql +++ b/sql/upgrade.sql @@ -1,6 +0,0 @@ - -insert into action (ac_id,ac_description,ac_module,ac_code) values (1130,'Modifier le numéro de pièce','compta','UPDRECEIPT'); -insert into action (ac_id,ac_description,ac_module,ac_code) values (1140,'Modifier la date d''une operation' ,'compta','UPDDATE'); - -insert into user_sec_act(ua_login,ua_act_id) select distinct ua_login,1130 from user_sec_act; -insert into user_sec_act(ua_login,ua_act_id) select distinct ua_login,1140 from user_sec_act; From b1f96914d81fbd2d26f4c4a92a42d7f8253d408d Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sat, 3 Feb 2024 16:13:09 +0100 Subject: [PATCH 16/26] bug follow-up --- include/class/follow_up.class.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/include/class/follow_up.class.php b/include/class/follow_up.class.php index 8a3b426aa..f39b3c218 100644 --- a/include/class/follow_up.class.php +++ b/include/class/follow_up.class.php @@ -995,8 +995,12 @@ class Follow_Up where agc_id = $4 " , array(strip_tags($this->ag_description), $this->ag_description, $_SESSION[SESSION_KEY.'g_user'], $this->ag_description_id)); - $this->db->exec_sql("insert into action_comment_document(document_id,action_gestion_comment_id) values ($1,$2)", - [$document_id,$this->ag_description_id]); + if ( ! empty ($document_saved)) { + foreach ($document_saved as $document_id) { + $this->db->exec_sql("insert into action_comment_document(document_id,action_gestion_comment_id) values ($1,$2)", + [$document_id,$this->ag_id]); + } + } } $this->insert_operation(); $this->insert_action(); From e2cc2f37e70f17cc2a7fa7ee58ef4a9c1015c8a5 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sun, 4 Feb 2024 11:31:22 +0100 Subject: [PATCH 17/26] =?UTF-8?q?Follow-Up=20:=20bug=20ne=20peut=20pas=20a?= =?UTF-8?q?jouter=20fichier=20sur=20nouvel=20=C3=A9v=C3=A9nement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/template/follow_up-display.php | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/include/template/follow_up-display.php b/include/template/follow_up-display.php index 903d39dfa..f54f66509 100644 --- a/include/template/follow_up-display.php +++ b/include/template/follow_up-display.php @@ -523,6 +523,22 @@ if ( $this->ag_id > 0 && Document_Option::is_enable_operation_detail($this->dt_i "> +
@@ -630,22 +646,6 @@ endfor; endif;?>
- From 0387a0282a1829ebf55f543164ecf804b6dc85c5 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sun, 4 Feb 2024 11:45:56 +0100 Subject: [PATCH 18/26] =?UTF-8?q?FOLLOWUP=20:=20nom=20contact=20pas=20affi?= =?UTF-8?q?ch=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/class/follow_up.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/class/follow_up.class.php b/include/class/follow_up.class.php index f39b3c218..ecdfeb88f 100644 --- a/include/class/follow_up.class.php +++ b/include/class/follow_up.class.php @@ -400,8 +400,8 @@ class Follow_Up $spcontact=new ISpan(); $spcontact->name='ag_contact_label'; $spcontact->value=''; - $fiche_contact=new Fiche($this->db); - $fiche_contact->get_by_qcode($this->ag_contact); + $fiche_contact=new Fiche($this->db,$this->ag_contact); + if ($fiche_contact->id!=0) { $spcontact->value=strtoupper($fiche_contact->strAttribut(ATTR_DEF_NAME)??""); From 9e5079ad4d62b8ce485996b9afbc0aece0a524e0 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Fri, 9 Feb 2024 20:03:53 +0100 Subject: [PATCH 19/26] Fix cosmetic bug : duplicate operation with autoreverse VAT has an VAT amount --- include/class/acc_operation.class.php | 31 ++- .../include/class/acc_operation.Test.php | 129 --------- unit-test/include/class/acc_operationTest.php | 258 ++++++++++++++++++ 3 files changed, 282 insertions(+), 136 deletions(-) delete mode 100644 unit-test/include/class/acc_operation.Test.php create mode 100644 unit-test/include/class/acc_operationTest.php diff --git a/include/class/acc_operation.class.php b/include/class/acc_operation.class.php index 56f22bf89..73c3d1a1c 100644 --- a/include/class/acc_operation.class.php +++ b/include/class/acc_operation.class.php @@ -869,13 +869,14 @@ EOF; return $type_operation; } /** - * create a form to recreate the operation and returns it, just like a correct - * + * @brief create a form to recreate the operation and returns it, just like a correct + * @param $p_id string DOMID of the form */ function form_clone_operation($p_id) { // retrieve all info about operation $operation = $this->get_quant(); $array=$operation->compute_array(); + global $g_user; $a_code=$this->db->get_array("select code from v_menu_dependency vmd where me_code=$1 and p_id=$2", array( $operation->signature,$g_user->get_profile())); @@ -918,14 +919,30 @@ EOF; // For Misc Operation , if a card is given then there is no accounting if ( $operation->signature==="ODS") { - $nb_array=count($array); - for ($i=0;$i<$nb_array;$i++) { - if (isset ($array["qc_".$i] ) && $array["qc_".$i] != "" ) { - $array["poste".$i]=""; + $nb_array = count($array); + for ($i = 0; $i < $nb_array; $i++) { + if (isset ($array["qc_" . $i]) && $array["qc_" . $i] != "") { + $array["poste" . $i] = ""; } } } - + + if ( $operation->signature==="ACH" || $operation->signature=="VEN") { + $idx=0; + foreach ($operation->det->array as $item) { + if ( isset ($item['qs_vat_sided']) && $item['qs_vat_sided'] != 0 ) { + $array['e_march'.$idx.'_tva_amount']=0; + }elseif (isset ($item['qp_vat_sided']) && $item['qp_vat_sided'] != 0 ){ + $array['e_march'.$idx.'_tva_amount']=0; + } + $idx++; + } + if ( DEBUGNOALYSS>1) { + echo \Noalyss\Dbg::hidden_info("operation->det_array", $operation->det->array); + echo \Noalyss\Dbg::hidden_info("array", $array); + } + } + // transform the operation into hidden element $r.=HtmlInput::simple_array_to_hidden($array); $r.=HtmlInput::hidden("e_comm",$operation->det->jr_comment); diff --git a/unit-test/include/class/acc_operation.Test.php b/unit-test/include/class/acc_operation.Test.php deleted file mode 100644 index a03d9af84..000000000 --- a/unit-test/include/class/acc_operation.Test.php +++ /dev/null @@ -1,129 +0,0 @@ -object = new Acc_Operation($g_connection); - - - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown():void - { - } - - /** - *@covers Acc_Operation::seek_group - */ - public function testSeek_group() - { - $this->object->jr_id=6; - $r=$this->object->seek_group(); - $this->assertEquals(8,$r); - } - /** - * @covers Acc_Operation::set_id - * - */ - public function testSet_id() - { - $this->object->set_id(1000); - $this->assertEquals(1000,$this->object->jr_id); - try { - $this->object->set_id('AB'); - } catch (Exception $e) { - $this->assertEquals($e->getMessage(),'Acc_Operation::set_id , id invalide '); - } - } - /** - * @covers Acc_Operation::set_paid - */ - function testSet_Paid() - { - $row=$this->object->db->get_array('select * from jrn where jr_rapt <> $1 limit 1',array('paid')); - if ( ! $row ) { - echo "Aucune ligne trouvée"; - $this->assertTrue(TRUE); - } else { - $this->object->jr_id=$row[0]['jr_id']; - $this->object->set_paid(); - $status=$this->object->db->get_value ('select jr_rapt from jrn where jr_id=$1',array($row[0]['jr_id'])); - $this->assertEquals($status,'paid'); - } - - } - /** - * @covers Acc_Operation::get_amount - */ - function testGet_Amount() - { - $row=$this->object->db->get_array('select * from jrn limit 1'); - if ( ! $row ) { - echo "Aucune ligne trouvée"; - $this->assertTrue(FALSE); - } else { - $this->object->jr_id=$row[0]['jr_id']; - $amount=$this->object->get_amount(); - $this->assertEquals($amount,$row[0]['jr_montant']); - } - - } - /** - * provide data for testAmount_Currency - * @return type - */ - public function data_amount_currency() - { - return array( - /* sale */ - array(659,146.95), - array(657,146.95), - array(649,0), - /* purchase*/ - array(680,680.33), - array(683,834.91), - array(526,0), - /* financial */ - array(658,146.95), - array(684,200), - array(685,300), - /* misc operation */ - array(686,25.25), - - ); - } - /** - * @testdox acc_operation::get_amount_currency - sale-purchase-fin-misc - * @covers Acc_Operation::get_amount_currency - * @dataProvider data_amount_currency - */ - function testGet_AmountCurrency($p_jrn_id,$p_amount_currency) - { - global $g_connection; - $acc_operation=new Acc_Detail($g_connection,$p_jrn_id); - $acc_operation->get(); - $acc_operation->get_quant(); - $actual_amount=round($acc_operation->get_currency_amount(),2); - $this->assertEquals($p_amount_currency,$actual_amount,"currency values doesn't match for $p_jrn_id"); - } -} diff --git a/unit-test/include/class/acc_operationTest.php b/unit-test/include/class/acc_operationTest.php new file mode 100644 index 000000000..0d9c5dfb0 --- /dev/null +++ b/unit-test/include/class/acc_operationTest.php @@ -0,0 +1,258 @@ +object = new Acc_Operation($g_connection); + + + } + + /** + * Tears down the fixture, for example, closes a network connection. + * This method is called after a test is executed. + */ + protected function tearDown():void + { + } + + /** + *@covers Acc_Operation::seek_group + */ + public function testSeek_group() + { + $this->object->jr_id=6; + $r=$this->object->seek_group(); + $this->assertEquals(8,$r); + } + /** + * @covers Acc_Operation::set_id + * + */ + public function testSet_id() + { + $this->object->set_id(1000); + $this->assertEquals(1000,$this->object->jr_id); + try { + $this->object->set_id('AB'); + } catch (Exception $e) { + $this->assertEquals($e->getMessage(),'Acc_Operation::set_id , id invalide '); + } + } + /** + * @covers Acc_Operation::set_paid + */ + function testSet_Paid() + { + $row=$this->object->db->get_array('select * from jrn where jr_rapt <> $1 limit 1',array('paid')); + if ( ! $row ) { + echo "Aucune ligne trouvée"; + $this->assertTrue(TRUE); + } else { + $this->object->jr_id=$row[0]['jr_id']; + $this->object->set_paid(); + $status=$this->object->db->get_value ('select jr_rapt from jrn where jr_id=$1',array($row[0]['jr_id'])); + $this->assertEquals($status,'paid'); + } + + } + /** + * @covers Acc_Operation::get_amount + */ + function testGet_Amount() + { + $row=$this->object->db->get_array('select * from jrn limit 1'); + if ( ! $row ) { + echo "Aucune ligne trouvée"; + $this->assertTrue(FALSE); + } else { + $this->object->jr_id=$row[0]['jr_id']; + $amount=$this->object->get_amount(); + $this->assertEquals($amount,$row[0]['jr_montant']); + } + + } + /** + * provide data for testAmount_Currency + * @return type + */ + public function data_amount_currency() + { + return array( + /* sale */ + array(659,146.95), + array(657,146.95), + array(649,0), + /* purchase*/ + array(680,680.33), + array(683,834.91), + array(526,0), + /* financial */ + array(658,146.95), + array(684,200), + array(685,300), + /* misc operation */ + array(686,25.25), + + ); + } + /** + * @testdox acc_operation::get_amount_currency - sale-purchase-fin-misc + * @covers Acc_Operation::get_amount_currency + * @dataProvider data_amount_currency + */ + function testGet_AmountCurrency($p_jrn_id,$p_amount_currency) + { + global $g_connection; + $acc_operation=new Acc_Detail($g_connection,$p_jrn_id); + $acc_operation->get(); + $acc_operation->get_quant(); + $actual_amount=round($acc_operation->get_currency_amount(),2); + $this->assertEquals($p_amount_currency,$actual_amount,"currency values doesn't match for $p_jrn_id"); + } + + /** + * @testDox Test form_clone_operation SALE + * @return void + */ + function testForm_clone_operation_sale() + { + global $g_connection; + // use jr_id=160 : 5 rows + $duplicate = new Acc_Operation($g_connection); + $duplicate->jr_id=160; + ob_start(); + + $result=$duplicate->form_clone_operation("test"); + ob_end_clean(); + + $this->assertTrue(stripos($result,'')>0, "sale : HTML doesn't contain nb_item = 5"); + // use jr_id=910 : 1 rows + $duplicate = new Acc_Operation($g_connection); + $duplicate->jr_id=910; + ob_start(); + $result=$duplicate->form_clone_operation("test"); + ob_end_clean(); + $this->assertStringContainsString(strtoupper(''), strtoupper($result)); + $this->assertStringContainsString( + strtoupper('') + ,strtoupper($result)); + + // use jr_id=659 VAT_SIDED + $duplicate = new Acc_Operation($g_connection); + $duplicate->jr_id=659; + ob_start(); + $result=$duplicate->form_clone_operation("test"); + ob_end_clean(); + $this->assertStringContainsString( + strtoupper('') + , strtoupper($result)); + $this->assertStringContainsString( + strtoupper('') + , strtoupper($result)); + $this->assertStringContainsString( + strtoupper( '') + , strtoupper($result)); + + } + + /** + * @testDox Test form_clone_operation PURCHASE + * @return void + */ + function testForm_clone_operation_purchase() + { global $g_connection; + // use jr_id 158 4 rows + $duplicate = new Acc_Operation($g_connection); + $duplicate->jr_id=158; + ob_start(); + + $result=$duplicate->form_clone_operation("test"); + ob_end_clean(); + + $this->assertTrue(stripos($result,'')>0 + , "purchase : HTML doesn't contain nb_item = 4 $result"); + + $this->assertStringContainsString( + strtoupper('') + ,strtoupper($result)); + + $this->assertStringContainsString( + strtoupper('') + ,strtoupper($result)); + + // use jr_id 680 VAT_SIDED + $duplicate = new Acc_Operation($g_connection); + $duplicate->jr_id=680; + ob_start(); + + $result=strtoupper($duplicate->form_clone_operation("test")); + ob_end_clean(); + + $this->assertStringContainsString( + strtoupper( ''), + $result); + $this->assertStringContainsString( + strtoupper(''),$result); + $this->assertStringContainsString( + strtoupper(''),$result); + + } + /** + * @testDox Test form_clone_operation MISC OP + * @return void + */ + function testForm_clone_operation_ods() + { + global $g_connection; + // use jr_id 317 1 rows + $duplicate = new Acc_Operation($g_connection); + $duplicate->jr_id=317; + ob_start(); + + $result=strtoupper($duplicate->form_clone_operation("test")); + ob_end_clean(); + $this->assertTrue(stripos($result,'')>0 + , "MO : HTML doesn't contain nb_item = 3 "); + $this->assertStringContainsString( + strtoupper('') , + $result); + + } + /** + * @testDox Test form_clone_operation FIN + * @return void + */ + function testForm_clone_operation_fin() + { + // use jr_id 250 1 rows + global $g_connection; + $duplicate = new Acc_Operation($g_connection); + $duplicate->jr_id=250; + ob_start(); + + $result=strtoupper($duplicate->form_clone_operation("test")); + ob_end_clean(); + + $this->assertStringContainsString( + strtoupper('') , + $result); + } + +} From cbf36dbeeab493a19e8408188c11bf90559e18cd Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sun, 11 Feb 2024 16:01:16 +0100 Subject: [PATCH 20/26] version 9.2 --- html/image/logo9000.png | Bin 33156 -> 33905 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/html/image/logo9000.png b/html/image/logo9000.png index a5d1eee8c56b5fcc0e212180fcefa0e3f6f71b59..88b84c5038e3c06b6522ef6bfd47ed1150a230a2 100644 GIT binary patch literal 33905 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

h*&@ipi6i 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 XC+cuC@R>S)1O7;f%ZrtZ7<~I5;a2Ts literal 33156 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

-UV4UaX|l33JjkKi25U0tYHhIo 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%0AA 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 QgPVg87m*RJ5Y+SiAKdDC&;S4c From 1835c8e83387a476ff5b50c1573f56f3ac339df7 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sun, 11 Feb 2024 16:59:01 +0100 Subject: [PATCH 21/26] Fix : auto numbering receipt --- include/class/acc_ledger.class.php | 8 ++++---- include/class/acc_ledger_purchase.class.php | 8 ++++---- include/class/acc_ledger_sale.class.php | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/class/acc_ledger.class.php b/include/class/acc_ledger.class.php index 1ee0c9ab0..7db721ace 100644 --- a/include/class/acc_ledger.class.php +++ b/include/class/acc_ledger.class.php @@ -1534,10 +1534,10 @@ class Acc_Ledger extends jrn_def_sql $acc_end->pj=$e_pj; /* if e_suggest != e_pj then do not increment sequence */ - if (strcmp($e_pj, $e_pj_suggest)==0&&noalyss_strlentrim($e_pj)!=0) - { - $this->inc_seq_pj(); - } +// if (strcmp($e_pj, $e_pj_suggest)==0&&noalyss_strlentrim($e_pj)!=0) +// { +// $this->inc_seq_pj(); +// } $this->pj=$acc_end->set_pj(); diff --git a/include/class/acc_ledger_purchase.class.php b/include/class/acc_ledger_purchase.class.php index 9722f4ee7..d94a36977 100644 --- a/include/class/acc_ledger_purchase.class.php +++ b/include/class/acc_ledger_purchase.class.php @@ -921,10 +921,10 @@ class Acc_Ledger_Purchase extends Acc_Ledger array($internal,$seq)); /**= e_pj then do not increment sequence */ - if ( strcmp($e_pj,$e_pj_suggest) == 0 && noalyss_strlentrim($e_pj) != 0 ) - { - $this->inc_seq_pj(); - } +// if ( strcmp($e_pj,$this->pj) == 0 && noalyss_strlentrim($e_pj) != 0 ) +// { +// $this->inc_seq_pj(); +// } /* Save the attachment */ if ( isset ($_FILES)) diff --git a/include/class/acc_ledger_sale.class.php b/include/class/acc_ledger_sale.class.php index bfee92fa6..f793c8e5b 100644 --- a/include/class/acc_ledger_sale.class.php +++ b/include/class/acc_ledger_sale.class.php @@ -621,9 +621,9 @@ class Acc_Ledger_Sale extends Acc_Ledger { /* * = e_pj then do not increment sequence */ /* and e_pj is not null */ - if (strcmp($e_pj, $e_pj_suggest) == 0 && noalyss_strlentrim($e_pj) != 0) { - $this->inc_seq_pj(); - } +// if (strcmp($e_pj, $this->pj ) == 0 && noalyss_strlentrim($e_pj) != 0) { +// $this->inc_seq_pj(); +// } $this->db->exec_sql("update jrn set jr_internal=$1 where jr_grpt_id = $2" ,[$internal,$seq]); From e2b640420083cf3e2531914d0b81d4b1356a6f14 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Sun, 11 Feb 2024 16:59:01 +0100 Subject: [PATCH 22/26] Fix : auto numbering receipt --- include/class/acc_ledger.class.php | 2 +- include/class/acc_ledger_purchase.class.php | 4 ++-- include/class/acc_ledger_sale.class.php | 8 +++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/class/acc_ledger.class.php b/include/class/acc_ledger.class.php index 1ee0c9ab0..c6db9798f 100644 --- a/include/class/acc_ledger.class.php +++ b/include/class/acc_ledger.class.php @@ -1534,7 +1534,7 @@ class Acc_Ledger extends jrn_def_sql $acc_end->pj=$e_pj; /* if e_suggest != e_pj then do not increment sequence */ - if (strcmp($e_pj, $e_pj_suggest)==0&&noalyss_strlentrim($e_pj)!=0) + if ($e_pj == $e_pj_suggest &&noalyss_strlentrim($e_pj)!=0) { $this->inc_seq_pj(); } diff --git a/include/class/acc_ledger_purchase.class.php b/include/class/acc_ledger_purchase.class.php index 9722f4ee7..e0f1323c9 100644 --- a/include/class/acc_ledger_purchase.class.php +++ b/include/class/acc_ledger_purchase.class.php @@ -920,8 +920,8 @@ class Acc_Ledger_Purchase extends Acc_Ledger $this->db->exec_sql('update quant_purchase set qp_internal = $1 where j_id in (select j_id from jrnx where j_grpt=$2)', array($internal,$seq)); - /**= e_pj then do not increment sequence */ - if ( strcmp($e_pj,$e_pj_suggest) == 0 && noalyss_strlentrim($e_pj) != 0 ) + /**= e_pj then do not increment sequence , if the given receipt number is equal to one computed then increment */ + if ($e_pj == $this->pj && noalyss_strlentrim($e_pj) != 0) { { $this->inc_seq_pj(); } diff --git a/include/class/acc_ledger_sale.class.php b/include/class/acc_ledger_sale.class.php index bfee92fa6..a50876206 100644 --- a/include/class/acc_ledger_sale.class.php +++ b/include/class/acc_ledger_sale.class.php @@ -619,9 +619,11 @@ class Acc_Ledger_Sale extends Acc_Ledger { $this->pj = $acc_operation->set_pj(); - /* * = e_pj then do not increment sequence */ - /* and e_pj is not null */ - if (strcmp($e_pj, $e_pj_suggest) == 0 && noalyss_strlentrim($e_pj) != 0) { + /** + * + * if the given receipt number is equal to one computed then increment + */ + if ($e_pj == $this->pj && noalyss_strlentrim($e_pj) != 0) { $this->inc_seq_pj(); } From ae83ccbda35b8c9aca3b123dd196b2cc67ec9289 Mon Sep 17 00:00:00 2001 From: Dany wm Date: Thu, 15 Feb 2024 20:59:31 +0100 Subject: [PATCH 23/26] DB protect against JS Injection --- sql/upgrade.sql | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/sql/upgrade.sql b/sql/upgrade.sql index e69de29bb..38c2e620c 100644 --- a/sql/upgrade.sql +++ b/sql/upgrade.sql @@ -0,0 +1,23 @@ +CREATE OR REPLACE FUNCTION comptaproc.trg_remove_script_tag() + RETURNS trigger + LANGUAGE plpgsql +AS $function$ + +begin + + NEW.agc_comment_raw:= regexp_replace(NEW.agc_comment_raw, ' Date: Thu, 15 Feb 2024 20:59:41 +0100 Subject: [PATCH 24/26] cosmetic --- include/template/follow_up-display.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/include/template/follow_up-display.php b/include/template/follow_up-display.php index f54f66509..f90818fad 100644 --- a/include/template/follow_up-display.php +++ b/include/template/follow_up-display.php @@ -420,6 +420,7 @@ function small(p_id_textarea){ for( $c=1;$c 0) { $rmComment=sprintf("return confirm_box(null,'"._('Voulez-vous effacer ce commentaire'). @@ -427,8 +428,8 @@ function small(p_id_textarea){ dossier::id(), $acomment[$c]['agc_id']); $js=Icon_Action::trash("accom".$acomment[$c]['agc_id'], $rmComment); - $comment= h($m_desc.' '.$acomment[$c]['agc_id'].'('.$acomment[$c]['tech_user']." ". - $acomment[$c]['str_agc_date'].')').$js. + $comment=span( h($m_desc.' '.$acomment[$c]['agc_id'].'('.$acomment[$c]['tech_user']." ". + $acomment[$c]['str_agc_date'].')'),$comment_style).$js. '
'. " ".$acomment[$c]['agc_comment_raw'].'
' ; @@ -436,8 +437,8 @@ function small(p_id_textarea){ } else { - $comment=h($m_desc.' '.$acomment[$c]['agc_id'].'('.$acomment[$c]['tech_user']." ". - $acomment[$c]['str_agc_date'].')'). + $comment=span(h($m_desc.' '.$acomment[$c]['agc_id'].'('.$acomment[$c]['tech_user']." ". + $acomment[$c]['str_agc_date'].')'),$comment_style). '
'. " ".$acomment[$c]['agc_comment_raw'].'
' ; From d9cf4cf71c5072b285a768f85545a2bd6a29db29 Mon Sep 17 00:00:00 2001 From: Dany wm Date: Sat, 17 Feb 2024 15:47:57 +0100 Subject: [PATCH 25/26] CARD : add button to epxort to PDF --- include/ajax/ajax_card.php | 6 +++ include/class/card_pdf.class.php | 71 ++++++++++++++++++++++++++++++ include/export/export_card_pdf.php | 16 +++++++ include/lib/ac_common.php | 26 +++++++++++ sql/upgrade.sql | 5 ++- 5 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 include/class/card_pdf.class.php create mode 100644 include/export/export_card_pdf.php diff --git a/include/ajax/ajax_card.php b/include/ajax/ajax_card.php index 22ca1c2e5..f354f4f33 100644 --- a/include/ajax/ajax_card.php +++ b/include/ajax/ajax_card.php @@ -168,6 +168,12 @@ case 'dc': $html.=HtmlInput::submit('save',_('Sauver')); } if ( ! isset ($nohistory))$html.=HtmlInput::history_card_button($f->id,_('Historique')); + $button_pdf=HtmlInput::button_anchor(_("PDF"),"export.php?".http_build_query([ + "act"=>"PDF:card", + "card_id"=>$f->id, + "gDossier"=>Dossier::id() + ])); + $html.=$button_pdf; // Display a remove button if not used and can modify card if ( $can_modify == 1 && $f->is_used()==FALSE) { diff --git a/include/class/card_pdf.class.php b/include/class/card_pdf.class.php new file mode 100644 index 000000000..3618d4431 --- /dev/null +++ b/include/class/card_pdf.class.php @@ -0,0 +1,71 @@ +card=new \Fiche ($cn,$p_card_id); + $this->card->load(); + parent::__construct($cn, "P"); + $this->setDossierInfo($this->card->strAttribut(ATTR_DEF_QUICKCODE)); + } + + /** + * @return mixed + */ + public function getCardId() + { + return $this->card->get_id(); + } + + /** + * @param mixed $card_id + */ + public function setCardId($card_id) + { + $this->card->set_id($card_id); + $this->card->load(); + } + + public function export() + { + $nb_attribut = count($this->card->attribut); +// var_dump( +// $this->card->attribut +// ); + if ($nb_attribut == 0) { + throw new \Exception(_("card_pdf.044 , card_inexistante")); + } + $this->setTitle($this->card->get_quick_code()." ".strtoupper($this->card->strAttribut(1)) + ." ".$this->card->strAttribut(32), true); + $this->SetAuthor('NOALYSS'); + $this->AliasNbPages(); + $this->AddPage(); + + $this->setFont("DejaVu", '', 7); + $this->SetDrawColor(214, 209, 209); + for ($i=0;$i<$nb_attribut;$i++) + { + $border="B"; + $this->write_cell(60,5,$this->card->attribut[$i]->ad_text,$border); + $this->write_cell(100,5,$this->card->attribut[$i]->av_text,$border); + $this->line_new(5); + } + + + $filename=$this->card->strAttribut(1)."-".$this->card->strAttribut(32).".pdf"; + $filename=sanitize_filename($filename); + $this->Output($filename,"D"); + } + +} \ No newline at end of file diff --git a/include/export/export_card_pdf.php b/include/export/export_card_pdf.php new file mode 100644 index 000000000..795f979d5 --- /dev/null +++ b/include/export/export_card_pdf.php @@ -0,0 +1,16 @@ +get("card_id"); +} catch (\Exception $e) { + echo $e->getMessage(); + die(); +} + +$card_pdf=new \Card_PDF($card_id); +$card_pdf->export(); \ No newline at end of file diff --git a/include/lib/ac_common.php b/include/lib/ac_common.php index 88e95ed7f..cf1fc109d 100644 --- a/include/lib/ac_common.php +++ b/include/lib/ac_common.php @@ -1773,4 +1773,30 @@ function generate_random_password($car):string // echo $string."\n"; }while ( count(check_password_strength($string)['msg'])> 0 && $loop<$max_loop); return $string; +} + +/** + * @brief removed invalid character when computing a filename, the suffix is kept + * @param $filename String filename to sanitize + * @return string without offending char + */ +function sanitize_filename($filename) +{ + // save the suffix + $pos_prefix=strrpos($filename, "."); + if ($pos_prefix==0) + { + $filename_suff=".pdf"; + $filename.=$filename_suff; + $pos_prefix=strrpos($filename, "."); + } + else + $filename_suff=substr($filename, $pos_prefix, strlen($filename)); + + $filename=str_replace(array('/', '*', '<', '>', ';', ',', '\\', '.', ':', '(', ')', ' ', '[', ']'), "-", $filename); + + $filename_no=substr($filename, 0, $pos_prefix); + + $new_filename=strtolower($filename_no)."-".date("Ymd-Hi").$filename_suff; + return $new_filename; } \ No newline at end of file diff --git a/sql/upgrade.sql b/sql/upgrade.sql index 38c2e620c..37c18bc69 100644 --- a/sql/upgrade.sql +++ b/sql/upgrade.sql @@ -11,7 +11,7 @@ begin end; $function$ ; - +² create trigger t_remove_script_tag before insert @@ -20,4 +20,7 @@ create trigger t_remove_script_tag before on public.action_gestion_comment for each row execute function comptaproc.trg_remove_script_tag(); +INSERT INTO public.menu_ref (me_code,me_menu,me_file,me_url,me_description,me_parameter,me_javascript,me_type,me_description_etendue) VALUES + ('PDF:card','export Fiche détail PDF','export_card_pdf.php',NULL,NULL,NULL,NULL,'PR',NULL); +insert into public.profile_menu (me_code,p_id,p_type_display) select 'PDF:card',p_id,'P' from profile; From 6f859d6ef9d697f04e2d0912ea98866bf624a819 Mon Sep 17 00:00:00 2001 From: Dany wm Date: Sat, 17 Feb 2024 20:47:07 +0100 Subject: [PATCH 26/26] =?UTF-8?q?Gestion=20:=20possibilit=C3=A9=20de=20sau?= =?UTF-8?q?vegarder=20les=20recherches?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/ajax_misc.php | 4 + html/js/gestion.js | 62 ++++++++++++ include/action.common.inc.php | 10 ++ include/ajax/ajax_follow_up.php | 14 +++ include/class/card_pdf.class.php | 2 +- include/class/follow_up_filter.class.php | 95 +++++++++++++++++++ include/template/action_search.php | 66 +++++++------ .../follow_up_filter-display_list.php | 86 +++++++++++++++++ sql/upgrade.sql | 2 + 9 files changed, 313 insertions(+), 28 deletions(-) create mode 100644 include/class/follow_up_filter.class.php create mode 100644 include/template/follow_up_filter-display_list.php diff --git a/html/ajax_misc.php b/html/ajax_misc.php index 63b197768..6879065ca 100644 --- a/html/ajax_misc.php +++ b/html/ajax_misc.php @@ -344,6 +344,10 @@ $path = array( "operation_exercice+text"=>"ajax_operation_exercice", // transfer operation to accountancy 'operation_exercice+transfer'=>"ajax_operation_exercice", + //list filter for followup + 'list_filter_followup'=>"ajax_follow_up", + //delete a filter for followup + 'delete_filter_followup'=>"ajax_follow_up", ) ; if (array_key_exists($op, $path)) { diff --git a/html/js/gestion.js b/html/js/gestion.js index 66e65f200..4e0258ed7 100644 --- a/html/js/gestion.js +++ b/html/js/gestion.js @@ -398,4 +398,66 @@ function action_save_short() alert_box('action_add ' + e.message); } return false; +} + +/** + * list of filter for follow up + * @param p_dossier int dossier id + * @param access_code string access_code + */ +function list_filter_followup(p_dossier,access_code) +{ + var queryString={ + "gDossier":p_dossier, + "op":"list_filter_followup", + "ctl":"filter_followup_id", + "ac":access_code + }; + var action=new Ajax.Request ( + "ajax_misc.php", + { + method:'get', + parameters:queryString, + onSuccess:function(responseHtml) + { + var posy=calcy(250) + var div = create_div({"id":"filter_followup_id", + 'cssclass': "inner_box", 'style': 'width:90%,right:5%;top:'+posy+"px"}); + div.update(responseHtml.responseText); + div.show(); + } + } + + ); +} + +/** + * @brief delete a filter of follow-up + * @param p_dossier int dossier id + * @param filter_id int table: action_gestion_comment.af_id + */ +function delete_filter_followup(p_dossier,filter_id) +{ + smoke.confirm(content[47], function (e) { + if (e) { + + var queryString = { + "gDossier": p_dossier, + "op": "delete_filter_followup", + "ctl": "filter_followup_id", + "filter_id": filter_id + }; + var action = new Ajax.Request( + "ajax_misc.php", + { + method: 'get', + parameters: queryString, + onSuccess: function (responseHtml) { + $('item_fu' + filter_id).remove(); + } + } + ); + } + } + ); } \ No newline at end of file diff --git a/include/action.common.inc.php b/include/action.common.inc.php index ea1f14b7d..6725f0607 100644 --- a/include/action.common.inc.php +++ b/include/action.common.inc.php @@ -312,6 +312,16 @@ if ($sub_action == "list") echo HtmlInput::hidden("export_type", "detail"); echo HtmlInput::submit("follow_up_csv", _("Export CSV détaillé"),'','smallbutton'); echo ""; + //if filter_name exists then we save the $_GET into the DB as a JSON object + $filter_name=$http->get("filter_name","string",null); + if ( noalyss_trim($filter_name) != "" ) { + // save filter + // $follow_up_filter=new Follow_Up_Filter($cn); + $a_content=json_encode($_GET); + $action_gestion_filter=new Follow_Up_Filter($filter_name,$a_content); + $action_gestion_filter->save(); + } + // si filtered on charge la DB Follow_Up::show_action_list($cn, $base); } //-------------------------------------------------------------------------------- diff --git a/include/ajax/ajax_follow_up.php b/include/ajax/ajax_follow_up.php index 5a8b885b9..f5a0e5028 100644 --- a/include/ajax/ajax_follow_up.php +++ b/include/ajax/ajax_follow_up.php @@ -138,4 +138,18 @@ if ($op == 'followup_comment_oneedit') { break; } return; +} +/******************************************************************************************************************** + * list the existing filter for followup + ******************************************************************************************************************/ +if ( $op == 'list_filter_followup') { + $followup_filter=Follow_Up_Filter::display_list($g_user->getLogin()); + return; +} +/******************************************************************************************************************* + * delete_filter_followup(p_dossier,filter_id) + *******************************************************************************************************************/ +if ( $op == 'delete_filter_followup') { + $cn->exec_delete("delete from action_gestion_id where af_id=$1 and af_user=$2", + [$http->get("filter_id","number"),$g_user->getLogin()]); } \ No newline at end of file diff --git a/include/class/card_pdf.class.php b/include/class/card_pdf.class.php index 3618d4431..59971489d 100644 --- a/include/class/card_pdf.class.php +++ b/include/class/card_pdf.class.php @@ -61,7 +61,7 @@ class Card_PDF extends \PDF $this->write_cell(100,5,$this->card->attribut[$i]->av_text,$border); $this->line_new(5); } - + $filename=$this->card->strAttribut(1)."-".$this->card->strAttribut(32).".pdf"; $filename=sanitize_filename($filename); diff --git a/include/class/follow_up_filter.class.php b/include/class/follow_up_filter.class.php new file mode 100644 index 000000000..9612ab068 --- /dev/null +++ b/include/class/follow_up_filter.class.php @@ -0,0 +1,95 @@ +name=$name; + $this->json_content=$json_content; + } + + /** + * @return mixed + */ + public function getName():string + { + return $this->name; + } + + /** + * @param mixed $name + */ + public function setName($name): Follow_Up_Filter + { + $this->name = $name; + return $this; + } + + /** + * @return mixed + */ + public function getaContent():array + { + return $this->json_content; + } + + /** + * @param mixed $json_content + */ + public function setaContent($json_content): Follow_Up_Filter + { + $this->json_content = $json_content; + return $this; + } + + public function save() { + global $cn,$g_user; + $this->name=trim($this->name); + + $exist=$cn->get_value("select count(*) from action_gestion_filter where af_user=$1 and + af_name=$2" , [$g_user->getLogin(),$this->name]); + if ( $exist == 0 ) { + $cn->exec_sql("insert into action_gestion_filter(af_user,af_name,af_search) values ($1,$2,$3)", + [$g_user->getLogin(),$this->name,$this->json_content]); + } else { + $cn->exec_sql("update action_gestion_filter set af_search=$3 where + af_user=$1 and + af_name=$2" , + [$g_user->getLogin(),$this->name,$this->json_content]); + } + + } + + /** + * @brief display the list of recorded search + * @param $login string Login of the user + * @return void + */ + public static function display_list($login):void + { + + require NOALYSS_TEMPLATE."/follow_up_filter-display_list.php"; + } +} \ No newline at end of file diff --git a/include/template/action_search.php b/include/template/action_search.php index 00d11ec39..5bec1f597 100644 --- a/include/template/action_search.php +++ b/include/template/action_search.php @@ -65,22 +65,24 @@
- + - + -
'._('Pièce').'
' . _('Numéro Pièce') .''. hb($e_pj) . '' . _('Numéro Pièce') .$span.''. hb($e_pj) . '' . _('Numéro Pièce') .''. hb($this->pj) . + $r.='' . _('Numéro Pièce').$span .''. hb($this->pj) . ' '._('Attention numéro pièce existante, elle a du être adaptée').'' . _('Numéro Pièce') .''. hb($this->pj) . '' . _('Numéro Pièce') .$span.''. hb($this->pj) . '
' . _('Numéro Pièce') .''. hb($e_pj) . '' . _('Numéro Pièce') .$span.''. hb($e_pj) . '' . _('Numéro Pièce') .''. hb($this->pj) . + $r.='' . _('Numéro Pièce') .$span.''. hb($this->pj) . ' '._('Attention numéro pièce existante, elle a du être adaptée').'' . _('Numéro Pièce') .''. hb($this->pj) . '' . _('Numéro Pièce') .$span.''. hb($this->pj) . '
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()); ?> diff --git a/include/template/ledger_detail_misc.php b/include/template/ledger_detail_misc.php index 0655bf92c..bbd7df138 100644 --- a/include/template/ledger_detail_misc.php +++ b/include/template/ledger_detail_misc.php @@ -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); ?> @@ -54,6 +55,8 @@ require_once NOALYSS_TEMPLATE.'/ledger_detail_top.php'; 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()); ?> diff --git a/include/template/ledger_detail_ven.php b/include/template/ledger_detail_ven.php index 216d53a15..eeb76df98 100644 --- a/include/template/ledger_detail_ven.php +++ b/include/template/ledger_detail_ven.php @@ -71,6 +71,8 @@ $str_anc = ""; 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()); ?>
MY_STRICT=='Y' && $g_user->check_action(UPDDATE)==0) { + $date->setReadOnly(true); + } $date->value=format_date($obj->det->jr_date); echo td(_('Date')).td($date->input()); diff --git a/include/template/ledger_detail_ven.php b/include/template/ledger_detail_ven.php index eeb76df98..852d7844e 100644 --- a/include/template/ledger_detail_ven.php +++ b/include/template/ledger_detail_ven.php @@ -1,7 +1,7 @@ @@ -31,6 +31,9 @@ $str_anc = ""; input()?>
input();?>
input()?>
- + +
+ + - - -
@@ -107,11 +109,7 @@ input();?>
- - +
@@ -124,26 +122,11 @@ input();?>

- - - - get("searchtag","array",array()); - for ($i=0;$iupdate_search_cell('search'); - } - } - ?> - -

-

+ + set_value($http->request("tag_option","number",0)); echo $iselect->input(); ?> + + + + get("searchtag","array",array()); + for ($i=0;$iupdate_search_cell('search'); + } + } + ?> +

- + +

+ Nom Filtre input(); + ?> + Filtre existant : + request("ac"))); + ?> +

+
    diff --git a/include/template/follow_up_filter-display_list.php b/include/template/follow_up_filter-display_list.php new file mode 100644 index 000000000..d8802c6b1 --- /dev/null +++ b/include/template/follow_up_filter-display_list.php @@ -0,0 +1,86 @@ + +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + * + */ + + +/** + * @file + * @brief display a list of filter for followup + */ +global $cn; +$http = new HttpInput(); +$div = $http->request("ctl"); +$acces_code=$http->get("ac"); +echo \HtmlInput::title_box("liste ",$div); + +$a_list = $cn->get_array("select af_id, af_name,af_search +from action_gestion_filter +where af_user=$1 +order by lower(af_name)", [$login]); +if (count($a_list) == 0) { + echo_warning("Aucun filtre"); + echo \HtmlInput::button_close($div); + return; +} + + +?> +

    + Cliquer sur un filtre pour chercher +

    + +
      +
    • + +
    • +
    diff --git a/sql/upgrade.sql b/sql/upgrade.sql index 37c18bc69..c0a22bc29 100644 --- a/sql/upgrade.sql +++ b/sql/upgrade.sql @@ -24,3 +24,5 @@ INSERT INTO public.menu_ref (me_code,me_menu,me_file,me_url,me_description,me_pa ('PDF:card','export Fiche détail PDF','export_card_pdf.php',NULL,NULL,NULL,NULL,'PR',NULL); insert into public.profile_menu (me_code,p_id,p_type_display) select 'PDF:card',p_id,'P' from profile; + +create table action_gestion_filter(af_id bigint generated always as identity, af_user text not null, af_name text not null , ag_search text not null);