/** * 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); }