From b60e90a7b7ff1c61733707207e770dc32a55e043 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
Date: Mon, 11 Apr 2016 18:08:03 +0200
Subject: [PATCH] NEW A module can add, into its import profiles, a sql request
 to execute at end of import. This allow to update dernormalized data after
 import.

---
 htdocs/core/modules/modStock.class.php |  6 +++-
 htdocs/imports/class/import.class.php  |  3 ++
 htdocs/imports/import.php              | 46 ++++++++++++++++++++++++--
 3 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/htdocs/core/modules/modStock.class.php b/htdocs/core/modules/modStock.class.php
index 81454a52222..7bdf5d1d641 100644
--- a/htdocs/core/modules/modStock.class.php
+++ b/htdocs/core/modules/modStock.class.php
@@ -194,8 +194,12 @@ class modStock extends DolibarrModules
 		$this->import_convertvalue_array[$r]=array(
 			'ps.fk_product'=>array('rule'=>'fetchidfromref','classfile'=>'/product/class/product.class.php','class'=>'Product','method'=>'fetch','element'=>'product'),
 			'ps.fk_entrepot'=>array('rule'=>'fetchidfromref','classfile'=>'/product/stock/class/entrepot.class.php','class'=>'Entrepot','method'=>'fetch','element'=>'label')
+		  );
+		$this->import_examplevalues_array[$r]=array(
+		    'ps.fk_product'=>"PREF123456",'ps.fk_entrepot'=>"ALM001",'ps.reel'=>"10"
 		);
-		$this->import_examplevalues_array[$r]=array('ps.fk_product'=>"PREF123456",'ps.fk_entrepot'=>"ALM001",'ps.reel'=>"10"
+		$this->import_run_sql_after_array[$r]=array(    // Because we may change data that are denormalized, we must update dernormalized data after.
+		    'UPDATE llx_product p SET p.stock= (SELECT SUM(ps.reel) FROM llx_product_stock ps WHERE ps.fk_product = p.rowid);'
 		);
 
 	}
diff --git a/htdocs/imports/class/import.class.php b/htdocs/imports/class/import.class.php
index 9a4d58aa65f..fb842ef56ca 100644
--- a/htdocs/imports/class/import.class.php
+++ b/htdocs/imports/class/import.class.php
@@ -38,6 +38,7 @@ class Import
 	var $array_import_regex;
 	var $array_import_examplevalues;
 	var $array_import_convertvalue;
+	var $array_import_run_sql_after;
 
 
 	/**
@@ -151,6 +152,8 @@ class Import
 						$this->array_import_examplevalues[$i]=$module->import_examplevalues_array[$r];
 						// Tableau des regles de conversion d'une valeur depuis une autre source (cle=champ, valeur=tableau des regles)
 						$this->array_import_convertvalue[$i]=(isset($module->import_convertvalue_array[$r])?$module->import_convertvalue_array[$r]:'');
+						// Sql request to run after import
+						$this->array_import_run_sql_after[$i]=(isset($module->import_run_sql_after_array[$r])?$module->import_run_sql_after_array[$r]:'');
 						// Module
 						$this->array_import_module[$i]=$module;
 
diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php
index eae01880f90..9b40c35ead6 100644
--- a/htdocs/imports/import.php
+++ b/htdocs/imports/import.php
@@ -1415,6 +1415,25 @@ if ($step == 5 && $datatoimport)
             print $langs->trans("ErrorFailedToOpenFile",$pathfile);
         }
 
+	    $error=0;
+	    
+	    // Run the sql after import if defined
+	    //var_dump($objimport->array_import_run_sql_after[0]);
+	    if (! empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0]))
+	    {
+	        $i=0;
+	        foreach($objimport->array_import_run_sql_after[0] as $sqlafterimport)
+	        {
+	            $i++;
+	            $resqlafterimport=$db->query($sqlafterimport);
+	            if (! $resqlafterimport) 
+	            {
+			        $arrayoferrors['none'][]=array('lib'=>$langs->trans("Error running final request: ".$sqlafterimport));
+	                $error++;
+	            }
+	        }
+	    }
+	    
         $db->rollback();    // We force rollback because this was just a simulation.
 
         // Show OK
@@ -1740,8 +1759,31 @@ if ($step == 6 && $datatoimport)
 	}
 
 	if (count($arrayoferrors) > 0) $db->rollback();	// We force rollback because this was errors.
-	else  $db->commit();	// We can commit if no errors.
-
+	else 
+	{
+	    $error=0;
+	    
+		// Run the sql after import if defined
+	    //var_dump($objimport->array_import_run_sql_after[0]);
+	    if (! empty($objimport->array_import_run_sql_after[0]) && is_array($objimport->array_import_run_sql_after[0]))
+	    {
+	        $i=0;
+	        foreach($objimport->array_import_run_sql_after[0] as $sqlafterimport)
+	        {
+	            $i++;
+	            $resqlafterimport=$db->query($sqlafterimport);
+	            if (! $resqlafterimport) 
+	            {
+			        $arrayoferrors['none'][]=array('lib'=>$langs->trans("Error running final request: ".$sqlafterimport));
+	                $error++;
+	            }
+	        }
+	    }
+	    
+	    if (! $error) $db->commit();	// We can commit if no errors.
+	    else $db->rollback();
+	}
+	    
     dol_fiche_end();
 
 
-- 
GitLab