From ea44e14b605725457bf6cf5f6293c9acf47184e3 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
Date: Fri, 7 Apr 2017 11:01:12 +0200
Subject: [PATCH] Start debug the variant module

---
 htdocs/compta/index.php                   |  12 +-
 htdocs/core/class/html.formfile.class.php |   2 +
 htdocs/langs/en_US/products.lang          |   3 +
 htdocs/product/card.php                   |   1 +
 htdocs/product/class/product.class.php    |   5 +
 htdocs/product/index.php                  |  16 +--
 htdocs/variants/combinations.php          | 162 ++++++++++++++--------
 htdocs/variants/generator.php             |  46 +++---
 8 files changed, 143 insertions(+), 104 deletions(-)

diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php
index ea8d47b264e..736d5696c3e 100644
--- a/htdocs/compta/index.php
+++ b/htdocs/compta/index.php
@@ -233,7 +233,6 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture-
 
 	if ( $resql )
 	{
-		$var = false;
 		$num = $db->num_rows($resql);
 
 		print '<table class="noborder" width="100%">';
@@ -248,7 +247,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture-
 			while ($i < $num)
 			{
 				$obj = $db->fetch_object($resql);
-				print '<tr '.$bc[$var].'><td class="nowrap">';
+				print '<tr class="oddeven"><td class="nowrap">';
 				$facturesupplierstatic->ref=$obj->ref;
 				$facturesupplierstatic->id=$obj->rowid;
                 $facturesupplierstatic->total_ht=$obj->total_ht;
@@ -269,7 +268,6 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture-
 				print '</tr>';
 				$tot_ttc+=$obj->total_ttc;
 				$i++;
-				$var=!$var;
 			}
 
 			print '<tr class="liste_total"><td align="left">'.$langs->trans("Total").'</td>';
@@ -278,7 +276,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture-
 		}
 		else
 		{
-			print '<tr '.$bc[$var].'><td colspan="3" class="opacitymedium">'.$langs->trans("NoInvoice").'</td></tr>';
+			print '<tr class="oddeven"><td colspan="3" class="opacitymedium">'.$langs->trans("NoInvoice").'</td></tr>';
 		}
 		print "</table><br>";
 		$db->free($resql);
@@ -768,6 +766,7 @@ if (! empty($conf->facture->enabled) && $user->rights->facture->lire)
 		$num = $db->num_rows($resql);
 		$i = 0;
 
+		print '<div class="div-table-responsive-no-min">';
 		print '<table class="noborder" width="100%">';
 		print '<tr class="liste_titre"><th colspan="2">'.$langs->trans("BillsCustomersUnpaid",$num).' <a href="'.DOL_URL_ROOT.'/compta/facture/list.php?search_status=1"><span class="badge">'.$num.'</span></a></th>';
 		print '<th align="right">'.$langs->trans("DateDue").'</th>';
@@ -848,7 +847,7 @@ if (! empty($conf->facture->enabled) && $user->rights->facture->lire)
 			if (! empty($conf->global->MAIN_SHOW_HT_ON_SUMMARY)) $colspan++;
 			print '<tr '.$bc[$var].'><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("NoInvoice").'</td></tr>';
 		}
-		print '</table><br>';
+		print '</table></div><br>';
 		$db->free($resql);
 	}
 	else
@@ -890,6 +889,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture-
 		$var=false;
 		$num = $db->num_rows($resql);
 
+		print '<div class="div-table-responsive-no-min">';
 		print '<table class="noborder" width="100%">';
 		print '<tr class="liste_titre"><th colspan="2">'.$langs->trans("BillsSuppliersUnpaid",$num).' <a href="'.DOL_URL_ROOT.'/fourn/facture/impayees.php"><span class="badge">'.$num.'</span></a></th>';
 		print '<th align="right">'.$langs->trans("DateDue").'</th>';
@@ -948,7 +948,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture-
 			if (! empty($conf->global->MAIN_SHOW_HT_ON_SUMMARY)) $colspan++;
 			print '<tr '.$bc[$var].'><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("NoInvoice").'</td></tr>';
 		}
-		print '</table><br>';
+		print '</table></div><br>';
 	}
 	else
 	{
diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php
index 1e2dc1c4938..647d0cf6a76 100644
--- a/htdocs/core/class/html.formfile.class.php
+++ b/htdocs/core/class/html.formfile.class.php
@@ -593,6 +593,7 @@ class FormFile
             $out.= '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
             
             $out.= load_fiche_titre($titletoshow, '', '');
+            $out.= '<div class="div-table-responsive-no-min">';
             $out.= '<table class="liste formdoc noborder" summary="listofdocumentstable" width="100%">';
 
             $out.= '<tr class="liste_titre">';
@@ -802,6 +803,7 @@ class FormFile
         {
             // Affiche pied du tableau
             $out.= "</table>\n";
+            $out.= "</div>\n";
             if ($genallowed)
             {
                 if (empty($noform)) $out.= '</form>'."\n";
diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang
index 046521e398e..ef4c13c89cc 100644
--- a/htdocs/langs/en_US/products.lang
+++ b/htdocs/langs/en_US/products.lang
@@ -287,6 +287,9 @@ HideProductCombinations=Hide products variant in the products selector
 ProductCombination=Variant
 NewProductCombination=New variant
 EditProductCombination=Editing variant
+NewProductCombinations=New variants
+EditProductCombinations=Editing variants
+SelectCombination=Select combination
 ProductCombinationGenerator=Variants generator
 Features=Features
 PriceImpact=Price impact
diff --git a/htdocs/product/card.php b/htdocs/product/card.php
index ac260fc99fb..0c6109ba64a 100644
--- a/htdocs/product/card.php
+++ b/htdocs/product/card.php
@@ -2015,6 +2015,7 @@ if (! empty($conf->global->PRODUCT_ADD_FORM_ADD_TO) && $object->id && ($action =
 /*
  * Documents generes
  */
+
 if ($action != 'edit' && $action != 'delete')
 {
     print '<div class="fichecenter"><div class="fichehalfleft">';
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index 23be6de5111..5f5b6f6eae9 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -3559,6 +3559,11 @@ class Product extends CommonObject
 			if ($status == 0) return ($type==0 ? $langs->trans('ProductStatusNotOnSellShort'):$langs->trans('ProductStatusNotOnBuyShort')).' '.img_picto(($type==0 ? $langs->trans('ProductStatusNotOnSell'):$langs->trans('ProductStatusNotOnBuy')), 'statut5', 'class="pictostatus"');
 			if ($status == 1) return ($type==0 ? $langs->trans('ProductStatusOnSellShort'):$langs->trans('ProductStatusOnBuyShort')).' '.img_picto(($type==0 ? $langs->trans('ProductStatusOnSell'):$langs->trans('ProductStatusOnBuy')),'statut4', 'class="pictostatus"');
 		}
+		if ($mode == 6)
+		{
+			if ($status == 0) return ($type==0 ? $langs->trans('ProductStatusNotOnSellShort'):$langs->trans('ProductStatusNotOnBuyShort')).' '.img_picto(($type==0 ? $langs->trans('ProductStatusNotOnSell'):$langs->trans('ProductStatusNotOnBuy')), 'statut5', 'class="pictostatus"');
+			if ($status == 1) return ($type==0 ? $langs->trans('ProductStatusOnSellShort'):$langs->trans('ProductStatusOnBuyShort')).' '.img_picto(($type==0 ? $langs->trans('ProductStatusOnSell'):$langs->trans('ProductStatusOnBuy')),'statut4', 'class="pictostatus"');
+		}
 		return $langs->trans('Unknown');
 	}
 
diff --git a/htdocs/product/index.php b/htdocs/product/index.php
index 355e0d2757f..73447e456e6 100644
--- a/htdocs/product/index.php
+++ b/htdocs/product/index.php
@@ -130,26 +130,26 @@ print '<table class="noborder" width="100%">';
 print '<tr class="liste_titre"><th colspan="2">'.$langs->trans("Statistics").'</th></tr>';
 if (! empty($conf->product->enabled))
 {
-	$statProducts = "<tr ".$bc[0].">";
+	$statProducts = '<tr class="oddeven">';
 	$statProducts.= '<td><a href="list.php?type=0&amp;tosell=0&amp;tobuy=0">'.$langs->trans("ProductsNotOnSell").'</a></td><td align="right">'.round($prodser[0][0]).'</td>';
 	$statProducts.= "</tr>";
-	$statProducts.= "<tr ".$bc[1].">";
+	$statProducts.= '<tr class="oddeven">';
 	$statProducts.= '<td><a href="list.php?type=0">'.$langs->trans("ProductsOnSell").'</a></td><td align="right">'.round($prodser[0][1]).'</td>';
 	$statProducts.= "</tr>";
-	$statProducts.= "<tr ".$bc[0].">";
+	$statProducts.= '<tr class="oddeven">';
 	$statProducts.= '<td><a href="list.php?type=0&amp;tosell=1&amp;tobuy=1">'.$langs->trans("ProductsOnSellAndOnBuy").'</a></td><td align="right">'.round($prodser[0][2]).'</td>';
 	$statProducts.= "</tr>";
 
 }
 if (! empty($conf->service->enabled))
 {
-	$statServices = "<tr ".$bc[1].">";
+	$statServices = '<tr class="oddeven">';
 	$statServices.= '<td><a href="list.php?type=1&amp;tosell=0&amp;tobuy=0">'.$langs->trans("ServicesNotOnSell").'</a></td><td align="right">'.round($prodser[1][0]).'</td>';
 	$statServices.= "</tr>";
-	$statServices.= "<tr ".$bc[0].">";
+	$statServices.= '<tr class="oddeven">';
 	$statServices.= '<td><a href="list.php?type=1">'.$langs->trans("ServicesOnSell").'</a></td><td align="right">'.round($prodser[1][1]).'</td>';
 	$statServices.= "</tr>";
-	$statServices.= "<tr ".$bc[1].">";
+	$statServices.= '<tr class="oddeven">';
 	$statServices.= '<td><a href="list.php?type=1&amp;tosell=1&amp;tobuy=1">'.$langs->trans("ServicesOnSellAndOnBuy").'</a></td><td align="right">'.round($prodser[1][2]).'</td>';
 	$statServices.= "</tr>";
 
@@ -325,10 +325,10 @@ if ($result)
     			print '</td>';
 			}
 			print '<td align="right" class="nowrap">';
-			print $product_static->LibStatut($objp->tosell,5,0);
+			print $product_static->LibStatut($objp->tosell,3,0);
 			print "</td>";
             print '<td align="right" class="nowrap">';
-            print $product_static->LibStatut($objp->tobuy,5,1);
+            print $product_static->LibStatut($objp->tobuy,3,1);
             print "</td>";
 			print "</tr>\n";
 			$i++;
diff --git a/htdocs/variants/combinations.php b/htdocs/variants/combinations.php
index dabace75ac0..cfbec4a8016 100644
--- a/htdocs/variants/combinations.php
+++ b/htdocs/variants/combinations.php
@@ -36,6 +36,7 @@ $price_impact = (float) GETPOST('price_impact');
 $price_impact_percent = (bool) GETPOST('price_impact_percent');
 $form = new Form($db);
 $action = GETPOST('action');
+$cancel = GETPOST('cancel');
 
 // Security check
 $fieldvalue = (! empty($id) ? $id : $ref);
@@ -57,6 +58,10 @@ if ($id > 0 || $ref)
  * Actions
  */
 
+if ($cancel) {
+    $action='';
+}
+    
 if (! $object->isProduct()) {
 	header('Location: '.dol_buildpath('/product/card.php?id='.$object->id, 2));
 	exit();
@@ -107,7 +112,7 @@ if ($_POST) {
 			$db->begin();
 
 			if (!$prodcomb->fetchByProductCombination2ValuePairs($id, $sanit_features)) {
-				if (ProductCombination::createProductCombination($product, $sanit_features, array(), $price_impact_percent, $price_impact, $weight_impact)) {
+				if (ProductCombination::createProductCombination($object, $sanit_features, array(), $price_impact_percent, $price_impact, $weight_impact)) {
 					$db->commit();
 					setEventMessage($langs->trans('RecordSaved'));
 					header('Location: '.dol_buildpath('/variants/combinations.php?id='.$id, 2));
@@ -175,7 +180,7 @@ if ($_POST) {
 			setEventMessage($langs->trans('RecordSaved'));
 		}
 
-	} else {
+	} elseif ($valueid > 0) {
 
 		if ($prodcomb->fetch($valueid) < 0) {
 			dol_print_error($db, $langs->trans('ErrorRecordNotFound'));
@@ -256,6 +261,9 @@ if ($action === 'confirm_deletecombination') {
  *	View
  */
 
+$form = new Form($db);
+
+
 if (! empty($id) || ! empty($ref)) {
 
 	llxHeader("", "", $langs->trans("CardProduct".$object->type));
@@ -342,6 +350,7 @@ if (! empty($id) || ! empty($ref)) {
 				var select = jQuery("select#features");
 
 				select.empty();
+
 				jQuery("form#combinationform input[type=hidden]").detach();
 
 				jQuery.each(variants_selected.index, function (key, val) {
@@ -359,11 +368,12 @@ if (! empty($id) || ! empty($ref)) {
 
 			jQuery(document).ready(function() {
 				jQuery("select#attribute").change(function () {
-					console.log("Change of field attribute");
+					console.log("Change of field variant attribute");
 					var select = jQuery("select#value");
 
 					if (!jQuery(this).val().length || jQuery(this).val() == '-1') {
 						select.empty();
+						select.append('<option value="-1">&nbsp;</option>');
 						return;
 					}
 
@@ -373,22 +383,27 @@ if (! empty($id) || ! empty($ref)) {
 						id: jQuery(this).val()
 					}, function(data) {
 						if (data.error) {
-							jQuery("select#value").empty();
+							select.empty();
+							select.append('<option value="-1">&nbsp;</option>');
 							return alert(data.error);
 						}
 
 						select.empty();
-						/* console.log(data.length); */
+						select.append('<option value="-1">&nbsp;</option>');
 
 						jQuery(data).each(function (key, val) {
 							keyforoption = val.id
 							valforoption = val.value
-							jQuery("select#value").append('<option value="' + keyforoption + '">' + valforoption + '</option>');
+							select.append('<option value="' + keyforoption + '">' + valforoption + '</option>');
 						});
 					});
 				});
 
+				/* Click on button Add combination
+				@FIXME Not compatible with all browsers.
+				 */
 				jQuery("#addfeature").click(function () {
+					console.log("Click on add");
 					var selectedattr = jQuery("select[name=attribute] option:selected");
 					var selectedvalu = jQuery("select[name=value] option:selected");
 
@@ -438,54 +453,69 @@ if (! empty($id) || ! empty($ref)) {
 		<?php 
 		}
 		
-        print '<form method="post" id="combinationform">';		
+		print '<form method="post" id="combinationform">';
+		print '<input type="hidden" name="id" value="'.dol_escape_htmltag($id).'">';
+		
 		print dol_fiche_head();
 		
 		?>
 		
 		<table class="border" style="width: 100%">
 			<?php if ($action == 'add') { ?>
+			<!--  Variant -->
 			<tr>
 				<td class="titlefieldcreate fieldrequired"><label for="attribute"><?php echo $langs->trans('ProductAttribute') ?></label></td>
-				<td colspan="2"><select class="flat minwidth100" id="attribute" name="attribute">
+				<td><select class="flat minwidth100" id="attribute" name="attribute">
 					<option value="-1">&nbsp;</option>
 					<?php foreach ($prodattr_all as $attr): ?>
 					<option value="<?php echo $attr->id ?>"><?php echo $attr->label ?></option>
 					<?php endforeach ?>
 				</select></td>
 			</tr>
+			<!-- Value -->
 			<tr>
 				<td class="fieldrequired"><label for="value"><?php echo $langs->trans('Value') ?></label></td>
-				<td colspan="2">
+				<td>
 					<select class="flat minwidth100" id="value" name="value">
 						<option value="-1">&nbsp;</option>
 					</select>
 				</td>
 			</tr>
-			<?php } ?>
 			<tr>
-				<td class="titlefieldcreate fieldrequired"><label for="features"><?php echo $langs->trans('Features') ?></label></td>
-				<td><select multiple style="width: 100%" id="features">
+				<td></td><td>
+					<a href="#" class="button" id="addfeature"><?php echo $langs->trans("SelectCombination"); ?></a>
+				</td>
+			</tr>
+		</table>
+		<hr>
+			<?php } 
+			?>
+		<table class="border" style="width: 100%">
+			<tr>
+				<td class="titlefieldcreate fieldrequired tdtop"><label for="features"><?php echo $langs->trans('Variant') ?></label></td>
+				<td class="valignmiddle">
+					<div class="inline-block valignmiddle quatrevingtpercent">
+					<select multiple class="centpercent" id="features">
 						<?php
 						foreach ($productCombination2ValuePairs1 as $pc2v): ?>
 							<option value="<?php echo $pc2v->fk_prod_attr ?>:<?php echo $pc2v->fk_prod_attr_val ?>"><?php echo dol_htmlentities($pc2v) ?></option>
 						<?php endforeach ?>
-					</select></td>
+					</select></div>
+					<div class="inline-block valignmiddle">
+					<a href="#" class="inline-block valignmiddle button" id="delfeature"><?php echo img_edit_remove() ?></a>
+					</div>
+				</td>
 				<td>
-					<?php if ($action == 'add'): ?>
-					<a href="#" class="button" id="addfeature"><?php echo img_edit_add() ?></a><br><br>
-					<a href="#" class="button" id="delfeature"><?php echo img_edit_remove() ?></a>
-					<?php endif; ?>
 				</td>
 			</tr>
 			<tr>
 				<td><label for="price_impact"><?php echo $langs->trans('PriceImpact') ?></label></td>
-				<td colspan="2"><input type="text" id="price_impact" name="price_impact" value="<?php echo price($price_impact) ?>">
+				<td><input type="text" id="price_impact" name="price_impact" value="<?php echo price($price_impact) ?>">
 				<input type="checkbox" id="price_impact_percent" name="price_impact_percent" <?php echo $price_impact_percent ? ' checked' : '' ?>> <label for="price_impact_percent"><?php echo $langs->trans('PercentageVariation') ?></label></td>
 			</tr>
 			<tr>
 				<td><label for="weight_impact"><?php echo $langs->trans('WeightImpact') ?></label></td>
-				<td colspan="2"><input type="text" id="weight_impact" name="weight_impact" value="<?php echo price($weight_impact) ?>"></td>
+				<td><input type="text" id="weight_impact" name="weight_impact" value="<?php echo price($weight_impact) ?>"></td>
 			</tr>
 		</table>
 
@@ -494,8 +524,10 @@ if (! empty($id) || ! empty($ref)) {
         ?>
 
 		<div style="text-align: center">
-		
-		<input type="submit" value="<?php echo $action == 'add' ? $langs->trans('Create') : $langs->trans('Save') ?>" class="button"></div>
+		<input type="submit" value="<?php echo $action == 'add' ? $langs->trans('Create') : $langs->trans('Save') ?>" class="button">
+		&nbsp;
+		<input type="submit" name="cancel" value="<?php echo $langs->trans('Cancel'); ?>" class="button">
+		</div>
 		
 		<?php foreach ($productCombination2ValuePairs1 as $pc2v): ?>
 				<input type="hidden" name="features[]" value="<?php echo $pc2v->fk_prod_attr.':'.$pc2v->fk_prod_attr_val ?>">
@@ -509,7 +541,6 @@ if (! empty($id) || ! empty($ref)) {
 		if ($action === 'delete') {
 
 			if ($prodcomb->fetch($valueid) > 0) {
-				$form = new Form($db);
 				$prodstatic->fetch($prodcomb->fk_product_child);
 
 				print $form->formconfirm(
@@ -524,8 +555,6 @@ if (! empty($id) || ! empty($ref)) {
 			}
 		} elseif ($action === 'copy') {
 
-			$form = new Form($db);
-
 			print $form->formconfirm(
 				'combinations.php?id='.$id,
 				$langs->trans('CloneCombinationsProduct'),
@@ -570,50 +599,64 @@ if (! empty($id) || ! empty($ref)) {
 				});
 			</script>
 
-		<form method="post">
-		<label for="bulk_action"><?php echo $langs->trans('BulkActions') ?></label>
-		<select id="bulk_action" name="bulk_action" class="flat">
-			<option value="not_buy"><?php echo $langs->trans('ProductStatusNotOnBuy') ?></option>
-			<option value="not_sell"><?php echo $langs->trans('ProductStatusNotOnSell') ?></option>
-			<option value="on_buy"><?php echo $langs->trans('ProductStatusOnBuy') ?></option>
-			<option value="on_sell"><?php echo $langs->trans('ProductStatusOnSell') ?></option>
-			<option value="delete"><?php echo $langs->trans('Delete') ?></option>
-		</select>
-		<input type="hidden" name="action" value="bulk_actions">
-		<input type="submit" value="<?php echo $langs->trans("Apply") ?>" class="button">
-		<br>
-		<br>
 		<?php } 
 		
-
+        // Buttons
 		print '<div class="tabsAction">';
+		
 		print '	<div class="inline-block divButAction">';
 		if ($productCombinations) {
 		    print '<a href="combinations.php?id='.$id.'&action=copy" class="butAction">'.$langs->trans('Copy').'</a>';
 		}
+		
 		print '<a href="combinations.php?id='.$id.'&action=add" class="butAction">'.$langs->trans('NewProductCombination').'</a>';
-		print '<a href="generator.php?id='.$id.'" class="butAction">'.$langs->trans('ProductCombinationGenerator').'</a>';
+		
+		if (empty($conf->dol_optimize_smallscreen) && $conf->use_javascript_ajax)     // Bugged page. Too much useless javascript.
+		{
+		  print '<a href="generator.php?id='.$id.'" class="butAction">'.$langs->trans('ProductCombinationGenerator').'</a>';
+		}
+		
 		print '	</div>';
+		
 		print '</div>';
 		
+		print '<form method="post">';
+		
+		$aaa='';
+		if (count($productCombinations))
+		{
+    		$aaa = '<label for="bulk_action">'.$langs->trans('BulkActions').'</label>';
+    		$aaa .= '<select id="bulk_action" name="bulk_action" class="flat">';
+    		$aaa .= '	<option value="not_buy">'.$langs->trans('ProductStatusNotOnBuy').'</option>';
+    		$aaa .= '	<option value="not_sell">'.$langs->trans('ProductStatusNotOnSell').'</option>';
+    		$aaa .= '	<option value="on_buy">'.$langs->trans('ProductStatusOnBuy').'</option>';
+    		$aaa .= '	<option value="on_sell">'.$langs->trans('ProductStatusOnSell').'</option>';
+    		$aaa .= '	<option value="delete">'.$langs->trans('Delete').'</option>';
+    		$aaa .= '</select>';
+    		$aaa .= '<input type="hidden" name="action" value="bulk_actions">';
+    		$aaa .= '<input type="submit" value="'.dol_escape_htmltag($langs->trans("Apply")).'" class="button">';
+		}
+		
+		$title = $langs->trans("ProductCombinations");
 		
+		print_barre_liste($title, 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, $aaa, 0);
 		
+		print '<div class="div-table-responsive">';
 		?>
-
 		<table class="liste">
 			<tr class="liste_titre">
-				<th class="liste_titre">
+				<th class="liste_titre"><?php echo $langs->trans('Product') ?></th>
+				<th class="liste_titre"><?php echo $langs->trans('Combination') ?></th>
+				<th class="liste_titre right"><?php echo $langs->trans('PriceImpact') ?></th>
+				<th class="liste_titre right"><?php echo $langs->trans('WeightImpact') ?></th>
+				<th class="liste_titre center"><?php echo $langs->trans('OnSell') ?></th>
+				<th class="liste_titre center"><?php echo $langs->trans('OnBuy') ?></th>
+				<th class="liste_titre"></th>
+				<th class="liste_titre center">
 					<?php if ($productCombinations): ?>
 					<input type="checkbox" name="select_all">
 					<?php endif ?>
 				</th>
-				<th class="liste_titre"><?php echo $langs->trans('Product') ?></th>
-				<th class="liste_titre"><?php echo $langs->trans('Combination') ?></th>
-				<th class="liste_titre" style="text-align: center"><?php echo $langs->trans('PriceImpact') ?></th>
-				<th class="liste_titre" style="text-align: center"><?php echo $langs->trans('WeightImpact') ?></th>
-				<th class="liste_titre" style="text-align: center;"><?php echo $langs->trans('OnSell') ?></th>
-				<th class="liste_titre" style="text-align: center;"><?php echo $langs->trans('OnBuy') ?></th>
-				<th class="liste_titre"></th>
 			</tr>
 			<?php
 			
@@ -622,8 +665,7 @@ if (! empty($id) || ! empty($ref)) {
     			foreach ($productCombinations as $currcomb) {
     				$prodstatic->fetch($currcomb->fk_product_child); 
     				?>
-    				<tr <?php echo $bc[!$var] ?>>
-    				<td><input type="checkbox" name="select[<?php echo $prodstatic->id ?>]"></td>
+    				<tr class="oddeven">
     				<td><?php echo $prodstatic->getNomUrl(1) ?></td>
     				<td>
     					<?php
@@ -639,17 +681,17 @@ if (! empty($id) || ! empty($ref)) {
     						}
     					} ?>
     				</td>
-    				<td style="text-align: right"><?php echo ($currcomb->variation_price >= 0 ? '+' : '').price($currcomb->variation_price).($currcomb->variation_price_percentage ? ' %' : '') ?></td>
-    				<td style="text-align: right"><?php echo ($currcomb->variation_weight >= 0 ? '+' : '').price($currcomb->variation_weight).' '.measuring_units_string($prodstatic->weight_units, 'weight') ?></td>
+    				<td class="right"><?php echo ($currcomb->variation_price >= 0 ? '+' : '').price($currcomb->variation_price).($currcomb->variation_price_percentage ? ' %' : '') ?></td>
+    				<td class="right"><?php echo ($currcomb->variation_weight >= 0 ? '+' : '').price($currcomb->variation_weight).' '.measuring_units_string($prodstatic->weight_units, 'weight') ?></td>
     				<td style="text-align: center;"><?php echo $prodstatic->getLibStatut(2, 0) ?></td>
     				<td style="text-align: center;"><?php echo $prodstatic->getLibStatut(2, 1) ?></td>
-    				<td style="text-align: right">
-    					<a href="<?php echo dol_buildpath('/variants/combinations.php?id='.$id.'&action=edit&valueid='.$currcomb->id, 2) ?>"><?php echo img_edit() ?></a>
-    					<a href="<?php echo dol_buildpath('/variants/combinations.php?id='.$id.'&action=delete&valueid='.$currcomb->id, 2) ?>"><?php echo img_delete() ?></a>
+    				<td class="right">
+    					<a class="paddingleft paddingright" href="<?php echo dol_buildpath('/variants/combinations.php?id='.$id.'&action=edit&valueid='.$currcomb->id, 2) ?>"><?php echo img_edit() ?></a>
+    					<a class="paddingleft paddingright" href="<?php echo dol_buildpath('/variants/combinations.php?id='.$id.'&action=delete&valueid='.$currcomb->id, 2) ?>"><?php echo img_delete() ?></a>
     				</td>
+    				<td class="center"><input type="checkbox" name="select[<?php echo $prodstatic->id ?>]"></td>
     			</tr>
     			<?php
-    			$var = !$var; 
 			    }
 			}
 			else
@@ -659,12 +701,12 @@ if (! empty($id) || ! empty($ref)) {
 			?>
 		</table>
 
-		<?php if ($productCombinations): ?>
-		</form>
-		<?php endif ?>
-
 		<?php
+		print '</div>';
+		print '</form>';
 	}
 }
 
 llxFooter();
+
+$db->close();
diff --git a/htdocs/variants/generator.php b/htdocs/variants/generator.php
index b709f240551..7b0358fd176 100644
--- a/htdocs/variants/generator.php
+++ b/htdocs/variants/generator.php
@@ -130,6 +130,8 @@ if ($_POST) {
 	}
 }
 
+
+
 /*
  *	View
  */
@@ -140,37 +142,21 @@ if (! empty($id) || ! empty($ref)) {
 
 	llxHeader("", "", $langs->trans("CardProduct".$object->type));
 
-	if ($result) {
-		$head = product_prepare_head($object);
-		$titre = $langs->trans("CardProduct".$object->type);
-		$picto = ($object->type == Product::TYPE_SERVICE ? 'service' : 'product');
-
+	if ($result > 0)
+	{
+		$showbarcode=empty($conf->barcode->enabled)?0:1;
+		if (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->barcode->lire_advance)) $showbarcode=0;
+		 
+		$head=product_prepare_head($object);
+		$titre=$langs->trans("CardProduct".$object->type);
+		$picto=($object->type== Product::TYPE_SERVICE?'service':'product');
 		dol_fiche_head($head, 'combinations', $titre, 0, $picto);
-
-		print '<table class="border" width="100%">';
-
-		// Reference
-		print '<tr>';
-		print '<td width="30%">'.$langs->trans("Ref").'</td><td colspan="3">';
-		print $form->showrefnav($object, 'id', '', 0);
-		print '</td>';
-		print '</tr>';
-
-		// Label
-		print '<tr><td>'.$langs->trans("Label").'</td><td colspan="3">'.$object->label.'</td></tr>';
-
-		// Status (to sell)
-		print '<tr><td>'.$langs->trans("Status").' ('.$langs->trans("Sell").')</td><td>';
-		print $object->getLibStatut(2, 0);
-		print '</td></tr>';
-
-		// Status (to buy)
-		print '<tr><td>'.$langs->trans("Status").' ('.$langs->trans("Buy").')</td><td>';
-		print $object->getLibStatut(2, 1);
-		print '</td></tr>';
-
-		print '</table>';
-
+		 
+		$linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?type='.$object->type.'">'.$langs->trans("BackToList").'</a>';
+		$object->next_prev_filter=" fk_product_type = ".$object->type;
+		 
+		dol_banner_tab($object, 'ref', $linkback, ($user->societe_id?0:1), 'ref', '', '', '', 0, '', '', 1);
+		
 		dol_fiche_end();
 	}
 
-- 
GitLab