NEW : Allow drag and drop on kits

This commit is contained in:
Adrien Raze 2021-08-30 14:45:42 +02:00
parent 581efd0847
commit 709a297563
6 changed files with 79 additions and 25 deletions

View File

@ -99,6 +99,8 @@ if (GETPOST('roworder', 'alpha', 3) && GETPOST('table_element_line', 'aZ09', 3)
$perm = 1;
} elseif ($table_element_line == 'ecm_files' && $fk_element == 'fk_ticket' && !empty($user->rights->ticket->write)) {
$perm = 1;
} elseif ($table_element_line == 'product_association' && $fk_element == 'fk_product' && !empty($user->rights->produit->creer)) {
$perm = 1;
} else {
$tmparray = explode('_', $table_element_line);
$tmpmodule = $tmparray[0]; $tmpobject = preg_replace('/line$/', '', $tmparray[1]);

View File

@ -3021,7 +3021,7 @@ abstract class CommonObject
*
* @param int $rowid Id of line
* @param int $rang Position
* @return void
* @return int
*/
public function updateRangOfLine($rowid, $rang)
{
@ -3037,10 +3037,13 @@ abstract class CommonObject
dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
if (!$this->db->query($sql)) {
dol_print_error($this->db);
return -1;
} else {
$parameters=array('rowid'=>$rowid, 'rang'=>$rang, 'fieldposition' => $fieldposition);
$action='';
$reshook = $hookmanager->executeHooks('afterRankOfLineUpdate', $parameters, $this, $action);
return 1;
}
$parameters=array('rowid'=>$rowid, 'rang'=>$rang, 'fieldposition' => $fieldposition);
$action='';
$reshook = $hookmanager->executeHooks('afterRankOfLineUpdate', $parameters, $this, $action);
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps

View File

@ -400,4 +400,5 @@ DeleteLinkedProduct=Delete the child product linked to the combination
PMPValue=Weighted average price
PMPValueShort=WAP
DefaultBOM=Default BOM
DefaultBOMDesc=The default BOM recommended to use to manufacture this product. This field can be set only if nature of product is '%s'.
DefaultBOMDesc=The default BOM recommended to use to manufacture this product. This field can be set only if nature of product is '%s'.
Rank=Rank

View File

@ -399,3 +399,4 @@ ProductSupplierExtraFields=Attributs supplémentaires (Prix fournisseur)
DeleteLinkedProduct=Supprimer le produit enfant lié à la combinaison
PMPValue=Prix moyen pondéré (PMP)
PMPValueShort=PMP
Rank=Rang

View File

@ -4014,22 +4014,27 @@ class Product extends CommonObject
dol_print_error($this->db);
return -1;
} else {
$result = $this->db->query($sql);
if ($result) {
$num = $this->db->num_rows($result);
if ($num > 0) {
$this->error = "isFatherOfThis";
//Selection of the highest row
$sql = 'SELECT MAX(rang) as max_rank FROM '.MAIN_DB_PREFIX.'product_association';
$sql .= ' WHERE fk_product_pere = '.$id_pere;
$resql = $this->db->query($sql);
if ($resql > 0) {
$obj = $this->db->fetch_object($resql);
$rank = $obj->max_rank + 1;
//Addition of a product with the highest rank +1
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'product_association(fk_product_pere,fk_product_fils,qty,incdec,rang)';
$sql .= ' VALUES ('.$id_pere.', '.$id_fils.', '.$qty.', '.$incdec.', '.$rank.')';
if (! $this->db->query($sql)) {
dol_print_error($this->db);
return -1;
} else {
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'product_association(fk_product_pere,fk_product_fils,qty,incdec)';
$sql .= ' VALUES ('.((int) $id_pere).', '.((int) $id_fils).', '.((float) $qty).', '.((int) $incdec).')';
if (!$this->db->query($sql)) {
dol_print_error($this->db);
return -1;
} else {
return 1;
}
}
else
{
return 1;
}
} else {
dol_print_error($this->db);
return -1;
}
}
}
@ -4102,6 +4107,24 @@ class Product extends CommonObject
return -1;
}
//Updated ranks so that none are missing
$sqlrank = 'SELECT rowid, rang FROM '.MAIN_DB_PREFIX.'product_association';
$sqlrank.= ' WHERE fk_product_pere = '.$fk_parent;
$sqlrank.= ' ORDER BY rang';
$resqlrank = $this->db->query($sqlrank);
if ($resqlrank) {
$cpt = 0;
while ($objrank = $this->db->fetch_object($resqlrank)){
$cpt++;
$sql = 'UPDATE '.MAIN_DB_PREFIX.'product_association';
$sql.= ' SET rang ='.$cpt;
$sql.= ' WHERE rowid ='.$objrank->rowid;
if (! $this->db->query($sql)) {
dol_print_error($this->db);
return -1;
}
}
}
return 1;
}
@ -4666,12 +4689,14 @@ class Product extends CommonObject
}
$sql = "SELECT p.rowid, p.ref, p.label as label, p.fk_product_type,";
$sql .= " pa.qty as qty, pa.fk_product_fils as id, pa.incdec";
$sql .= " pa.qty as qty, pa.fk_product_fils as id, pa.incdec,";
$sql .= " pa.rowid as fk_association, pa.rang";
$sql .= " FROM ".MAIN_DB_PREFIX."product as p,";
$sql .= " ".MAIN_DB_PREFIX."product_association as pa";
$sql .= " WHERE p.rowid = pa.fk_product_fils";
$sql .= " AND pa.fk_product_pere = ".((int) $id);
$sql .= " AND pa.fk_product_fils <> ".((int) $id); // This should not happens, it is to avoid infinite loop if it happens
$sql.= " ORDER BY pa.rang";
dol_syslog(get_class($this).'::getChildsArbo id='.$id.' level='.$level, LOG_DEBUG);
@ -4698,7 +4723,9 @@ class Product extends CommonObject
2=>$rec['fk_product_type'],
3=>$this->db->escape($rec['label']),
4=>$rec['incdec'],
5=>$rec['ref']
5=>$rec['ref'],
6=>$rec['fk_association'],
7=>$rec['rang']
);
//$prods[$this->db->escape($rec['label'])]= array(0=>$rec['id'],1=>$rec['qty'],2=>$rec['fk_product_type']);
//$prods[$this->db->escape($rec['label'])]= array(0=>$rec['id'],1=>$rec['qty']);

View File

@ -132,6 +132,8 @@ if ($action == 'add_prod' && ($user->rights->produit->creer || $user->rights->se
setEventMessages('RecordSaved', null);
}
$action = '';
header("Location: ".$_SERVER["PHP_SELF"].'?id='.$object->id);
exit;
}
@ -268,8 +270,18 @@ if ($id > 0 || !empty($ref)) {
$prodsfather = $object->getFather(); // Parent Products
$object->get_sousproduits_arbo(); // Load $object->sousprods
$parent_label = $object->label;
$prods_arbo = $object->get_arbo_each_prod();
$tmpid = $id;
if (! empty($conf->use_javascript_ajax)) {
$nboflines = $prods_arbo;
$table_element_line='product_association';
include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php';
}
$id = $tmpid;
$nbofsubsubproducts = count($prods_arbo); // This include sub sub product into nb
$prodschild = $object->getChildsArbo($id, 1);
$nbofsubproducts = count($prodschild); // This include only first level of childs
@ -323,9 +335,10 @@ if ($id > 0 || !empty($ref)) {
print '<input type="hidden" name="action" value="save_composed_product" />';
print '<input type="hidden" name="id" value="'.$id.'" />';
print '<table class="liste">';
print '<table id="tablelines" class="ui-sortable liste">';
print '<tr class="liste_titre">';
print '<tr class="liste_titre nodrag nodrop">';
print '<td>'.$langs->trans('Rank').'</td>';
print '<td>'.$langs->trans('ComposedProduct').'</td>';
print '<td>'.$langs->trans('Label').'</td>';
print '<td class="right" colspan="2">'.$langs->trans('MinSupplierPrice').'</td>';
@ -335,6 +348,7 @@ if ($id > 0 || !empty($ref)) {
}
print '<td class="center">'.$langs->trans('Qty').'</td>';
print '<td class="center">'.$langs->trans('ComposedProductIncDecStock').'</td>';
print '<td class="linecolmove" style="width: 10px"></td>';
print '</tr>'."\n";
$totalsell = 0;
@ -343,7 +357,9 @@ if ($id > 0 || !empty($ref)) {
$productstatic->fetch($value['id']);
if ($value['level'] <= 1) {
print '<tr class="oddeven">';
print '<tr id="'.$object->sousprods[$parent_label][$value['id']][6].'" class="drag drop oddeven level1">';
print '<td>'.$object->sousprods[$parent_label][$value['id']][7].'</td>';
$notdefined = 0;
$nb_of_subproduct = $value['nb'];
@ -407,6 +423,8 @@ if ($id > 0 || !empty($ref)) {
print '<td>'.($value['incdec'] == 1 ? 'x' : '').'</td>';
}
print '<td class="linecolmove tdlineupdown center">';
print '</td>';
print '</tr>'."\n";
} else {
$hide = '';
@ -414,10 +432,11 @@ if ($id > 0 || !empty($ref)) {
$hide = ' hideobject'; // By default, we do not show this. It makes screen very difficult to understand
}
print '<tr class="oddeven'.$hide.'" id="sub-'.$value['id_parent'].'">';
print '<tr class="oddeven'.$hide.'" id="sub" parent_id="'.$value['id_parent'].'">';
//$productstatic->ref=$value['label'];
$productstatic->ref = $value['ref'];
print '<td></td>';
print '<td>';
for ($i = 0; $i < $value['level']; $i++) {
print ' &nbsp; &nbsp; '; // Add indentation
@ -437,6 +456,7 @@ if ($id > 0 || !empty($ref)) {
}
print '<td class="center">'.$value['nb'].'</td>';
print '<td>&nbsp;</td>';
print '<td>&nbsp;</td>';
print '</tr>'."\n";
}