Well I guess I do have one more question.
Importing of Member Works in New, Identifies Member in Module if they exist, adds the dues payment in the dues module and creates the relationship perfectly. Everything I wanted it to do.
Howeverā¦
It will create multiple of the same dues payments if I run the script twice which is perfect, as I will be running new dues records all the time
It will not create duplicate members, also perfect.
But only relates the first dues payment record imported to the member.
Hereās the latest code
<?php
if (!defined('sugarEntry') || !sugarEntry) die ('Not a Valid Entry Point!');
$date = new DateTime();
echo '<H2>Wilderness Import Started</h2>';
echo $date->format('r').'<br>';
echo '-------------------------------------------------------------------------------------------------------------------------------------<br>';
require_once("include/utils/sugar_file_utils.php");
MemberImportJob();
clearstatcache();
DuesImportJob();
die();
function time_elapsed()
{
static $first = null;
static $previous = null;
$now = microtime(true);
if ($first == null) $first = $now;
if ($previous != null)
echo("<br /><br /><strong>---------------------------------------------------------------------------------------------------------</strong><br />");
echo '--- Partial ' . round(($now - $previous), 2) . ', Total ' . round(($now - $first), 2) . ' ---<br />'; // 109s
echo("<strong>---------------------------------------------------------------------------------------------------------</strong><br />");
$ret = round(($now - $previous), 2);
$previous = $now;
return $ret;
}
function myLog ($str2log)
{
file_put_contents('./zlog_'.date("j.n.Y").'.txt', date("H:i:s", time())." ".$str2log.PHP_EOL, FILE_APPEND);
}
function calcDelta($a1, $a2)
{
//combine into a nice associative array:
$delta=Array();
foreach ($a1 as $key=>$value)
{
if ($a1[$key] != $a2->$key)
$delta[] = array($key => ("Was ". $a1[$key]. ", became " . $a2->$key));
}
//$num = count($data);
if (empty($a1)) $delta[] = array("a1" => ("Was empty"));
if (empty($a2)) $delta[] = array("a2" => ("Was empty"));
return $delta;
}
require_once("include/utils/sugar_file_utils.php");
function fillPerson($record, &$person, $employeeID)
{
if ($person->full_name_import == "") {
echo("<br /><br /><strong style='color:red;'>Record Not Found!</strong><br /><br />");
echo("Creating New Member Record for " . $record["LAST NAME"] . " " . $record["FIRST NAME"] . "<br /><br />");
$employeeID = $record["EMP ID"];
$employeeIDLeadingZeros = str_pad($employeeID, 8, '0', STR_PAD_LEFT);
echo("Add Leading Zeros to Employee ID: " . $employeeID . "<br /><br />");
echo("New Employee ID Formatted to Standardized Format: " . $employeeIDLeadingZeros . "<br /><br />");
$person->first_name = $record["FIRST NAME"];
$person->last_name = $record["LAST NAME"];
$person->lcl_affiliate_number = $record["AFFILIATE"];
$person->lcl_employee_id = $employeeIDLeadingZeros;
//var_dump($employeeID);
//var_dump($employeeIDLeadingZeros);
$recordname = (($record["LAST NAME"] . " " . $record["FIRST NAME"]));
$person->full_name_import = $recordname;
$person->name = $person->first_name . " " . $person->last_name;
//$person->id = $employeeIDLeadingZeros;
$person->ppe_date_c = $record["PPE"];
//var_dump($person);
//var_dump($employeeIDLeadingZeros);
}
return calcDelta($person->fetched_row, $person);
}
function fillFoundRecord($record, &$person, $employeeID)
{
$person = BeanFactory::getBean("locte_Membership");
$person = $person->retrieve_by_string_fields(array('first_name' => $record["FIRST NAME"], 'last_name' => $record["LAST NAME"], 'lcl_affiliate_number' => $record["AFFILIATE"]));
echo("<br /><br /><strong style='color:red;'>Record Found for: " . $person->last_name . ", " . $person->first_name . "</strong><br /><br />");
echo("Updating Member Record for " . $record["LAST NAME"] . " " . $record["FIRST NAME"] . "<br /><br />");
$employeeID = $record["EMP ID"];
$employeeIDLeadingZeros = str_pad($employeeID, 8, '0', STR_PAD_LEFT);
echo("Add Leading Zeros to Employee ID: " . $employeeID . "<br /><br />");
echo("New Employee ID Formatted to Standardized Format: " . $employeeIDLeadingZeros . "<br /><br />");
//var_dump($employeeID);
//var_dump($employeeIDLeadingZeros);
$recordname = (($record["LAST NAME"] . " " . $record["FIRST NAME"]));
$person->full_name_import = $recordname;
$recordnameV = (($record["LAST NAME"] . ", " . $record["FIRST NAME"]));
$person->name = $recordnameV;
//$person->id = $employeeIDLeadingZeros;
$person->ppe_date_c = $record["PPE"];
$person->lcl_affiliate_number = $record["AFFILIATE"];
$person->lcl_employee_id = $employeeIDLeadingZeros;
// $person_id = $person->save();
return calcDelta($person->fetched_row, $person);
}
function fillDues($record, &$person, $employeeID)
{
//echo("<br /><br /><strong>New Dues Record for: " . $record["LAST NAME"] . ", " . $record["FIRST NAME"]"</strong><br /><br />");
echo("***********************************************************************************************************************");
echo("<br /><br /><br />Creating New DUES Record for " . $record["LAST NAME"] . ", " . $record["FIRST NAME"] . "<br /><br />");
$employeeID = $record["EMP ID"];
$employeeIDLeadingZeros = str_pad($employeeID, 8, '0', STR_PAD_LEFT);
echo("Add Leading Zeros to Employee ID: " . $employeeID . "<br /><br />");
echo("New Employee ID Formatted to Standardized Format: " . $employeeIDLeadingZeros . "<br /><br />");
$person->dues_first_name = $record["FIRST NAME"];
$person->dues_last_name = $record["LAST NAME"];
$person->dues_affiliate_number_c = $record["AFFILIATE"];
$person->dues_emp_id = $employeeIDLeadingZeros;
//var_dump($employeeID);
//var_dump($employeeIDLeadingZeros);
$recordname = (($record["LAST NAME"] . " " . $record["FIRST NAME"]));
$person->dues_full_name = $recordname;
$person->name = $record["LAST NAME"] . ", " . $record["FIRST NAME"];
//$person->id = $employeeIDLeadingZeros;
$person->ppe_date_c = $record["PPE"];
$person->dues_amount = $record["DUES AMT"];
//var_dump($person);
//var_dump($employeeIDLeadingZeros);
return calcDelta($person->fetched_row, $person);
}
function MemberImportJob()
{
try
{
time_elapsed();
$GLOBALS['log']->info('Wilderness Import');
$config = new Configurator();
$config->loadConfig();
$xmlDataDir = 'custom/wimporter/eidimport'; //$config->config['WildernessImporter_DataFilePath'];
$GLOBALS['log']->info("Wilderness Import: Scanning XML Data dir $xmlDataDir...");
echo("<h3>Wilderness Import: Scanning XML Data dir $xmlDataDir...<br /></h3>");
$directoryContent = scandir($xmlDataDir);
$GLOBALS['log']->info("Wilderness Import: Scanning XML Data dir $xmlDataDir... [Found " . count($directoryContent) . " files]");
echo("<h3>Wilderness Import: Scanning XML Data dir $xmlDataDir... [Found " . count($directoryContent) . " files]</h3>");
foreach ($directoryContent as $itemFile)
{
if (is_dir($xmlDataDir . DIRECTORY_SEPARATOR . $itemFile)) continue;
if (strcasecmp(substr($itemFile, -4), ".csv") != 0) continue;
$GLOBALS['log']->info("Wilderness Import: Processing $itemFile file...");
myLog("---------------------------------------------------");
myLog("Wilderness Import: Processing $itemFile file...");
myLog("----------------------------------------------------");
echo("<br /><br /><strong>---------------------------------------------------------------</strong><br />");
echo("<strong>Wilderness Import: Processing $itemFile file...</strong><br />");
echo("<strong>---------------------------------------------------------------</strong><br /><br />");
$oFile = fopen($xmlDataDir . DIRECTORY_SEPARATOR . $itemFile, 'r');
if ($oFile !== FALSE)
{
$header = NULL;
$data = Array();
// read entire file at once:
// expected separator is ",", expected encoding is UTF-8 without BOM (BOM is 3 weird characters in beginning of file)
while (($data[] = fgetcsv($oFile, 0, ',')) !== FALSE) { }
echo('File opened..... <br /> <br />');
fclose($oFile);
//combine into a nice associative array:
$arow=Array();
echo('<strong>Building Array of Row Data from CSV File' . $itemFile . '<br /><br />');
$fields = array_shift($data);
echo('Building CSV Header Fields Array as shown below: <br /><br />');
echo implode(", ", $fields) . "</strong><br /><br />\n";
foreach ($data as $i=>$arow)
{
$GLOBALS['log']->info("Wilderness Import: array_combine " . $i);
if (is_array($arow)) {
$data[$i] = array_combine($fields, $arow);}
var_dump($fields);
var_dump($arow);
}
unset($arow); // **********************************************! ! ! !! ! ! ! ! ! !! !
$num = count($data);
echo('<br /><strong>Build Full Array of Roster to be Imported Complete. Entries to be imported are shown below: </strong> <br /><br />');
for ($row=0; $row < $num - 1; $row++)
{ // normal bounds: from 0 to $num
//$num is the number of lines including header in csv file
echo "<br /><br /><strong>Filename: $itemFile | Roster Import, Row " . ($row + 1) . ":</strong><br />\n";
$GLOBALS['log']->info("Wilderness Import: Importing " . $data[$row]['FULL NAME']);
echo("<strong>Importing Roster Row #: ". ($row + 1) . "<br />" . "Local Number " . $data[$row]["AFFILIATE"] . "<br />" . "Employee: " . $data[$row]["FULL NAME"] . "</strong><br /><br />");
echo "File Row Data: <br /><br />";
echo implode(", ", $data[$row]);
$Member = BeanFactory::getBean("locte_Membership");
$Member=$Member->retrieve_by_string_fields(array('last_name' => $data[$row]["LAST NAME"], 'first_name' => $data[$row]["FIRST NAME"], 'lcl_affiliate_number' => $data[$row]["AFFILIATE"]));
$MemberID = $Member->id;
if (is_null($Member)) {
$Member = BeanFactory::newBean('locte_Membership');
$delta = fillPerson($data[$row], $Member, "FULL NAME");
if(count($delta))
{
$Member_id = $Member->save();
var_dump($Member->last_name);
var_dump($Member->first_name);
var_dump($Member->lcl_affiliate_number);
var_dump($Member->full_name_import);
echo("Found Record Saved!");
}
} else {
var_dump($Member->id);
$delta = fillFoundRecord($data[$row], $Member, "FULL NAME");
}
/* $Dues = BeanFactory::newBean('adues_ppe');
$delta = fillDues($data[$row], $Dues, "EMP ID");
if(count($delta))
{
$Dues_id = $Dues->save();
}
$Member->load_relationship('locte_membership_adues_ppe_1');
$newrelMember = $Member->locte_membership_adues_ppe_1->add($Dues, array('id' => $MemberID));
*/
myLog("Importing done in " . round(time_elapsed(),2) . " seconds.<br /><br />");
echo("<br /><br /><strong>****************************************************************************************************************************************************************</strong>");
echo("<br /><br /><strong>****************************************************************************************************************************************************************</strong>");
unset($data[$row]);
}
//echo print_r($GLOBALS["beanList"]);
//echo("<p></p>");
// $myfield_defs = $Member->getFieldDefinitions(); // just to help while developing
// foreach($myfield_defs as $def) echo $def["name"] . "<br />\n";
}
// Records have been saved: from this point on, only work on relationships:
$GLOBALS['log']->info('End: Member Update/Import');
myLog('End: Wilderness Import');
echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
echo("<p>End: Member/Update Import<br />");
echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
//time_elapsed();
return true;
}
} catch (Exception $e)
{
$GLOBALS['log']->fatal("Wilderness Import: Exception " . $e->getMessage());
myLog("Wilderness Import: Exception " . $e->getMessage());
echo '\n\nCaught exception: ', $e->getMessage(), "\n";
return false;
}
}
function DuesImportJob()
{
try
{
time_elapsed();
$GLOBALS['log']->info('Wilderness Import');
$config = new Configurator();
$config->loadConfig();
$xmlDataDir = 'custom/wimporter/eidimport'; //$config->config['WildernessImporter_DataFilePath'];
$GLOBALS['log']->info("Wilderness Import: Scanning XML Data dir $xmlDataDir...");
echo("<h3>Wilderness Import: Scanning XML Data dir $xmlDataDir...<br /></h3>");
$directoryContent = scandir($xmlDataDir);
$GLOBALS['log']->info("Wilderness Import: Scanning XML Data dir $xmlDataDir... [Found " . count($directoryContent) . " files]");
echo("<h3>Wilderness Import: Scanning XML Data dir $xmlDataDir... [Found " . count($directoryContent) . " files]</h3>");
foreach ($directoryContent as $itemFile)
{
if (is_dir($xmlDataDir . DIRECTORY_SEPARATOR . $itemFile)) continue;
if (strcasecmp(substr($itemFile, -4), ".csv") != 0) continue;
$GLOBALS['log']->info("Wilderness Import: Processing $itemFile file...");
myLog("---------------------------------------------------");
myLog("Wilderness Import: Processing $itemFile file...");
myLog("----------------------------------------------------");
echo("<br /><br /><strong>---------------------------------------------------------------</strong><br />");
echo("<strong>Wilderness Import: Processing $itemFile file...</strong><br />");
echo("<strong>---------------------------------------------------------------</strong><br /><br />");
$oFile = fopen($xmlDataDir . DIRECTORY_SEPARATOR . $itemFile, 'r');
if ($oFile !== FALSE)
{
$header = NULL;
$data = Array();
// read entire file at once:
// expected separator is ",", expected encoding is UTF-8 without BOM (BOM is 3 weird characters in beginning of file)
while (($data[] = fgetcsv($oFile, 0, ',')) !== FALSE) { }
echo('File opened..... <br /> <br />');
fclose($oFile);
//combine into a nice associative array:
$arow=Array();
echo('<strong>Building Array of Row Data from CSV File' . $itemFile . '<br /><br />');
$fields = array_shift($data);
echo('Building CSV Header Fields Array as shown below: <br /><br />');
echo implode(", ", $fields) . "</strong><br /><br />\n";
foreach ($data as $i=>$arow)
{
$GLOBALS['log']->info("Wilderness Import: array_combine " . $i);
if (is_array($arow)) {
$data[$i] = array_combine($fields, $arow);}
var_dump($fields);
var_dump($arow);
}
unset($arow); // **********************************************! ! ! !! ! ! ! ! ! !! !
$num = count($data);
echo('<br /><strong>Build Full Array of Roster to be Imported Complete. Entries to be imported are shown below: </strong> <br /><br />');
for ($row=0; $row < $num - 1; $row++)
{ // normal bounds: from 0 to $num
//$num is the number of lines including header in csv file
echo "<br /><br /><strong>Filename: $itemFile | Roster Import, Row " . ($row + 1) . ":</strong><br />\n";
$GLOBALS['log']->info("Wilderness Import: Importing " . $data[$row]['FULL NAME']);
echo("<strong>Importing Roster Row #: ". ($row + 1) . "<br />" . "Local Number " . $data[$row]["AFFILIATE"] . "<br />" . "Employee: " . $data[$row]["FULL NAME"] . "</strong><br /><br />");
echo "File Row Data: <br /><br />";
echo implode(", ", $data[$row]);
$Member = BeanFactory::getBean("locte_Membership");
$Member=$Member->retrieve_by_string_fields(array('last_name' => $data[$row]["LAST NAME"], 'first_name' => $data[$row]["FIRST NAME"], 'lcl_affiliate_number' => $data[$row]["AFFILIATE"]));
$MemberID = $Member->id;
var_dump($Member->id);
$Dues = BeanFactory::newBean('adues_ppe');
$delta = fillDues($data[$row], $Dues, "EMP ID");
if(count($delta))
{
$Dues_id = $Dues->save();
}
$Member->load_relationship('locte_membership_adues_ppe_1');
$newrelMember = $Member->locte_membership_adues_ppe_1->add($Dues, array('id' => $MemberID));
myLog("Importing done in " . round(time_elapsed(),2) . " seconds.<br /><br />");
echo("<br /><br /><strong>****************************************************************************************************************************************************************</strong>");
echo("<br /><br /><strong>****************************************************************************************************************************************************************</strong>");
unset($data[$row]);
}
//echo print_r($GLOBALS["beanList"]);
//echo("<p></p>");
// $myfield_defs = $Member->getFieldDefinitions(); // just to help while developing
// foreach($myfield_defs as $def) echo $def["name"] . "<br />\n";
}
// Records have been saved: from this point on, only work on relationships:
$GLOBALS['log']->info('End: Wilderness Import');
myLog('End: Dues Import');
echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
echo("<p>End: Dues Import<br />");
echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
//time_elapsed();
return true;
}
} catch (Exception $e)
{
$GLOBALS['log']->fatal("Wilderness Import: Exception " . $e->getMessage());
myLog("Wilderness Import: Exception " . $e->getMessage());
echo '\n\nCaught exception: ', $e->getMessage(), "\n";
return false;
}
echo("Wilderness Import Complete!");
}
Last thing before I can put this into production
Thanks again!