From 3f39fde4dce132b76d5440758717c6b7b24408b2 Mon Sep 17 00:00:00 2001 From: "Kyle B. Johnson" Date: Fri, 17 Jan 2025 14:02:53 -0500 Subject: [PATCH 1/2] refactor: Update donor export for custom columns --- src/Exports/DonorsExport.php | 52 ++++++++++++++++--------- tests/Unit/Exports/DonorsExportTest.php | 44 +++++++++++++++++++++ 2 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 tests/Unit/Exports/DonorsExportTest.php diff --git a/src/Exports/DonorsExport.php b/src/Exports/DonorsExport.php index 2bf9b45d04..534e0cedfc 100644 --- a/src/Exports/DonorsExport.php +++ b/src/Exports/DonorsExport.php @@ -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)) ); } @@ -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. @@ -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); } /** @@ -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); + } } diff --git a/tests/Unit/Exports/DonorsExportTest.php b/tests/Unit/Exports/DonorsExportTest.php new file mode 100644 index 0000000000..289e6a9b06 --- /dev/null +++ b/tests/Unit/Exports/DonorsExportTest.php @@ -0,0 +1,44 @@ +set_properties([ + 'giveDonorExport-startDate' => '', + 'giveDonorExport-endDate' => '', + 'searchBy' => '', + 'forms' => 0, + 'give_export_columns' => [ + 'full_name' => 'on', + 'custom-column' => 'on', // Custom column in the request + ], + ]); + + 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']); + } +} From b900d67eb7458bb6228856409d9ff051b6bca61b Mon Sep 17 00:00:00 2001 From: "Kyle B. Johnson" Date: Tue, 21 Jan 2025 21:20:19 -0500 Subject: [PATCH 2/2] test: Create donor for export --- tests/Unit/Exports/DonorsExportTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Unit/Exports/DonorsExportTest.php b/tests/Unit/Exports/DonorsExportTest.php index 289e6a9b06..8d425456ea 100644 --- a/tests/Unit/Exports/DonorsExportTest.php +++ b/tests/Unit/Exports/DonorsExportTest.php @@ -2,6 +2,8 @@ namespace Give\Tests\Unit\Exports; +use Give\Donations\Models\Donation; +use Give\Donors\Models\Donor; use Give\Exports\DonorsExport; use Give\Tests\TestCase; @@ -24,6 +26,8 @@ public function it_includes_custom_csv_columns() ], ]); + Donor::factory()->create(); + add_filter( 'give_export_donors_get_default_columns', static function($columnData) { $columnData['custom-column'] = 'My Custom Column'; return $columnData;