/**
  * This function check contribution is valid for giftaid or not:
  * 1 - if contribution_id already inserted in batch_contribution
  * 2 - if contributions are not valid for gift aid
  *
  * @param $contributionIDs
  *
  * @return array
  */
 public static function validateContributionToBatch(&$contributionIDs)
 {
     $contributionsAdded = array();
     $contributionsAlreadyAdded = array();
     $contributionsNotValid = array();
     require_once "CRM/Civigiftaid/Utils/GiftAid.php";
     //require_once "CRM/Core/DAO/EntityBatch.php";
     require_once "CRM/Batch/DAO/EntityBatch.php";
     require_once "CRM/Contribute/BAO/Contribution.php";
     foreach ($contributionIDs as $contributionID) {
         $batchContribution =& new CRM_Batch_DAO_EntityBatch();
         $batchContribution->entity_table = 'civicrm_contribution';
         $batchContribution->entity_id = $contributionID;
         // check if the selected contribution id already in a batch
         // if not, increment $numContributionsAdded else keep the count of contributions that are already added
         if (!$batchContribution->find(TRUE)) {
             // get contact_id, & contribution receive date from Contribution using contribution id
             $params = array('id' => $contributionID);
             CRM_Contribute_BAO_Contribution::retrieve($params, $defaults, $ids);
             // check if contribution is not valid for gift aid, increment $numContributionsNotValid
             if (CRM_Civigiftaid_Utils_GiftAid::isEligibleForGiftAid($defaults['contact_id'], $defaults['receive_date'], $contributionID) and $defaults['contribution_status_id'] == 1) {
                 $contributionsAdded[] = $contributionID;
             } else {
                 $contributionsNotValid[] = $contributionID;
             }
         } else {
             $contributionsAlreadyAdded[] = $contributionID;
         }
     }
     return array(count($contributionIDs), $contributionsAdded, $contributionsAlreadyAdded, $contributionsNotValid);
 }
/**
 * Implementation of hook_civicrm_custom
 * Create / update Gift Aid declaration records on Individual when
 * "Eligible for Gift Aid" field on Contribution is updated.
 */
function civigiftaid_civicrm_custom($op, $groupID, $entityID, &$params)
{
    if ($op != 'create') {
        return;
    }
    //Do this only for online contributions
    if ($_GET['q'] != 'civicrm/contribute/transact' or empty($_GET['q'])) {
        return;
    }
    require_once 'CRM/Core/DAO.php';
    $tableName = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $groupID, 'table_name', 'id');
    if ($tableName == 'civicrm_value_gift_aid_submission') {
        // Iterate through $params to get new declaration value
        $newStatus = NULL;
        if (!is_array($params) || empty($params)) {
            return;
        }
        foreach ($params as $field) {
            if ($field['column_name'] == 'eligible_for_gift_aid') {
                $newStatus = $field['value'];
                break;
            }
        }
        if (is_null($newStatus)) {
            return;
        }
        // Get contactID.
        $sql = "\n      SELECT contact_id, receive_date\n      FROM civicrm_contribution\n      WHERE id = %1";
        $dao = CRM_Core_DAO::executeQuery($sql, array(1 => array($entityID, 'Integer')));
        if ($dao->fetch()) {
            $contactID = $dao->contact_id;
            $contributionDate = $dao->receive_date;
        }
        if ($contactID) {
            $addressDetails = _civigiftaid_civicrm_custom_get_address_and_postal_code($contactID, 1);
            require_once 'CRM/Civigiftaid/Utils/GiftAid.php';
            $params = array('entity_id' => $contactID, 'eligible_for_gift_aid' => $newStatus, 'start_date' => $contributionDate, 'address' => $addressDetails[0], 'post_code' => $addressDetails[1]);
            CRM_Civigiftaid_Utils_GiftAid::setDeclaration($params);
        }
    }
}
 /**
  * Create / update Gift Aid declaration records on Individual when
  * "Eligible for Gift Aid" field on Contribution is updated.
  * See http://wiki.civicrm.org/confluence/display/CRM/Gift+aid+implementation
  *
  * TODO change arguments to single $param array
  * @param array  $params    - fields to store in declaration:
  *               - entity_id:  the Individual for whom we will create/update declaration
  *               - eligible_for_gift_aid: 1 for positive declaration, 0 for negative
  *               - start_date: start date of declaration (in ISO date format)
  *               - end_date:   end date of declaration (in ISO date format)
  *
  * @return array   TODO
  * @access public
  * @static
  */
 static function setDeclaration($params)
 {
     static $charityColumnExists = null;
     if (!CRM_Utils_Array::value('entity_id', $params)) {
         return array('is_error' => 1, 'error_message' => 'entity_id is required');
     }
     $charity = CRM_Utils_Array::value('charity', $params);
     // Retrieve existing declarations for this user.
     $currentDeclaration = CRM_Civigiftaid_Utils_GiftAid::getDeclaration($params['entity_id'], $params['start_date'], $charity);
     $charityClause = '';
     if ($charityColumnExists === NULL) {
         $charityColumnExists = CRM_Core_DAO::checkFieldExists('civicrm_value_gift_aid_declaration', 'charity');
     }
     if ($charityColumnExists) {
         $charityClause = $charity ? " AND charity='{$charity}'" : " AND ( charity IS NULL OR charity = '' )";
     }
     // Get future declarations: start_date in future, end_date in future or null
     // - if > 1, pick earliest start_date
     $futureDeclaration = array();
     $sql = "\n        SELECT id, eligible_for_gift_aid, start_date, end_date\n        FROM   civicrm_value_gift_aid_declaration\n        WHERE  entity_id = %1 AND start_date > %2 AND (end_date > %2 OR end_date IS NULL) {$charityClause}\n        ORDER BY start_date";
     $dao = CRM_Core_DAO::executeQuery($sql, array(1 => array($params['entity_id'], 'Integer'), 2 => array(CRM_Utils_Date::isoToMysql($params['start_date']), 'Timestamp')));
     if ($dao->fetch()) {
         $futureDeclaration['id'] = $dao->id;
         $futureDeclaration['eligible_for_gift_aid'] = $dao->eligible_for_gift_aid;
         $futureDeclaration['start_date'] = $dao->start_date;
         $futureDeclaration['end_date'] = $dao->end_date;
     }
     #CRM_Core_Error::debug('futureDeclaration', $futureDeclaration);
     $specifiedEndTimestamp = null;
     if (CRM_Utils_Array::value('end_date', $params)) {
         $specifiedEndTimestamp = strtotime(CRM_Utils_Array::value('end_date', $params));
     }
     // Calculate new_end_date for negative declaration
     // - new_end_date =
     //   if end_date specified then (specified end_date)
     //   else (start_date of first future declaration if any, else null)
     $futureTimestamp = null;
     if (CRM_Utils_Array::value('start_date', $futureDeclaration)) {
         $futureTimestamp = strtotime(CRM_Utils_Array::value('start_date', $futureDeclaration));
     }
     if ($specifiedEndTimestamp) {
         $endTimestamp = $specifiedEndTimestamp;
     } else {
         if ($futureTimestamp) {
             $endTimestamp = $futureTimestamp;
         } else {
             $endTimestamp = null;
         }
     }
     if ($params['eligible_for_gift_aid'] == 1) {
         if (!$currentDeclaration) {
             // There is no current declaration so create new.
             CRM_Civigiftaid_Utils_GiftAid::_insertDeclaration($params, $endTimestamp);
         } else {
             if ($currentDeclaration['eligible_for_gift_aid'] == 1 && $endTimestamp) {
                 //   - if current positive, extend its end_date to new_end_date.
                 $updateParams = array('id' => $currentDeclaration['id'], 'end_date' => date('YmdHis', $endTimestamp));
                 CRM_Civigiftaid_Utils_GiftAid::_updateDeclaration($updateParams);
             } else {
                 if ($currentDeclaration['eligible_for_gift_aid'] == 0) {
                     //   - if current negative, set its end_date to now and create new ending new_end_date.
                     $updateParams = array('id' => $currentDeclaration['id'], 'end_date' => CRM_Utils_Date::isoToMysql($params['start_date']));
                     CRM_Civigiftaid_GiftAid::_updateDeclaration($updateParams);
                     CRM_Civigiftaid_Utils_GiftAid::_insertDeclaration($params, $endTimestamp);
                 }
             }
         }
     } else {
         if ($params['eligible_for_gift_aid'] == 0) {
             if (!$currentDeclaration) {
                 // There is no current declaration so create new.
                 CRM_Civigiftaid_Utils_GiftAid::_insertDeclaration($params, $endTimestamp);
             } else {
                 if ($currentDeclaration['eligible_for_gift_aid'] == 1) {
                     //   - if current positive, set its end_date to now and create new ending new_end_date.
                     $updateParams = array('id' => $currentDeclaration['id'], 'end_date' => CRM_Utils_Date::isoToMysql($params['start_date']));
                     CRM_Civigiftaid_Utils_GiftAid::_updateDeclaration($updateParams);
                     CRM_Civigiftaid_Utils_GiftAid::_insertDeclaration($params, $endTimestamp);
                 }
             }
             //   - if current negative, leave as is.
         }
     }
     return array('is_error' => 0);
 }