New: Can import members using assistant

This commit is contained in:
Laurent Destailleur 2010-10-01 23:37:36 +00:00
parent 85635cdeea
commit 7a2d72b6fd
17 changed files with 304 additions and 449 deletions

View File

@ -3,6 +3,7 @@ English Dolibarr ChangeLog
***** ChangeLog for 3.0 compared to 2.9 *****
For users:
- New: Can import members using assistant.
- New: Can exclude deposit, replacement or credit notes in script rebuild_merge_pdf.
- New: task #10473 : Option MAIN_PROFIDx_IN_ADDRESS must no more be hidden.
- New: Can generate business card for on particular member.

View File

@ -27,6 +27,7 @@
require("../main.inc.php");
require_once(DOL_DOCUMENT_ROOT."/lib/member.lib.php");
require_once(DOL_DOCUMENT_ROOT."/lib/date.lib.php");
require_once(DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php");
require_once(DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php");
require_once(DOL_DOCUMENT_ROOT."/adherents/class/adherent_options.class.php");
@ -755,7 +756,6 @@ if ($rowid)
}
if (! $dateto)
{
//$dateto=dol_time_plus_duree(dol_time_plus_duree($datefrom,$defaultdelay,$defaultdelayunit),-1,'d');
$dateto=-1; // By default, no date is suggested
}
print '<tr><td>'.$langs->trans("DateEndSubscription").'</td><td>';

View File

@ -31,6 +31,7 @@
require_once(DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php");
require_once(DOL_DOCUMENT_ROOT."/adherents/class/cotisation.class.php");
require_once(DOL_DOCUMENT_ROOT."/lib/functions2.lib.php");
require_once(DOL_DOCUMENT_ROOT."/lib/date.lib.php");
/**

View File

@ -28,6 +28,7 @@
*/
require ("../main.inc.php");
require_once(DOL_DOCUMENT_ROOT."/lib/date.lib.php");
require_once(DOL_DOCUMENT_ROOT.'/lib/contract.lib.php');
if ($conf->projet->enabled) require_once(DOL_DOCUMENT_ROOT."/projet/class/project.class.php");
if ($conf->propal->enabled) require_once(DOL_DOCUMENT_ROOT."/comm/propal/class/propal.class.php");

View File

@ -1071,7 +1071,7 @@ if ($step == 4 && $datatoimport)
}
// STEP 5: Summary of choices
// STEP 5: Summary of choices and launch simulation
if ($step == 5 && $datatoimport)
{
$model=$format;
@ -1262,356 +1262,162 @@ if ($step == 5 && $datatoimport)
print '</div>';
// Show import id
print $langs->trans("NowClickToTestTheImport",$langs->transnoentitiesnoconv("RunSimulateImportFile")).'<br>';
print '<br>';
if (GETPOST('action') != 'launchsimu')
{
// Show import id
print $langs->trans("NowClickToTestTheImport",$langs->transnoentitiesnoconv("RunSimulateImportFile")).'<br>';
print '<br>';
// Actions
print '<center>';
if ($user->rights->import->run)
{
print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=5&action=launchsimu'.$param.'">'.$langs->trans("RunSimulateImportFile").'</a>';
}
else
{
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("RunSimulateImportFile").'</a>';
}
print '</center>';
}
else
{
// Actions
print '<center>';
if ($user->rights->import->run)
{
print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=6'.$param.'">'.$langs->trans("RunSimulateImportFile").'</a>';
}
else
{
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("RunSimulateImportFile").'</a>';
}
/*print '<form action="'.$_SERVER["PHP_SELF"].'?step=6&'.$param.'">';
print '<input class="button" type="submit" value="'.$langs->trans("RunSimulateImportFile").'">';
print '</form>';*/
print '</center>';
// Launch import
$arrayoferrors=array();
$arrayofwarnings=array();
$maxnboferrors=empty($conf->global->IMPORT_MAX_NB_OF_ERRORS)?50:$conf->global->IMPORT_MAX_NB_OF_ERRORS;
$maxnbofwarnings=empty($conf->global->IMPORT_MAX_NB_OF_WARNINGS)?50:$conf->global->IMPORT_MAX_NB_OF_WARNINGS;
$nboferrors=0;
$nbofwarnings=0;
if ($mesg) print $mesg;
$importid=dol_print_date(dol_now('tzserver'),'%Y%m%d%H%M%S');
//var_dump($array_match_file_to_database);
$db->begin();
// Open input file
$nbok=0;
$pathfile=$conf->import->dir_temp.'/'.$filetoimport;
$result=$obj->import_open_file($pathfile,$langs);
if ($result > 0)
{
$sourcelinenb=0;
// Loop on each input file record
while ($sourcelinenb < $nboflines)
{
$sourcelinenb++;
$arrayrecord=$obj->import_read_record();
if ($excludefirstline && $sourcelinenb == 1) continue;
$result=$obj->import_insert($arrayrecord,$array_match_file_to_database,$objimport,sizeof($fieldssource),$importid);
if (sizeof($obj->errors)) $arrayoferrors[$sourcelinenb]=$obj->errors;
if (sizeof($obj->warnings)) $arrayofwarnings[$sourcelinenb]=$obj->warnings;
if (! sizeof($obj->errors) && ! sizeof($obj->warnings)) $nbok++;
}
// Close file
$obj->import_close_file();
}
else
{
print $langs->trans("ErrorFailedToOpenFile",$pathfile);
}
$db->rollback(); // We force rollback because this was just a simulation.
// Show OK
if (! sizeof($arrayoferrors) && ! sizeof($arrayofwarnings)) print img_tick().' <b>'.$langs->trans("NoError").'</b><br><br>';
else print $langs->trans("NbOfLinesOK",$nbok).'</b><br><br>';
// Show Errors
//var_dump($arrayoferrors);
if (sizeof($arrayoferrors))
{
print img_error().' <b>'.$langs->trans("ErrorsOnXLines",sizeof($arrayoferrors)).'</b><br>';
print '<table width="100%" class="border"><tr><td>';
foreach ($arrayoferrors as $key => $val)
{
$nboferrors++;
if ($nboferrors > $maxnboferrors)
{
print $langs->trans("TooMuchErrors",(sizeof($arrayoferrors)-$nboferrors))."<br>";
break;
}
print '* '.$langs->trans("Line").' '.$key.'<br>';
foreach($val as $i => $err)
{
print ' &nbsp; &nbsp; > '.$err['lib'].'<br>';
}
}
print '</td></tr></table>';
print '<br>';
}
// Show Warnings
//var_dump($arrayoferrors);
if (sizeof($arrayofwarnings))
{
print img_warning().' <b>'.$langs->trans("WarningsOnXLines",sizeof($arrayofwarnings)).'</b><br>';
print '<table width="100%" class="border"><tr><td>';
foreach ($arrayofwarnings as $key => $val)
{
$nbofwarnings++;
if ($nbofwarnings > $maxnbofwarnings)
{
print $langs->trans("TooMuchWarnings",(sizeof($arrayofwarnings)-$nbofwarnings))."<br>";
break;
}
print ' * '.$langs->trans("Line").' '.$key.'<br>';
foreach($val as $i => $err)
{
print ' &nbsp; &nbsp; > '.$err['lib'].'<br>';
}
}
print '</td></tr></table>';
print '<br>';
}
// Show import id
$importid=dol_print_date(dol_now('tzserver'),'%Y%m%d%H%M%S');
print '<center>';
print $langs->trans("NowClickToRunTheImport",$langs->transnoentitiesnoconv("RunImportFile")).'<br>';
print $langs->trans("DataLoadedWithId",$importid).'<br>';
print '</center>';
print '<br>';
// Actions
print '<center>';
if ($user->rights->import->run)
{
if (empty($nboferrors))
{
print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=6&importid='.$importid.$param.'">'.$langs->trans("RunImportFile").'</a>';
}
else
{
//print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=5&action=launchsimu'.$param.'">'.$langs->trans("RunSimulateImportFile").'</a>';
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("CorrectErrorBeforeRunningImport")).'">'.$langs->trans("RunImportFile").'</a>';
}
}
else
{
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("RunSimulateImportFile").'</a>';
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("RunImportFile").'</a>';
}
print '</center>';
}
if ($mesg) print $mesg;
}
// STEP 6: Result of simulation
// STEP 6: Real import
if ($step == 6 && $datatoimport)
{
$model=$format;
$liste=$objmodelimport->liste_modeles($db);
// Create classe to use for import
$dir = DOL_DOCUMENT_ROOT . "/includes/modules/import/";
$file = "import_".$model.".modules.php";
$classname = "Import".ucfirst($model);
require_once($dir.$file);
$obj = new $classname($db);
// Load source fields in input file
$fieldssource=array();
$result=$obj->import_open_file($conf->import->dir_temp.'/'.$filetoimport,$langs);
if ($result >= 0)
{
// Read first line
$arrayrecord=$obj->import_read_record();
// Put into array fieldssource starting with 1.
$i=1;
foreach($arrayrecord as $key => $val)
{
$fieldssource[$i]['example1']=dol_trunc($val['val'],24);
$i++;
}
$obj->import_close_file();
}
$nboflines=(! empty($_GET["nboflines"])?$_GET["nboflines"]:dol_count_nb_of_line($conf->import->dir_temp.'/'.$filetoimport));
$param='&format='.$format.'&datatoimport='.$datatoimport.'&filetoimport='.urlencode($filetoimport).'&nboflines='.$nboflines;
if ($excludefirstline) $param.='&excludefirstline=1';
llxHeader('',$langs->trans("NewImport"),'EN:Module_Imports_En|FR:Module_Imports|ES:M&oacute;dulo_Importaciones');
$h = 0;
$head[$h][0] = DOL_URL_ROOT.'/imports/import.php?step=1'.$param;
$head[$h][1] = $langs->trans("Step")." 1";
$h++;
$head[$h][0] = DOL_URL_ROOT.'/imports/import.php?step=2'.$param;
$head[$h][1] = $langs->trans("Step")." 2";
$h++;
$head[$h][0] = DOL_URL_ROOT.'/imports/import.php?step=3'.$param;
$head[$h][1] = $langs->trans("Step")." 3";
$h++;
$head[$h][0] = DOL_URL_ROOT.'/imports/import.php?step=4'.$param;
$head[$h][1] = $langs->trans("Step")." 4";
$h++;
$head[$h][0] = DOL_URL_ROOT.'/imports/import.php?step=5'.$param;
$head[$h][1] = $langs->trans("Step")." 5";
$h++;
$head[$h][0] = DOL_URL_ROOT.'/imports/import.php?step=6'.$param;
$head[$h][1] = $langs->trans("Step")." 6";
$hselected=$h;
$h++;
dol_fiche_head($head, $hselected, $langs->trans("NewImport"));
print '<table width="100%" class="border">';
// Module
print '<tr><td width="25%">'.$langs->trans("Module").'</td>';
print '<td>';
//print img_object($objimport->array_import_module[0]->getName(),$objimport->array_import_module[0]->picto).' ';
print $objimport->array_import_module[0]->getName();
print '</td></tr>';
// Lot de donnees a importer
print '<tr><td>'.$langs->trans("DatasetToImport").'</td>';
print '<td>';
print img_object($objimport->array_import_module[0]->getName(),$objimport->array_import_icon[0]).' ';
print $objimport->array_import_label[0];
print '</td></tr>';
print '</table><br>';
print '<b>'.$langs->trans("InformationOnSourceFile").'</b>';
print '<table width="100%" class="border">';
//print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnSourceFile").'</b></td></tr>';
// Source file format
print '<tr><td width="25%">'.$langs->trans("SourceFileFormat").'</td>';
print '<td>';
$text=$objmodelimport->getDriverDesc($format);
print $html->textwithpicto($objmodelimport->getDriverLabel($format),$text);
print '</td></tr>';
// File to import
print '<tr><td>'.$langs->trans("FileToImport").'</td>';
print '<td>';
$modulepart='import';
//$relativepath=$filetoimport;
print '<a href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&file='.urlencode($filetoimport).'&step=4'.$param.'" target="_blank">';
print $filetoimport;
print '</a>';
print '</td></tr>';
// Nb of fields
print '<tr><td>';
print $langs->trans("NbOfSourceLines");
print '</td><td>';
print $nboflines;
print '</td></tr>';
// Checkbox do not import first line
print '<tr><td>';
print $langs->trans("Option");
print '</td><td>';
print '<input type="hidden" name="excludefirstline" value="'.$excludefirstline.'">';
print '<input type="checkbox" name="excludefirstlinebis" value="1" disabled="true"';
print ($excludefirstline?' checked="true"':'');
print '>';
print ' '.$langs->trans("DoNotImportFirstLine");
print '</td></tr>';
print '</table>';
print '<br>';
print '<b>'.$langs->trans("InformationOnTargetTables").'</b>';
print '<table width="100%" class="border">';
//print '<tr><td colspan="2"><b>'.$langs->trans("InformationOnTargetTables").'</b></td></tr>';
// Tables imported
print '<tr><td width="25%">';
print $langs->trans("TablesTarget");
print '</td><td>';
$listtables=array();
foreach($array_match_file_to_database as $code=>$label)
{
//var_dump($fieldssource);
if ($code > sizeof($fieldssource)) continue;
//print $code.'-'.$label;
$alias=preg_replace('/(\..*)$/i','',$label);
$listtables[$alias]=$objimport->array_import_tables[0][$alias];
}
if (sizeof($listtables))
{
$newval='';
foreach ($listtables as $val)
{
if ($newval) print ', ';
$newval=$val;
// Link to Dolibarr wiki pages
/*$helppagename='EN:Table_'.$newval;
if ($helppagename && empty($conf->global->MAIN_HELP_DISABLELINK))
{
// Get helpbaseurl, helppage and mode from helppagename and langs
$arrayres=getHelpParamFor($helppagename,$langs);
$helpbaseurl=$arrayres['helpbaseurl'];
$helppage=$arrayres['helppage'];
$mode=$arrayres['mode'];
$newval.=' <a href="'.sprintf($helpbaseurl,$helppage).'">'.img_picto($langs->trans($mode == 'wiki' ? 'GoToWikiHelpPage': 'GoToHelpPage'),DOL_URL_ROOT.'/theme/common/helpdoc.png','',1).'</a>';
}*/
print $newval;
}
}
else print $langs->trans("Error");
print '</td></tr>';
// Fields imported
print '<tr><td>';
print $langs->trans("FieldsTarget").'</td><td>';
$listfields=array();
$i=0;
$sort_array_match_file_to_database=$array_match_file_to_database;
ksort($sort_array_match_file_to_database);
//var_dump($sort_array_match_file_to_database);
foreach($sort_array_match_file_to_database as $code=>$label)
{
$i++;
//var_dump($fieldssource);
if ($code > sizeof($fieldssource)) continue;
//print $code.'-'.$label;
$alias=preg_replace('/(\..*)$/i','',$label);
$listfields[$i]=$langs->trans("Field").' '.$code.'->'.$label;
}
print sizeof($listfields)?(join(', ',$listfields)):$langs->trans("Error");
print '</td></tr>';
print '</table>';
// Launch import
$arrayoferrors=array();
$arrayofwarnings=array();
$maxnboferrors=empty($conf->global->IMPORT_MAX_NB_OF_ERRORS)?50:$conf->global->IMPORT_MAX_NB_OF_ERRORS;
$maxnbofwarnings=empty($conf->global->IMPORT_MAX_NB_OF_WARNINGS)?50:$conf->global->IMPORT_MAX_NB_OF_WARNINGS;
$nboferrors=0;
$nbofwarnings=0;
$importid=dol_print_date(dol_now('tzserver'),'%Y%m%d%H%M%S');
//var_dump($array_match_file_to_database);
$db->begin();
// Open input file
$nbok=0;
$pathfile=$conf->import->dir_temp.'/'.$filetoimport;
$result=$obj->import_open_file($pathfile,$langs);
if ($result > 0)
{
$sourcelinenb=0;
// Loop on each input file record
while ($sourcelinenb < $nboflines)
{
$sourcelinenb++;
$arrayrecord=$obj->import_read_record();
if ($excludefirstline && $sourcelinenb == 1) continue;
$result=$obj->import_insert($arrayrecord,$array_match_file_to_database,$objimport,sizeof($fieldssource),$importid);
if (sizeof($obj->errors)) $arrayoferrors[$sourcelinenb]=$obj->errors;
if (sizeof($obj->warnings)) $arrayofwarnings[$sourcelinenb]=$obj->warnings;
if (! sizeof($obj->errors) && ! sizeof($obj->warnings)) $nbok++;
}
// Close file
$obj->import_close_file();
}
else
{
print $langs->trans("ErrorFailedToOpenFile",$pathfile);
}
$db->rollback(); // We force rollback because this was just a simulation.
print '</div>';
// Show OK
if (! sizeof($arrayoferrors) && ! sizeof($arrayofwarnings)) print img_tick().' <b>'.$langs->trans("NoError").'</b><br><br>';
else print $langs->trans("NbOfLinesOK",$nbok).'</b><br><br>';
// Show Errors
//var_dump($arrayoferrors);
if (sizeof($arrayoferrors))
{
print img_error().' <b>'.$langs->trans("ErrorsOnXLines",sizeof($arrayoferrors)).'</b><br>';
print '<table width="100%" class="border"><tr><td>';
foreach ($arrayoferrors as $key => $val)
{
$nboferrors++;
if ($nboferrors > $maxnboferrors)
{
print $langs->trans("TooMuchErrors",(sizeof($arrayoferrors)-$nboferrors))."<br>";
break;
}
print '* '.$langs->trans("Line").' '.$key.'<br>';
foreach($val as $i => $err)
{
print ' &nbsp; &nbsp; > '.$err['lib'].'<br>';
}
}
print '</td></tr></table>';
print '<br>';
}
// Show Warnings
//var_dump($arrayoferrors);
if (sizeof($arrayofwarnings))
{
print img_warning().' <b>'.$langs->trans("WarningsOnXLines",sizeof($arrayofwarnings)).'</b><br>';
print '<table width="100%" class="border"><tr><td>';
foreach ($arrayofwarnings as $key => $val)
{
$nbofwarnings++;
if ($nbofwarnings > $maxnbofwarnings)
{
print $langs->trans("TooMuchWarnings",(sizeof($arrayofwarnings)-$nbofwarnings))."<br>";
break;
}
print ' * '.$langs->trans("Line").' '.$key.'<br>';
foreach($val as $i => $err)
{
print ' &nbsp; &nbsp; > '.$err['lib'].'<br>';
}
}
print '</td></tr></table>';
print '<br>';
}
// Show import id
$importid=dol_print_date(dol_now('tzserver'),'%Y%m%d%H%M%S');
print '<center>';
print $langs->trans("NowClickToRunTheImport",$langs->transnoentitiesnoconv("RunImportFile")).'<br>';
print $langs->trans("DataLoadedWithId",$importid).'<br>';
print '</center>';
print '<br>';
// Actions
print '<center>';
if ($user->rights->import->run)
{
if (empty($nboferrors))
{
print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=7&importid='.$importid.$param.'">'.$langs->trans("RunImportFile").'</a>';
}
else
{
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("CorrectErrorBeforeRunningImport")).'">'.$langs->trans("RunImportFile").'</a>';
}
}
else
{
print '<a class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("RunImportFile").'</a>';
}
/*print '<form action="'.$_SERVER["PHP_SELF"].'?step=6&'.$param.'">';
print '<input class="button" type="submit" value="'.$langs->trans("RunSimulateImportFile").'">';
print '</form>';*/
print '</center>';
if ($mesg) print $mesg;
}
// STEP 7: Real import
if ($step == 7 && $datatoimport)
{
$model=$format;
$liste=$objmodelimport->liste_modeles($db);
@ -1673,10 +1479,6 @@ if ($step == 7 && $datatoimport)
$head[$h][0] = DOL_URL_ROOT.'/imports/import.php?step=6'.$param;
$head[$h][1] = $langs->trans("Step")." 6";
$h++;
$head[$h][0] = DOL_URL_ROOT.'/imports/import.php?step=7'.$param;
$head[$h][1] = $langs->trans("Step")." 7";
$hselected=$h;
$h++;

View File

@ -50,6 +50,8 @@ class ImportCsv extends ModeleImports
var $handle; // Handle fichier
var $cachefieldtable=array(); // Array to cache list of value into fields@tables
/**
* \brief Constructeur
@ -330,7 +332,7 @@ class ImportCsv extends ModeleImports
else if ($arrayrecord[($key-1)]['type'] > 0)
{
$newval=$arrayrecord[($key-1)]['val'];
$listvalues.="'".addslashes($arrayrecord[($key-1)]['val'])."'";
$listvalues.="'".$this->db->escape($arrayrecord[($key-1)]['val'])."'";
}
// Make some tests
@ -345,16 +347,55 @@ class ImportCsv extends ModeleImports
}
// Test format only if field is not a missing mandatory field
else {
if (! empty($objimport->array_import_regex[0][$val]) && ! preg_match('/'.$objimport->array_import_regex[0][$val].'/i',$newval))
if (! empty($objimport->array_import_regex[0][$val]))
{
$this->errors[$error]['lib']=$langs->trans('ErrorWrongValueForField',$key,$newval,$objimport->array_import_regex[0][$val]);
$this->errors[$error]['type']='REGEX';
$errorforthistable++;
$error++;
// If test is "Must exist in a field@table"
if (preg_match('/^(.*)@(.*)$/',$objimport->array_import_regex[0][$val],$reg))
{
$field=$reg[1];
$table=$reg[2];
if (! is_array($this->cachefieldtable[$field.'@'.$table])) // If content of field@table no already loaded into cache
{
$sql="SELECT ".$field." as aliasfield FROM ".$table;
$resql=$this->db->query($sql);
if ($resql)
{
$num=$this->db->num_rows($resql);
$i=0;
while ($i < $num)
{
$obj=$this->db->fetch_object($resql);
if ($obj) $this->cachefieldtable[$field.'@'.$table][]=$obj->aliasfield;
$i++;
}
}
else
{
dol_print_error($this->db);
}
}
// Now we check in cache
if (! in_array($newval,$this->cachefieldtable[$field.'@'.$table]))
{
$this->errors[$error]['lib']=$langs->trans('ErrorFieldValueNotIn',$key,$newval,$field,$table);
$this->errors[$error]['type']='FOREIGNKEY';
$error++;
}
}
// If test is just a static regex
else if (! preg_match('/'.$objimport->array_import_regex[0][$val].'/i',$newval))
{
$this->errors[$error]['lib']=$langs->trans('ErrorWrongValueForField',$key,$newval,$objimport->array_import_regex[0][$val]);
$this->errors[$error]['type']='REGEX';
$errorforthistable++;
$error++;
}
}
// Other tests
// ...
// Other tests
// ...
}
}
$i++;

View File

@ -209,16 +209,19 @@ class modAdherent extends DolibarrModules
//--------
$r=0;
$now=dol_now();
require_once(DOL_DOCUMENT_ROOT."/lib/date.lib.php");
$r++;
$this->import_code[$r]=$this->rights_class.'_'.$r;
$this->import_label[$r]="Members"; // Translation key
$this->import_icon[$r]=$this->picto;
$this->import_tables_array[$r]=array('a'=>MAIN_DB_PREFIX.'adherent');
$this->import_tables_creator_array[$r]=array('a'=>'fk_user_author'); // Fields to store import user id
$this->import_fields_array[$r]=array('a.civilite'=>"Civility",'a.nom'=>"Lastname*",'a.prenom'=>"Firstname",'a.login'=>"Login*","a.pass"=>"Password","a.fk_adherent_type"=>"MemberType*",'a.morphy'=>'MorPhy*','a.societe'=>'Company','a.adresse'=>"Address",'a.cp'=>"Zip",'a.ville'=>"Town",'a.pays'=>"Country",'a.phone'=>"PhonePro",'a.phone_perso'=>"PhonePerso",'a.phone_mobile'=>"PhoneMobile",'a.email'=>"Email",'a.naiss'=>"Birthday",'a.statut'=>"Status*",'a.photo'=>"Photo",'a.note'=>"Note",'a.datec'=>'DateCreation');
$this->import_fields_array[$r]=array('a.civilite'=>"Civility",'a.nom'=>"Lastname*",'a.prenom'=>"Firstname",'a.login'=>"Login*","a.pass"=>"Password","a.fk_adherent_type"=>"MemberType*",'a.morphy'=>'MorPhy*','a.societe'=>'Company','a.adresse'=>"Address",'a.cp'=>"Zip",'a.ville'=>"Town",'a.pays'=>"Country",'a.phone'=>"PhonePro",'a.phone_perso'=>"PhonePerso",'a.phone_mobile'=>"PhoneMobile",'a.email'=>"Email",'a.naiss'=>"Birthday",'a.statut'=>"Status*",'a.photo'=>"Photo",'a.note'=>"Note",'a.datec'=>'DateCreation','a.datefin'=>'DateEndSubscription');
$this->import_entities_array[$r]=array(); // We define here only fields that use another picto
$this->import_regex_array[$r]=array('a.civilite'=>'code@'.MAIN_DB_PREFIX.'c_civilite','a.fk_adherent_type'=>'rowid@'.MAIN_DB_PREFIX.'adherent_type','a.morphy'=>'(phy|mor)','a.statut'=>'^[0|1]','a.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$');
$this->import_examplevalues_array[$r]=array('a.civilite'=>"MR",'a.nom'=>'Smith','a.prenom'=>'John','a.login'=>'jsmith','a.pass'=>'passofjsmith','a.fk_adherent_type'=>'1','a.morphy'=>'"mor" or "phy"','a.societe'=>'JS company','a.adresse'=>'21 jump street','a.cp'=>'55000','a.ville'=>'New York','a.pays'=>'US','a.email'=>'jsmith@example.com','a.naiss'=>'1972-10-10','a.statut'=>"0 or 1",'a.note'=>"This is a comment on member",'a.datec'=>'2008-12-31');
$this->import_regex_array[$r]=array('a.civilite'=>'code@'.MAIN_DB_PREFIX.'c_civilite','a.fk_adherent_type'=>'rowid@'.MAIN_DB_PREFIX.'adherent_type','a.morphy'=>'(phy|mor)','a.statut'=>'^[0|1]','a.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$','a.datefin'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$');
$this->import_examplevalues_array[$r]=array('a.civilite'=>"MR",'a.nom'=>'Smith','a.prenom'=>'John','a.login'=>'jsmith','a.pass'=>'passofjsmith','a.fk_adherent_type'=>'1','a.morphy'=>'"mor" or "phy"','a.societe'=>'JS company','a.adresse'=>'21 jump street','a.cp'=>'55000','a.ville'=>'New York','a.pays'=>'1','a.email'=>'jsmith@example.com','a.naiss'=>'1972-10-10','a.statut'=>"0 or 1",'a.note'=>"This is a comment on member",'a.datec'=>dol_print_date($now,'%Y-%m-%d'),'a.datefin'=>dol_print_date(dol_time_plus_duree($now, 1, 'y'),'%Y-%m-%d'));
}

View File

@ -65,3 +65,7 @@ UPDATE llx_c_tva SET taux = '18' WHERE rowid = 41;
UPDATE llx_c_tva SET taux = '8' WHERE rowid = 42;
DELETE FROM llx_c_tva WHERE rowid = 45;
DELETE FROM llx_c_tva WHERE rowid = 46;
ALTER TABLE llx_adherent ADD COLUMN import_key varchar(14);
ALTER TABLE llx_categorie ADD COLUMN import_key varchar(14);

View File

@ -59,5 +59,6 @@ create table llx_adherent
tms timestamp, -- date de modification
fk_user_author integer, -- can be null because member can be create by a guest
fk_user_mod integer,
fk_user_valid integer
fk_user_valid integer,
import_key varchar(14) -- Import key
)type=innodb;

View File

@ -25,10 +25,11 @@ create table llx_categorie
rowid integer AUTO_INCREMENT PRIMARY KEY,
label varchar(255), -- category name
type tinyint DEFAULT 1 NOT NULL, -- category type (product, supplier, customer)
entity integer DEFAULT 1 NOT NULL, -- multi company id
entity integer DEFAULT 1 NOT NULL, -- multi company id
description text, -- description of the category
fk_soc integer DEFAULT NULL, -- attribution of the category has a company (for product only)
visible tinyint DEFAULT 1 NOT NULL -- determine if the products are visible or not
fk_soc integer DEFAULT NULL, -- attribution of the category has a company (for product only)
visible tinyint DEFAULT 1 NOT NULL, -- determine if the products are visible or not
import_key varchar(14) -- Import key
)type=innodb;
--

View File

@ -64,6 +64,7 @@ ErrorModuleRequireJavascript=Javascript must not be disabled to have this featur
ErrorPasswordsMustMatch=Both typed passwords must match each other
ErrorContactEMail=A technical error occured. Please, contact administrator to folowwing email <b>%s</b> en provide the error code <b>%s</b> in your message, or even better by adding a screen copy of this page.
ErrorWrongValueForField=Wrong value for field number <b>%s</b> (value '<b>%s</b>' does not match regex rule <b>%s</b>)
ErrorFieldValueNotIn=Wrong value for field number<b>%s</b> (value '<b>%s</b>' is not a value available into field <b>%s</b> of table <b>%s</b>)
ErrorsOnXLines=Errors on <b>%s</b> source lines
WarningsOnXLines=Warnings on <b>%s</b> source lines
ErrorFileIsInfectedWithAVirus=The antivirus program was not able to validate the file (file might be infected by a virus)

View File

@ -65,6 +65,7 @@ ErrorModuleRequireJavascript=Le javascript ne doit pas être désactivé pour qu
ErrorPasswordsMustMatch=Les 2 mots de passe saisis doivent correspondre
ErrorContactEMail=Une erreur technique est apparue. Merci de contacter l'administrateur à l'email suivant <b>%s</b> en lui indiquant le code erreur <b>%s</b> dans votre message ou mieux en fournissant une copie d'écran de cette page.
ErrorWrongValueForField=Mauvaise valeur pour le champ numéro <b>%s</b> (la valeur '<b>%s</b>' ne respecte pas la règle <b>%s</b>)
ErrorFieldValueNotIn=Mauvaise valeur pour le champ numéro <b>%s</b> (la valeur '<b>%s</b>' n'est pas une valeure présente dans le champ <b>%s</b> de la table <b>%s</b>)
ErrorsOnXLines=Erreurs sur <b>%s</b> lignes sources
WarningsOnXLines=Alertes sur <b>%s</b> lignes sources
ErrorFileIsInfectedWithAVirus=L'antivirus n'a pas pu valider ce fichier (il est probablement infecté par un virus) !

View File

@ -21,15 +21,34 @@
/**
* \file htdocs/lib/date.lib.php
* \brief Ensemble de fonctions de base de dolibarr sous forme d'include
* \version $Id$
* \version $Id$
*/
/** \brief Converti les heures et minutes en secondes
* \param iHours Heures
* \param iMinutes Minutes
* \param iSeconds Secondes
* \return iResult Temps en secondes
/**
* Add a delay to a date
* @param time Date timestamp ou au format YYYY-MM-DD
* @param duration_value Value of delay to add
* @param duration_unit Unit of added delay (d, m, y)
* @return int New timestamp
*/
function dol_time_plus_duree($time,$duration_value,$duration_unit)
{
if ($duration_value == 0) return $time;
if ($duration_value > 0) $deltastring="+".abs($duration_value);
if ($duration_value < 0) $deltastring="-".abs($duration_value);
if ($duration_unit == 'd') { $deltastring.=" day"; }
if ($duration_unit == 'm') { $deltastring.=" month"; }
if ($duration_unit == 'y') { $deltastring.=" year"; }
return strtotime($deltastring,$time);
}
/** Converti les heures et minutes en secondes
* @param iHours Heures
* @param iMinutes Minutes
* @param iSeconds Secondes
* @return iResult Temps en secondes
*/
function ConvertTime2Seconds($iHours=0,$iMinutes=0,$iSeconds=0)
{
@ -38,13 +57,12 @@ function ConvertTime2Seconds($iHours=0,$iMinutes=0,$iSeconds=0)
}
/** \brief Return, in clear text, value of a number of seconds in days, hours and minutes
* \param iSecond Number of seconds
* \param format Output format (all: complete display, hour: displays only hours, min: displays only minutes)
* \param lengthOfDay Length of day (default 86400 seconds)
* \return sTime Formated text of duration
* \example 0 return 00:00, 3600 return 1:00, 86400 return 1d, 90000 return 1 Day 01:00
*
/** Return, in clear text, value of a number of seconds in days, hours and minutes
* @param iSecond Number of seconds
* @param format Output format (all: complete display, hour: displays only hours, min: displays only minutes)
* @param lengthOfDay Length of day (default 86400 seconds)
* @return sTime Formated text of duration
* @example 0 return 00:00, 3600 return 1:00, 86400 return 1d, 90000 return 1 Day 01:00
*/
function ConvertSecondToTime($iSecond,$format='all',$lengthOfDay=86400)
{
@ -86,10 +104,10 @@ function ConvertSecondToTime($iSecond,$format='all',$lengthOfDay=86400)
}
/** \brief Return previous month
* \param month Month
* \param year Year
* \return array Previous year,month
/** Return previous month
* @param month Month
* @param year Year
* @return array Previous year,month
*/
function dol_get_prev_month($month, $year)
{
@ -106,10 +124,10 @@ function dol_get_prev_month($month, $year)
return array('year' => $prev_year, 'month' => $prev_month);
}
/** \brief Return next month
* \param month Month
* \param year Year
* \return array Next year,month
/** Return next month
* @param month Month
* @param year Year
* @return array Next year,month
*/
function dol_get_next_month($month, $year)
{
@ -127,13 +145,13 @@ function dol_get_next_month($month, $year)
}
/** \brief Return GMT time for first day of a month or year
* \param year Year
* \param month Month
* \param gm False = Return date to compare with server TZ, True to compare with GM date.
/** Return GMT time for first day of a month or year
* @param year Year
* @param month Month
* @param gm False = Return date to compare with server TZ, True to compare with GM date.
* Exemple: dol_get_first_day(1970,1,false) will return -3600 with TZ+1, after a dol_print_date will return 1970-01-01 00:00:00
* Exemple: dol_get_first_day(1970,1,true) will return 0 whatever is TZ, after a dol_print_date will return 1970-01-01 00:00:00
* \return Timestamp Date for first day
* @return Timestamp Date for first day
*/
function dol_get_first_day($year,$month=1,$gm=false)
{
@ -141,11 +159,11 @@ function dol_get_first_day($year,$month=1,$gm=false)
}
/** \brief Return GMT time for last day of a month or year
* \param year Year
* \param month Month
* \param gm False = Return date to compare with server TZ, True to compare with GM date.
* \return Timestamp Date for first day
/** Return GMT time for last day of a month or year
* @param year Year
* @param month Month
* @param gm False = Return date to compare with server TZ, True to compare with GM date.
* @return Timestamp Date for first day
*/
function dol_get_last_day($year,$month=12,$gm=false)
{
@ -168,11 +186,11 @@ function dol_get_last_day($year,$month=12,$gm=false)
/**
* \brief Fonction retournant le nombre de jour fieries samedis et dimanches entre 2 dates entrees en timestamp
* \remarks Called by function num_open_day
* \param timestampStart Timestamp de debut
* \param timestampEnd Timestamp de fin
* \return nbFerie Nombre de jours feries
* Fonction retournant le nombre de jour fieries samedis et dimanches entre 2 dates entrees en timestamp
* @remarks Called by function num_open_day
* @param timestampStart Timestamp de debut
* @param timestampEnd Timestamp de fin
* @return nbFerie Nombre de jours feries
*/
function num_public_holiday($timestampStart, $timestampEnd, $countrycode='FR')
{
@ -266,11 +284,11 @@ function num_public_holiday($timestampStart, $timestampEnd, $countrycode='FR')
}
/**
* \brief Fonction retournant le nombre de jour entre deux dates
* \param timestampStart Timestamp de debut
* \param timestampEnd Timestamp de fin
* \param lastday On prend en compte le dernier jour, 0: non, 1:oui
* \return nbjours Nombre de jours
* Fonction retournant le nombre de jour entre deux dates
* @param timestampStart Timestamp de debut
* @param timestampEnd Timestamp de fin
* @param lastday On prend en compte le dernier jour, 0: non, 1:oui
* @return nbjours Nombre de jours
*/
function num_between_day($timestampStart, $timestampEnd, $lastday=0)
{
@ -290,12 +308,12 @@ function num_between_day($timestampStart, $timestampEnd, $lastday=0)
}
/**
* \brief Fonction retournant le nombre de jour entre deux dates sans les jours feries (jours ouvres)
* \param timestampStart Timestamp de debut
* \param timestampEnd Timestamp de fin
* \param inhour 0: sort le nombre de jour , 1: sort le nombre d'heure (72 max)
* \param lastday On prend en compte le dernier jour, 0: non, 1:oui
* \return nbjours Nombre de jours ou d'heures
* Fonction retournant le nombre de jour entre deux dates sans les jours feries (jours ouvres)
* @param timestampStart Timestamp de debut
* @param timestampEnd Timestamp de fin
* @param inhour 0: sort le nombre de jour , 1: sort le nombre d'heure (72 max)
* @param lastday On prend en compte le dernier jour, 0: non, 1:oui
* @return nbjours Nombre de jours ou d'heures
*/
function num_open_day($timestampStart, $timestampEnd,$inhour=0,$lastday=0)
{

View File

@ -24,16 +24,16 @@
*/
/**
* \brief Scan a directory and return a list of files/directories. Content for string is UTF8.
* \param $path Starting path from which to search
* \param $types Can be "directories", "files", or "all"
* \param $recursive Determines whether subdirectories are searched
* \param $filter Regex for include filter
* \param $exludefilter Regex for exclude filter (example: '\.meta$')
* \param $sortcriteria Sort criteria ("name","date","size")
* \param $sortorder Sort order (SORT_ASC, SORT_DESC)
* \param $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like date and size to be loaded (slower)
* \return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file')
* Scan a directory and return a list of files/directories. Content for string is UTF8.
* @param $path Starting path from which to search
* @param $types Can be "directories", "files", or "all"
* @param $recursive Determines whether subdirectories are searched
* @param $filter Regex for include filter
* @param $exludefilter Regex for exclude filter (example: '\.meta$')
* @param $sortcriteria Sort criteria ("name","date","size")
* @param $sortorder Sort order (SORT_ASC, SORT_DESC)
* @param $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like date and size to be loaded (slower)
* @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file')
*/
function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter="", $sortcriteria="name", $sortorder=SORT_ASC, $mode=0)
{

View File

@ -393,8 +393,8 @@ function dol_fiche_head($links, $active='0', $title='', $notab=0, $picto='')
}
/**
* \brief Show tab footer of a card
* \param notab 0=Add tab footer, 1=no tab footer
* Show tab footer of a card
* @param notab 0=Add tab footer, 1=no tab footer
*/
function dol_fiche_end($notab=0)
{
@ -402,25 +402,6 @@ function dol_fiche_end($notab=0)
}
/**
* \brief Add a delay to a date
* \param time Date timestamp ou au format YYYY-MM-DD
* \param duration_value Value of delay to add
* \param duration_unit Unit of added delay (d, m, y)
* \return int New timestamp
*/
function dol_time_plus_duree($time,$duration_value,$duration_unit)
{
if ($duration_value == 0) return $time;
if ($duration_value > 0) $deltastring="+".abs($duration_value);
if ($duration_value < 0) $deltastring="-".abs($duration_value);
if ($duration_unit == 'd') { $deltastring.=" day"; }
if ($duration_unit == 'm') { $deltastring.=" month"; }
if ($duration_unit == 'y') { $deltastring.=" year"; }
return strtotime($deltastring,$time);
}
/* For backward compatibility */
function dolibarr_print_date($time,$format='',$to_gmt=false,$outputlangs='',$encodetooutput=false)
{
@ -1101,15 +1082,15 @@ function img_object($alt, $object)
function img_picto($alt, $picto, $options='', $pictoisfullpath=0)
{
global $conf;
$path = 'theme/'.$conf->theme;
if (preg_match('/^([^@]+)@([^@]+)$/i',$picto,$regs))
{
$picto = $regs[1];
$path = $regs[2];
}
if (! preg_match('/(\.png|\.gif)$/i',$picto)) $picto.='.png';
if ($pictoisfullpath) return '<img src="'.$picto.'" border="0" alt="'.dol_escape_htmltag($alt).'" title="'.dol_escape_htmltag($alt).'"'.($options?' '.$options:'').'>';
return '<img src="'.DOL_URL_ROOT.'/'.$path.'/img/'.$picto.'" border="0" alt="'.dol_escape_htmltag($alt).'" title="'.dol_escape_htmltag($alt).'"'.($options?' '.$options:'').'>';
@ -2422,7 +2403,7 @@ function price($amount, $html=0, $outlangs='', $trunc=1, $rounding=-1, $forcerou
$end='...';
}
}
// If force rounding
if ($forcerounding >= 0) $nbdecimal = $forcerounding;

View File

@ -475,8 +475,6 @@ if ($_REQUEST["amount"] == 'contractline')
//}
if ($contractline->date_fin_validite)
{
//$dateactend = dol_time_plus_duree ($contractline->date_fin_validite, $product->duration_value, $product->duration_unit);
//print ', '.$langs->trans("DateEndPlanned").': '.dol_print_date($contractline->date_fin_validite);
$text.='<br>'.$langs->trans("ExpiredSince").': '.dol_print_date($contractline->date_fin_validite);
}

View File

@ -1,6 +1,6 @@
<?PHP
/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2009 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2006-2010 Laurent Destailleur <eldy@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -42,6 +42,7 @@ $forcecommit=0;
require_once($path."../../htdocs/master.inc.php");
require_once(DOL_DOCUMENT_ROOT."/lib/date.lib.php");
require_once(DOL_DOCUMENT_ROOT."/lib/ldap.class.php");
require_once(DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php");
require_once(DOL_DOCUMENT_ROOT."/adherents/class/cotisation.class.php");