From c721d9362c671744a31d62e438602a2040f60d4f Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 6 May 2011 08:28:28 +0000 Subject: [PATCH] Fix: prevent to fault positive --- htdocs/core/class/commonobject.class.php | 73 ++++++++++++++++++- .../livraison/pdf/pdf_sirocco.modules.php | 46 ++++++------ .../livraison/pdf/pdf_typhon.modules.php | 28 ++++--- 3 files changed, 107 insertions(+), 40 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 1d0420f3a09..1a14c12a510 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -1156,11 +1156,17 @@ class CommonObject * @param sourcetype * @param targetid * @param targettype - * @param clause + * @param clause OR, AND */ function load_object_linked($sourceid='',$sourcetype='',$targetid='',$targettype='',$clause='OR') { $this->linked_object=array(); + + $justsource=false; + $justtarget=false; + + if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $justsource=true; + if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $justtarget=true; $sourceid = (!empty($sourceid)?$sourceid:$this->id); $targetid = (!empty($targetid)?$targetid:$this->id); @@ -1170,9 +1176,18 @@ class CommonObject // Links beetween objects are stored in this table $sql = 'SELECT fk_source, sourcetype, fk_target, targettype'; $sql.= ' FROM '.MAIN_DB_PREFIX.'element_element'; - $sql.= " WHERE (fk_source = '".$sourceid."' AND sourcetype = '".$sourcetype."')"; - $sql.= " ".$clause." (fk_target = '".$targetid."' AND targettype = '".$targettype."')"; - + $sql.= " WHERE "; + if ($justsource || $justtarget) + { + if ($justsource) $sql.= "fk_source = '".$sourceid."' AND sourcetype = '".$sourcetype."'"; + if ($justtarget) $sql.= "fk_target = '".$targetid."' AND targettype = '".$targettype."'"; + } + else + { + $sql.= "(fk_source = '".$sourceid."' AND sourcetype = '".$sourcetype."')"; + $sql.= " ".$clause." (fk_target = '".$targetid."' AND targettype = '".$targettype."')"; + } + dol_syslog("CommonObject::load_object_linked sql=".$sql); $resql = $this->db->query($sql); if ($resql) @@ -1199,6 +1214,56 @@ class CommonObject } } + /** + * Fetch objects linked + */ + function fetch_object_linked($sourceid='',$sourcetype='',$targetid='',$targettype='',$clause='OR') + { + global $conf; + + $this->linkedObjects=array(); + + $this->load_object_linked($sourceid,$sourcetype,$targetid,$targettype,$clause); + + foreach($this->linked_object as $key => $value) + { + // Parse element/subelement (ex: project_task) + $element = $subelement = $key; + if (preg_match('/^([^_]+)_([^_]+)/i',$key,$regs)) + { + $element = $regs[1]; + $subelement = $regs[2]; + } + + // For compatibility + if ($element == 'facture') { $element = 'compta/facture'; $subelement = 'facture'; } + if ($element == 'order' || $element == 'commande') { $element = $subelement = 'commande'; } + if ($element == 'propal') { $element = 'comm/propal'; $subelement = 'propal'; } + if ($element == 'contract') { $element = $subelement = 'contrat'; } + if ($element == 'shipping') { $element = $subelement = 'expedition'; } + if ($element == 'delivery') { $element = $subelement = 'livraison'; } + + if ($conf->$element->enabled) + { + dol_include_once('/'.$element.'/class/'.$subelement.'.class.php'); + + $classname = ucfirst($subelement); + + $num=sizeof($value); + + for ($i=0;$i<$num;$i++) + { + $object = new $classname($this->db); + $ret = $object->fetch($value[$i]); + if ($ret >= 0) + { + $this->linkedObjects[$key][$i] = $object; + } + } + } + } + } + /** * Set statut of an object * @param statut Statut to set diff --git a/htdocs/includes/modules/livraison/pdf/pdf_sirocco.modules.php b/htdocs/includes/modules/livraison/pdf/pdf_sirocco.modules.php index 00eaf2f5693..17cab6b2bd2 100644 --- a/htdocs/includes/modules/livraison/pdf/pdf_sirocco.modules.php +++ b/htdocs/includes/modules/livraison/pdf/pdf_sirocco.modules.php @@ -418,36 +418,34 @@ class pdf_sirocco extends ModelePDFDeliveryOrder $pdf->SetFont('','B', $default_font_size - 1); - // Add list of linked orders - // TODO mutualiser - $object->load_object_linked(); + // Add origin linked objects + // TODO extend to other objects + $object->fetch_object_linked('','',$object->id,'delivery'); - if ($conf->commande->enabled) + if (! empty($object->linkedObjects)) { $outputlangs->load('orders'); - foreach($object->linked_object as $key => $val) + + foreach($object->linkedObjects as $elementtype => $objects) { - if ($key == 'shipping') // Link to shipment + $object->fetch_object_linked('','',$objects[0]->id,$objects[0]->element); + + foreach($object->linkedObjects as $elementtype => $objects) { - for ($i = 0; $idb); - $result=$newtmp->fetch($val[$i]); - - if (($newtmp->origin=='commande' || $newtmp->origin=='order') && $newtmp->origin_id) - { - $newobject=new Commande($this->db); - $result=$newobject->fetch($newtmp->origin_id); - if ($result >= 0) - { - $posy+=7; - $pdf->SetXY($this->page_largeur - $this->marge_droite - 100,$posy); - $pdf->SetFont('','', $default_font_size - 1); - $text=$newobject->ref; - if ($newobject->ref_client) $text.=' ('.$newobject->ref_client.')'; - $pdf->MultiCell(100, 4, $outputlangs->transnoentities("RefOrder")." : ".$outputlangs->transnoentities($text), '', 'R'); - } - } + $order=new Commande($this->db); + $result=$order->fetch($objects[$i]->id); + if ($result >= 0) + { + $posy+=5; + $pdf->SetXY(100,$posy); + $pdf->SetFont('','', $default_font_size - 1); + $text=$order->ref; + if ($order->ref_client) $text.=' ('.$order->ref_client.')'; + $pdf->MultiCell(100, 4, $outputlangs->transnoentities("RefOrder")." : ".$outputlangs->transnoentities($text), '', 'R'); + } } } } diff --git a/htdocs/includes/modules/livraison/pdf/pdf_typhon.modules.php b/htdocs/includes/modules/livraison/pdf/pdf_typhon.modules.php index 2593c13d944..35cb1029295 100644 --- a/htdocs/includes/modules/livraison/pdf/pdf_typhon.modules.php +++ b/htdocs/includes/modules/livraison/pdf/pdf_typhon.modules.php @@ -547,28 +547,32 @@ class pdf_typhon extends ModelePDFDeliveryOrder $pdf->SetTextColor(0,0,60); - // Add list of linked orders - // TODO mutualiser - $object->load_object_linked(); + // Add origin linked objects + // TODO extend to other objects + $object->fetch_object_linked('','',$object->id,'delivery'); - if ($conf->commande->enabled) + if (! empty($object->linkedObjects)) { $outputlangs->load('orders'); - foreach($object->linked_object as $key => $val) + + foreach($object->linkedObjects as $elementtype => $objects) { - if ($key == 'commande' || $key == 'order') + $object->fetch_object_linked('','',$objects[0]->id,$objects[0]->element); + + foreach($object->linkedObjects as $elementtype => $objects) { - for ($i = 0; $idb); - $result=$newobject->fetch($val[$i]); + $order=new Commande($this->db); + $result=$order->fetch($objects[$i]->id); if ($result >= 0) { - $posy+=4; + $posy+=5; $pdf->SetXY(100,$posy); $pdf->SetFont('','', $default_font_size - 1); - $text=$newobject->ref; - if ($newobject->ref_client) $text.=' ('.$newobject->ref_client.')'; + $text=$order->ref; + if ($order->ref_client) $text.=' ('.$order->ref_client.')'; $pdf->MultiCell(100, 4, $outputlangs->transnoentities("RefOrder")." : ".$outputlangs->transnoentities($text), '', 'R'); } }