*
  • an invoice *
  • a meeting *
  • an order *
  • a letter * * The table document_type are the possible actions */ /** * \brief class_action for manipulating actions * action can be : * * The table document_type are the possible actions */ class Follow_Up { var $db; /*!< $db database connexion */ var $ag_timestamp; /*!< $ag_timestamp document date (ag_gestion.ag_timestamp) */ var $dt_id; /*!< $dt_id type of the document (document_type.dt_id) */ var $ag_state; /*!< $ag_state stage of the document (printed, send to client...) */ var $d_number; /*!< $d_number number of the document */ var $d_filename; /*!< $d_filename filename's document */ var $d_mimetype; /*!< $d_mimetype document's filename */ var $ag_title; /*!< $ag_title title document */ var $f_id; /*!< $f_id_dest fiche id (From field ) */ var $ag_ref; /*!< $ag_ref is the ref */ var $ag_hour; /*!< $ag_hour is the hour of the meeting, action */ var $ag_priority; /*!< $ag_priority is the priority 1 High, 2 medium, 3 low */ var $ag_dest; /*!< $ag_dest person who is in charged */ var $ag_contact; /*!< $ag_contact contact */ var $ag_remind_date; /*!< $ag_contact contact */ /** * @brief $operation string related operation */ var $operation; /** * @brief $action string related action */ var $action; /** * @brief constructor * \brief constructor * \param p_cn database connection */ function __construct($p_cn, $p_id=0) { $this->db=$p_cn; $this->ag_id=$p_id; $this->f_id=0; $this->aAction_detail=array(); $this->operation=""; $this->action=""; } /** * Create a filter based on the current user, * @remark type $g_user Connected user * @param type $cn Database connection * @param type $p_mode Mode is R (for Read) or W (for write) * @return string SQL where clause to include in the SQL * example: (ag_dest in (select p_granted from user_sec_action_profile where p_id=x) */ static function sql_security_filter($cn, $p_mode) { global $g_user; $profile=$cn->get_value("select p_id from profile_user where user_name=$1", array($g_user->login)); if ($profile=='') die("Security"); if ($p_mode=='R') { $sql=" (ag_dest in (select p_granted from user_sec_action_profile where p_id=$profile ) ) "; } else if ($p_mode=='W') { $sql=" ( ag_dest in (select p_granted from user_sec_action_profile where p_id=$profile and ua_right='W' ) )"; } else { record_log(_('Securité')); throw new Exception(_('Securité')); } return $sql; } //---------------------------------------------------------------------- /** * \brief Display the object, the tags for the FORM * are in the caller. It will be used for adding and updating * action * \note If ag_id is not equal to zero then it is an update otherwise * it is a new document * * \param $p_view form will be in readonly mode (value: READ, UPD or NEW ) * \param $p_gen true we show the tag for generating a doc (value : true or false) and adding files * \param $p_base is the ac parameter * \param $retour is the html code for the return button * \note update the reference number or the document type is not allowed * * * \return string containing the html code */ function Display($p_view, $p_gen, $p_base, $retour="") { global $g_user; if ($p_view=='UPD') { $upd=true; $readonly=false; } elseif ($p_view=="NEW") { $upd=false; $readonly=false; $this->ag_ref=_("Nouveau"); } elseif ($p_view=='READ') { $upd=true; $readonly=true; } else { throw new Exception('class_action'.__LINE__.'Follow_Up::Display error unknown parameter'.$p_view); } // Compute the widget // Date $date=new IDate(); $date->readOnly=$readonly; $date->name="ag_timestamp"; $date->id="ag_timestamp"; $date->value=$this->ag_timestamp; $remind_date=new IDate(); $remind_date->readOnly=$readonly; $remind_date->name="ag_remind_date"; $remind_date->id="ag_remind_date"; $remind_date->value=$this->ag_remind_date; // Doc Type $doc_type=new ISelect(); $doc_type->name="dt_id"; $doc_type->value=$this->db->make_array("select dt_id,dt_value from document_type order by dt_value", 1); $doc_type->selected=$this->dt_id; $doc_type->readOnly=$readonly; $str_doc_type=$doc_type->input(); // Description $desc=new ITextArea(); $desc->style=' class="itextarea" style="width:80%;margin-left:0px"'; $desc->name="ag_comment"; $desc->readOnly=$readonly; $acomment=$this->db->get_array("SELECT agc_id, ag_id, to_char(agc_date,'DD.MM.YYYY HH24:MI') as str_agc_date, agc_comment, tech_user FROM action_gestion_comment where ag_id=$1 order by agc_id", array($this->ag_id) ); // List opération liées $operation=$this->db->get_array("select ago_id,j.jr_id,j.jr_internal,j.jr_comment,to_char(j.jr_date,'DD.MM.YY') as str_date from jrn as j join action_gestion_operation as ago on (j.jr_id=ago.jr_id) where ag_id=$1 order by jr_date", array($this->ag_id)); $iconcerned=new IConcerned('operation'); // List related action $iaction=new IRelated_Action('action'); $iaction->value=(isset($this->action))?$this->action:""; // state // Retrieve the value $a=$this->db->make_array("select s_id,s_value from document_state "); $state=new ISelect(); $state->readOnly=$readonly; $state->name="ag_state"; $state->value=$a; $state->selected=$this->ag_state; $str_state=$state->input(); // Retrieve the value if there is an attached doc $doc_ref=""; // Document id $h2=new IHidden(); $h2->name="d_id"; $h2->value=$this->d_id; if ($this->d_id!=0&&$this->d_id!="") { $h2->readonly=($p_view=='NEW')?false:true; $doc=new Document($this->db, $this->d_id); $doc->get(); if (strlen(trim($doc->d_lob))!=0) { $d_id=new IHidden(); $doc_ref="

    Document ".$doc->anchor().'

    '; $doc_ref.=$h2->input().$d_id->input('d_id', $this->d_id); } } // title $title=new IText(); $title->readOnly=$readonly; $title->name="ag_title"; $title->value=$this->ag_title; $title->size=60; // Priority of the ag_priority $ag_priority=new ISelect(); $ag_priority->readOnly=$readonly; $ag_priority->name="ag_priority"; $ag_priority->selected=$this->ag_priority; $ag_priority->value=array(array('value'=>1, 'label'=>_('Haute')), array('value'=>2, 'label'=>_('Moyenne')), array('value'=>3, 'label'=>_('Basse')) ); $str_ag_priority=$ag_priority->input(); // hour of the action (meeting) ag_hour $ag_hour=new IText(); $ag_hour->readOnly=$readonly; $ag_hour->name="ag_hour"; $ag_hour->value=$this->ag_hour; $ag_hour->size=6; $ag_hour->javascript=" onblur=check_hour('ag_hour');"; $str_ag_hour=$ag_hour->input(); // Profile in charged of the action $ag_dest=new ISelect(); $ag_dest->readOnly=$readonly; $ag_dest->name="ag_dest"; // select profile $aAg_dest=$this->db->make_array("select p_id as value, ". "p_name as label ". " from profile where p_id in ".$g_user->get_writable_profile()."order by 2"); $ag_dest->value=$aAg_dest; $ag_dest->selected=$this->ag_dest; $str_ag_dest=$ag_dest->input(); // ag_ref // Always false for update $client_label=new ISpan(); /* Add button */ $f_add_button=new IButton('add_card'); $f_add_button->label=_('Créer une nouvelle fiche'); $f_add_button->set_attribute('ipopup', 'ipop_newcard'); $filter=$this->db->make_list('select fd_id from fiche_def '); $f_add_button->set_attribute('filter', $filter); $f_add_button->javascript=" select_card_type(this);"; $str_add_button=$f_add_button->input(); // f_id_dest sender if ($this->qcode_dest!=NOTFOUND&&strlen(trim($this->qcode_dest))!=0) { $tiers=new Fiche($this->db); $tiers->get_by_qcode($this->qcode_dest); $qcode_dest_label=$tiers->strAttribut(1); $this->f_id_dest=$tiers->id; } else { $qcode_dest_label=($this->f_id_dest==0||trim($this->qcode_dest)=="")?'Interne ':'Error'; } $h_ag_id=new IHidden(); // if concerns another action : show the link otherwise nothing // // sender $w=new ICard(); $w->readOnly=$readonly; $w->jrn=0; $w->name='qcode_dest'; $w->value=($this->f_id_dest!=0)?$this->qcode_dest:""; $w->label=""; $list_recipient=$this->db->make_list('select fd_id from fiche_def where frd_id in (14,25,8,9,16)'); $w->extra=$list_recipient; $w->set_attribute('typecard', $list_recipient); $w->set_dblclick("fill_ipopcard(this);"); $w->set_attribute('ipopup', 'ipopcard'); // name of the field to update with the name of the card $w->set_attribute('label', 'qcode_dest_label'); // name of the field to update with the name of the card $w->set_attribute('typecard', $w->extra); $w->set_function('fill_data'); $w->javascript=sprintf(' onchange="fill_data_onchange(\'%s\');" ', $w->name); $sp=new ISpan(); $sp->name='qcode_dest_label'; $sp->value=$qcode_dest_label; // autre - a refaire pour avoir plusieurs fiches // Sur le modèle des tags $ag_contact=new ICard(); $ag_contact->readOnly=$readonly; $ag_contact->jrn=0; $ag_contact->name='ag_contact'; $ag_contact->value=''; $ag_contact->set_attribute('ipopup', 'ipopcard'); if ($this->ag_contact!=0) { $contact=new Fiche($this->db, $this->ag_contact); $ag_contact->value=$contact->get_quick_code(); } $ag_contact->label=""; $list_contact=$this->db->make_list('select fd_id from fiche_def where frd_id=16'); $ag_contact->extra=$list_contact; $ag_contact->set_dblclick("fill_ipopcard(this);"); // name of the field to update with the name of the card $ag_contact->set_attribute('label', 'ag_contact_label'); // name of the field to update with the name of the card $ag_contact->set_attribute('typecard', $list_contact); $ag_contact->set_function('fill_data'); $ag_contact->javascript=sprintf(' onchange="fill_data_onchange(\'%s\');" ', $ag_contact->name); $spcontact=new ISpan(); $spcontact->name='ag_contact_label'; $spcontact->value=''; $fiche_contact=new Fiche($this->db); $fiche_contact->get_by_qcode($this->ag_contact); if ($fiche_contact->id!=0) { $spcontact->value=$fiche_contact->strAttribut(ATTR_DEF_NAME); } $h_agrefid=new IHidden(); $iag_ref=new IText("ag_ref"); $iag_ref->value=$this->ag_ref; $iag_ref->readOnly=($p_view=="NEW"||$p_view=='READ')?true:false; $str_ag_ref=$iag_ref->input(); // Preparing the return string $r=""; /* for new files */ $upload=new IFile(); $upload->name="file_upload[]"; $upload->readOnly=$readonly; $upload->value=""; $aAttachedFile=$this->db->get_array('select d_id,d_filename,d_description,d_mimetype,'. '\'export.php?act=RAW:document&'. Dossier::get().'&d_id=\'||d_id as link'. ' from document where ag_id=$1', array($this->ag_id)); /* create the select for document */ $aDocMod=new ISelect(); $aDocMod->name='doc_mod'; $aDocMod->value=$this->db->make_array('select md_id,dt_value||\' : \'||md_name as md_name'. ' from document_modele join document_type on (md_type=dt_id)'. ' order by md_name'); $str_select_doc=$aDocMod->input(); /* if no document then do not show the generate button */ if (empty($aDocMod->value)) $str_submit_generate=""; else $str_submit_generate=HtmlInput::submit("generate", _("Génére le document")); $ag_id=$this->ag_id; /* fid = Icard */ $icard=new ICard(); $icard->jrn=0; $icard->table=0; $icard->extra2='QuickCode'; $icard->noadd="no"; $icard->extra='all'; /* Text desc */ $text=new IText(); $num=new INum(); /* TVA */ $itva=new ITva_Popup($this->db); $itva->in_table=true; $aCard=array(); /* create aArticle for the detail section */ $article_count=(count($this->aAction_detail)==0)?MAX_ARTICLE:count($this->aAction_detail); /* Compute total */ $tot_item=0; $tot_vat=0; for ($i=0; $i<$article_count; $i++) { /* fid = Icard */ $icard=new ICard(); $icard->jrn=0; $icard->table=0; $icard->noadd="no"; $icard->extra='all'; $icard->name="e_march".$i; $tmp_ad=(isset($this->aAction_detail[$i]))?$this->aAction_detail[$i]:false; $icard->readOnly=$readonly; $icard->value=''; $aCard[$i]=0; if ($tmp_ad) { $march=new Fiche($this->db); $f=$tmp_ad->get_parameter('qcode'); if ($f!=0) { $march->id=$f; $icard->value=$march->get_quick_code(); $aCard[$i]=$f; } } $icard->set_dblclick("fill_ipopcard(this);"); // name of the field to update with the name of the card $icard->set_attribute('label', "e_march".$i."_label"); // name of the field to update with the name of the card $icard->set_attribute('typecard', $icard->extra); $icard->set_attribute('ipopup', 'ipopcard'); $icard->set_function('fill_data'); $icard->javascript=sprintf(' onchange="fill_data_onchange(\'%s\');" ', $icard->name); $aArticle[$i]['fid']=$icard->search().$icard->input(); $text->javascript=' onchange="clean_tva('.$i.');compute_ledger('.$i.')"'; $text->css_size="100%"; $text->name="e_march".$i."_label"; $text->id="e_march".$i."_label"; $text->size=40; $text->value=($tmp_ad)?$tmp_ad->get_parameter('text'):""; $text->readOnly=$readonly; $aArticle[$i]['desc']=$text->input(); $num->javascript=' onchange="format_number(this,4);clean_tva('.$i.');compute_ledger('.$i.')"'; $num->name="e_march".$i."_price"; $num->id="e_march".$i."_price"; $num->size=8; $num->readOnly=$readonly; $num->value=($tmp_ad)?$tmp_ad->get_parameter('price_unit'):0; $aArticle[$i]['pu']=$num->input(); $num->name="e_quant".$i; $num->id="e_quant".$i; $num->size=8; $num->value=($tmp_ad)?$tmp_ad->get_parameter('quantity'):0; $aArticle[$i]['quant']=$num->input(); $itva->name='e_march'.$i.'_tva_id'; $itva->id='e_march'.$i.'_tva_id'; $itva->value=($tmp_ad)?$tmp_ad->get_parameter('tva_id'):0; $itva->readOnly=$readonly; $itva->js=' onchange="format_number(this);clean_tva('.$i.');compute_ledger('.$i.')"'; $itva->set_attribute('compute', $i); $aArticle[$i]['tvaid']=$itva->input(); $num->name="e_march".$i."_tva_amount"; $num->id="e_march".$i."_tva_amount"; $num->value=($tmp_ad)?$tmp_ad->get_parameter('tva_amount'):0; $num->javascript=" onchange=\"compute_ledger('".$i." ')\""; $num->size=8; $aArticle[$i]['tva']=$num->input(); $tot_vat=bcadd($tot_vat,$num->value); $num->name="tvac_march".$i; $num->id="tvac_march".$i; $num->value=($tmp_ad)?$tmp_ad->get_parameter('total'):0; $num->size=8; $aArticle[$i]['tvac']=$num->input(); $tot_item=bcadd($tot_item,$num->value); $aArticle[$i]['hidden_htva']=HtmlInput::hidden('htva_march'.$i, 0); $aArticle[$i]['hidden_tva']=HtmlInput::hidden('tva_march'.$i, 0); $aArticle[$i]['ad_id']=($tmp_ad)?HtmlInput::hidden('ad_id'.$i, $tmp_ad->get_parameter('id')):HtmlInput::hidden('ad_id'.$i, 0); } /* Add the needed hidden values */ $r.=dossier::hidden(); /* add the number of item */ $Hid=new IHidden(); $r.=$Hid->input("nb_item", $article_count); $r.=HtmlInput::request_to_hidden(array("closed_action", "remind_date_end", "remind_date", "sag_ref", "only_internal", "state", "qcode", "ag_dest_query", "action_query", "tdoc", "date_start", "date_end", "hsstate", "searchtag")); $a_tag=$this->tag_get(); $menu=new Default_Menu(); /* get template */ ob_start(); require NOALYSS_TEMPLATE.'/detail-action.php'; $content=ob_get_contents(); ob_end_clean(); $r.=$content; //hidden $r.="

    "; $r.=$h2->input(); $r.=$h_ag_id->input('ag_id', $this->ag_id); $hidden2=new IHidden(); $r.=$hidden2->input('f_id_dest', $this->f_id_dest); $r.="

    "; return $r; } //---------------------------------------------------------------------- /** * \brief This function shows the detail of an action thanks the ag_id */ function get() { $sql="select ag_id,to_char (ag_timestamp,'DD.MM.YYYY') as ag_timestamp,". " f_id_dest,ag_title,ag_ref,d_id,ag_type,ag_state, ag_owner, ". " ag_dest, ag_hour, ag_priority, ag_contact,to_char (ag_remind_date,'DD.MM.YYYY') as ag_remind_date ". " from action_gestion left join document using (ag_id) where ag_id=".$this->ag_id; $r=$this->db->exec_sql($sql); $row=Database::fetch_all($r); if ($row==false) { $this->ag_id=0; return; } $this->ag_timestamp=$row[0]['ag_timestamp']; $this->ag_contact=$row[0]['ag_contact']; $this->f_id_dest=$row[0]['f_id_dest']; $this->ag_title=$row[0]['ag_title']; $this->ag_type=$row[0]['ag_type']; $this->ag_ref=$row[0]['ag_ref']; $this->ag_state=$row[0]['ag_state']; $this->d_id=$row[0]['d_id']; $this->ag_dest=$row[0]['ag_dest']; $this->ag_hour=$row[0]['ag_hour']; $this->ag_priority=$row[0]['ag_priority']; $this->ag_remind_date=$row[0]['ag_remind_date']; $this->ag_owner=$row[0]['ag_owner']; $action_detail=new Follow_Up_Detail($this->db); $action_detail->set_parameter('ag_id', $this->ag_id); $this->aAction_detail=$action_detail->load_all(); // if there is no document set 0 to d_id if ($this->d_id=="") $this->d_id=0; // if there is a document fill the object if ($this->d_id!=0) { $this->state=$row['0']['ag_state']; $this->ag_state=$row[0]['ag_state']; } $this->dt_id=$this->ag_type; $aexp=new Fiche($this->db, $this->f_id_dest); $this->qcode_dest=$aexp->strAttribut(ATTR_DEF_QUICKCODE); } /** * \brief Save the document and propose to save the generated document or * to upload one, the data are included except the file. Temporary the generated * document is save. * The files into $_FILES['file_upload'] will be saved * @note the array $_POST['input_desc'] must be set, contains the description * of the uploaded files * * \return */ function save() { // Get The sequence id, $seq_name="seq_doc_type_".$this->dt_id; $str_file=""; $add_file=''; // f_id exp $exp=new Fiche($this->db); $exp->get_by_qcode($this->qcode_dest); $exp->id=($exp->id==0)?null:$exp->id; $contact=new Fiche($this->db); $contact->get_by_qcode($this->ag_contact); if (trim($this->ag_title)=="") { $doc_mod=new document_type($this->db); $doc_mod->dt_id=$this->dt_id; $doc_mod->get(); $this->ag_title=$doc_mod->dt_value; } $this->ag_id=$this->db->get_next_seq('action_gestion_ag_id_seq'); // Create the reference $ag_ref=$this->db->get_value('select dt_prefix from document_type where dt_id=$1', array($this->dt_id)).'-'.$this->db->get_next_seq($seq_name); $this->ag_ref=$ag_ref; // save into the database if ($this->ag_remind_date!=null||$this->ag_remind_date!='') { $sql="insert into action_gestion". "(ag_id,ag_timestamp,ag_type,ag_title,f_id_dest,ag_ref, ag_dest, ". " ag_hour, ag_priority,ag_owner,ag_contact,ag_state,ag_remind_date) ". " values ($1,to_date($2,'DD.MM.YYYY'),$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,to_date($13,'DD.MM.YYYY'))"; } else { $this->ag_remind_date=null; $sql="insert into action_gestion". "(ag_id,ag_timestamp,ag_type,ag_title,f_id_dest,ag_ref, ag_dest, ". " ag_hour, ag_priority,ag_owner,ag_contact,ag_state,ag_remind_date) ". " values ($1,to_date($2,'DD.MM.YYYY'),$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13)"; } $this->db->exec_sql($sql, array($this->ag_id, /* 1 */ $this->ag_timestamp, /* 2 */ $this->dt_id, /* 3 */ $this->ag_title, /* 4 */ $exp->id, /* 5 */ $ag_ref, /* 6 */ $this->ag_dest, /* 7 */ $this->ag_hour, /* 8 */ $this->ag_priority, /* 9 */ $_SESSION['g_user'], /* 10 */ $contact->id, /* 11 */ $this->ag_state, /* 12 */ $this->ag_remind_date /* 13 */ ) ); /* insert also the details */ for ($i=0; $i<$_POST['nb_item']; $i++) { $act=new Follow_Up_Detail($this->db); $act->from_array($_POST, $i); if ($act->f_id==0) continue; $act->ag_id=$this->ag_id; $act->save(); } /* Upload the documents */ $doc=new Document($this->db); $doc->Upload($this->ag_id); if (trim($this->ag_comment)!='') { $this->db->exec_sql("insert into action_gestion_comment (ag_id,tech_user,agc_comment) values ($1,$2,$3)" , array($this->ag_id, $_SESSION['g_user'], $this->ag_comment)); } $this->insert_operation(); $this->insert_action(); } /** * myList($p_base, $p_filter = "", $p_search = "") * Show list of action by default if sorted on date * @param $p_base base url with ac... * @param $p_filter filters on the document_type * @param $p_search must a valid sql command ( ex 'and ag_title like upper('%hjkh%')) * @return string containing html code */ function myList($p_base, $p_filter="", $p_search="") { // for the sort $url=HtmlInput::get_to_string(array("closed_action", "remind_date_end", "remind_date", "sag_ref", "only_internal", "state", "qcode", "ag_dest_query", "action_query", "tdoc", "date_start", "date_end", "hsstate", "searchtag")).'&'.$p_base; $table=new Sort_Table(); $table->add('Date Doc.', $url, 'order by ag_timestamp asc', 'order by ag_timestamp desc', 'da', 'dd'); $table->add('Date Comm.', $url, 'order by last_comment', 'order by last_comment desc', 'dca', 'dcd'); $table->add('Date Limite', $url, 'order by ag_remind_date asc', 'order by ag_remind_date desc', 'ra', 'rd'); $table->add('Tag', $url, 'order by tags asc', 'order by tags desc', 'taa', 'tad'); $table->add('Réf.', $url, 'order by ag_ref asc', 'order by ag_ref desc', 'ra', 'rd'); $table->add('Groupe', $url, "order by coalesce((select p_name from profile where p_id=ag_dest),'Aucun groupe')", "order by coalesce((select p_name from profile where p_id=ag_dest),'Aucun groupe') desc", 'dea', 'ded'); $table->add('Dest/Exp', $url, 'order by name asc', 'order by name desc', 'ea', 'ed'); $table->add('Titre', $url, 'order by ag_title asc', 'order by ag_title desc', 'ta', 'td'); $ord=(!isset($_GET['ord']))?"dcd":$_GET['ord']; $sort=$table->get_sql_order($ord); if (strlen(trim($p_filter))!=0) $p_filter_doc=" dt_id in ( $p_filter )"; else $p_filter_doc=" 1=1 "; $sql=" select ag_id,to_char(ag_timestamp,'DD.MM.YYYY') as my_date, to_char(ag_remind_date,'DD.MM.YYYY') as my_remind, to_char(coalesce((select max(agc_date) from action_gestion_comment as agc where agc.ag_id=ag.ag_id),ag_timestamp),'DD.MM.YY') as str_last_comment, coalesce((select max(agc_date) from action_gestion_comment as agc where agc.ag_id=ag.ag_id),ag_timestamp) as last_comment, f_id_dest, s_value, ag_title,dt_value,ag_ref, ag_priority,ag_state, coalesce((select p_name from profile where p_id=ag_dest),'Aucun groupe') as dest, (select ad_value from fiche_Detail where f_id=ag.f_id_dest and ad_id=1) as name, array_to_string((select array_agg(t1.t_tag) from action_tags as a1 join tags as t1 on (a1.t_id=t1.t_id) where a1.ag_id=ag.ag_id ),',') as tags from action_gestion as ag join document_type on (ag_type=dt_id) join document_state on (ag_state=s_id) where $p_filter_doc $p_search $sort"; $max_line=$this->db->count_sql($sql); $step=$_SESSION['g_pagesize']; $page=(isset($_GET['offset']))?$_GET['page']:1; $offset=(isset($_GET['offset']))?Database::escape_string($_GET['offset']):0; if ($step!=-1) $limit=" LIMIT $step OFFSET $offset "; else $limit=''; $bar=navigation_bar($offset, $max_line, $step, $page); $Res=$this->db->exec_sql($sql.$limit); $a_row=Database::fetch_all($Res); $r=""; $r.='

    '.$bar.'

    '; $r.=''; $r.=""; $r.=''; $r.=''; $r.=''; $r.=''; $r.=''; $r.=''; $r.=''; $r.=''; $r.=''; $r.=th('Priorité'); $r.=""; // if there are no records return a message if (sizeof($a_row)==0 or $a_row==false) { $r='
    '; $r.='
    Aucun enregistrement trouvé'; $r.="
    "; return $r; } $today=date('d.m.Y'); $i=0; $checkbox=new ICheckBox("mag_id[]"); //show the sub_action foreach ($a_row as $row) { $href=''; $i++; $tr=($i%2==0)?'even':'odd'; if ($row['ag_priority']<2) $tr='priority1'; $st=''; if ($row['my_date']==$today) $st=' style="font-weight:bold; border:2px solid orange;"'; $date_remind=format_date($row['my_remind'], 'DD.MM.YYYY', 'YYYYMMDD'); $date_today=date('Ymd'); if ($date_remind!=""&&$date_remind==$date_today&&$row['ag_state']!=1&&$row['ag_state']!=3) $st=' style="font-weight:bold;background:orange"'; if ($date_remind!=""&&$date_remind<$date_today&&$row['ag_state']!=1&&$row['ag_state']!=3) $st=' style="font-weight:bold;background:#FF0000;color:white;"'; $r.=""; $checkbox->value=$row['ag_id']; $r.=''; $r.=""; $r.=""; $r.=""; $r.=""; $r.=""; $r.=""; // Expediteur $fexp=new Fiche($this->db); $fexp->id=$row['f_id_dest']; $qcode_dest=$fexp->strAttribut(ATTR_DEF_QUICKCODE); $qexp=($qcode_dest==NOTFOUND)?"Interne":$qcode_dest; $jsexp=sprintf("javascript:showfiche('%s')", $qexp); if ($qexp!='Interne') { $r.="'; } else $r.=""; $ref=""; $r.='"; /* * State */ switch ($row['ag_priority']) { case 1: $priority='Haute'; break; case 2: $priority="Moyenne"; break; case 3: $priority="Important"; break; } $r.=td($priority); $r.=""; $r.=""; } $r.="
    '.ICheckBox::toggle_checkbox('ag', 'list_ag_frm').''.$table->get_header(0).''.$table->get_header(1).''.$table->get_header(2).''.$table->get_header(3).''.$table->get_header(4).''.$table->get_header(5).''.$table->get_header(6).''.$table->get_header(7).'
    '.$checkbox->input().'".$href.smaller_date($row['my_date']).''."".$href.$row['str_last_comment'].''."".$href.smaller_date($row['my_remind']).''."".$href.h($row['tags']).''."".$href.$row['ag_ref'].''."".$href.h($row['dest']).''."$href".$qexp." : ".$fexp->getName().'$href Interne '.$href. h($row['ag_title'])."".$ref."
    "; $r.='

    '.$bar.'

    '; return $r; } //---------------------------------------------------------------------- /* * \brief Update the data into the database * * \return true on success otherwise false */ function Update() { // if ag_id == 0 nothing to do if ($this->ag_id==0) return; // retrieve customer // f_id if (trim($this->qcode_dest)=="") { // internal document $this->f_id_dest=null; // internal document } else { $tiers=new Fiche($this->db); if ($tiers->get_by_qcode($this->qcode_dest)==-1) // Error we cannot retrieve this qcode return false; else $this->f_id_dest=$tiers->id; } $contact=new Fiche($this->db); if ($contact->get_by_qcode($this->ag_contact)==-1) $contact->id=0; // reload the old one $old=new Follow_Up($this->db); $old->ag_id=$this->ag_id; $old->get(); // If ag_ref changed then check if unique if ($old->ag_ref!=$this->ag_ref) { $nAg_ref=$this->db->get_value("select count(*) from action_gestion where ag_ref=$1", array($this->ag_ref)); if ($nAg_ref!=0) { echo h2("Référence en double, référence non sauvée", 'class="error"'); $this->ag_ref=$old->ag_ref; } } if ($this->ag_remind_date!=null) { $this->db->exec_sql("update action_gestion set ". " ag_timestamp=to_date($1,'DD.MM.YYYY'),". " ag_title=$2,". " ag_type=$3, ". " f_id_dest=$4, ". "ag_state=$5,". " ag_hour = $7 ,". " ag_priority = $8 ,". " ag_dest = $9 , ". " ag_contact = $10, ". " ag_ref = $11, ". " ag_remind_date=to_date($12,'DD.MM.YYYY') ". " where ag_id = $6", array( $this->ag_timestamp, /* 1 */ $this->ag_title, /* 2 */ $this->dt_id, /* 3 */ $this->f_id_dest, /* 4 */ $this->ag_state, /* 5 */ $this->ag_id, /* 6 */ $this->ag_hour, /* 7 */ $this->ag_priority, /* 8 */ $this->ag_dest, /* 9 */ $contact->id, /* 10 */ $this->ag_ref, /* 11 */ $this->ag_remind_date /* 12 */ )); } else { $this->db->exec_sql("update action_gestion set ". " ag_timestamp=to_date($1,'DD.MM.YYYY'),". " ag_title=$2,". " ag_type=$3, ". " f_id_dest=$4, ". "ag_state=$5,". " ag_hour = $7 ,". " ag_priority = $8 ,". " ag_dest = $9 , ". " ag_contact = $10, ". " ag_ref = $11, ". " ag_remind_date=null ". " where ag_id = $6", array( $this->ag_timestamp, /* 1 */ $this->ag_title, /* 2 */ $this->dt_id, /* 3 */ $this->f_id_dest, /* 4 */ $this->ag_state, /* 5 */ $this->ag_id, /* 6 */ $this->ag_hour, /* 7 */ $this->ag_priority, /* 8 */ $this->ag_dest, /* 9 */ $contact->id, /* 10 */ $this->ag_ref /* 11 */ )); } // Upload documents $doc=new Document($this->db); $doc->Upload($this->ag_id); /* save action details */ for ($i=0; $i<$_POST['nb_item']; $i++) { $act=new Follow_Up_Detail($this->db); $act->from_array($_POST, $i); if ($act->f_id==0&&$act->ad_id!=0) $act->delete(); if ($act->f_id==0) continue; $act->save(); } if (trim($this->ag_comment)!='') { $this->db->exec_sql("insert into action_gestion_comment (ag_id,tech_user,agc_comment) values ($1,$2,$3)" , array($this->ag_id, $_SESSION['g_user'], $this->ag_comment)); } $this->insert_operation(); $this->insert_action(); return true; } /** * \brief generate the document and add it to the action * \param md_id is the id of the document_modele * \param $p_array contains normally the $_POST */ function generate_document($md_id, $p_array) { $doc=new Document($this->db); $mod=new Document_Modele($this->db, $md_id); $mod->load(); $doc->f_id=$this->f_id_dest; $doc->md_id=$md_id; $doc->ag_id=$this->ag_id; $doc->Generate($p_array,$this->ag_id); } /** * \brief put an array in the variable member, the indice * is the member name * \param $p_array to parse * - ag_id id of the Follow_up * - ag_ref reference of the action * - qcode_dest quick_code of the card of dest * - f_id_dest f_id of the card of dest * - dt_id Document_Modele::dt_id * - ag_state document_state::s_id (default:2) * - ag_title title of the action * - ag_hour * - ag_dest Profile, profile of the user * - ag_comment comment * - ag_remind_date Remind Date * - operation related operation * - action related action * - op deprecated * \return nothing */ function fromArray($p_array) { global $g_user; $this->ag_id=(isset($p_array['ag_id']))?$p_array['ag_id']:0; $this->ag_ref=(isset($p_array['ag_ref']))?$p_array['ag_ref']:""; $this->qcode_dest=(isset($p_array['qcode_dest']))?$p_array['qcode_dest']:""; $this->f_id_dest=(isset($p_array['f_id_dest']))?$p_array['f_id_dest']:null; $this->ag_timestamp=(isset($p_array['ag_timestamp']))?$p_array['ag_timestamp']:date('d.m.Y'); $this->qcode_dest=(isset($p_array['qcode_dest']))?$p_array['qcode_dest']:""; $this->dt_id=(isset($p_array['dt_id']))?$p_array['dt_id']:""; $this->ag_state=(isset($p_array['ag_state']))?$p_array['ag_state']:2; $this->ag_ref=(isset($p_array['ag_ref']))?$p_array['ag_ref']:""; $this->ag_title=(isset($p_array['ag_title']))?$p_array['ag_title']:""; $this->ag_hour=(isset($p_array['ag_hour']))?$p_array['ag_hour']:""; $this->ag_dest=(isset($p_array['ag_dest']))?$p_array['ag_dest']:$g_user->get_profile(); $this->ag_priority=(isset($p_array['ag_priority']))?$p_array['ag_priority']:2; $this->ag_contact=(isset($p_array['ag_contact']))?$p_array['ag_contact']:""; $this->ag_comment=(isset($p_array['ag_comment']))?$p_array['ag_comment']:""; $this->ag_remind_date=(isset($p_array['ag_remind_date']))?$p_array['ag_remind_date']:null; $this->operation=(isset($p_array['operation']))?$p_array['operation']:null; /** * @todo * deprecated : to remove $this->op = (isset($p_array['op'])) ? $p_array['op'] : null; */ $this->action=(isset($p_array['action']))?$p_array['action']:null; } /** * \brief remove the action * */ function remove() { $this->get(); // remove the key $sql="delete from action_gestion where ag_id=$1"; $this->db->exec_sql($sql, array($this->ag_id)); /* check the number of attached document */ $doc=new Document($this->db); $aDoc=$doc->get_all($this->ag_id); if (!empty($aDoc)) { // if there are documents for ($i=0; $iremove(); } } } /** * \brief return the last p_limit operation into an array, there is a security * on user * \param $p_limit is the max of operation to return * \return $p_array of Follow_Up object */ function get_last($p_limit) { $sql="select coalesce(vw_name,'Interne') as vw_name,ag_hour,quick_code,ag_id,ag_title,ag_ref, dt_value,to_char(ag_timestamp,'DD.MM.YYYY') as ag_timestamp_fmt,ag_timestamp ". " from action_gestion join document_type ". " on (ag_type=dt_id) " . "left join vw_fiche_attr on (f_id=f_id_dest) " . "where ag_state in (2,3) " . "and ".self::sql_security_filter($this->db,'R'). "order by ag_timestamp desc limit $p_limit"; $array=$this->db->get_array($sql); return $array; } /** * get the action where the remind day is today * @return array */ function get_today() { $sql="select ag_ref,ag_hour,coalesce(vw_name,'Interne') as vw_name,ag_id,ag_title,ag_ref, dt_value,to_char(ag_remind_date,'DD.MM.YYYY') as ag_timestamp_fmt,ag_timestamp ". " from action_gestion join document_type ". " on (ag_type=dt_id) left join vw_fiche_attr on (f_id=f_id_dest) where ag_state not in (1,4) and to_char(ag_remind_date,'DDMMYYYY')=to_char(now(),'DDMMYYYY') and ". self::sql_security_filter($this->db,'R'); $array=$this->db->get_array($sql); return $array; } /** * get the action where the remind day is today * @return array */ function get_late() { $sql="select ag_ref,ag_hour,coalesce(vw_name,'Interne') as vw_name,ag_id,ag_title,ag_ref, dt_value,to_char(ag_remind_date,'DD.MM.YYYY') as ag_timestamp_fmt,ag_timestamp ". " from action_gestion join document_type ". " on (ag_type=dt_id) left join vw_fiche_attr on (f_id=f_id_dest) where ag_state not in (1,4) and to_char(ag_remind_date,'YYMMDD') < to_char(now(),'YYMMDD') and ".self::sql_security_filter($this->db,'R'); $array=$this->db->get_array($sql); return $array; } /** * insert a related operation */ function insert_operation() { if (trim($this->operation)=='') return; $array=explode(",", $this->operation); for ($i=0; $idb->get_value("select count(*) from action_gestion_operation where ag_id=$1 and jr_id=$2", array($this->ag_id, $array[$i]))==0) { $this->db->exec_sql("insert into action_gestion_operation (ag_id,jr_id) values ($1,$2)", array($this->ag_id, $array[$i])); } } } /** * remove a related operation * @deprecated not used : dead_code * @todo to remove */ function remove_operation_deprecated() { if ($this->op==null) return; $op=$this->op; for ($i=0; $idb->exec_sql("delete from action_gestion_operation where ago_id=$1", array($op[$i])); } } /** * Display only a search box for searching an action * @param $cn database connx * @param $inner true if coming from an ajax (ajax_search_action) */ static function display_search($cn, $inner=false) { global $g_user; $http=new HttpInput(); $a=$http->get("action_query","string",""); $qcode=$http->get("qcode","string",""); $supl_hidden=HtmlInput::array_to_hidden(['sc','sb','ac'], $_REQUEST); if (isset($_REQUEST['f_id'])) { $f_id=$http->request('f_id','number'); $supl_hidden.=HtmlInput::hidden('f_id', $f_id); $f=new Fiche($cn, $f_id); $supl_hidden.=HtmlInput::hidden('qcode_dest', $f->get_quick_code()); } /** * Show the default button (add action, show search...) */ if (!$inner) require_once NOALYSS_TEMPLATE.'/action_button.php'; $w=new ICard(); if ( $inner ) $w->autocomplete=0; $w->name='qcode'; $w->id=$w->generate_id($w->name); $w->value=$qcode; $w->extra="all"; $w->typecard='all'; $w->jrn=0; $w->table=0; $list=$cn->make_list("select fd_id from fiche_def where frd_id in (4,8,9,14,15,16,25)"); $w->extra=$list; /* type of documents */ $type_doc=new ISelect('tdoc'); $aTDoc=$cn->make_array('select dt_id,dt_value from document_type order by dt_value'); $aTDoc[]=array('value'=>'-1', 'label'=>_('Tous les types')); $type_doc->value=$aTDoc; $type_doc->selected=(isset($_GET['tdoc']))?$_GET['tdoc']:-1; /* State of documents */ $type_state=new ISelect('state'); $aState=$cn->make_array('select s_id,s_value from document_state order by s_value'); $aState[]=array('value'=>'-1', 'label'=>_('Tous les Etats')); $type_state->value=$aState; $type_state->selected=(isset($_GET['state']))?$_GET['state']:-1; /* Except State of documents */ $hsExcptype_state=new ISelect('hsstate'); $aExcpState=$cn->make_array('select s_id,s_value from document_state order by s_value'); $aExcpState[]=array('value'=>'-1', 'label'=>_('Aucun')); $hsExcptype_state->value=$aExcpState; $hsExcptype_state->selected=(isset($_GET['hsstate']))?$_GET['hsstate']:-1; // date $start=new IDate('date_start'); $start->value=(isset($_GET['date_start']))?$_GET['date_start']:""; $end=new IDate('date_end'); $end->value=(isset($_GET['date_end']))?$_GET['date_end']:""; // Closed action $closed_action=new ICheckBox('closed_action'); $closed_action->selected=(isset($_GET['closed_action']))?true:false; // Internal $only_internal=new ICheckBox('only_internal'); $only_internal->selected=(isset($_GET['only_internal']))?true:false; // select profile $aAg_dest=$cn->make_array("select p_id as value, ". "p_name as label ". " from profile where p_id in ". $g_user->get_readable_profile(). "order by 2"); $aAg_dest[]=array('value'=>'-2', 'label'=>_('Tous les profiles')); $ag_dest=new ISelect(); $ag_dest->name="ag_dest_query"; $ag_dest->value=$aAg_dest; $ag_dest->selected=(isset($_GET["ag_dest_query"]))?$_GET["ag_dest_query"]:-2; $str_ag_dest=$ag_dest->input(); $osag_ref=new IText("sag_ref"); $osag_ref->value=(isset($_GET['sag_ref']))?$_GET['sag_ref']:""; $remind_date=new IDate('remind_date'); $remind_date->value=(isset($_GET['remind_date']))?$_GET['remind_date']:""; $remind_date_end=new IDate('remind_date_end'); $remind_date_end->value=(isset($_GET['remind_date_end']))?$_GET['remind_date_end']:""; $otag=new Tag($cn); // show the action in require_once NOALYSS_TEMPLATE.'/action_search.php'; } /** * @brief show a list of documents * @param $cn database connextion * @param $p_base base URL */ static function show_action_list($cn, $p_base) { Follow_Up::display_search($cn); $act=new Follow_Up($cn); /** \brief * \note The field 'recherche' is about a part of the title or a ref. number */ $query=Follow_Up::create_query($cn); echo '
    '; echo HtmlInput::request_to_hidden(array("gDossier", "ac", "sb", "sc", "f_id")); require_once NOALYSS_TEMPLATE.'/action_other_action.php'; echo $act->myList($p_base, "", $query); echo '
    '; } /** * Create a subquery to filter thanks the selected tag * @param $cn db connx * @param $p_array * @return SQL */ static function filter_by_tag($cn, $p_array=null) { if ($p_array==null) $p_array=$_GET; $query=""; if (count($p_array['searchtag'])==0) return ""; for ($i=0; $iget_by_qcode($_REQUEST['qcode']); // if quick code not found then nothing if ($fiche->id==0) $str=' and false '; else $str=" and (f_id_dest= ".$fiche->id." or ag_id in (select ag_id from action_person as ap where ap.f_id=".$fiche->id.") )"; } } if (isset($p_array['tdoc'])&&$p_array['tdoc'] !=-1) { $action_query .= ' and dt_id = '.sql_string($p_array['tdoc']); } if (isset($p_array['state'])&&$p_array['state'] !=-1) { $action_query .= ' and ag_state= '.sql_string($p_array['state']); } if (isset($p_array['hsstate'])&&$p_array['hsstate']!=-1) { $action_query .= ' and ag_state <> '.sql_string($p_array['hsstate']); } if (isset($p_array['sag_ref'])&&trim($p_array['sag_ref'])!="") { $action_query .= " and ag_ref= '".sql_string($p_array['sag_ref'])."'"; } if (isset($_GET['only_internal'])) $action_query .= ' and f_id_dest=0 '; if (isset($p_array['date_start'])&&isDate($p_array['date_start'])!=null) { $action_query.=" and ag_timestamp >= to_date('".$p_array['date_start']."','DD.MM.YYYY')"; } if (isset($p_array['date_end'])&&isDate($p_array['date_end'])!=null) { $action_query.=" and ag_timestamp <= to_date('".$p_array['date_end']."','DD.MM.YYYY')"; } if (isset($p_array['ag_dest_query'])&&$p_array['ag_dest_query']!=-2) { $action_query.= " and ((ag_dest = ".sql_string($p_array['ag_dest_query'])." and ".self::sql_security_filter($cn, "R").") or ". "(ag_dest = ".sql_string($p_array['ag_dest_query'])." and ".self::sql_security_filter($cn, "R")." and ". " ag_owner='".$_SESSION['g_user']."'))"; } else { $action_query .=" and (ag_owner='".$_SESSION['g_user']."' or ".self::sql_security_filter($cn, "R")." or ag_dest=-1 )"; } if (isset ($p_array['ag_id']) && isNumber($p_array['ag_id'])==1&&$p_array['ag_id']!=0) { $action_query=" and ag_id= ".sql_string($p_array['ag_id']); } if (isset($p_array['$remind_date'])&&$p_array['remind_date']!=""&&isDate($p_array['remind_date'])==$p_array['remind_date']) { $action_query .= " and to_date('".sql_string($p_array['$remind_date'])."','DD.MM.YYYY')<= ag_remind_date"; } if (isset($p_array['remind_date_end'])&&$p_array['remind_date_end']!=""&&isDate($p_array['$remind_date_end'])==$p_array['remind_date_end']) { $action_query .= " and to_date('".sql_string($p_array['remind_date_end'])."','DD.MM.YYYY')>= ag_remind_date"; } if (!isset($p_array['closed_action'])) { $action_query.=" and s_status is null "; } if (isset($p_array['searchtag'])) { $action_query .= Follow_Up::filter_by_tag($cn, $p_array); } return $action_query.$str; } /** * Show the result of a search in an inner windows, the result is limited to 25 * @param type $cn database connx * @param type $p_sql the query */ static function short_list($cn, $p_sql) { $sql=" select ag_id,to_char(ag_timestamp,'DD.MM.YY') as my_date, f_id_dest, substr(ag_title,1,40) as sub_ag_title,dt_value,ag_ref, ag_priority,ag_state, coalesce((select p_name from profile where p_id=ag_dest),'Aucun groupe') as dest, (select ad_value from fiche_Detail where f_id=action_gestion.f_id_dest and ad_id=1) as name from action_gestion join document_type on (ag_type=dt_id) join document_state on (s_id=ag_state) where $p_sql"; $max_line=$cn->count_sql($sql); $limit=($max_line>25)?25:$max_line; $Res=$cn->exec_sql($sql."limit ".$limit); $a_row=Database::fetch_all($Res); require_once NOALYSS_TEMPLATE.'/action_search_result.php'; } /** * Insert a related action into the table action_gestion_related */ function insert_action() { if (trim($this->action)=='') return; $array=explode(",", $this->action); for ($i=0; $iag_id == $array[$i]) { continue; } if ($this->db->get_value("select count(*) from action_gestion_related where (aga_least=$1 and aga_greatest=$2) or (aga_greatest=$1 and aga_least=$2)", array($array[$i], $this->ag_id))==0) { $this->db->exec_sql("insert into action_gestion_related(aga_least,aga_greatest) values ($1,$2)", array($this->ag_id, $array[$i])); } } } /** * export to CSV the query the p_array has * @param array $p_array */ function export_csv($p_array) { $p_search=self::create_query($this->db, $p_array); $sql=" select ag_id, to_char(ag_timestamp,'DD.MM.YYYY') as my_date, to_char(ag_remind_date,'DD.MM.YYYY') as my_remind, to_char(coalesce((select max(agc_date) from action_gestion_comment as agc where agc.ag_id=ag_id),ag_timestamp),'DD.MM.YY') as last_comment, array_to_string((select array_agg(t1.t_tag) from action_tags as a1 join tags as t1 on (a1.t_id=t1.t_id) where a1.ag_id=ag.ag_id ),',') as tags, (select ad_value from fiche_Detail where f_id=ag.f_id_dest and ad_id=1) as name, ag_title, dt_value, ag_ref, ag_priority, ag_state, coalesce((select p_name from profile where p_id=ag_dest),'Aucun groupe') as dest from action_gestion as ag join document_type on (ag.ag_type=dt_id) join document_state on(ag.ag_state=s_id) where true $p_search order by ag.ag_timestamp,ag.ag_id"; $ret=$this->db->exec_sql($sql); if (Database::num_row($ret)==0) return; $this->db->query_to_csv($ret, array( array("title"=>"doc id", "type"=>"string"), array("title"=>"date", "type"=>"date"), array("title"=>"rappel", "type"=>"date"), array("title"=>"date dernier commentaire", "type"=>"date"), array("title"=>"tags", "type"=>"string"), array("title"=>"nom", "type"=>"string"), array("title"=>"titre", "type"=>"string"), array("title"=>"type document", "type"=>"string"), array("title"=>"ref", "type"=>"string"), array("title"=>"priorite", "type"=>"string"), array("title"=>"etat", "type"=>"string"), array("title"=>"profil", "type"=>"string") ) ); } static function get_all_operation($p_jr_id) { global $cn; $array=$cn->get_array(" select ag_id,ag_ref,ago_id, ag_title from action_gestion join action_gestion_operation using(ag_id) where jr_id=$1", array($p_jr_id)); return $array; } /** * @brief get the tags of the current objet * @return an array idx [ag_id,t_id,at_id,t_tag] */ function tag_get() { if ($this->ag_id==0) return; $sql='select b.ag_id,b.t_id,b.at_id,a.t_tag' .' from ' .' tags as a join action_tags as b on (a.t_id=b.t_id)' .' where ag_id=$1 ' .' order by a.t_tag'; $array=$this->db->get_array($sql, array($this->ag_id)); return $array; } /** * @brief show the tags of the current objet * normally used by ajax. The same tag cannot be added twice * */ function tag_add($p_t_id) { if ($this->ag_id==0) return; $count=$this->db->get_value('select count(*) from action_tags'. ' where ag_id=$1 and t_id=$2', array($this->ag_id, $p_t_id)); if ($count>0) return; $sql=' insert into action_tags (ag_id,t_id) values ($1,$2)'; $this->db->exec_sql($sql, array($this->ag_id, $p_t_id)); } /** * @brief remove the tags of the current objet * normally used by ajax */ function tag_remove($p_t_id) { if ($this->ag_id==0) return; $sql=' delete from action_tags where ag_id=$1 and t_id=$2'; $this->db->exec_sql($sql, array($this->ag_id, $p_t_id)); } /** * @brief show the cell content in Display for the tags * called also by ajax */ function tag_cell() { global $g_user; $a_tag=$this->tag_get(); $c=count($a_tag); for ($e=0; $e<$c; $e++) { echo ''; echo $a_tag[$e]['t_tag']; if ($g_user->can_write_action($this->ag_id)==true) { $js_remove=sprintf("onclick=\"action_tag_remove('%s','%s','%s')\"", dossier::id(), $this->ag_id, $a_tag[$e]['t_id']); echo HtmlInput::anchor(SMALLX, "javascript:void(0)", $js_remove, ' class="smallbutton" style="padding:0px;display:inline" '); } echo ''; echo ' '; echo ' '; } $js=sprintf("onclick=\"action_tag_select('%s','%s')\"", dossier::id(), $this->ag_id); if ($g_user->can_write_action($this->ag_id)==true) { echo HtmlInput::button('tag_bt', 'Ajout tag', $js, 'smallbutton'); } } static function action_tag_remove($cn, $p_array) { global $g_user; $mag_id=$p_array['mag_id']; $remtag=$p_array['remtag']; for ($i=0; $ican_write_action($mag_id[$i])==false) continue; for ($e=0; $etag_remove($remtag[$e]); } } } static function action_tag_add($cn, $p_array) { global $g_user; $mag_id=$p_array['mag_id']; $addtag=$p_array['addtag']; for ($i=0; $ican_write_action($mag_id[$i])==false) continue; for ($e=0; $etag_add($addtag[$e]); } } } static function action_tag_clear($cn, $p_array) { global $g_user; $mag_id=$p_array['mag_id']; for ($i=0; $ican_write_action($mag_id[$i])==false) continue; $a=new Follow_Up($cn, $mag_id[$i]); $a->tag_clear(); } } static function action_print($cn, $p_array) { global $g_user; $mag_id=$p_array['mag_id']; for ($i=0; $ican_read_action($mag_id[$i])==false) continue; $a=new Follow_Up($cn, $mag_id[$i]); $a->get(); echo '
    '; echo $a->Display("READ", false, ""); echo '
    '; echo '

    - -

    '; } } function tag_clear() { $this->db->exec_sql('delete from action_tags where ag_id=$1', array($this->ag_id)); } static function action_set_state($cn, $p_array) { global $g_user; $mag_id=$p_array['mag_id']; $state=$p_array['ag_state']; for ($i=0; $ican_write_action($mag_id[$i])==false) continue; $cn->exec_sql('update action_gestion set ag_state=$1 where ag_id=$2', array($state, $mag_id[$i])); } } static function action_remove($cn, $p_array) { global $g_user; $mag_id=$p_array['mag_id']; for ($i=0; $ican_write_action($mag_id[$i])==false) continue; $cn->exec_sql('delete from action_gestion where ag_id=$1', array($mag_id[$i])); } } /** * Verify that data are correct * @throws Exception */ function verify() { if ($this->dt_id==-1) { throw new Exception(_('Type action invalide'), 10); } if (isDate($this->ag_timestamp)!=$this->ag_timestamp) throw new Exception(_('Date invalide'), 20); if (isDate($this->ag_remind_date)!=$this->ag_remind_date) throw new Exception(_('Date invalide'), 30); if ($this->f_id_dest==0) $this->f_id_dest=null; } /** * Add another concerned (tiers, supplier...) * @remark type $g_user * @param type $p_fiche_id */ function insert_linked_card($p_fiche_id) { global $g_user; if ($g_user->can_write_action($this->ag_id)) { /** * insert into action_person */ $count=$this->db->get_value('select count(*) from action_person where f_id=$1 and ag_id=$2', array($p_fiche_id, $this->ag_id)); if ($count==0) { $this->db->exec_sql('insert into action_person (ag_id,f_id) values ($1,$2)', array($this->ag_id, $p_fiche_id)); } } } /** * Remove another concerned (tiers, supplier...) * @remark type $g_user * @param type $p_fiche_id */ function remove_linked_card($p_fiche_id) { global $g_user; if ($g_user->can_write_action($this->ag_id)) { $this->db->exec_sql('delete from action_person where ag_id = $1 and f_id = $2', array($this->ag_id, $p_fiche_id)); } } /** * Display the other concerned (tiers, supplier...) * @return string */ function display_linked() { $a_linked=$this->db->get_array('select ap_id,f_id from action_person where ag_id=$1', array($this->ag_id)); if (count($a_linked)==0) return ""; for ($i=0; $idb, $a_linked[$i]['f_id']); $qc=$fiche->get_quick_code(); $js_remove=sprintf("onclick=\"action_remove_concerned('%s','%s','%s')\"", dossier::id(), $a_linked[$i]['f_id'], $this->ag_id); echo ''; echo $qc; echo HtmlInput::anchor(SMALLX, "javascript:void(0)", $js_remove, ' class="smallbutton" style="padding:0px;display:inline" '); echo ''; echo ' '; echo ' '; } } /** * @brief display a small form to enter a new event * */ function display_short() { $cn=$this->db; include NOALYSS_TEMPLATE.'/action_display_short.php'; } /** * Add an event , with the minimum of informations, * used in Dashboard and Scheduler */ function save_short() { global $g_user; // check if we can add if ($g_user->can_add_action($this->ag_dest) == FALSE ) { throw new Exception(_('SECURITE : Ajout impossible')); } // Get The sequence id, $seq_name="seq_doc_type_".$this->dt_id; $str_file=""; $add_file=''; $this->ag_id=$this->db->get_next_seq('action_gestion_ag_id_seq'); // Create the reference $ag_ref=$this->db->get_value('select dt_prefix from document_type ' . 'where dt_id=$1', array($this->dt_id)) .'-'.$this->db->get_next_seq($seq_name); $this->ag_ref=$ag_ref; /** * If ag_ref already exist then compute a new one */ // save into the database $sql="insert into action_gestion". "(ag_id,ag_timestamp,ag_type,ag_title,f_id_dest,ag_ref, " . "ag_dest, ". " ag_priority,ag_owner,ag_state,ag_remind_date,ag_hour) ". " values " . "($1,to_date($2,'DD.MM.YYYY'),$3,$4,$5,$6," . "$7," . "$8,$9,$10,to_date($11,'DD.MM.YYYY'),$12)"; $this->db->exec_sql($sql, array( $this->ag_id, /* 1 */ $this->ag_timestamp, /* 2 */ $this->dt_id, /* 3 */ $this->ag_title, /* 4 */ $this->f_id_dest, /* 5 */ $ag_ref, /* 6 */ $this->ag_dest, /* 7 */ $this->ag_priority, /* 8 */ $_SESSION['g_user'], /* 9 */ $this->ag_state, /* 10 */ $this->ag_remind_date, /* 11 */ $this->ag_hour /* 12 */ ) ); if (trim($this->ag_comment)!='') { $this->db->exec_sql("insert into action_gestion_comment (ag_id,tech_user,agc_comment) values ($1,$2,$3)" , array($this->ag_id, $_SESSION['g_user'], $this->ag_comment)); } } /** * Return the first parent of the event tree, or -1 if not found * @return integer (ag_id) */ function get_parent() { $value=$this->db->get_array(' with recursive t (aga_least,aga_greatest,depth) as ( select aga_least,aga_greatest , 1 from action_gestion_related where aga_greatest=$1 union all select p2.aga_least,p2.aga_greatest,depth + 1 from t as p1, action_gestion_related as p2 where p2.aga_greatest is not null and p2.aga_greatest = p1.aga_least ) select * from t order by depth desc limit 1 ' , array($this->ag_id) ); if ( ! empty($value ) ) return $value[0]['aga_least']; else return -1; } /** * Compute an array of the complete tree depending of $p_id * @param $p_id ag_id * @return array * key index : * - uniq value , path * - aga_least * - aga_greatest * - depth */ function get_children($p_id) { // retrieve parent // Get information $sql = "with recursive t (key_path, aga_least,aga_greatest,depth) as ( select aga_least::text||'-'||aga_greatest::text as key_path , aga_least,aga_greatest , 1 from action_gestion_related where aga_least=$1 union all select key_path||'-'||p2.aga_greatest::text, p2.aga_least,p2.aga_greatest,depth + 1 from t as p1, action_gestion_related as p2 where p1.aga_greatest is not null and p1.aga_greatest = p2.aga_least ) select key_path,aga_greatest,ag_title as title,depth ,to_char(ag_timestamp,'DD/MM/YY') as str_date,ag_ref||' '||dt_value as action_ref from action_gestion join t on (ag_id=aga_greatest) join document_type on (ag_type=dt_id) order by key_path "; $ret_array=$this->db->get_array($sql,array($p_id)); // Empty returns if ( empty($ret_array)) return array(); return $ret_array; } /** * Display the tree of childrens of the current Action + related parents * @return return the tree of children in a unordered list , HTML string */ function display_children($p_view, $p_base) { /** * First we retrieve the parent */ $parent=$this->get_parent(); $base=HtmlInput::request_to_string(array("gDossier", "ac", "sa", "sb", "sc", "f_id")); $parent=$this->get_parent(); if ($parent==-1) { echo _('Principal'); $parent = $this->ag_id; } else { $fu_parent=new Follow_Up($this->db, $parent); $fu_parent->get(); echo''; $xaction=sprintf('view_action(%d,%d,%d)', $fu_parent->ag_id, Dossier::id(), 1); $showAction='
    '; echo $showAction. $fu_parent->ag_timestamp," ", h($fu_parent->ag_title), '('.h($fu_parent->ag_ref).')', ''; echo ""; } echo ''; } /** * Display the list of parent of the current Follow_Up * \param $p_view form will be in readonly mode (value: READ, UPD or NEW ) * \param $p_base is the ac parameter * \see Follow_Up::Display * \return None display the HTML list */ function display_parent($p_view,$p_base) { $a_parent=$this->db->get_array( " select ag_id,ag_title as title ,to_char(ag_timestamp,'DD/MM/YY') as str_date,ag_ref||' '||dt_value as action_ref from action_gestion join document_type on (ag_type=dt_id) where ag_id in (select aga_least from action_gestion_related where aga_greatest = $1) order by ag_id ", array($this->ag_id) ); if ( empty($a_parent ) ) return; echo ''; } }