Skip to content

Commit

Permalink
Merge pull request #1625 from younginnovations/1607-transaction-list-…
Browse files Browse the repository at this point in the history
…--change-date-display-and-add-column-sorting

Review: 1607-transaction-list---change-date-display-and-add-column-sorting
  • Loading branch information
PG-Momik authored Nov 29, 2024
2 parents c4cf058 + 52c798e commit f5d3eab
Show file tree
Hide file tree
Showing 12 changed files with 1,953 additions and 540 deletions.
12 changes: 12 additions & 0 deletions app/Helpers/general.php
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,18 @@ function getTableConfig($module): array
],
'user' => ['orderBy' => ['username', 'publisher_name', 'created_at', 'organisation', 'admin', 'general', 'active', 'deactivated', 'total', 'last_logged_in'], 'direction' => ['asc', 'desc']],
'audit' => ['orderBy' => ['user_id', 'user_type', 'event', 'auditable_type', 'created_at'], 'direction' => ['asc', 'desc']],
'transaction' => [
'orderBy' => ['type', 'value', 'date'],
'direction' => ['asc', 'desc'],
'filterBy' => [
'all',
'incoming_funds',
'outgoing_commitment',
'disbursement',
'expenditure',
'others',
],
],
];

return $tableConfig[$module];
Expand Down
48 changes: 45 additions & 3 deletions app/Http/Controllers/Admin/Activity/TransactionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,20 +95,62 @@ public function index($activityId): Factory|View|RedirectResponse|Application
public function getPaginatedTransactions(int $activityId, int $page = 1): JsonResponse
{
try {
$transaction = $this->transactionService->getPaginatedTransaction($activityId, $page);
$transaction = $this->transactionService->getPaginatedTransactionAndStats($activityId, $page, $this->sanitizeRequest(request()));
$stats = $this->transactionService->getTransactionCountStats($activityId);

return response()->json([
'success' => true,
'message' => 'Transactions fetched successfully',
'data' => $transaction,
'data' => [
'transactions' => $transaction,
'stats' => $stats,
],
]);
} catch (Exception $e) {
logger()->error($e->getMessage());
logger()->error($e);

return response()->json(['success' => false, 'message' => 'Error occurred while fetching the data']);
}
}

public function sanitizeRequest(\Illuminate\Http\Request $request): array
{
$tableConfig = getTableConfig('transaction');
$transactionTypeMap = [
'all' => 'all',
'incoming_funds' => 1,
'outgoing_commitment' => 2,
'disbursement' => 3,
'expenditure' => 4,
'others' => 'others',
];

$queryParams = [];

if (!empty($request->get('q')) || $request->get('q') === '0') {
$queryParams['query'] = $request->get('q');
}

if (!empty($request->get('limit'))) {
$queryParams['limit'] = $request->get('limit') ?? 10;
}

if (in_array($request->get('orderBy'), $tableConfig['orderBy'], true)) {
$queryParams['orderBy'] = $request->get('orderBy') ?? '';

if (in_array($request->get('direction'), $tableConfig['direction'], true)) {
$queryParams['direction'] = $request->get('direction') ?? 'asc';
}
}

if (in_array($request->get('filterBy'), $tableConfig['filterBy'], true)) {
$queryParams['filterBy'] = $request->get('filterBy');
$queryParams['filterBy'] = Arr::get($transactionTypeMap, $queryParams['filterBy'], 'all');
}

return $queryParams;
}

/**
* Show the form for creating a new resource.
*
Expand Down
54 changes: 50 additions & 4 deletions app/IATI/Repositories/Activity/TransactionRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use App\IATI\Repositories\Repository;
use App\IATI\Traits\FillDefaultValuesTrait;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Arr;

/**
* Class TransactionRepository.
Expand All @@ -27,14 +28,39 @@ public function getModel(): string
/**
* Returns paginated transactions.
*
* @param int $activityId
* @param int $page
* @param int $activityId
* @param array $queryParams
* @param int $page
*
* @return LengthAwarePaginator
*/
public function getPaginatedTransaction(int $activityId, int $page = 1): LengthAwarePaginator
public function getPaginatedTransaction(int $activityId, array $queryParams, int $page = 1): LengthAwarePaginator
{
return $this->model->where('activity_id', $activityId)->orderBy('created_at', 'DESC')->paginate(10, ['*'], 'transaction', $page);
$query = $this->model->where('activity_id', $activityId);

$filterApplied = Arr::get($queryParams, 'filterBy', 'all');
$orderBy = Arr::get($queryParams, 'orderBy', 'created_at');
$direction = strtoupper(Arr::get($queryParams, 'direction', 'ASC'));
$limit = Arr::get($queryParams, 'limit', 10);

$query = $query->when($filterApplied != 'all', function ($query) use ($filterApplied) {
if ($filterApplied === 'others') {
return $query->whereRaw("(transaction->'transaction_type'->0->>'transaction_type_code')::INTEGER NOT IN (1, 2, 3, 4)");
}

return $query->whereRaw("(transaction->'transaction_type'->0->>'transaction_type_code') = '$filterApplied'");
});

$query = $query->when(true, function ($query) use ($orderBy, $direction) {
return match ($orderBy) {
'type' => $query->orderByRaw("(transaction->'transaction_type'->0->>'transaction_type_code')::INTEGER $direction, created_at DESC"),
'value' => $query->orderByRaw("(transaction->'value'->0->>'amount')::NUMERIC $direction, created_at DESC"),
'date' => $query->orderByRaw("(transaction->'transaction_date'->0->>'date')::DATE $direction, created_at DESC"),
default => $query->orderBy('created_at', 'desc'),
};
});

return $query->orderBy('id', 'desc')->paginate($limit, ['*'], 'transaction', $page);
}

/**
Expand Down Expand Up @@ -98,4 +124,24 @@ public function insert($transactions): bool
{
return $this->model->insert($transactions);
}

/**
* @param int $activityId
*
* @return array
*/
public function getTransactionCountStats(int $activityId): array
{
return $this->model->where('activity_id', $activityId)
->selectRaw("
COUNT(*) as all,
COUNT(CASE WHEN (transaction->'transaction_type'->0->>'transaction_type_code')::INTEGER = 1 THEN 1 END) as incoming_funds,
COUNT(CASE WHEN (transaction->'transaction_type'->0->>'transaction_type_code')::INTEGER = 2 THEN 2 END) as outgoing_commitment,
COUNT(CASE WHEN (transaction->'transaction_type'->0->>'transaction_type_code')::INTEGER = 3 THEN 3 END) as disbursement,
COUNT(CASE WHEN (transaction->'transaction_type'->0->>'transaction_type_code')::INTEGER = 4 THEN 4 END) as expenditure,
COUNT(CASE WHEN (transaction->'transaction_type'->0->>'transaction_type_code')::INTEGER NOT IN (1,2,3,4) THEN 1 END) as others
")
->first()
->toArray();
}
}
19 changes: 15 additions & 4 deletions app/IATI/Services/Activity/TransactionService.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,15 @@ public function __construct(
}

/**
* @param int $activityId
* @param int $page
* @param int $activityId
* @param int $page
* @param array $queryParams
*
* @return LengthAwarePaginator|Collection
*/
public function getPaginatedTransaction(int $activityId, int $page): LengthAwarePaginator|Collection
public function getPaginatedTransactionAndStats(int $activityId, int $page, array $queryParams): LengthAwarePaginator|Collection
{
return $this->transactionRepository->getPaginatedTransaction($activityId, $page);
return $this->transactionRepository->getPaginatedTransaction($activityId, $queryParams, $page);
}

/**
Expand Down Expand Up @@ -663,4 +664,14 @@ public function getDeprecationStatusMap($id = '', $key = '')

return [];
}

/**
* @param int $activityId
*
* @return array
*/
public function getTransactionCountStats(int $activityId): array
{
return $this->transactionRepository->getTransactionCountStats($activityId);
}
}
10 changes: 5 additions & 5 deletions public/css/app.css

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions public/css/webportal-app.css

Large diffs are not rendered by default.

Loading

0 comments on commit f5d3eab

Please sign in to comment.