Merge pull request #15897 from OPEN-DSI/add_triggers_on_object_link_managment

NEW : Add triggers in the function add_object_linked(), updateObjectLinked() and deleteObjectLinked()
This commit is contained in:
Laurent Destailleur 2021-01-07 10:49:06 +01:00 committed by GitHub
commit 3d2dc59468
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3257,14 +3257,18 @@ abstract class CommonObject
* *
* @param string $origin Linked element type * @param string $origin Linked element type
* @param int $origin_id Linked element id * @param int $origin_id Linked element id
* @param User $f_user User that create
* @param int $notrigger 1=Does not execute triggers, 0= execute triggers
* @return int <=0 if KO, >0 if OK * @return int <=0 if KO, >0 if OK
* @see fetchObjectLinked(), updateObjectLinked(), deleteObjectLinked() * @see fetchObjectLinked(), updateObjectLinked(), deleteObjectLinked()
*/ */
public function add_object_linked($origin = null, $origin_id = null) public function add_object_linked($origin = null, $origin_id = null, $f_user = null, $notrigger = 0)
{ {
// phpcs:enable // phpcs:enable
global $user;
$origin = (!empty($origin) ? $origin : $this->origin); $origin = (!empty($origin) ? $origin : $this->origin);
$origin_id = (!empty($origin_id) ? $origin_id : $this->origin_id); $origin_id = (!empty($origin_id) ? $origin_id : $this->origin_id);
$f_user = isset($f_user) ? $f_user : $user;
// Special case // Special case
if ($origin == 'order') $origin = 'commande'; if ($origin == 'order') $origin = 'commande';
@ -3272,26 +3276,41 @@ abstract class CommonObject
if ($origin == 'invoice_template') $origin = 'facturerec'; if ($origin == 'invoice_template') $origin = 'facturerec';
if ($origin == 'supplierorder') $origin = 'order_supplier'; if ($origin == 'supplierorder') $origin = 'order_supplier';
$this->db->begin(); $this->db->begin();
$error = 0;
$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element ("; $sql = "INSERT INTO " . MAIN_DB_PREFIX . "element_element (";
$sql .= "fk_source"; $sql .= "fk_source";
$sql .= ", sourcetype"; $sql .= ", sourcetype";
$sql .= ", fk_target"; $sql .= ", fk_target";
$sql .= ", targettype"; $sql .= ", targettype";
$sql .= ") VALUES ("; $sql .= ") VALUES (";
$sql .= $origin_id; $sql .= $origin_id;
$sql .= ", '".$this->db->escape($origin)."'"; $sql .= ", '" . $this->db->escape($origin) . "'";
$sql .= ", ".$this->id; $sql .= ", " . $this->id;
$sql .= ", '".$this->db->escape($this->element)."'"; $sql .= ", '" . $this->db->escape($this->element) . "'";
$sql .= ")"; $sql .= ")";
dol_syslog(get_class($this)."::add_object_linked", LOG_DEBUG); dol_syslog(get_class($this) . "::add_object_linked", LOG_DEBUG);
if ($this->db->query($sql)) if ($this->db->query($sql)) {
{ if (!$notrigger) {
// Call trigger
$this->context['link_origin'] = $origin;
$this->context['link_origin_id'] = $origin_id;
$result = $this->call_trigger('OBJECT_LINK_INSERT', $f_user);
if ($result < 0) {
$error++;
}
// End call triggers
}
} else {
$this->error = $this->db->lasterror();
$error++;
}
if (!$error) {
$this->db->commit(); $this->db->commit();
return 1; return 1;
} else { } else {
$this->error = $this->db->lasterror();
$this->db->rollback(); $this->db->rollback();
return 0; return 0;
} }
@ -3502,38 +3521,61 @@ abstract class CommonObject
* @param string $sourcetype Object source type * @param string $sourcetype Object source type
* @param int $targetid Object target id * @param int $targetid Object target id
* @param string $targettype Object target type * @param string $targettype Object target type
* @param User $f_user User that create
* @param int $notrigger 1=Does not execute triggers, 0= execute triggers
* @return int >0 if OK, <0 if KO * @return int >0 if OK, <0 if KO
* @see add_object_linked(), fetObjectLinked(), deleteObjectLinked() * @see add_object_linked(), fetObjectLinked(), deleteObjectLinked()
*/ */
public function updateObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '') public function updateObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $f_user = null, $notrigger = 0)
{ {
global $user;
$updatesource = false; $updatesource = false;
$updatetarget = false; $updatetarget = false;
$f_user = isset($f_user) ? $f_user : $user;
if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource = true; if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource = true;
elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $updatetarget = true; elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $updatetarget = true;
$sql = "UPDATE ".MAIN_DB_PREFIX."element_element SET "; $this->db->begin();
if ($updatesource) $error = 0;
{
$sql .= "fk_source = ".$sourceid; $sql = "UPDATE " . MAIN_DB_PREFIX . "element_element SET ";
$sql .= ", sourcetype = '".$this->db->escape($sourcetype)."'"; if ($updatesource) {
$sql .= " WHERE fk_target = ".$this->id; $sql .= "fk_source = " . $sourceid;
$sql .= " AND targettype = '".$this->db->escape($this->element)."'"; $sql .= ", sourcetype = '" . $this->db->escape($sourcetype) . "'";
} elseif ($updatetarget) $sql .= " WHERE fk_target = " . $this->id;
{ $sql .= " AND targettype = '" . $this->db->escape($this->element) . "'";
$sql .= "fk_target = ".$targetid; } elseif ($updatetarget) {
$sql .= ", targettype = '".$this->db->escape($targettype)."'"; $sql .= "fk_target = " . $targetid;
$sql .= " WHERE fk_source = ".$this->id; $sql .= ", targettype = '" . $this->db->escape($targettype) . "'";
$sql .= " AND sourcetype = '".$this->db->escape($this->element)."'"; $sql .= " WHERE fk_source = " . $this->id;
$sql .= " AND sourcetype = '" . $this->db->escape($this->element) . "'";
} }
dol_syslog(get_class($this)."::updateObjectLinked", LOG_DEBUG); dol_syslog(get_class($this) . "::updateObjectLinked", LOG_DEBUG);
if ($this->db->query($sql)) if ($this->db->query($sql)) {
{ if (!$notrigger) {
return 1; // Call trigger
$this->context['link_source_id'] = $sourceid;
$this->context['link_source_type'] = $sourcetype;
$this->context['link_target_id'] = $targetid;
$this->context['link_target_type'] = $targettype;
$result = $this->call_trigger('OBJECT_LINK_UPDATE', $f_user);
if ($result < 0) {
$error++;
}
// End call triggers
}
} else { } else {
$this->error = $this->db->lasterror(); $this->error = $this->db->lasterror();
$error++;
}
if (!$error) {
$this->db->commit();
return 1;
} else {
$this->db->rollback();
return -1; return -1;
} }
} }
@ -3546,13 +3588,17 @@ abstract class CommonObject
* @param int $targetid Object target id * @param int $targetid Object target id
* @param string $targettype Object target type * @param string $targettype Object target type
* @param int $rowid Row id of line to delete. If defined, other parameters are not used. * @param int $rowid Row id of line to delete. If defined, other parameters are not used.
* @param User $f_user User that create
* @param int $notrigger 1=Does not execute triggers, 0= execute triggers
* @return int >0 if OK, <0 if KO * @return int >0 if OK, <0 if KO
* @see add_object_linked(), updateObjectLinked(), fetchObjectLinked() * @see add_object_linked(), updateObjectLinked(), fetchObjectLinked()
*/ */
public function deleteObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $rowid = '') public function deleteObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $rowid = '', $f_user = null, $notrigger = 0)
{ {
global $user;
$deletesource = false; $deletesource = false;
$deletetarget = false; $deletetarget = false;
$f_user = isset($f_user) ? $f_user : $user;
if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource = true; if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource = true;
elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $deletetarget = true; elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $deletetarget = true;
@ -3561,36 +3607,56 @@ abstract class CommonObject
$sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element); $sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
$targetid = (!empty($targetid) ? $targetid : $this->id); $targetid = (!empty($targetid) ? $targetid : $this->id);
$targettype = (!empty($targettype) ? $targettype : $this->element); $targettype = (!empty($targettype) ? $targettype : $this->element);
$this->db->begin();
$error = 0;
$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_element"; if (!$notrigger) {
// Call trigger
$this->context['link_id'] = $rowid;
$this->context['link_source_id'] = $sourceid;
$this->context['link_source_type'] = $sourcetype;
$this->context['link_target_id'] = $targetid;
$this->context['link_target_type'] = $targettype;
$result = $this->call_trigger('OBJECT_LINK_DELETE', $f_user);
if ($result < 0) {
$error++;
}
// End call triggers
}
if (!$error) {
$sql = "DELETE FROM " . MAIN_DB_PREFIX . "element_element";
$sql .= " WHERE"; $sql .= " WHERE";
if ($rowid > 0) if ($rowid > 0) {
{ $sql .= " rowid = " . $rowid;
$sql .= " rowid = ".$rowid;
} else { } else {
if ($deletesource) if ($deletesource) {
{ $sql .= " fk_source = " . $sourceid . " AND sourcetype = '" . $this->db->escape($sourcetype) . "'";
$sql .= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'"; $sql .= " AND fk_target = " . $this->id . " AND targettype = '" . $this->db->escape($this->element) . "'";
$sql .= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'"; } elseif ($deletetarget) {
} elseif ($deletetarget) $sql .= " fk_target = " . $targetid . " AND targettype = '" . $this->db->escape($targettype) . "'";
{ $sql .= " AND fk_source = " . $this->id . " AND sourcetype = '" . $this->db->escape($this->element) . "'";
$sql .= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
$sql .= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
} else { } else {
$sql .= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')"; $sql .= " (fk_source = " . $this->id . " AND sourcetype = '" . $this->db->escape($this->element) . "')";
$sql .= " OR"; $sql .= " OR";
$sql .= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')"; $sql .= " (fk_target = " . $this->id . " AND targettype = '" . $this->db->escape($this->element) . "')";
} }
} }
dol_syslog(get_class($this)."::deleteObjectLinked", LOG_DEBUG); dol_syslog(get_class($this) . "::deleteObjectLinked", LOG_DEBUG);
if ($this->db->query($sql)) if (!$this->db->query($sql)) {
{
return 1;
} else {
$this->error = $this->db->lasterror(); $this->error = $this->db->lasterror();
$this->errors[] = $this->error; $this->errors[] = $this->error;
return -1; $error++;
}
}
if (!$error) {
$this->db->commit();
return 1;
} else {
$this->db->rollback();
return 0;
} }
} }