Merge pull request #20456 from hregis/fix_mutlicompany_sharings_compatibility

FIX multicompany sharings compatibility
This commit is contained in:
Laurent Destailleur 2022-03-29 13:56:43 +02:00 committed by GitHub
commit 5108240ed5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 64 additions and 46 deletions

View File

@ -4374,9 +4374,10 @@ abstract class CommonObject
* Check is done into this->childtables. There is no check into llx_element_element.
*
* @param int $id Force id of object
* @param int $entity Force entity to check
* @return int <0 if KO, 0 if not used, >0 if already used
*/
public function isObjectUsed($id = 0)
public function isObjectUsed($id = 0, $entity = 0)
{
global $langs;
@ -4399,11 +4400,25 @@ abstract class CommonObject
// Test if child exists
$haschild = 0;
foreach ($arraytoscan as $table => $elementname) {
foreach ($arraytoscan as $table => $element) {
//print $id.'-'.$table.'-'.$elementname.'<br>';
// Check if third party can be deleted
$sql = "SELECT COUNT(*) as nb from ".$this->db->prefix().$table;
$sql .= " WHERE ".$this->fk_element." = ".((int) $id);
// Check if element can be deleted
$sql = "SELECT COUNT(*) as nb";
$sql.= " FROM ".$this->db->prefix().$table." as c";
if (!empty($element['parent']) && !empty($element['parentkey'])) {
$sql.= ", ".$this->db->prefix().$element['parent']." as p";
}
$sql.= " WHERE c.".$this->fk_element." = ".((int) $id);
if (!empty($element['parent']) && !empty($element['parentkey'])) {
$sql.= " AND c.".$element['parentkey']." = p.rowid";
}
if (!empty($entity)) {
if (!empty($element['parent']) && !empty($element['parentkey'])) {
$sql.= " AND p.entity = ".((int) $entity);
} else {
$sql.= " AND c.entity = ".((int) $entity);
}
}
$resql = $this->db->query($sql);
if ($resql) {
$obj = $this->db->fetch_object($resql);
@ -4411,11 +4426,12 @@ abstract class CommonObject
$langs->load("errors");
//print 'Found into table '.$table.', type '.$langs->transnoentitiesnoconv($elementname).', haschild='.$haschild;
$haschild += $obj->nb;
if (is_numeric($elementname)) { // old usage
$this->errors[] = $langs->transnoentities("ErrorRecordHasAtLeastOneChildOfType", method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref, $table);
} else // new usage: $elementname=Translation key
{
$this->errors[] = $langs->transnoentities("ErrorRecordHasAtLeastOneChildOfType", method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref, $langs->transnoentitiesnoconv($elementname));
if (is_numeric($element)) { // very old usage array('table1', 'table2', ...)
$this->errors[] = $langs->transnoentitiesnoconv("ErrorRecordHasAtLeastOneChildOfType", method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref, $table);
} elseif (is_string($element)) { // old usage array('table1' => 'TranslateKey1', 'table2' => 'TranslateKey2', ...)
$this->errors[] = $langs->transnoentitiesnoconv("ErrorRecordHasAtLeastOneChildOfType", method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref, $langs->transnoentitiesnoconv($element));
} else { // new usage: $element['name']=Translation key
$this->errors[] = $langs->transnoentitiesnoconv("ErrorRecordHasAtLeastOneChildOfType", method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref, $langs->transnoentitiesnoconv($element['name']));
}
break; // We found at least one, we stop here
}

View File

@ -64,13 +64,13 @@ class Product extends CommonObject
* @var array List of child tables. To test if we can delete object.
*/
protected $childtables = array(
'supplier_proposaldet',
'propaldet',
'commandedet',
'facturedet',
'contratdet',
'facture_fourn_det',
'commande_fournisseurdet'
'supplier_proposaldet' => array('name' => 'SupplierProposal', 'parent' => 'supplier_proposal', 'parentkey' => 'fk_supplier_proposal'),
'propaldet' => array('name' => 'Proposal', 'parent' => 'propal', 'parentkey' => 'fk_propal'),
'commandedet' => array('name' => 'Order', 'parent' => 'commande', 'parentkey' => 'fk_commande'),
'facturedet' => array('name' => 'Invoice', 'parent' => 'facture', 'parentkey' => 'fk_facture'),
'contratdet' => array('name' => 'Contract', 'parent' => 'contrat', 'parentkey' => 'fk_contrat'),
'facture_fourn_det' => array('name' => 'SupplierInvoice', 'parent' => 'facture_fourn', 'parentkey' => 'fk_facture_fourn'),
'commande_fournisseurdet' => array('name' => 'SupplierOrder', 'parent' => 'commande_fournisseur', 'parentkey' => 'fk_commande')
);
/**

View File

@ -59,7 +59,9 @@ class Task extends CommonObjectLine
/**
* @var array List of child tables. To test if we can delete object.
*/
protected $childtables = array('projet_task_time');
protected $childtables = array(
'projet_task_time' => array('name' => 'Task', 'parent' => 'projet_task', 'parentkey' => 'fk_task')
);
/**
* @var int ID parent task

View File

@ -73,18 +73,18 @@ class Societe extends CommonObject
* @var array List of child tables. To test if we can delete object.
*/
protected $childtables = array(
"supplier_proposal" => 'SupplierProposal',
"propal" => 'Proposal',
"commande" => 'Order',
"facture" => 'Invoice',
"facture_rec" => 'RecurringInvoiceTemplate',
"contrat" => 'Contract',
"fichinter" => 'Fichinter',
"facture_fourn" => 'SupplierInvoice',
"commande_fournisseur" => 'SupplierOrder',
"projet" => 'Project',
"expedition" => 'Shipment',
"prelevement_lignes" => 'DirectDebitRecord',
'supplier_proposal' => array('name' => 'SupplierProposal'),
'propal' => array('name' => 'Proposal'),
'commande' => array('name' => 'Order'),
'facture' => array('name' => 'Invoice'),
'facture_rec' => array('name' => 'RecurringInvoiceTemplate'),
'contrat' => array('name' => 'Contract'),
'fichinter' => array('name' => 'Fichinter'),
'facture_fourn' => array('name' => 'SupplierInvoice'),
'commande_fournisseur' => array('name' => 'SupplierOrder'),
'projet' => array('name' => 'Project'),
'expedition' => array('name' => 'Shipment'),
'prelevement_lignes' => array('name' => 'DirectDebitRecord'),
);
/**
@ -92,22 +92,22 @@ class Societe extends CommonObject
* if name like with @ClassName:FilePathClass:ParentFkFieldName' it will call method deleteByParentField (with parentId as parameters) and FieldName to fetch and delete child object
*/
protected $childtablesoncascade = array(
"societe_prices",
"societe_address",
"product_fournisseur_price",
"product_customer_price_log",
"product_customer_price",
"@Contact:/contact/class/contact.class.php:fk_soc",
"adherent",
"societe_account",
"societe_rib",
"societe_remise",
"societe_remise_except",
"societe_commerciaux",
"categorie",
"notify",
"notify_def",
"actioncomm",
'societe_prices',
'societe_address',
'product_fournisseur_price',
'product_customer_price_log',
'product_customer_price',
'@Contact:/contact/class/contact.class.php:fk_soc',
'adherent',
'societe_account',
'societe_rib',
'societe_remise',
'societe_remise_except',
'societe_commerciaux',
'categorie',
'notify',
'notify_def',
'actioncomm',
);
/**