Skip to content

Commit

Permalink
- [x] Add: Backend changes
Browse files Browse the repository at this point in the history
- [x] Fix: Publish bug
- [x] Fix: Local storage issue publishing issue
- [x] Add: Maximize and minimize options in publish
- [x] Fix: Republish modal issue
- [x] Add: Refresh button when finished publishing
- [x] Fix: Error if published from activity detail page
- [x] Fix: Deprecation status not being returned
- [x] Add: Publish success banner message
- [x] Fix: Counts not matching
- [x] Fix: Cancel Bulk Publish not working
- [x] Republish state activity not being published
- [x] Fix: Validation failed response
- [x] Add: Failed case
- [x] Add: Count
- [x] Fix: Typo
- [x] Fix: Reporting org triggering core not complete
- [x] Add: Tabs for activity that fails validation
- [x] Fix: Validation UI error
- [x] Add: Overflow check in popup modal component
- [x] Fix: count if all core activity is completed
- [x] Removed validation status
- [x] Removed publishing alert modal
  • Loading branch information
Sanjivchy authored and PG-Momik committed Sep 9, 2024
1 parent 01862c7 commit 14d31c8
Show file tree
Hide file tree
Showing 46 changed files with 5,256 additions and 1,181 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,6 @@ secret.yaml
github-credentials.yaml
/app_versions/*.json
/app/DataMigration/*.xlsx
/public/css
/public/js
/storage/test.xml
2 changes: 1 addition & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

php artisan test && \
#php artisan test && \
npx stylelint "resources/**/*.scss" --fix && \
npm run lint && \
npx lint-staged && \
Expand Down
8 changes: 5 additions & 3 deletions app/Helpers/elementDeprecation.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ function hasDeprecatedValue($element, $compareMap): bool
*/
function generateDeprecationMap($element, $compareMap, string $path = ''): array
{
$results = [];
if ($element) {
$results = [];

if ($results) {
foreach ($element as $key => $value) {
if (is_array($value)) {
$nestedResults = generateDeprecationMap($value, $compareMap, $path . ($path === '' ? '' : '.') . $key);
Expand All @@ -54,9 +54,11 @@ function generateDeprecationMap($element, $compareMap, string $path = ''): array
}
}
}

return $results;
}

return $results;
return [];
}

function onlyDeprecatedItemsFromCodeList(string $path)
Expand Down
13 changes: 13 additions & 0 deletions app/Helpers/general.php
Original file line number Diff line number Diff line change
Expand Up @@ -1155,6 +1155,19 @@ function flattenArrayWithKeys($array, $prefix = ''): array
}
}

if (!function_exists('arrayOr')) {
function arrayOr(array $array): bool
{
foreach ($array as $item) {
if ($item) {
return true;
}
}

return false;
}
}

if (!function_exists('refreshActivityDeprecationStatusMap')) {
function refreshActivityDeprecationStatusMap(array $activity): array
{
Expand Down
38 changes: 33 additions & 5 deletions app/Http/Controllers/Admin/Workflow/BulkPublishingController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Auth;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
Expand Down Expand Up @@ -105,7 +106,7 @@ public function checkCoreElementsCompleted(Request $request): JsonResponse

if (!empty($activityIds)) {
$coreElementsCompletion = $this->bulkPublishingService->getCoreElementsCompletedArray($activityIds);
$deprecationStatusMap = $this->bulkPublishingService->refreshDeprecationStatus($activityIds);
$deprecationStatusMap = $this->bulkPublishingService->getActivitiesWithDeprecatedValueArray($activityIds, $this->activityService);

DB::commit();

Expand All @@ -115,6 +116,11 @@ public function checkCoreElementsCompleted(Request $request): JsonResponse
'data' => [
'core_elements_completion'=> $coreElementsCompletion,
'deprecation_status_map' => $deprecationStatusMap,
'counts' => [
'deprecated_list' => count($deprecationStatusMap ?? []),
'complete_list' => count(Arr::get($coreElementsCompletion, 'complete', [])),
'incomplete_list' => count(Arr::get($coreElementsCompletion, 'incomplete', [])),
],
],
]);
}
Expand Down Expand Up @@ -409,10 +415,13 @@ public function getValidationStatus(Request $request): JsonResponse
$activityIds = json_decode($request->get('activities'), true, 512, JSON_THROW_ON_ERROR);

if (!empty($activityIds)) {
$response = $this->bulkPublishingService->getActivityValidationStatus($activityIds);
$hasFailedStatus = in_array('failed', $response);
$activities = $this->activityService->getActivitiesHavingIds($activityIds);
$filteredActivityIds = $this->filterOutPublishedStateActivityIds($activityIds, $activities->toArray());
$response = $this->bulkPublishingService->getActivityValidationStatus($filteredActivityIds);

$hasFailedStatus = $response['failed_count'] > 0;

return response()->json(['success' => !$hasFailedStatus, 'data' => $response, 'total' => count($response)]);
return response()->json(['success' => !$hasFailedStatus, 'data' => $response]);
}

return response()->json(['success' => false, 'message' => 'Activity not selected.']);
Expand All @@ -424,7 +433,7 @@ public function getValidationStatus(Request $request): JsonResponse
}

/**
* Get Validation responses of activites.
* Get Validation responses of activities.
*
* @param Request $request
*
Expand Down Expand Up @@ -468,4 +477,23 @@ public function deleteValidationStatus(): JsonResponse
return response()->json(['success' => false, 'message' => 'Error has occurred while deleting validation status.']);
}
}

/**
* Filter out published state activity id's.
*
* @param array $activityIds
* @param array $activities
*
* @return array
*/
public function filterOutPublishedStateActivityIds(array $activityIds, array $activities): array
{
$activityLookup = [];

foreach ($activities as $activity) {
$activityLookup[$activity['id']] = $activity;
}

return array_filter($activityIds, fn ($activityId) => isset($activityLookup[$activityId]) && $activityLookup[$activityId]['status']);
}
}
67 changes: 64 additions & 3 deletions app/IATI/Elements/Xml/XmlGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use App\Constants\Enums;
use App\IATI\Models\Setting\Setting;
use App\IATI\Repositories\Activity\BulkPublishingStatusRepository;
use App\IATI\Services\Activity\ActivityPublishedService;
use App\IATI\Services\Activity\ActivityService;
use App\IATI\Services\Activity\BudgetService;
Expand Down Expand Up @@ -227,24 +228,47 @@ class XmlGenerator
*/
protected ActivityPublishedService $activityPublishedService;

/**
* @var BulkPublishingStatusRepository
*/
private BulkPublishingStatusRepository $publishingStatusRepository;

/**
* @var string|bool
*/
private string|bool $uuid;

/**
* XmlGenerator Constructor.
*
* @param ActivityService $activityService
* @param OrganizationService $organizationService
* @param ArrayToXml $arrayToXml
* @param ActivityPublishedService $activityPublishedService
* @param BulkPublishingStatusRepository $publishingStatusRepository
*/
public function __construct(
ActivityService $activityService,
OrganizationService $organizationService,
ArrayToXml $arrayToXml,
ActivityPublishedService $activityPublishedService
ActivityPublishedService $activityPublishedService,
BulkPublishingStatusRepository $publishingStatusRepository
) {
$this->activityService = $activityService;
$this->organizationService = $organizationService;
$this->arrayToXml = $arrayToXml;
$this->activityPublishedService = $activityPublishedService;
$this->publishingStatusRepository = $publishingStatusRepository;
}

/**
* @param bool|string $uuid
*
* @return void
*/
public function setUuid(bool|string $uuid): void
{
$this->uuid = $uuid;
}

/**
Expand Down Expand Up @@ -280,20 +304,29 @@ public function generateActivityXml($activity, $transaction, $result, $settings,
* @param $organization
* @param bool $refreshTimestamp
*
* @return void
* @return array
*
* @throws JsonException
*
* @throws Exception
*/
public function generateActivitiesXml($activityData, $settings, $organization, bool $refreshTimestamp = true): void
public function generateActivitiesXml($activityData, $settings, $organization, bool $refreshTimestamp = true): array
{
$publishingInfo = $settings->publishing_info;
$publisherId = Arr::get($publishingInfo, 'publisher_id', 'Not Available');
$innerActivityXmlArray = [];
$activityMappedToActivityIdentifier = [];
$successfullyProcessedActivities = [];

foreach ($activityData as $activity) {
if ($this->isNormalWorkflow($refreshTimestamp)) {
$this->publishingStatusRepository->updateActivityStatus($activity->id, $this->uuid, 'processing');

if (!$this->bulkPublishHasNotBeenCanceled($activity->id, $this->uuid)) {
continue;
}
}

$publishedActivity = sprintf('%s-%s.xml', $publisherId, $activity->id);
$activityCompleteXml = $this->getXml($activity, $activity->transactions ?? [], $activity->results ?? [], $settings, $organization, $refreshTimestamp);
$innerActivityXml = $activityCompleteXml->getElementsByTagName('iati-activity')->item(0);
Expand All @@ -305,13 +338,17 @@ public function generateActivitiesXml($activityData, $settings, $organization, b
$publishedFiles[] = $publishedActivity;

awsUploadFile(sprintf('%s/%s/%s', 'xml', 'activityXmlFiles', $publishedActivity), $activityCompleteXml->saveXML());

$successfullyProcessedActivities[] = $activity;
}

if (count($innerActivityXmlArray)) {
$filename = sprintf('%s-%s.xml', $publisherId, 'activities');
$this->savePublishedFiles($filename, $activity->org_id, $publishedFiles);
$this->appendMultipleInnerActivityXmlToMergedXml($innerActivityXmlArray, $settings, $organization, $activityMappedToActivityIdentifier, $refreshTimestamp);
}

return $successfullyProcessedActivities;
}

/**
Expand Down Expand Up @@ -850,4 +887,28 @@ public function extractIatiIdentifierFromMergedXml(SimpleXMLElement $mergedXml):

return $iatiIdentifierArray;
}

/**
* @param bool $refreshTimestamp
*
* @return bool
*/
private function isNormalWorkflow(bool $refreshTimestamp): bool
{
return $refreshTimestamp;
}

/**
* @param $activityId
* @param bool|string $uuid
*
* @return bool
*/
private function bulkPublishHasNotBeenCanceled($activityId, bool|string $uuid = false): bool
{
$activityPublishingStatus = $this->publishingStatusRepository->getSpecificActivityPublishingStatus($activityId, $uuid);
$activityPublishingStatus = $activityPublishingStatus ?? [];

return count($activityPublishingStatus) !== 0;
}
}
16 changes: 16 additions & 0 deletions app/IATI/Repositories/Activity/BulkPublishingStatusRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,22 @@ public function getActivityPublishingStatus($organizationId, ?string $uuid = '')
})->get();
}

/**
* Returns activity publishing status.
*
* @param $activityId
* @param bool|string $uuid
*
* @return object|null
*/
public function getSpecificActivityPublishingStatus($activityId, bool|string $uuid = false): ?object
{
return $this->model->where('activity_id', '=', $activityId)
->when(!empty($uuid), function ($query) use ($uuid) {
return $query->where('job_batch_uuid', '=', $uuid);
})->get();
}

/**
* Returns activities that are currently undergoing bulk publishing for an organization.
*
Expand Down
Loading

0 comments on commit 14d31c8

Please sign in to comment.