CRM-18490: API does not return Address ID via API
authordeb.monish <monish.deb@webaccessglobal.com>
Fri, 6 May 2016 14:39:29 +0000 (20:09 +0530)
committerdeb.monish <monish.deb@webaccessglobal.com>
Mon, 9 May 2016 12:29:28 +0000 (17:59 +0530)
CRM/Contact/BAO/Query.php
CRM/Contribute/BAO/Query.php
api/v3/utils.php
tests/phpunit/api/v3/ContactTest.php

index d0c25c75175bd5e6687573ed24154c0b0cc1bf94..09129fddb02e2a32fd9566ff8da15e892fdeb4a3 100644 (file)
@@ -405,6 +405,7 @@ class CRM_Contact_BAO_Query {
    * @param bool $smartGroupCache
    * @param null $displayRelationshipType
    * @param string $operator
+   * @param string $apiEntity
    *
    * @return \CRM_Contact_BAO_Query
    */
@@ -413,8 +414,10 @@ class CRM_Contact_BAO_Query {
     $includeContactIds = FALSE, $strict = FALSE, $mode = 1,
     $skipPermission = FALSE, $searchDescendentGroups = TRUE,
     $smartGroupCache = TRUE, $displayRelationshipType = NULL,
-    $operator = 'AND'
+    $operator = 'AND',
+    $apiEntity = NULL
   ) {
+
     $this->_params = &$params;
     if ($this->_params == NULL) {
       $this->_params = array();
@@ -460,13 +463,13 @@ class CRM_Contact_BAO_Query {
     }
 
     // basically do all the work once, and then reuse it
-    $this->initialize();
+    $this->initialize($apiEntity);
   }
 
   /**
    * Function which actually does all the work for the constructor.
    */
-  public function initialize() {
+  public function initialize($apiEntity = NULL) {
     $this->_select = array();
     $this->_element = array();
     $this->_tables = array();
@@ -495,7 +498,7 @@ class CRM_Contact_BAO_Query {
 
     $this->_whereTables = $this->_tables;
 
-    $this->selectClause();
+    $this->selectClause($apiEntity);
     $this->_whereClause = $this->whereClause();
     if (array_key_exists('civicrm_contribution', $this->_whereTables)) {
       $component = 'contribution';
@@ -591,12 +594,23 @@ class CRM_Contact_BAO_Query {
   /**
    * Some composite fields do not appear in the fields array hack to make them part of the query.
    */
-  public function addSpecialFields() {
+  public function addSpecialFields($apiEntity) {
     static $special = array('contact_type', 'contact_sub_type', 'sort_name', 'display_name');
+    // if get called via Contact.get API having address_id as return parameter
+    if ($apiEntity == 'Contact') {
+      $special[] = 'address_id';
+    }
     foreach ($special as $name) {
       if (!empty($this->_returnProperties[$name])) {
-        $this->_select[$name] = "contact_a.{$name} as $name";
-        $this->_element[$name] = 1;
+        if ($name == 'address_id') {
+          $this->_tables['civicrm_address'] = 1;
+          $this->_select['address_id'] = 'civicrm_address.id as address_id';
+          $this->_element['address_id'] = 1;
+        }
+        else {
+          $this->_select[$name] = "contact_a.{$name} as $name";
+          $this->_element[$name] = 1;
+        }
       }
     }
   }
@@ -608,9 +622,9 @@ class CRM_Contact_BAO_Query {
    * tables, the initial attempt also retrieves all variables used
    * in the params list
    */
-  public function selectClause() {
+  public function selectClause($apiEntity = NULL) {
 
-    $this->addSpecialFields();
+    $this->addSpecialFields($apiEntity);
 
     foreach ($this->_fields as $name => $field) {
       // skip component fields
@@ -4263,14 +4277,17 @@ civicrm_relationship.is_permission_a_b = 0
     $smartGroupCache = TRUE,
     $count = FALSE,
     $skipPermissions = TRUE,
-    $mode = 1
+    $mode = 1,
+    $apiEntity = NULL
   ) {
 
     $query = new CRM_Contact_BAO_Query(
       $params, $returnProperties,
       NULL, TRUE, FALSE, $mode,
       $skipPermissions,
-      TRUE, $smartGroupCache
+      TRUE, $smartGroupCache,
+      NULL, 'AND',
+      $apiEntity
     );
 
     //this should add a check for view deleted if permissions are enabled
index 1c37dde847b5cd307812d7e96f47c2c25e1585c5..eb0314e60ef903cddbad96242b1caaab3222f363 100644 (file)
@@ -239,7 +239,7 @@ class CRM_Contribute_BAO_Query {
     // Adding address_id in a way that is more easily extendable since the above is a bit ... wordy.
     $supportedBasicReturnValues = array('address_id');
     foreach ($supportedBasicReturnValues as $fieldName) {
-      if (!empty($query->_returnProperties[$fieldName])) {
+      if (!empty($query->_returnProperties[$fieldName]) && empty($query->_select[$fieldName])) {
         $query->_select[$fieldName] = "civicrm_contribution.{$fieldName} as $fieldName";
         $query->_element[$fieldName] = $query->_tables['civicrm_contribution'] = 1;
       }
index 09c0a3dc27a4f472926c69f3f18d40a0e5d4c939..916eae4c046079b0cef7dd93f00490181693e755 100644 (file)
@@ -626,7 +626,8 @@ function _civicrm_api3_get_using_query_object($entity, $params, $additional_opti
     $smartGroupCache,
     $getCount,
     $skipPermissions,
-    $mode
+    $mode,
+    $entity
   );
 
   return $entities;
index 464a9db48f26fc44106bf172bdf8bcc1c5544a9f..8ea30e2eb1947eedbd6f30057bbbc00c8cc85a77 100644 (file)
@@ -860,20 +860,23 @@ class api_v3_ContactTest extends CiviUnitTestCase {
   }
 
   /**
-   * Check that address name is returned if required.
+   * Check that address name, ID is returned if required.
    */
-  public function testGetReturnAddressName() {
+  public function testGetReturnAddress() {
     $contactID = $this->individualCreate();
-    $this->callAPISuccess('address', 'create', array(
+    $result = $this->callAPISuccess('address', 'create', array(
       'contact_id' => $contactID,
       'address_name' => 'My house',
       'location_type_id' => 'Home',
       'street_address' => '1 my road',
     ));
+    $addressID = $result['id'];
+
     $result = $this->callAPISuccessGetSingle('contact', array(
-      'return' => 'address_name, street_address',
+      'return' => 'address_name, street_address, address_id',
       'id' => $contactID,
     ));
+    $this->assertEquals($addressID, $result['address_id']);
     $this->assertEquals('1 my road', $result['street_address']);
     $this->assertEquals('My house', $result['address_name']);