Commit 68d208ab authored by mattwire's avatar mattwire
Browse files

Merge branch 'batchstuff' into 'master'

3.4.4

See merge request extensions/ukgiftaid!15
parents 787e7747 438b34aa
......@@ -630,22 +630,18 @@ SQL;
2 => [$p_contribution_receive_date, 'Timestamp']
];
$oDao = CRM_Core_DAO::executeQuery( $sSql
, $aParams
, $abort = TRUE
, $daoName = NULL
, $freeDAO = FALSE
, $i18nRewrite = TRUE
, $trapException = TRUE /* This must be explicitly set to TRUE for the code below to handle any Exceptions */
);
if (!(is_a($oDao, 'DB_Error'))) {
try {
$oDao = CRM_Core_DAO::executeQuery($sSql, $aParams);
if ($oDao->fetch()) {
$aAddress['id'] = $oDao->id;
$aAddress['address'] = $oDao->address;
$aAddress['id'] = $oDao->id;
$aAddress['address'] = $oDao->address;
$aAddress['house_number'] = self::getHouseNo($oDao->address);
$aAddress['postcode'] = self::getPostCode($oDao->postcode);
}
}
catch (Exception $e) {
\Civi::log()->error('getDonorAddress error: ' . $e->getMessage());
}
return $aAddress;
}
......
......@@ -100,38 +100,42 @@ class CRM_Civigiftaid_Form_Task_AddToBatch extends CRM_Contribute_Form_Task {
}
if (empty($this->batchTitle)) {
CRM_Core_Error::statusBounce('Missing name for new GiftAid batch - try creating the batch again?', NULL, 'GiftAid - Add to Batch');
CRM_Core_Error::statusBounce(E::ts('Missing name for new GiftAid batch - try creating the batch again?'), NULL, E::ts('GiftAid - Add to Batch'));
}
$batchParams['title'] = $this->batchTitle;
$batchParams['name'] = $this->batchName;
$batchParams['description'] = $this->_submitValues['description'];
$batchParams['batch_type'] = "Gift Aid";
$batchParams['batch_type'] = 'Gift Aid';
$batchParams['created_id'] = $batchParams['modified_id'] = CRM_Core_Session::getLoggedInContactID();
$batchParams['created_date'] = $batchParams['modified_date'] = date("YmdHis");
$batchParams['status_id'] = 0;
$batchMode = CRM_Core_PseudoConstant::get(
'CRM_Batch_DAO_Batch',
'mode_id',
['labelColumn' => 'name']
);
$batchParams['mode_id'] = CRM_Utils_Array::key('Manual Batch', $batchMode);
$batchParams['status_id'] = 'Exported';
$batchParams['mode_id'] = 'Manual Batch';
$session = new CRM_Core_Session();
$contributionIDsToAdd = $session->get($this->batchName, E::SHORT_NAME);
$transaction = new CRM_Core_Transaction();
if (empty($contributionIDsToAdd)) {
CRM_Core_Error::statusBounce(E::ts('No contributions to add to batch!'), NULL, E::ts('GiftAid - Add to Batch'));
}
$createdBatch = CRM_Batch_BAO_Batch::create($batchParams);
$batchID = $createdBatch->id;
$batchLabel = $batchParams['title'];
$transaction = new CRM_Core_Transaction();
$createdBatch = civicrm_api3('Batch', 'create', $batchParams);
// Save current settings for the batch
CRM_Civigiftaid_BAO_BatchSettings::create(['batch_id' => $batchID]);
CRM_Civigiftaid_BAO_BatchSettings::create(['batch_id' => $createdBatch['id']]);
$optionGroupID = civicrm_api3('OptionGroup', 'getvalue', ['name' => 'giftaid_batch_name', 'return' => 'id']);
$giftAidBatchNameParams = [
'option_group_id' => $optionGroupID,
'value' => $createdBatch['id'],
'label' => $this->batchTitle,
'name' => $this->batchName,
];
civicrm_api3('OptionValue', 'create', $giftAidBatchNameParams);
list($total, $addedContributionIDs, $notAddedContributionIDs) =
CRM_Civigiftaid_Utils_Contribution::addContributionToBatch($contributionIDsToAdd, $batchID);
CRM_Civigiftaid_Utils_Contribution::addContributionToBatch($contributionIDsToAdd, $createdBatch['id']);
if (count($addedContributionIDs) === 0) {
// rollback since there were no contributions added, and we might not want to keep an empty batch
......@@ -139,13 +143,13 @@ class CRM_Civigiftaid_Form_Task_AddToBatch extends CRM_Contribute_Form_Task {
$statusType = 'alert';
$statusMessage = E::ts(
'Could not create batch "%1", as there were no valid contribution(s) to be added.',
[1 => $batchLabel]
[1 => $batchParams['title']]
);
}
else {
$statusType = 'success';
$statusMessage = [
E::ts('Added Contribution(s) to %1', [1 => $batchLabel]),
E::ts('Added Contribution(s) to %1', [1 => $batchParams['title']]),
];
$statusMessage[] = E::ts('Contribution IDs added to batch: %1', [1 => implode(', ', $addedContributionIDs)]);
if (!empty($notAddedContributionIDs)) {
......
......@@ -31,7 +31,7 @@ class CRM_Civigiftaid_Report_Form_Contribute_GiftAid extends CRM_Report_Form {
'batch_id' => [
'title' => ts('Batch'),
'operatorType' => CRM_Report_Form::OP_MULTISELECT,
'options' => CRM_Civigiftaid_Utils_Contribution::getBatchIdTitle('id desc'),
'options' => CRM_Civigiftaid_Utils_Contribution::getBatchIdTitle(),
'type' => CRM_Utils_Type::T_INT,
],
],
......@@ -127,6 +127,10 @@ class CRM_Civigiftaid_Report_Form_Contribute_GiftAid extends CRM_Report_Form {
$this->_columns['civicrm_value_gift_aid_submission']['fields'][$field]['type'] = CRM_Utils_Type::T_INT;
}
}
// Remove the Gift Aid Batch name filter - it doesn't work and we have batch_id via civicrm_entity_batch which does
if (isset($this->_columns['civicrm_value_gift_aid_submission']['filters'][CRM_Civigiftaid_Utils::getCustomByName('batch_name', 'Gift_Aid')])) {
unset($this->_columns['civicrm_value_gift_aid_submission']['filters'][CRM_Civigiftaid_Utils::getCustomByName('batch_name', 'Gift_Aid')]);
}
}
}
......@@ -198,7 +202,7 @@ class CRM_Civigiftaid_Report_Form_Contribute_GiftAid extends CRM_Report_Form {
$this->_columnHeaders['civicrm_address_house_number'] = [
'title' => 'House name or number',
];
/**
* HMRC Gift Aid spreadsheet requires columns for Aggregated Donations and Sponsored Events.
* Normally blank, these are included here so the CiviCRM csv file matches the HMRC format.
......@@ -319,7 +323,7 @@ class CRM_Civigiftaid_Report_Form_Contribute_GiftAid extends CRM_Report_Form {
if (array_key_exists('civicrm_address_street_address', $row)) {
$address = CRM_Civigiftaid_Declaration::getDonorAddress($row['civicrm_contribution_contact_id'], CRM_Utils_Date::isoToMysql($row['civicrm_contribution_receive_date']));
$address = CRM_Civigiftaid_Declaration::getDonorAddress($row['civicrm_contribution_contact_id'], date('Ymd', strtotime($row['civicrm_contribution_receive_date'])) . '235959');
$rows[$rowNum]['civicrm_address_house_number'] = $address['house_number'];
$rows[$rowNum]['civicrm_address_street_address']
= $address['address'];
......
......@@ -601,6 +601,12 @@ class CRM_Civigiftaid_Upgrader extends CRM_Civigiftaid_Upgrader_Base {
return TRUE;
}
public function upgrade_3111() {
$this->log('Check we have batch_type = "Gift Aid".');
$this->ensureDataStructures();
return TRUE;
}
/**
* @return array
*/
......@@ -921,6 +927,9 @@ class CRM_Civigiftaid_Upgrader extends CRM_Civigiftaid_Upgrader_Base {
'is_reserved' => 1
],
];
$optionGroups['batch_type'] = civicrm_api3('OptionGroup', 'getsingle', [
'name' => 'batch_type',
]);
return $optionGroups;
}
......@@ -1002,6 +1011,13 @@ class CRM_Civigiftaid_Upgrader extends CRM_Civigiftaid_Upgrader_Base {
'is_reserved' => 1,
'description' => 'The GiftAid basic tax rate (%)'
],
[
'option_group_id' => $this->optionGroupNameToId['batch_type'],
'name' => "Gift Aid",
'is_active' => 1,
'is_reserved' => 1,
'is_default' => 0,
]
];
return $optionValues;
......
......@@ -33,21 +33,10 @@ class CRM_Civigiftaid_Utils_Contribution {
// Get the batch name
$batchName = civicrm_api3('Batch', 'getvalue', [
'return' => "title",
'return' => 'name',
'id' => $batchID,
]);
$batchNameGroup = civicrm_api3('OptionGroup', 'getsingle', ['name' => 'giftaid_batch_name']);
if ($batchNameGroup['id']) {
$groupId = $batchNameGroup['id'];
$params = [
'option_group_id' => $groupId,
'value' => $batchName,
'label' => $batchName
];
civicrm_api3('OptionValue', 'create', $params);
}
// Get all contributions from found IDs that are not already in a batch
$contributionParams = [
'id' => ['IN' => $contributionIDs],
......@@ -109,13 +98,13 @@ class CRM_Civigiftaid_Utils_Contribution {
* @param int $contributionID
* @param int $eligibleForGiftAid - if this is NULL if will NOT be set, otherwise set it to eg CRM_Civigiftaid_Utils_GiftAid::DECLARATION_IS_YES
* @param string $batchName - if this is set to NULL it will NOT be changed
* @param bool $addToBatch - You must set this to TRUE to modify the batchName
* @param bool $updateIfHasBatchName - You must set this to TRUE to modify the batchName
*
* @throws \CRM_Extension_Exception
* @throws \CiviCRM_API3_Exception
*/
public static function updateGiftAidFields($contributionID, $eligibleForGiftAid = NULL, $batchName = '', $addToBatch = FALSE) {
if (!empty($batchName) && !$addToBatch) {
public static function updateGiftAidFields($contributionID, $eligibleForGiftAid = NULL, $batchName = '', $updateIfHasBatchName = FALSE) {
if (!empty($batchName) && !$updateIfHasBatchName) {
// Don't touch this contribution - it's already part of a batch
// and we're not being called to clear the batch (e.g. new contribution in a recurring contribution).
return;
......@@ -402,17 +391,15 @@ class CRM_Civigiftaid_Utils_Contribution {
/**
* Returns the array of batchID & title
*
* @param string $orderBy
*
* @return array
*/
public static function getBatchIdTitle($orderBy = 'id') {
$query = "SELECT * FROM civicrm_batch ORDER BY " . $orderBy;
public static function getBatchIdTitle() {
$query = "SELECT * FROM civicrm_batch ORDER BY id DESC";
$dao = CRM_Core_DAO::executeQuery($query);
$result = [];
while ($dao->fetch()) {
$result[$dao->id] = $dao->id . " - " . $dao->title;
$result[$dao->id] = $dao->title;
}
return $result;
}
......
......@@ -16,39 +16,46 @@ abstract class CRM_Civigiftaid_Utils_Hook extends CRM_Utils_Hook {
/**
* This hook allows filtering contributions for gift-aid
* @param bool $isEligible eligibilty already detected if getDeclaration() method.
* @param integer $contactID contact being checked
* @param date $date date gift-aid declaration was made on
* @param $contributionID contribution id if any being referred
*
* @param bool $isEligible
* eligibilty already detected if getDeclaration() method.
* @param int $contactID
* contact being checked
* @param date $date
* date gift-aid declaration was made on
* @param int $contributionID
* contribution id if any being referred
*
* @return mixed
*/
public static function giftAidEligible(&$isEligible, $contactID, $date = NULL, $contributionID = NULL) {
return self::singleton()->invoke(4, $isEligible, $contactID, $date, $contributionID, self::$_nullObject, self::$_nullObject, 'civicrm_giftAidEligible');
return self::singleton()->invoke(['isEligible', 'contactID', 'date', 'contributionID'], $isEligible, $contactID, $date, $contributionID, self::$_nullObject, self::$_nullObject, 'civicrm_giftAidEligible');
}
/**
* This hook allows doing any extra processing for contributions that are added to a batch.
*
* @param $batchID
* @param array $contributionsAdded Contribution ids that have been batched
* @param int $batchID
* @param array $contributionsAdded
* Contribution ids that have been batched
*
* @return mixed
*/
public static function batchContributions( $batchID, $contributionsAdded ) {
return self::singleton()->invoke(2, $batchID, $contributionsAdded, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_batchContributions');
public static function batchContributions($batchID, $contributionsAdded) {
return self::singleton()->invoke(['batchID', 'contributionsAdded'], $batchID, $contributionsAdded, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_batchContributions');
}
/**
* This hook allows altering getDeclaration() query
* @param string $query declaration query
* @param array $queryParams params required by query
* @param string $query
* declaration query
* @param array $queryParams
* params required by query
*
* @return mixed
*
*/
public static function alterDeclarationQuery( &$query, &$queryParams ) {
return self::singleton()->invoke(2, $query, $queryParams, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_alterDeclarationQuery');
public static function alterDeclarationQuery(&$query, &$queryParams) {
return self::singleton()->invoke(['query', 'queryParams'], $query, $queryParams, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_alterDeclarationQuery');
}
}
......@@ -92,6 +92,86 @@ function civicrm_api3_gift_aid_updateeligiblecontributions($params) {
return civicrm_api3_create_success($updatedIDs ?? [], $params, 'GiftAid', 'updateeligiblecontributions');
}
/**
* @param array $params
*/
function _civicrm_api3_gift_aid_recalculatecontributionamounts_spec(&$params) {
$params['contribution_id']['title'] = 'Contribution ID';
$params['contribution_id']['description'] = 'Optional contribution ID to update';
$params['contribution_id']['type'] = CRM_Utils_Type::T_INT;
$params['contribution_id']['api.required'] = FALSE;
$params['batch_name']['title'] = 'The batch name (optional)';
$params['batch_name']['description'] = 'If specified, amounts will be recalculated for contributions with this batch name only. Otherwise only contributions with no batch name will be recalculated.';
$params['batch_name']['type'] = CRM_Utils_Type::T_STRING;
}
function civicrm_api3_gift_aid_recalculatecontributionamounts($params) {
$customBatchName = CRM_Civigiftaid_Utils::getCustomByName('batch_name', 'Gift_Aid');
$customEligible = CRM_Civigiftaid_Utils::getCustomByName('Eligible_for_Gift_Aid', 'Gift_Aid');
$params['options']['limit'] = $params['options']['limit'] ?? 0;
$contributionParams = [
'return' => [
'id',
'contact_id',
'contribution_status_id',
'receive_date',
$customBatchName,
$customEligible,
],
'options' => $params['options'],
];
// Retrieve all contributions that are eligible for gift aid
$contributionParams[$customEligible] = 1;
if (!empty($params['contribution_id'])) {
$contributionParams['id'] = $params['contribution_id'];
}
$contributions = civicrm_api3('Contribution', 'get', $contributionParams)['values'];
if (empty($contributions)) {
return civicrm_api3_create_error('No contributions found or none have Eligible flag set!');
}
// Disable logging
$loggingSchema = new \CRM_Logging_Schema();
$loggingEnabled = $loggingSchema->isEnabled();
if ($loggingEnabled) {
$loggingSchema->disableLogging();
Civi::settings()->set('logging', '0');
}
try {
foreach ($contributions as $contributionID => $contributionDetail) {
// Check batch name here because it may be NULL or empty string and we can't check that using API3.
if (!empty($params['batch_name']) && ($params['batch_name'] !== $contributionDetail[$customBatchName])) {
// We specified a specific batch name to process and this contribution is not part of that batch
continue;
}
elseif (empty($params['batch_name']) && !empty($contributionDetail[$customBatchName])) {
// Contribution is part of a batch so we must not change/process it.
continue;
}
CRM_Civigiftaid_Utils_Contribution::updateGiftAidFields($contributionID,
$contributionDetail[$customEligible],
$contributionDetail[$customBatchName],
TRUE
);
$updatedIDs[] = $contributionID;
}
}
finally {
// Re-enable logging
if ($loggingEnabled) {
$loggingSchema->enableLogging();
Civi::settings()->set('logging', '1');
}
}
return civicrm_api3_create_success($updatedIDs ?? [], $params, 'GiftAid', 'recalculatecontributionamounts');
}
function _civicrm_api3_gift_aid_updatedeclarations_spec(&$params) {
$params['contact_id']['title'] = 'Contact ID';
$params['start_date']['title'] = 'Declaration start date';
......
......@@ -15,8 +15,13 @@ function civigiftaid_civicrm_config(&$config) {
if (isset(Civi::$statics[__FUNCTION__])) { return; }
Civi::$statics[__FUNCTION__] = 1;
// Symfony hook priorities - see https://docs.civicrm.org/dev/en/latest/hooks/usage/symfony/#priorities
// Add listeners for CiviCRM hooks that might need altering by other scripts
Civi::dispatcher()->addListener('hook_civicrm_post', 'CRM_Civigiftaid_SetContributionGiftAidEligibility::run');
// Run before giftaidonline (-100)
\Civi::dispatcher()->addListener('hook_civicrm_navigationMenu', 'civigiftaid_symfony_civicrm_navigationMenu', 0);
}
/**
......@@ -98,11 +103,12 @@ function civigiftaid_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
/**
* Add navigation for GiftAid under "Administer/CiviContribute" menu
*
* @param array $menu
* @param \Civi\Core\Event\GenericHookEvent $event
* @param string $hookName
*
* @throws \CiviCRM_API3_Exception
*/
function civigiftaid_civicrm_navigationMenu(&$menu) {
function civigiftaid_symfony_civicrm_navigationMenu($event, $hookName) {
// Get optionvalue ID for basic rate tax setting
$result = civicrm_api3('OptionValue', 'getsingle', ['name' => 'basic_rate_tax']);
if ($result['id']) {
......@@ -118,7 +124,7 @@ function civigiftaid_civicrm_navigationMenu(&$menu) {
'operator' => NULL,
'separator' => 1,
];
_civigiftaid_civix_insert_navigation_menu($menu, 'Administer/CiviContribute', $item[0]);
_civigiftaid_civix_insert_navigation_menu($event->params, 'Administer/CiviContribute', $item[0]);
$item[] = [
'label' => E::ts('GiftAid Basic Rate Tax'),
......@@ -128,7 +134,7 @@ function civigiftaid_civicrm_navigationMenu(&$menu) {
'operator' => NULL,
'separator' => NULL,
];
_civigiftaid_civix_insert_navigation_menu($menu, 'Administer/CiviContribute/admin_giftaid', $item[1]);
_civigiftaid_civix_insert_navigation_menu($event->params, 'Administer/CiviContribute/admin_giftaid', $item[1]);
$item[] = [
'label' => E::ts('Settings'),
......@@ -138,9 +144,9 @@ function civigiftaid_civicrm_navigationMenu(&$menu) {
'operator' => NULL,
'separator' => NULL,
];
_civigiftaid_civix_insert_navigation_menu($menu, 'Administer/CiviContribute/admin_giftaid', $item[2]);
_civigiftaid_civix_insert_navigation_menu($event->params, 'Administer/CiviContribute/admin_giftaid', $item[2]);
_civigiftaid_civix_navigationMenu($menu);
_civigiftaid_civix_navigationMenu($event->params);
}
/**
......@@ -238,23 +244,53 @@ function civigiftaid_civicrm_postProcess($formName, &$form) {
* @throws \CiviCRM_API3_Exception
*/
function civigiftaid_civicrm_post($op, $objectName, $objectId, &$objectRef) {
if ($objectName !== 'Contribution') {
return;
}
switch ($objectName) {
case 'Batch':
if ($op !== 'delete') {
return;
}
// We have the batch ID. Check if it's a giftaid batch and delete related stuff
try {
$optionGroupID = civicrm_api3('OptionGroup', 'getvalue', [
'name' => 'giftaid_batch_name',
'return' => 'id'
]);
$batchOptionValue = civicrm_api3('OptionValue', 'getsingle', [
'option_group_id' => $optionGroupID,
'value' => $objectId,
]);
// Clear batch_name from contributions
$updateSql = "UPDATE civicrm_value_gift_aid_submission SET batch_name = NULL WHERE batch_name=%1";
$updateSqlParams = [
1 => [$batchOptionValue['name'], 'String']
];
CRM_Core_DAO::executeQuery($updateSql, $updateSqlParams);
// Finally we delete the giftaid batch name option value.
civicrm_api3('OptionValue', 'delete', [
'id' => $batchOptionValue['id'],
]);
} catch (Exception $e) {
\Civi::log()
->error('Deleting Gift Aid Batch failed: ' . $e->getMessage());
}
break;
if ($op == 'edit' || $op == 'create') {
$callbackParams = [
'entity' => $objectName,
'op' => $op,
'id' => $objectId,
'details' => $objectRef,
];
if (CRM_Core_Transaction::isActive()) {
CRM_Core_Transaction::addCallback(CRM_Core_Transaction::PHASE_POST_COMMIT, 'civigiftaid_callback_civicrm_post_contribution', [$callbackParams]);
}
else {
civigiftaid_callback_civicrm_post_contribution($callbackParams);
}
case 'Contribution':
if ($op == 'edit' || $op == 'create') {
$callbackParams = [
'entity' => $objectName,
'op' => $op,
'id' => $objectId,
'details' => $objectRef,
];
if (CRM_Core_Transaction::isActive()) {
CRM_Core_Transaction::addCallback(CRM_Core_Transaction::PHASE_POST_COMMIT, 'civigiftaid_callback_civicrm_post_contribution', [$callbackParams]);
}
else {
civigiftaid_callback_civicrm_post_contribution($callbackParams);
}
}
break;
}
}
......@@ -381,3 +417,29 @@ function civigiftaid_civicrm_validateForm($formName, &$fields, &$files, &$form,
return $errors;
}
}
/**
* This hook is called to alter Custom field value before its displayed.
*
* @param string $displayValue
* @param mixed $value
* @param int $entityId
* @param array $fieldInfo
*/
function civigiftaid_civicrm_alterCustomFieldDisplayValue(&$displayValue, $value, $entityId, $fieldInfo) {
// Gift Aid batch name is stored as "name" but we want to display "label".
if ($fieldInfo['name'] === 'Batch_Name' && $fieldInfo['column_name'] === 'batch_name' && !empty($value)) {
try {
$optionGroupID = civicrm_api3('OptionGroup', 'getvalue', ['name' => 'giftaid_batch_name', 'return' => 'id']);
$displayValue = civicrm_api3('OptionValue', 'getvalue', [
'option_group_id' => $optionGroupID,
'name' => $value,
'return' => 'label',
]);
}
catch (Exception $e) {
// Do nothing, we'll use the existing displayValue
// This will fail for older batches which stored the label instead of the name for the batch_name field.
}
}
}
......@@ -20,6 +20,15 @@ Note that a contribution's eligibility is based on the financial types of the li
- If missing/false (default), only calculate amounts (and eligibility) for contributions that do not have eligibility known.
- If true, recalculate Gift Aid amounts (but not eligibility) for contributions that have the eligible flag set.
### Recalculate Contribution Amounts
GiftAid.recalculatecontributionamounts - API to recalculate gift aid amounts for contributions.
This is also done by updateeligiblecontributions but there are two main differences:
1. The eligibility status is not changed.
2. If you specify a batch name as parameter the amounts will be recalculated for all contributions with that batch name.
- `batch_name` (string): The batch name (note that you see the label in the UI but you need the name which you can find from the `gift_aid_batch_name` option group).
### Update Declarations
GiftAid.updatedeclarations - API to update existing declarations that may be invalid (eg. were imported, missing address etc.).
......
......@@ -9,6 +9,20 @@ Releases use the following numbering system:
* **[BC]**: Items marked with [BC] indicate a breaking change that will require updates to your code if you are using that code in your extension.
## Release 3.4.4
**Requires CiviCRM 5.25 minimum or you won't see the batch name anymore in the contribution detail** - *alterCustomFieldDisplayValue hook does not exist.*
* Replace deprecated hook definitions.
* Remove deprecated trapException on executeQuery.
* Switch "Add to Batch" to use API and supported batch params.
* If deleting a batch clean up giftaid batch info so we don't have problems adding them to a new batch.
* Add API to recalculate amounts for contributions already added to a batch (`GiftAid.recalculatecontributionamounts`).
* Fix ukgiftaidonline menu items sometimes not showing: [ukgiftaidonline#1](https://lab.civicrm.org/extensions/ukgiftaidsubmission/-/issues/1).
* Fix searching for batch via reports.
* Improve GiftAid Report for submission to HMRC [!12](https://lab.civicrm.org/extensions/ukgiftaid/-/merge_requests/12)
* Improve address validation for house names.
* Fix get address for report when contribution receive date is a few seconds after declaration but on same day.
## Release 3.4.3
* Fix [#9](https://lab.civicrm.org/extensions/ukgiftaid/-/issues/4) Fix contributions marked not-eligible when line items missing
......
......@@ -18,11 +18,11 @@
<author>MJW Consulting, Rich Lott (Artful Robot) Erawat Chamanont, Jamie Novick, Guanhuan Chen, Robin Mitra</author>
<email>mjw@mjwconsult.co.uk, https://artfulrobot.uk, jamie@compucorp.co.uk, guanhuan@compucorp.co.uk</email>
</maintainer>
<releaseDate>2020-08-14</releaseDate>
<version>3.4.3</version>
<releaseDate>2020-08-24</releaseDate>
<version>3.4.4</version>
<develStage>stable</develStage>
<compatibility>
<ver>5.24</ver>
<ver>5.25</ver>
</compatibility>
<civix>
<namespace>CRM/Civigiftaid</namespace>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment