Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor: Update donor export for custom columns #7682

Draft
wants to merge 2 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 33 additions & 19 deletions src/Exports/DonorsExport.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,7 @@ public function get_data(): array
}

return $this->filterExportData(
array_map(function ($row) {
return array_intersect_key($row, $this->csv_cols());
}, $donorQuery->getAll(ARRAY_A))
$this->spreadExportDataOnExpectedColumns($donorQuery->getAll(ARRAY_A))
);
}

Expand All @@ -156,19 +154,6 @@ protected function filterExportData(array $exportData): array
return apply_filters("give_export_get_data_{$this->export_type}", $exportData);
}

/**
* @since 3.14.0
*/
protected function filterColumnData(array $defaultColumns): array
{
/**
* @since 3.14.0
*
* @param array $defaultColumns
*/
return apply_filters('give_export_donors_get_default_columns', $defaultColumns );
}

/**
* @since 3.14.0 allow cols to be filtered.
* @since 3.12.1 Include donor_phone_number col.
Expand All @@ -195,11 +180,17 @@ public function csv_cols(): array
],
];

$defaultColumns = $this->flattenAddressColumn(
/**
* @unreleased
* @since 3.14.0
*
* @param array $defaultColumns
*/
$defaultColumns = apply_filters('give_export_donors_get_default_columns', $defaultColumns );

return $this->flattenAddressColumn(
array_intersect_key($defaultColumns, $this->postedData['give_export_columns'])
);

return $this->filterColumnData($defaultColumns);
}

/**
Expand All @@ -222,4 +213,27 @@ protected function flattenColumn(array $columnarData, string $columnName): array

return $columnarData;
}

/**
* Spread Export Data on Expected (CSV) Columns
*
* This ensures that all columns exist in the CSV export, even if they are empty.
*
* @unreleased
*
* @param array $exportData
*
* @return array
*/
protected function spreadExportDataOnExpectedColumns(array $exportData): array
{
/**
* Fill an array of CSV columns to merge with the export data.
*/
$columnKeysArray = array_fill_keys(array_keys($this->csv_cols()), '');

return array_map(function ($row) use ($columnKeysArray) {
return array_merge($columnKeysArray, $row);
}, $exportData);
}
}
48 changes: 48 additions & 0 deletions tests/Unit/Exports/DonorsExportTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace Give\Tests\Unit\Exports;

use Give\Donations\Models\Donation;
use Give\Donors\Models\Donor;
use Give\Exports\DonorsExport;
use Give\Tests\TestCase;

final class DonorsExportTest extends TestCase
{
/** @test */
public function it_includes_custom_csv_columns()
{
require_once GIVE_PLUGIN_DIR . 'includes/admin/tools/export/class-export.php';
require_once GIVE_PLUGIN_DIR . 'includes/admin/tools/export/class-batch-export.php';
$exporter = new DonorsExport();
$exporter->set_properties([
'giveDonorExport-startDate' => '',
'giveDonorExport-endDate' => '',
'searchBy' => '',
'forms' => 0,
'give_export_columns' => [
'full_name' => 'on',
'custom-column' => 'on', // Custom column in the request
],
]);

Donor::factory()->create();

add_filter( 'give_export_donors_get_default_columns', static function($columnData) {
$columnData['custom-column'] = 'My Custom Column';
return $columnData;
});

add_filter( 'give_export_get_data_donors', static function($data) {
foreach($data as $key => $value) {
$data[$key]['custom-column'] = 'My Custom Value';
}
return $data;
});

$exportData = $exporter->get_data();

$this->assertArrayHasKey('custom-column', $exporter->csv_cols());
$this->assertEquals('My Custom Value', $exportData[0]['custom-column']);
}
}
Loading