Example #1
0
 /**
  * Update the shared addresses if master address is modified.
  *
  * @param int $addressId
  *   Address id.
  * @param array $params
  *   Associated array of address params.
  */
 public static function processSharedAddress($addressId, $params)
 {
     $query = 'SELECT id FROM civicrm_address WHERE master_id = %1';
     $dao = CRM_Core_DAO::executeQuery($query, array(1 => array($addressId, 'Integer')));
     // unset contact id
     $skipFields = array('is_primary', 'location_type_id', 'is_billing', 'master_id', 'contact_id');
     foreach ($skipFields as $value) {
         unset($params[$value]);
     }
     $addressDAO = new CRM_Core_DAO_Address();
     while ($dao->fetch()) {
         $addressDAO->copyValues($params);
         $addressDAO->id = $dao->id;
         $addressDAO->save();
         $addressDAO->free();
     }
 }
Example #2
0
function processContacts(&$config, $processGeocode, $parseStreetAddress, $start = null, $end = null)
{
    // build where clause.
    $clause = array('( c.id = a.contact_id )');
    if ($start) {
        $clause[] = "( c.id >= {$start} )";
    }
    if ($end) {
        $clause[] = "( c.id <= {$end} )";
    }
    if ($processGeocode) {
        $clause[] = '( a.geo_code_1 is null OR a.geo_code_1 = 0 )';
        $clause[] = '( a.geo_code_2 is null OR a.geo_code_2 = 0 )';
        $clause[] = '( a.country_id is not null )';
    }
    $whereClause = implode(' AND ', $clause);
    $query = "\nSELECT     c.id,\n           a.id as address_id,\n           a.street_address,\n           a.city,\n           a.postal_code,\n           s.name as state,\n           o.name as country\nFROM       civicrm_contact  c\nINNER JOIN civicrm_address        a ON a.contact_id = c.id\nLEFT  JOIN civicrm_country        o ON a.country_id = o.id\nLEFT  JOIN civicrm_state_province s ON a.state_province_id = s.id\nWHERE      {$whereClause}\n  ORDER BY a.id\n";
    $totalGeocoded = $totalAddresses = $totalAddressParsed = 0;
    $dao =& CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray);
    if ($processGeocode) {
        require_once str_replace('_', DIRECTORY_SEPARATOR, $config->geocodeMethod) . '.php';
    }
    require_once 'CRM/Core/DAO/Address.php';
    require_once 'CRM/Core/BAO/Address.php';
    while ($dao->fetch()) {
        $totalAddresses++;
        $params = array('street_address' => $dao->street_address, 'postal_code' => $dao->postal_code, 'city' => $dao->city, 'state_province' => $dao->state, 'country' => $dao->country);
        $addressParams = array();
        // process geocode.
        if ($processGeocode) {
            // loop through the address removing more information
            // so we can get some geocode for a partial address
            // i.e. city -> state -> country
            $maxTries = 5;
            do {
                if (defined('THROTTLE_REQUESTS') && THROTTLE_REQUESTS) {
                    usleep(50000);
                }
                eval($config->geocodeMethod . '::format( $params, true );');
                array_shift($params);
                $maxTries--;
            } while (!isset($params['geo_code_1']) && $maxTries > 1);
            if (isset($params['geo_code_1'])) {
                $totalGeocoded++;
                $addressParams['geo_code_1'] = $params['geo_code_1'];
                $addressParams['geo_code_2'] = $params['geo_code_2'];
            }
        }
        // parse street address
        if ($parseStreetAddress) {
            $parsedFields = CRM_Core_BAO_Address::parseStreetAddress($dao->street_address);
            $success = true;
            // consider address is automatically parseable,
            // when we should found street_number and street_name
            if (!CRM_Utils_Array::value('street_name', $parsedFields) || !CRM_Utils_Array::value('street_number', $parsedFields)) {
                $success = false;
            }
            // do check for all elements.
            if ($success) {
                $totalAddressParsed++;
            } else {
                // reset element values.
                $parsedFields = array_fill_keys(array_keys($parsedFields), '');
            }
            $addressParams = array_merge($addressParams, $parsedFields);
        }
        // finally update address object.
        if (!empty($addressParams)) {
            $address = new CRM_Core_DAO_Address();
            $address->id = $dao->address_id;
            $address->copyValues($addressParams);
            $address->save();
            $address->free();
        }
    }
    echo ts("Addresses Evaluated: {$totalAddresses}\n");
    if ($processGeocode) {
        echo ts("Addresses Geocoded : {$totalGeocoded}\n");
    }
    if ($parseStreetAddress) {
        echo ts("Street Address Parsed : {$totalAddressParsed}\n");
    }
    return;
}
/**
 * @param $config
 * @param $processGeocode
 * @param $parseStreetAddress
 * @param null $start
 * @param null $end
 */
function processContacts(&$config, $processGeocode, $parseStreetAddress, $start = NULL, $end = NULL)
{
    // build where clause.
    $clause = array('( c.id = a.contact_id )');
    if ($start) {
        $clause[] = "( c.id >= {$start} )";
    }
    if ($end) {
        $clause[] = "( c.id <= {$end} )";
    }
    if ($processGeocode) {
        $clause[] = '( a.geo_code_1 is null OR a.geo_code_1 = 0 )';
        $clause[] = '( a.geo_code_2 is null OR a.geo_code_2 = 0 )';
        $clause[] = '( a.country_id is not null )';
    }
    $whereClause = implode(' AND ', $clause);
    $query = "\nSELECT     c.id,\n           a.id as address_id,\n           a.street_address,\n           a.city,\n           a.postal_code,\n           s.name as state,\n           o.name as country\nFROM       civicrm_contact  c\nINNER JOIN civicrm_address        a ON a.contact_id = c.id\nLEFT  JOIN civicrm_country        o ON a.country_id = o.id\nLEFT  JOIN civicrm_state_province s ON a.state_province_id = s.id\nWHERE      {$whereClause}\n  ORDER BY a.id\n";
    $totalGeocoded = $totalAddresses = $totalAddressParsed = 0;
    $dao = CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray);
    if ($processGeocode) {
        require_once str_replace('_', DIRECTORY_SEPARATOR, $config->geocodeMethod) . '.php';
    }
    require_once 'CRM/Core/DAO/Address.php';
    require_once 'CRM/Core/BAO/Address.php';
    $unparseableContactAddress = array();
    while ($dao->fetch()) {
        $totalAddresses++;
        $params = array('street_address' => $dao->street_address, 'postal_code' => $dao->postal_code, 'city' => $dao->city, 'state_province' => $dao->state, 'country' => $dao->country);
        $addressParams = array();
        // process geocode.
        if ($processGeocode) {
            // loop through the address removing more information
            // so we can get some geocode for a partial address
            // i.e. city -> state -> country
            $maxTries = 5;
            do {
                if (defined('THROTTLE_REQUESTS') && THROTTLE_REQUESTS) {
                    usleep(50000);
                }
                eval($config->geocodeMethod . '::format( $params, true );');
                array_shift($params);
                $maxTries--;
            } while (!isset($params['geo_code_1']) && $maxTries > 1);
            if (isset($params['geo_code_1']) && $params['geo_code_1'] != 'null') {
                $totalGeocoded++;
                $addressParams['geo_code_1'] = $params['geo_code_1'];
                $addressParams['geo_code_2'] = $params['geo_code_2'];
            }
        }
        // parse street address
        if ($parseStreetAddress) {
            $parsedFields = CRM_Core_BAO_Address::parseStreetAddress($dao->street_address);
            $success = TRUE;
            // consider address is automatically parseable,
            // when we should found street_number and street_name
            if (empty($parsedFields['street_name']) || empty($parsedFields['street_number'])) {
                $success = FALSE;
            }
            // do check for all elements.
            if ($success) {
                $totalAddressParsed++;
            } elseif ($dao->street_address) {
                //build contact edit url,
                //so that user can manually fill the street address fields if the street address is not parsed, CRM-5886
                $url = CRM_Utils_System::url('civicrm/contact/add', "reset=1&action=update&cid={$dao->id}");
                $unparseableContactAddress[] = " Contact ID: " . $dao->id . " <a href =\"{$url}\"> " . $dao->street_address . " </a> ";
                // reset element values.
                $parsedFields = array_fill_keys(array_keys($parsedFields), '');
            }
            $addressParams = array_merge($addressParams, $parsedFields);
        }
        // finally update address object.
        if (!empty($addressParams)) {
            $address = new CRM_Core_DAO_Address();
            $address->id = $dao->address_id;
            $address->copyValues($addressParams);
            $address->save();
            $address->free();
        }
    }
    echo ts("Addresses Evaluated: {$totalAddresses}\n");
    if ($processGeocode) {
        echo ts("Addresses Geocoded : {$totalGeocoded}\n");
    }
    if ($parseStreetAddress) {
        echo ts("Street Address Parsed : {$totalAddressParsed}\n");
        if ($unparseableContactAddress) {
            echo ts("<br />\nFollowing is the list of contacts whose address is not parsed :<br />\n");
            foreach ($unparseableContactAddress as $contactLink) {
                echo ts("%1<br />\n", array(1 => $contactLink));
            }
        }
    }
}
Example #4
0
 /**
  * @param $config
  * @param $processGeocode
  * @param $parseStreetAddress
  *
  * @return array
  * @throws Exception
  */
 public function processContacts(&$config, $processGeocode, $parseStreetAddress)
 {
     // build where clause.
     $clause = array('( c.id = a.contact_id )');
     $params = array();
     if ($this->start) {
         $clause[] = "( c.id >= %1 )";
         $params[1] = array($this->start, 'Integer');
     }
     if ($this->end) {
         $clause[] = "( c.id <= %2 )";
         $params[2] = array($this->end, 'Integer');
     }
     if ($processGeocode) {
         $clause[] = '( a.geo_code_1 is null OR a.geo_code_1 = 0 )';
         $clause[] = '( a.geo_code_2 is null OR a.geo_code_2 = 0 )';
         $clause[] = '( a.country_id is not null )';
     }
     $whereClause = implode(' AND ', $clause);
     $query = "\n    SELECT     c.id,\n               a.id as address_id,\n               a.street_address,\n               a.city,\n               a.postal_code,\n               s.name as state,\n               o.name as country\n    FROM       civicrm_contact  c\n    INNER JOIN civicrm_address        a ON a.contact_id = c.id\n    LEFT  JOIN civicrm_country        o ON a.country_id = o.id\n    LEFT  JOIN civicrm_state_province s ON a.state_province_id = s.id\n    WHERE      {$whereClause}\n      ORDER BY a.id\n    ";
     $totalGeocoded = $totalAddresses = $totalAddressParsed = 0;
     $dao = CRM_Core_DAO::executeQuery($query, $params);
     if ($processGeocode) {
         require_once str_replace('_', DIRECTORY_SEPARATOR, $config->geocodeMethod) . '.php';
     }
     $unparseableContactAddress = array();
     while ($dao->fetch()) {
         $totalAddresses++;
         $params = array('street_address' => $dao->street_address, 'postal_code' => $dao->postal_code, 'city' => $dao->city, 'state_province' => $dao->state, 'country' => $dao->country);
         $addressParams = array();
         // process geocode.
         if ($processGeocode) {
             // loop through the address removing more information
             // so we can get some geocode for a partial address
             // i.e. city -> state -> country
             $maxTries = 5;
             do {
                 if ($this->throttle) {
                     usleep(5000000);
                 }
                 $className = $config->geocodeMethod;
                 $className::format($params, TRUE);
                 // see if we got a geocode error, in this case we'll trigger a fatal
                 // CRM-13760
                 if (isset($params['geo_code_error']) && $params['geo_code_error'] == 'OVER_QUERY_LIMIT') {
                     CRM_Core_Error::fatal('Aborting batch geocoding. Hit the over query limit on geocoder.');
                 }
                 array_shift($params);
                 $maxTries--;
             } while ((!isset($params['geo_code_1']) || $params['geo_code_1'] == 'null') && $maxTries > 1);
             if (isset($params['geo_code_1']) && $params['geo_code_1'] != 'null') {
                 $totalGeocoded++;
                 $addressParams['geo_code_1'] = $params['geo_code_1'];
                 $addressParams['geo_code_2'] = $params['geo_code_2'];
                 $addressParams['postal_code'] = $params['postal_code'];
                 $addressParams['postal_code_suffix'] = CRM_Utils_Array::value('postal_code_suffix', $params);
             }
         }
         // parse street address
         if ($parseStreetAddress) {
             $parsedFields = CRM_Core_BAO_Address::parseStreetAddress($dao->street_address);
             $success = TRUE;
             // consider address is automatically parseable,
             // when we should found street_number and street_name
             if (empty($parsedFields['street_name']) || empty($parsedFields['street_number'])) {
                 $success = FALSE;
             }
             // do check for all elements.
             if ($success) {
                 $totalAddressParsed++;
             } elseif ($dao->street_address) {
                 //build contact edit url,
                 //so that user can manually fill the street address fields if the street address is not parsed, CRM-5886
                 $url = CRM_Utils_System::url('civicrm/contact/add', "reset=1&action=update&cid={$dao->id}");
                 $unparseableContactAddress[] = " Contact ID: " . $dao->id . " <a href =\"{$url}\"> " . $dao->street_address . " </a> ";
                 // reset element values.
                 $parsedFields = array_fill_keys(array_keys($parsedFields), '');
             }
             $addressParams = array_merge($addressParams, $parsedFields);
         }
         // finally update address object.
         if (!empty($addressParams)) {
             $address = new CRM_Core_DAO_Address();
             $address->id = $dao->address_id;
             $address->copyValues($addressParams);
             $address->save();
             $address->free();
         }
     }
     $this->returnMessages[] = ts("Addresses Evaluated: %1", array(1 => $totalAddresses)) . "\n";
     if ($processGeocode) {
         $this->returnMessages[] = ts("Addresses Geocoded: %1", array(1 => $totalGeocoded)) . "\n";
     }
     if ($parseStreetAddress) {
         $this->returnMessages[] = ts("Street Addresses Parsed: %1", array(1 => $totalAddressParsed)) . "\n";
         if ($unparseableContactAddress) {
             $this->returnMessages[] = "<br />\n" . ts("Following is the list of contacts whose address is not parsed:") . "<br />\n";
             foreach ($unparseableContactAddress as $contactLink) {
                 $this->returnMessages[] = $contactLink . "<br />\n";
             }
         }
     }
     return $this->returnResult();
 }
Example #5
0
function processContacts(&$config, $start = null, $end = null)
{
    $contactClause = array();
    if ($start) {
        $contactClause[] = "c.id >= {$start}";
    }
    if ($end) {
        $contactClause[] = "c.id <= {$end}";
    }
    if (!empty($contactClause)) {
        $contactClause = ' AND ' . implode(' AND ', $contactClause);
    } else {
        $contactClause = null;
    }
    $query = "\nSELECT     c.id,\n           a.id as address_id,\n           a.street_address,\n           a.city,\n           a.postal_code,\n           s.name as state,\n           o.name as country\nFROM       civicrm_contact  c\nINNER JOIN civicrm_address        a ON a.contact_id = c.id\nINNER JOIN civicrm_country        o ON a.country_id = o.id\nLEFT  JOIN civicrm_state_province s ON a.state_province_id = s.id\nWHERE      c.id           = a.contact_id\n  AND      ( a.geo_code_1 is null OR a.geo_code_1 = 0 )\n  AND      ( a.geo_code_2 is null OR a.geo_code_2 = 0 )\n  AND      a.country_id is not null\n  {$contactClause}\nORDER BY a.id\n";
    $totalGeocoded = $totalAddresses = 0;
    $dao =& CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray);
    require_once str_replace('_', DIRECTORY_SEPARATOR, $config->geocodeMethod) . '.php';
    require_once 'CRM/Core/DAO/Address.php';
    while ($dao->fetch()) {
        $totalAddresses++;
        $params = array('street_address' => $dao->street_address, 'postal_code' => $dao->postal_code, 'city' => $dao->city, 'state_province' => $dao->state, 'country' => $dao->country);
        // loop through the address removing more information
        // so we can get some geocode for a partial address
        // i.e. city -> state -> country
        $maxTries = 5;
        do {
            if (defined('THROTTLE_REQUESTS') && THROTTLE_REQUESTS) {
                usleep(50000);
            }
            eval($config->geocodeMethod . '::format( $params, true );');
            array_shift($params);
            $maxTries--;
        } while (!isset($params['geo_code_1']) && $maxTries > 1);
        if (isset($params['geo_code_1'])) {
            $address = new CRM_Core_DAO_Address();
            $address->id = $dao->address_id;
            $address->geo_code_1 = $params['geo_code_1'];
            $address->geo_code_2 = $params['geo_code_2'];
            $address->save();
            $totalGeocoded++;
        }
    }
    echo ts("Addresses Evaluated: {$totalAddresses}\n");
    echo ts("Addresses Geocoded : {$totalGeocoded}\n");
    return;
}