Skip to content

Commit

Permalink
Merge pull request #11579 from jmcclelland/CRM-21701
Browse files Browse the repository at this point in the history
CRM-21701 - ensure street addresses are parsed
  • Loading branch information
eileenmcnaughton authored Jan 23, 2018
2 parents 5e5f37d + e6f202a commit 6fa2a79
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 25 deletions.
49 changes: 24 additions & 25 deletions CRM/Core/BAO/Address.php
Original file line number Diff line number Diff line change
Expand Up @@ -350,33 +350,32 @@ public static function fixAddress(&$params) {
$params['country_id'] == 1228
) {
CRM_Utils_Address_USPS::checkAddress($params);
}
// do street parsing again if enabled, since street address might have changed
$parseStreetAddress = CRM_Utils_Array::value(
'street_address_parsing',
CRM_Core_BAO_Setting::valueOptions(
CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
'address_options'
),
FALSE
);

// do street parsing again if enabled, since street address might have changed
$parseStreetAddress = CRM_Utils_Array::value(
'street_address_parsing',
CRM_Core_BAO_Setting::valueOptions(
CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
'address_options'
),
FALSE
);

if ($parseStreetAddress && !empty($params['street_address'])) {
foreach (array(
'street_number',
'street_name',
'street_unit',
'street_number_suffix',
) as $fld) {
unset($params[$fld]);
}
// main parse string.
$parseString = CRM_Utils_Array::value('street_address', $params);
$parsedFields = CRM_Core_BAO_Address::parseStreetAddress($parseString);

// merge parse address in to main address block.
$params = array_merge($params, $parsedFields);
if ($parseStreetAddress && !empty($params['street_address'])) {
foreach (array(
'street_number',
'street_name',
'street_unit',
'street_number_suffix',
) as $fld) {
unset($params[$fld]);
}
// main parse string.
$parseString = CRM_Utils_Array::value('street_address', $params);
$parsedFields = CRM_Core_BAO_Address::parseStreetAddress($parseString);

// merge parse address in to main address block.
$params = array_merge($params, $parsedFields);
}

// check if geocode should be skipped (can be forced with an optional parameter through the api)
Expand Down
52 changes: 52 additions & 0 deletions tests/phpunit/CRM/Core/BAO/AddressTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,58 @@ public function testGetValues() {
$this->contactDelete($contactId);
}

public function setStreetAddressParsing($status) {
$address_options = CRM_Core_BAO_Setting::valueOptions(
CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
'address_options',
TRUE, NULL, TRUE
);
if ($status) {
$value = 1;
}
else {
$value = 0;
}
$address_options['street_address_parsing'] = $value;
CRM_Core_BAO_Setting::setValueOption(
CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
'address_options',
$address_options
);
}

/**
* ParseStreetAddress if enabled, otherwise, don't.
*/
public function testParseStreetAddressIfEnabled() {
// Turn off address standardization. Parsing should work without it.
Civi::settings()->set('address_standardization_provider', NULL);

// Ensure street parsing happens if enabled.
$this->setStreetAddressParsing(TRUE);

$contactId = $this->individualCreate();
$street_address = "54 Excelsior Ave.";
$params = array(
'contact_id' => $contactId,
'street_address' => $street_address,
'location_type_id' => 1,
);

$result = civicrm_api3('Address', 'create', $params);
$value = array_pop($result['values']);
$street_number = CRM_Utils_Array::value('street_number', $value);
$this->assertEquals($street_number, '54');

// Ensure street parsing does not happen if disabled.
$this->setStreetAddressParsing(FALSE);
$result = civicrm_api3('Address', 'create', $params);
$value = array_pop($result['values']);
$street_number = CRM_Utils_Array::value('street_number', $value);
$this->assertEmpty($street_number);

}

/**
* ParseStreetAddress() method (get street address parsed)
*/
Expand Down

0 comments on commit 6fa2a79

Please sign in to comment.