Logic Hooks

This is the complete segment:


			while (($data[] = fgetcsv($oFile, 3000, ',')) !== FALSE) { }
			fclose($oFile);
			//combine into a nice associative array:
			$arow=Array();
			$campos = array_shift($data);
			foreach ($data as $i=>$arow) {
				//$GLOBALS['log']->info("SchoolImporterJob: array_combine " . $i);
				$data[$i] = array_combine($campos, $arow);
			}
            unset($arow); 

So I would say if $arow comes up as a boolean (likely ā€œfalseā€), itā€™s because array_shift($data) isnā€™t doing what it should, and that is likely caused by $data not having what it should. If I were you I would look into the fgetcsv funtion, and into your CSV file formatting.

EDIT: also, are you using a debugger? This would make the entire process MUCH more transparent. Try setting up XDEBUG and an IDE.

1 Like

Well Iā€™m pretty excited to start seeing output from the csv file, its definitely appearing to be an awesome solution. Im still seeing a couple of errors and not sure how to address them.

Iā€™ve added my Full Script Below:

fillperson() is giving me trouble and the save() for some reason. Ive added comments the lines that it doesnt like.



<?php
if (!defined('sugarEntry') || !sugarEntry) die ('Not a Valid Entry Point!');

$date = new DateTime();
echo 'Wilderness Import started at ';
echo $date->format('r').'<br>';
echo '-------------------------------------------------------------------------------------------------------------------------------------<br>';

require_once("include/utils/sugar_file_utils.php");

WildernessImportJob();
die();

function time_elapsed()
{
	static $first = null;
  static $previous = null;
	$now = microtime(true);
  if ($first == null) $first = $now;
  if ($previous != null)
    echo '--- Partial ' . round(($now - $previous), 2) . ', Total ' . round(($now - $first), 2) . ' ---';  // 109s
    $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($person, $record)
{
  if ($person->full_name_c == "")
  {
    $recordname = trim(($record["FULL NAME"] != "") ? $record["FULL NAME"] : "[To-be-filled]");
    $recordname = str_replace("  ", " ", $recordname);
    $parts = explode(" ", $recordname);
    $person->last_name = array_pop($parts);
    $person->first_name = $parts[0];
    $person->name = $person->first_name . " " . $person->last_name;
    $person->full_name_c = $record["FULL NAME"];
  }
}
function GetOrCreateMember ($the_name, $empID)
{
//Check if the fullname is null
  if ($the_name != "")
  {
    //if not null then retrieve members Bean by Employee ID Field
    $person = BeanFactory::getBean("locte_Members");
    $person = $person->retrieve_by_string_fields(array('full_name_c' => $the_name));
  //  $employeeID = $person->retrieve_by_string_fields(array('lcl_employee_id' => $personEmployeeID));
    //otherwise create a new member record from csv file
    if (is_null($person))
    {
      //get members bean
      $person = BeanFactory::newBean("locte_Members");
      //set full_name_c to the_name variable
      $person->full_name_c = $the_name;
    //  $person->lcl_employee_id = $personEmployeeID;
      $person_name = str_replace("  ", " ", $the_name);
      $parts = explode(" ", $person_name);
      $person->last_name = array_pop($parts);
      $person->first_name = $parts[0];
      //combine first and last name to populate the fullname field
      $person->name = $person->first_name . " " . $person->last_name;
    //  if ($person->id == null && $person->lcl_employee_id != null)
    //  {
    //    $person->id = $personEmployeeID;
    //    $person->member_status = "Active";
    //    $person->add_drop = "Added This Month";
    //  }
    //  $person->id = $person->$empID;
      $person_id = $person->save();
      // add new duespayment to member record
    //  $rosterDuesPayments = BeanFactory::getBean('Dues Payments')->retrieve_by_string_fields(array('name'=> $duesEmployeeID));
    //  $person->load_relationship('locte_Members_adues_dues'); //confirm relationship name in cache
    //  $person->dues_payments->add($rosterDuesPayments->id);
    }
    return $person;
  }
  return null;
}
function WildernessImportJob()
  {
    try
    {
	    time_elapsed();
	    $GLOBALS['log']->info('Wilderness Import');
	    $config = new Configurator();
	    $config->loadConfig();
	    $xmlDataDir =  'custom/wimporter/ToImport';      //$config->config['WildernessImporter_DataFilePath'];
	    $GLOBALS['log']->info("Wilderness Import: Scanning XML Data dir $xmlDataDir...");
	    $directoryContent = scandir($xmlDataDir);
	    $GLOBALS['log']->info("Wilderness Import: Scanning XML Data dir $xmlDataDir... [Found " . count($directoryContent) . " files]");
	      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("----------------------------------------------------");
		      $oFile = fopen($xmlDataDir . DIRECTORY_SEPARATOR . $itemFile, 'r');
		      if ($oFile !== FALSE)
          {
			      // 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('CSV File Rows Array has been built <br /><br />');
			                $fields = array_shift($data);
											echo('CSV Header Fields Array has been built as shown below: <br /><br />');
											echo implode(", ", $fields) . "<br /><br />\n";


			                  foreach ($data as $i=>$arow)

                        {
                        $GLOBALS['log']->info("Wilderness Import: array_combine " . $i);
				                $data[$i] = array_combine($fields, $arow);

			                  }
                      unset($arow); // **********************************************! ! ! !! ! ! ! ! ! !! !


                      $num = count($data);
											echo('Build Full Array of Roster to be Imported Complete.  Entries to be imported are shown below <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 "<p><h4>File $itemFile   |   Roster Import, Row" . ($row + 1) . ": <br /></h4></p>\n";
                                      $GLOBALS['log']->info("Wilderness Import: Importing " . $data[$row]["FULL NAME"]);
                                      echo("Importing #". $row. " " . $data[$row]["FULL NAME"]);

                                       	        	echo "<table>\n";
                       	        	foreach ($fields as $field) {
                              		//echo "<tr><td>" . $field . "</td><td>" . $data[$row][$field] . "</td><td>" . $data[$row+1][$field] . "</td><td>" . $data[$row+2][$field] . "</td></tr>\n";
                      	        	}
                      	        	echo "</table>\n";
                                	echo implode(", ", $data[$row]) . "<br /><br />\n";


																//	$module_list = array_intersect($GLOBALS['moduleList'],array_keys($GLOBALS['beanList']));
																//	foreach($module_list as $module_name) {
        												//	$bean = BeanFactory::getBean($module_name);
        												//	$field_defs[$module_name] = $bean->getFieldDefinitions();
																//	echo($module_name . "<br />");


                      	        	$Member = BeanFactory::getBean("locte_Members");

																 // $myfield_defs = $Member->getFieldDefinitions(); // just to help while developing
																//	foreach($myfield_defs as $def) echo $def["name"] . "<br />\n";


                      	          $Member=$Member->retrieve_by_string_fields(array('full_name_c' => $data[$row]["Member: FULL NAME"]));
																	$Member->full_name_c = $FullName;


                      	        	if (is_null($Member))
                      	        	$Member = BeanFactory::newBean("locte_Members");
                      				$delta = fillPerson($data[$row], $Member, "FULL NAME");
                            }

														if (count($delta)) {
															$Member_id = $Member->save();
               }


          }
				  // Records have been saved: from this point on, only work on relationships:
	        $GLOBALS['log']->info('End: Wilderness Import');
	        myLog('End: Wilderness Import');
	        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;
    }
  }


Fatal error: Uncaught Error: Cannot use object of type stdClass as array in /var/www/html/afscmedbv5test/custom/wimporter/newimporter.php on line 49

CSV Format is correct. It outputs each row as an echo for my debugging purposes. All info is there. It will output the fielddefs in the SuiteCRM Module so its reading everything properly. Ive removed the $prefix variable as I donā€™t need it at this point. I think that may have ultimately screwed it up

I really appreciate all of the assistance.

Error: Call to a member function save() on null in /var/www/html/afscmedbv5test/custom/wimporter/newimporter.php on line 173

Last piece of the puzzle. lol

$Member variable reports null when dumped. Not sure why?


<?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");

WildernessImportJob();
die();

function time_elapsed()
{
	static $first = null;
  static $previous = null;
	$now = microtime(true);
  if ($first == null) $first = $now;
  if ($previous != null)
		echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
		echo("<br /> <br />");
		echo("<p>Populate Logs - IT Use<br />");
    echo '--- Partial ' . round(($now - $previous), 2) . ', Total ' . round(($now - $first), 2) . ' ---<br />';  // 109s
			echo("<br /> <br />");
				echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
    $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)
{
	// $record is what is being imported from CSV
	// $person is the bean about to be filled and going into the SuitCRM DB. It may be new or not, depending on whether it exists in the DB previously.
	// name: only updates if not existant yet, because it's the key we use for search, and because names are more complex with parts
	if ($person->full_name_c == "") {
		$recordname = (($record["FULL NAME"] != "") ? $record["FULL NAME"] : "[To-be-filled]");
		//echo $prefix;
		$recordname = str_replace("  ", " ", $recordname);
		echo $recordname;
		$parts = explode(" ", $recordname);
		$person->last_name = array_pop($parts);
		$person->first_name = $parts[0];
		$person->name = $person->first_name . " " . $person->last_name;
		$person->full_name_c = $record["FULL NAME"]; // custom field created in Studio
	}
//$datanasc = DateTime::createFromFormat('!m/d/Y', $record["PPE"]);
//	$datasnasc->setTime(0, 0);
//	$person->ppe_date_c = ($datanasc == false) ? "" : $datanasc->format('m-d-Y');
//$person->ppe_date_c = $record["PPE"];
//print_r($person);
//var_dump($person);

}
	// finish by making a complete analysis of what changed:
return calcDelta($person->fetched_row, $person);

function GetOrCreateMember ($the_name)
{
//Check if the fullname is null
  if ($the_name != "")
  {
    $person = BeanFactory::getBean("locte_Members");
    $person = $person->retrieve_by_string_fields(array('full_name_c' => $the_name));
    if (is_null($person))
    {
      //get members bean
      $person = BeanFactory::newBean("locte_Members");
      //set full_name_c to the_name variable
      $person->full_name_c = $the_name;
    	//  $person->lcl_employee_id = $personEmployeeID;
      $person_name = str_replace("  ", " ", $the_name);
      $parts = explode(" ", $person_name);
      $person->last_name = array_pop($parts);
      $person->first_name = $parts[0];
    	//combine first and last name to populate the fullname field
      $person->name = $person->first_name . " " . $person->last_name;
      //  $person_id = $person->save();
    	//  add new duespayment to member record
    	//  $rosterDuesPayments = BeanFactory::getBean('Dues Payments')->retrieve_by_string_fields(array('name'=> $duesEmployeeID));
    	//  $person->load_relationship('locte_Members_adues_dues'); //confirm relationship name in cache
    	//  $person->dues_payments->add($rosterDuesPayments->id);
    }
    return $person;
  }
  return null;
}
function WildernessImportJob()
  {
    try
    {
	    time_elapsed();
	    $GLOBALS['log']->info('Wilderness Import');
	    $config = new Configurator();
	    $config->loadConfig();
	    $xmlDataDir =  'custom/wimporter/ToImport';      //$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><br />");
	      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("<h4>---------------------------------------------------------------</h4>");
					echo("<h4>Wilderness Import: Processing $itemFile file...</h4>");
		      echo("<h4>---------------------------------------------------------------</h4>");
		      $oFile = fopen($xmlDataDir . DIRECTORY_SEPARATOR . $itemFile, 'r');
		      if ($oFile !== FALSE)
          {
			      // 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, 90, ',')) !== FALSE) { }
									 echo('File opened..... <br /> <br />');
			                fclose($oFile);
			                   //combine into a nice associative array:
			                $arow=Array();
											echo('Building CSV File Row Array <br /><br />');
			                $fields = array_shift($data);
											echo('Building CSV Header Fields Array as shown below:<strong> <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);}
			                  }
                      unset($arow); // **********************************************! ! ! !! ! ! ! ! ! !! !
                      $num = count($data);
											echo('Build Full Array of Roster to be Imported Complete.  Entries to be imported are shown below <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 "<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 "<strong><table>\n";
                       	        	foreach ($fields as $field) {
                              		//echo "<tr><td>" . $field . "</td><td>" . $data[$row][$field] . "</td><td>" . $data[$row+1][$field] . "</td><td>" . $data[$row+2][$field] . "</td></tr>\n";
                      	        	}
                      	        	echo "</table>\n";
																	echo "File Row Data:      ";
                                	echo implode(", ", $data[$row]) . "</strong><br /><br />\n";
																 	$Member = BeanFactory::getBean("locte_Members");
                      	          $Member=$Member->retrieve_by_string_fields(array('full_name_c' => $data[$row]["FULL NAME"]));
																	$Member = fillPerson($data[$row], $Member->full_name_c, "FULL NAME");
																	$Member = $Member->save();
																	var_dump($delta);
																	var_dump($data[$row]);
                      	        	//if (is_null($Member)) {
                      	        	//$Member = BeanFactory::newBean("locte_Members");
                      				    //$delta = fillPerson($data[$row]["FULL NAME"], $Member->full_name_c, "FULL NAME");
																	//var_dump($delta);
                            //}
														//if (count($delta)) {
														//	$Member_id = $Member->save();
               							//}

														//$GLOBALS['log']->info("SchoolImporterJob: Importing done in " . round(time_elapsed(),2) . " seconds.");
														myLog("Importing done in " . round(time_elapsed(),2) . " seconds.");
														echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
														echo("<p><br />Importing done in " . round(time_elapsed(),2) . " seconds.<br />");
	        									echo "<br /><br />\n";
                						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: Wilderness Import');

					echo("<p>End: Wilderness 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;
    }
  }

In this line

$Member = fillPerson($data[$row], $Member->full_name_c, "FULL NAME");

youā€™re passing 3 parameters, but the function only takes 2.

And full_name_c is a custom field which I added to the Contacts module, and which served as a unique key for me. If you donā€™t have that field there, then you canā€™t use it to retrieve a valid Bean in this lineā€¦

 $Member=$Member->retrieve_by_string_fields(array('full_name_c' => $data[$row]["FULL NAME"]));
1 Like

i added full_name_c as a field in locte_members_cstm. Ive changed getBean to the correct table (locte_members_cstm)

Now I am getting

Call to a member function retrieve_by_string_fields() on boolean in /var/www/html/afscmedbv5test/custom/wimporter/newimporter.php on line 171

There are no full names in the table as of yet so all will have to be filled, so I assume its returning false. Iā€™m moving things around but still getting the error. This is probably something completely dumb on my part.

if I dump the variables I get data and the connection the database is working

My CSV file has 3 parts currently, I trimmed it down for testing

Full contents:

LAST NAME,FIRST NAME,FULL NAME
BUTLER,BRIANA,BUTLER BRIANA

Current 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");

WildernessImportJob();
die();

function time_elapsed()
{
	static $first = null;
  static $previous = null;
	$now = microtime(true);
  if ($first == null) $first = $now;
  if ($previous != null)
		echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
		echo("<br /> <br />");
		echo("<p>Populate Logs - IT Use<br />");
    echo '--- Partial ' . round(($now - $previous), 2) . ', Total ' . round(($now - $first), 2) . ' ---<br />';  // 109s
			echo("<br /> <br />");
				echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
    $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)
{
	// $record is what is being imported from CSV
	// $person is the bean about to be filled and going into the SuitCRM DB. It may be new or not, depending on whether it exists in the DB previously.
	// name: only updates if not existant yet, because it's the key we use for search, and because names are more complex with parts
	if ($person->full_name_c == "") {
		$recordname = (($record["FULL NAME"] != "") ? $record["FULL NAME"] : "[To-be-filled]");
		//echo $prefix;
		$recordname = str_replace("  ", " ", $recordname);
		echo $recordname;
		$parts = explode(" ", $recordname);
		$person->last_name = array_pop($parts);
		$person->first_name = $parts[0];
		$person->name = $person->first_name . " " . $person->last_name;
		$person->full_name_c = $record['FULL NAME']; // custom field created in Studio
	}
//$datanasc = DateTime::createFromFormat('!m/d/Y', $record["PPE"]);
//	$datasnasc->setTime(0, 0);
//	$person->ppe_date_c = ($datanasc == false) ? "" : $datanasc->format('m-d-Y');
//$person->ppe_date_c = $record["PPE"];
//print_r($person);
//var_dump($person);

}
	// finish by making a complete analysis of what changed:
return calcDelta($person->fetched_row, $person);

function GetOrCreateMember ($the_name)
{
//Check if the fullname is null
  if ($the_name != "")
  {
    $person = BeanFactory::getBean("locte_Members");
    $person = $person->retrieve_by_string_fields(array('full_name_c' => $the_name));
    if (is_null($person))
    {
      //get members bean
      $person = BeanFactory::newBean("locte_Members");
      //set full_name_c to the_name variable
      $person->full_name_c = $the_name;
    	//  $person->lcl_employee_id = $personEmployeeID;
      $person_name = str_replace("  ", " ", $the_name);
      $parts = explode(" ", $person_name);
      $person->last_name = array_pop($parts);
      $person->first_name = $parts[0];
    	//combine first and last name to populate the fullname field
      $person->name = $person->first_name . " " . $person->last_name;
      //  $person_id = $person->save();
    	//  add new duespayment to member record
    	//  $rosterDuesPayments = BeanFactory::getBean('Dues Payments')->retrieve_by_string_fields(array('name'=> $duesEmployeeID));
    	//  $person->load_relationship('locte_Members_adues_dues'); //confirm relationship name in cache
    	//  $person->dues_payments->add($rosterDuesPayments->id);
    }
    return $person;
  }
  return null;
}
function WildernessImportJob()
  {
    try
    {
	    time_elapsed();
	    $GLOBALS['log']->info('Wilderness Import');
	    $config = new Configurator();
	    $config->loadConfig();
	    $xmlDataDir =  'custom/wimporter/ToImport';      //$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><br />");
	      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("<h4>---------------------------------------------------------------</h4>");
					echo("<h4>Wilderness Import: Processing $itemFile file...</h4>");
		      echo("<h4>---------------------------------------------------------------</h4>");
		      $oFile = fopen($xmlDataDir . DIRECTORY_SEPARATOR . $itemFile, 'r');
		      if ($oFile !== FALSE)
          {
			      // 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, 90, ',')) !== FALSE) { }
									 echo('File opened..... <br /> <br />');
			                fclose($oFile);
			                   //combine into a nice associative array:
			                $arow=Array();
											echo('Building CSV File Row Array <br /><br />');
			                $fields = array_shift($data);
											echo('Building CSV Header Fields Array as shown below:<strong> <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);}
			                  }
                      unset($arow); // **********************************************! ! ! !! ! ! ! ! ! !! !
                      $num = count($data);
											echo('Build Full Array of Roster to be Imported Complete.  Entries to be imported are shown below <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 "<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 "<strong><table>\n";
                       	        	foreach ($fields as $field) {
                              		//echo "<tr><td>" . $field . "</td><td>" . $data[$row][$field] . "</td><td>" . $data[$row+1][$field] . "</td><td>" . $data[$row+2][$field] . "</td></tr>\n";
                      	        	}
                      	        	echo "</table>\n";
																	echo "File Row Data:      ";
                                	echo implode(", ", $data[$row]) . "</strong><br /><br />\n";
																 	$Member = BeanFactory::getBean("locte_members_cstm");
                      	          $Member=$Member->retrieve_by_string_fields(array('full_name_c' => $data[$row]['FULL NAME']));

																	if (is_null($Member)) {
                      	        	$Member = BeanFactory::newBean("locte_members_cstm");
                      				    $delta = fillPerson($data[$row], $Member, "FULL NAME");
																	var_dump($delta);
                            }
														if (count($delta)) {
														$Member_id = $Member->save();
               							}

														//$GLOBALS['log']->info("SchoolImporterJob: Importing done in " . round(time_elapsed(),2) . " seconds.");
														myLog("Importing done in " . round(time_elapsed(),2) . " seconds.");
														echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
														echo("<p><br />Importing done in " . round(time_elapsed(),2) . " seconds.<br />");
	        									echo "<br /><br />\n";
                						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: Wilderness Import');

					echo("<p>End: Wilderness 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;
    }
  }

Code in question:


$Member = BeanFactory::getBean('locte_members_cstm');
$Member=$Member->retrieve_by_string_fields(array('full_name_c' => $data[$row]["FULL NAME"]));

Variable Dumps:

var_dump($data[$row][ā€œFULL NAMEā€]); /var/www/html/afscmedbv5test/custom/wimporter/newimporter.php:172:string ā€˜BUTLER BRIANAā€™ (length=13)
var_dump($Member); /var/www/html/afscmedbv5test/custom/wimporter/newimporter.php:174:boolean false
var_dump($Member->full_name_c); /var/www/html/afscmedbv5test/custom/wimporter/newimporter.php:175:null

I manually added the full name to full_name_c to check if it would return properly. No dice.

case is correct on table name. I see no reason why this shouldnā€™t be working.

In this block:


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('Building CSV File Row Array <br /><br />');
			                $fields = array_shift($data);
											//echo('Building CSV Header Fields Array as shown below:<strong> <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);
											  }
												var_dump($fields);
												var_dump($arow);


                      unset($arow); // **********************************************! ! ! !! ! ! ! ! ! !! !

                      $num = count($data);

Dumps return data on the first iteration as follows -

/var/www/html/afscmedbv5test/custom/wimporter/newimporter.php:159:
array (size=3)
0 => string ā€˜LAST NAMEā€™ (length=9)
1 => string ā€˜FIRST NAMEā€™ (length=10)
2 => string ā€˜FULL NAMEā€™ (length=9)
/var/www/html/afscmedbv5test/custom/wimporter/newimporter.php:160:
array (size=3)
0 => string ā€˜UTLERā€™ (length=5)
1 => string ā€˜BRIANAā€™ (length=6)
2 => string ā€˜BUTLER BRIANAā€™ (length=13)

One the second iteration -

/var/www/html/afscmedbv5test/custom/wimporter/newimporter.php:159:
array (size=3)
0 => string ā€˜LAST NAMEā€™ (length=9)
1 => string ā€˜FIRST NAMEā€™ (length=10)
2 => string ā€˜FULL NAMEā€™ (length=9)
/var/www/html/afscmedbv5test/custom/wimporter/newimporter.php:160:boolean false

This was because I have only one record aside from headers line in the csvā€¦
Added if statement above to avoid the error below

 if (is_array($arow)) 
{
 $data[$i] = array_combine($fields, $arow);
}

Warning: array_combine() expects parameter 2 to be array, boolean given in /var/www/html/afscmedbv5test/custom/wimporter/newimporter.php on line 158

for ($row=0; $row < $num - 1; $row++)

the - 1 gets rid of errors caused by end of file and the number of records reports accurately removing the header line. eg 0 = 1 (first record after headers)

Everything works aside from saving to db

Well the only thing not happening now is the Full Name getting inserted to the database


<?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");

WildernessImportJob();
die();

function time_elapsed()
{
	static $first = null;
  static $previous = null;
	$now = microtime(true);
  if ($first == null) $first = $now;
  if ($previous != null)
		echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
		//echo("<p>Populate Logs - IT Use<br />");
    echo '--- Partial ' . round(($now - $previous), 2) . ', Total ' . round(($now - $first), 2) . ' ---<br />';  // 109s
				echo("<strong>---------------------------------------------------------------------------------------------------------</strong>");
    $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)
{
	// $record is what is being imported from CSV
	// $person is the bean about to be filled and going into the SuitCRM DB. It may be new or not, depending on whether it exists in the DB previously.
	// name: only updates if not existant yet, because it's the key we use for search, and because names are more complex with parts
	if ($person->full_name_import == "") {
		$recordname = (($record["LAST NAME"] . ", " . $record["FIRST NAME"]));   // != "") ? $record["FULL NAME"] : "[To-be-filled]");
		//echo $prefix;
		//$recordname = str_replace("  ", " ", $recordname);
		//$parts = explode(" ", $recordname);
		//$person->last_name = array_pop($parts);
		//$person->first_name = $parts[0];
		//$person->full_name_import = $person->first_name . " " . $person->last_name;
		$person->full_name_import = $recordname; //['FULL NAME']; // custom field created in Studio
	}
//$datanasc = DateTime::createFromFormat('!m/d/Y', $record["PPE"]);
//	$datasnasc->setTime(0, 0);
//	$person->ppe_date_c = ($datanasc == false) ? "" : $datanasc->format('m-d-Y');
//$person->ppe_date_c = $record["PPE"];
//print_r($person);
//var_dump($person);
return calcDelta($person->fetched_row, $person);

}
	// finish by making a complete analysis of what changed:


function GetOrCreateMember ($the_name)
{
//Check if the fullname is null
  if ($the_name != "")
  {
    $person = BeanFactory::getBean("locte_Members");
    $person = $person->retrieve_by_string_fields(array('full_name_import' => $the_name));
    if (is_null($person))
    {
      //get members bean
      $person = BeanFactory::newBean("locte_Members");
      //set full_name_c to the_name variable
      $person->full_name_import = $the_name;
    	//  $person->lcl_employee_id = $personEmployeeID;
      $person_name = str_replace("  ", " ", $the_name);
      $parts = explode(" ", $person_name);
      $person->last_name = array_pop($parts);
      $person->first_name = $parts[0];
    	//combine first and last name to populate the fullname field
      $person->name = $person->first_name . " " . $person->last_name;
      $person_id = $person->save();
    	//  add new duespayment to member record
    	//  $rosterDuesPayments = BeanFactory::getBean('Dues Payments')->retrieve_by_string_fields(array('name'=> $duesEmployeeID));
    	//  $person->load_relationship('locte_Members_adues_dues'); //confirm relationship name in cache
    	//  $person->dues_payments->add($rosterDuesPayments->id);
    }
    return $person;
  }
  return null;
}
function WildernessImportJob()
  {
    try
    {
	    time_elapsed();
	    $GLOBALS['log']->info('Wilderness Import');
	    $config = new Configurator();
	    $config->loadConfig();
	    $xmlDataDir =  'custom/wimporter/ToImport';      //$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><br />");
	      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("<h4>---------------------------------------------------------------</h4>");
					echo("<h4>Wilderness Import: Processing $itemFile file...</h4>");
		      echo("<h4>---------------------------------------------------------------</h4>");
		      $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('Building CSV File Row Array <br /><br />');
			                $fields = array_shift($data);
											//echo('Building CSV Header Fields Array as shown below:<strong> <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 />Build Full Array of Roster to be Imported Complete.  Entries to be imported are shown below <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 "<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:      ";
                                	echo implode(", ", $data[$row]);

																 	$Member = BeanFactory::getBean("locte_Members");

      	          								$Member=$Member->retrieve_by_string_fields(array('full_name_import' => $data[$row]["FULL NAME"]));

																
																	var_dump($Member->full_name_import);

																	if (is_null($Member)) {
																		$Member = BeanFactory::newBean('locte_Members');
																		$delta = fillPerson($data[$row], $Member, "");

																	var_dump($Member->full_name_import);
																		if (count($delta)) {
																		$Member->save();
																		$testName = $Member->full_name_import;
																		echo("<br />Full Name Should Follow: " . $testName);
               											}
																		echo("<br />Full Name Should Follow: " . $testName);

																	}
														myLog("Importing done in " . round(time_elapsed(),2) . " seconds.");
														echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></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: Wilderness Import');

					echo("<p>End: Wilderness 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;
    }
  }

I appreciate your patience with my learning curve as does the state of Florida, Im a .net guy usually

In the database, there are two tables, one for the module, one for custom fields (_cstm).

But there is only one Bean for both. So you see in my code I have a $person Bean which is of type ā€œContactsā€ and I access the custom field directly as $person->full_name_c

1 Like

Yeah, I wound up figuring that out by retrieving fielddefs. For some reason its still not saving though. It iterates through all of the Names in the list.

Everything works except saving. I only have the create new record functionality at this point but want to get that perfect before I move on to updating records already present. Which Iā€™m sure will kick my butt also.

Here is the full script
Hopefully when Im all done this will help a lot of people :slight_smile:



<?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");

WildernessImportJob();
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 />");
		//var_dump($employeeID);
		//var_dump($employeeIDLeadingZeros);
		$recordname = (($record["LAST NAME"] . ", " . $record["FIRST NAME"]));
		$person->full_name_import = $recordname;
		$person->id = $employeeIDLeadingZeros;
		$person->ppe_date_c = $record["PPE"];
		$person->lcl_affiliate_number = $record["AFFILIATE"];


	}
return calcDelta($person->fetched_row, $person);
}

function fillFoundRecord($record, &$person, $employeeID)
{
	if ($person->first_name == $record["FIRST NAME"] && $person->last_name == $record["LAST NAME"] && $person->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 AFSCME Standardized Format: " . $employeeIDLeadingZeros . "<br /><br />");
		//var_dump($employeeID);
		//var_dump($employeeIDLeadingZeros);
		$recordname = (($record["LAST NAME"] . ", " . $record["FIRST NAME"]));
		$person->full_name_import = $recordname;
		$person->id = $employeeIDLeadingZeros;
		$person->ppe_date_c = $record["PPE"];
		$person->lcl_affiliate_number = $record["AFFILIATE"];
		$person_id = $person->save();

	}
return calcDelta($person->fetched_row, $person);
}


function GetOrCreateMember ($the_name)
{
  if ($the_name != "")
  {
    $person = BeanFactory::getBean("locte_Members");
    $person = $person->retrieve_by_string_fields(array('full_name_import' => $the_name));
    if (is_null($person))
    {
      $person = BeanFactory::newBean("locte_Members");
      $person->full_name_import = $the_name;
      $person_name = str_replace("  ", " ", $the_name);
      $parts = explode(" ", $person_name);
      $person->last_name = array_pop($parts);
      $person->first_name = $parts[0];
      $person->name = $person->first_name . " " . $person->last_name;
      $person_id = $person->save();
    }
    return $person;
  }
  return null;
}

function WildernessImportJob()
  {
    try
    {
	    time_elapsed();
	    $GLOBALS['log']->info('Wilderness Import');
	    $config = new Configurator();
	    $config->loadConfig();
	    $xmlDataDir =  'custom/wimporter/ToImport';      //$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_Members");
																	$MemberFullNameImport=$Member->retrieve_by_string_fields(array('full_name_import' => $data[$row]["LAST NAME"]));

																	if (is_null($MemberFullNameImport)) {
																		$Member = BeanFactory::newBean('locte_Members');
																		$delta = fillPerson($data[$row], $MemberFullNameImport, "FULL NAME");
																			if (count($delta)) {
																				$Member_id = $Member->save();
																				$testName = $MemberFullNameImport->full_name_import;
																				echo("<br /><br />Full Name To Be Imported: " . $testName . "<br /><br />");
               												}
																		}
														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: Wilderness Import');
					echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
					echo("<p>End: Wilderness 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;
    }
  }


Thanks again

Nevermind Its Creating New Records but not Filling the fields.

Got it all working! Huge thanks!!!

Working code below. Hope this helps everyone!

Pulls Record Based on First Name, Last Name, and in my case an Affiliate number - If these exist already it updates record if not it creates new.

Matches and Displays Record ID and a few other variables. Prints everything the script is doing in steps



<?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");

WildernessImportJob();
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 AFSCME 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_Members");
    $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 AFSCME 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 WildernessImportJob()
  {
    try
    {
	    time_elapsed();
	    $GLOBALS['log']->info('Wilderness Import');
	    $config = new Configurator();
	    $config->loadConfig();
	    $xmlDataDir =  'custom/wimporter/ToImport';      //$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_Members");
																	$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"]));

																	var_dump($Member->id);
																	$delta = fillFoundRecord($data[$row], $Member, "FULL NAME");

																	if (is_null($Member)) {
																		$Member = BeanFactory::newBean('locte_Members');
																		$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!");
																	  }
																	}

														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: Wilderness Import');
					echo("<strong><h3>---------------------------------------------------------------------------------------------------------</h3></strong>");
					echo("<p>End: Wilderness 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;
    }
  }

BIG Thanks to pgr for providing the starting script and putting up with all of the questions.

Great to hear itā€™s working!

I have one big advice for you, do yourself a favor and install

XDEBUG!

Itā€™s better to be a developer with eyes than to be a blind developer. :slight_smile:

I grabbed it after reading a reply on another thread from you a few days ago. Haha :slight_smile:

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!

In other words it will only relate 1 payment record to each member no matter how many import runs I do. Could have explained better. It is a one to many relationship. It is also only creating a relationship id in the database once per member record after multiple runs

Sorry, I donā€™t have time to get into your code, thereā€™s too much of itā€¦

Make sure you are saving the Dues bean (assuming it is a module, and has a Bean) before trying to set the new relationship to it.

Sorry bout that, it is getting pretty long, I believe the problem is in this small block and I dont really understand the things pointed out beneath the code and can find no other examples similar


$Member = BeanFactory::getBean("locte_Members");
$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));

This is really the only part that matters for the Dues save and relationship add.

Im unclear as to how this line is supposed to be formatted
$newrelMember = $Member->locte_membership_adues_ppe_1->add($Dues, array(ā€˜idā€™ => $MemberID));

what is ā€˜idā€™ supposed to referenceā€¦ it was reltype in your code

Iā€™m also unclear about what the header EMP ID in this line does.
$delta = fillDues($data[$row], $Dues, ā€œEMP IDā€);

I got it. I changed

$newrelMember = $Member->locte_membership_adues_ppe_1->add($Dues, array(ā€˜idā€™ => $MemberID));

to

$newrelMember = $Member->locte_membership_adues_ppe_1->add($Dues);

If you have time I still have the EMP ID part of the question, I know what its referencing I just dont know why