Loading module/Oscar/src/Oscar/Controller/ProjectGrantController.php +2 −0 Original line number Diff line number Diff line Loading @@ -1786,11 +1786,13 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif return $this->jsonOutput($datas); } elseif ($this->isAjax() || $this->getRequest()->getQuery('f') === 'json') { $perimeter = $this->getRequest()->getQuery('p', null); $datas = [ 'activity' => $this->getProjectGrantApiService()->getActivityJson( $entity->getId(), $this->url(), $this->getOscarUserContextService(), $perimeter ), ]; return $this->jsonOutput($datas); Loading module/Oscar/src/Oscar/Service/ProjectGrantApiService.php +271 −59 Original line number Diff line number Diff line Loading @@ -13,9 +13,12 @@ use Oscar\Entity\ActivityOrganization; use Oscar\Entity\ActivityPerson; use Oscar\Entity\ContractDocument; use Oscar\Entity\OrganizationRole; use Oscar\Entity\Person; use Oscar\Entity\ProjectMember; use Oscar\Entity\ProjectPartner; use Oscar\Entity\Role; use Oscar\Entity\WorkPackage; use Oscar\Entity\WorkPackagePerson; use Oscar\Exception\OscarException; use Oscar\Provider\Privileges; use Oscar\Traits\UseEntityManager; Loading Loading @@ -48,34 +51,42 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO return [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_EDIT, $activity), 'administration' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::MAINTENANCE_MENU_ADMIN), ], 'budget' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_MANAGE, $activity), ], 'core' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_MANAGE, $activity), ], 'project' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::PROJECT_SHOW, $activity->getProject()), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_CHANGE_PROJECT, $activity), ], 'documents' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_DOCUMENT_SHOW, $activity->getProject()), ], 'persons' => [ 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_MANAGE, $activity), 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_SHOW, $activity), 'show' => $oscarUserContext->hasPrivileges(Privileges::PERSON_SHOW), 'notes' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_MANAGE_USER, $activity), 'manage' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_MANAGE_ADMIN, $activity), ], 'milestones' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_MILESTONE_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_MILESTONE_MANAGE, $activity), ], 'organizations' => [ 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_ORGANIZATION_MANAGE, $activity), 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_ORGANIZATION_SHOW, $activity), 'show' => $oscarUserContext->hasPrivileges(Privileges::ORGANIZATION_SHOW), ], 'milestones' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_MILESTONE_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_MILESTONE_MANAGE, $activity), 'persons' => [ 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_MANAGE, $activity), 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_SHOW, $activity), 'show' => $oscarUserContext->hasPrivileges(Privileges::PERSON_SHOW), ], 'budget' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_MANAGE, $activity), 'project' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::PROJECT_SHOW, $activity->getProject()), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_CHANGE_PROJECT, $activity), ], 'spents' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_SHOW, $activity), Loading @@ -88,58 +99,169 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO $activity ), ], 'notes' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_MANAGE_USER, $activity), 'manage' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_MANAGE_ADMIN, $activity), ], 'administration' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::MAINTENANCE_MENU_ADMIN), 'workpackages' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_WORKPACKAGE_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges( Privileges::ACTIVITY_WORKPACKAGE_MANAGE, $activity ), ] ]; } public function getActivityJson(int $id, ?Url $urlPlugin = null, ?OscarUserContext $oscarUserContext = null): array { public function getActivityJson( int $id, ?Url $urlPlugin = null, ?OscarUserContext $oscarUserContext = null, ?string $perimeter = null ): array { $credentials = $this->getActivityJsonCredentials($id, $oscarUserContext); $out = [ 'date' => date('Y-m-d H:i:s'), 'error' => null, 'warnings' => null, 'perimeter' => $perimeter, 'credentials' => null, 'datas' => null ]; if ($credentials['read'] !== true) { return []; $out['error'] = 'access denied'; return $out; } else { $datas = $this->getActivityJsonDatas($id, $urlPlugin); $datas['credentials'] = $credentials; foreach ($datas['datas'] as $key => $content) { $out['credentials'] = $credentials; $out['datas'] = $this->getActivityJsonDatas($id, $urlPlugin, $perimeter); foreach ($out['datas'] as $key => $content) { if (!array_key_exists($key, $credentials)) { unset($datas['datas'][$key]); unset($out['datas'][$key]); } else { if ($credentials[$key]['read'] !== true) { unset($datas['datas'][$key]); unset($out['datas'][$key]); } } } return $datas; return $out; } } const PERIMETER_ADMINISTRATION = 'administration'; const PERIMETER_BUDGET = 'budget'; const PERIMETER_CORE = 'core'; const PERIMETER_DOCUMENTS = 'documents'; const PERIMETER_NOTES = 'notes'; const PERIMETER_MILESTONES = 'milestones'; const PERIMETER_ORGANIZATIONS = 'organizations'; const PERIMETER_PERSONS = 'persons'; const PERIMETER_PROJECT = 'project'; const PERIMETER_SPENTS = 'spents'; const PERIMETER_TIMESHEETS = 'timesheets'; const PERIMETER_WORKPACKAGES = 'workpackages'; public function getPerimetersKeys(): array { return [ self::PERIMETER_ADMINISTRATION, self::PERIMETER_BUDGET, self::PERIMETER_CORE, self::PERIMETER_DOCUMENTS, self::PERIMETER_MILESTONES, self::PERIMETER_NOTES, self::PERIMETER_ORGANIZATIONS, self::PERIMETER_PROJECT, self::PERIMETER_PERSONS, self::PERIMETER_SPENTS, self::PERIMETER_TIMESHEETS, self::PERIMETER_WORKPACKAGES, ]; } public function getActivityJsonDatas( int $id, ?Url $urlPlugin = null, ?string $perimeters = null ): array { if ($perimeters !== null) { $perimeters = array_intersect(explode(',', $perimeters), $this->getPerimetersKeys()); } else { $perimeters = $this->getPerimetersKeys(); } /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); /** @var OscarUserContext $oscarUserContext */ $oscarUserContext = $this->getServiceContainer()->get(OscarUserContext::class); $currentUserId = -1; if ($oscarUserContext->getCurrentPerson()) { $currentUserId = $oscarUserContext->getCurrentPerson()->getId(); $currentUserId = $oscarUserContext->getCurrentPersonId() ?: -1; $datas = [ "api" => "Oscar Activity API" ]; foreach ($perimeters as $perimeter) { switch ($perimeter) { case self::PERIMETER_ADMINISTRATION: $datas[self::PERIMETER_ADMINISTRATION] = []; break; case self::PERIMETER_BUDGET: $datas[self::PERIMETER_BUDGET] = $this->getBudgetActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_CORE: $datas[self::PERIMETER_CORE] = $this->getCoreActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_DOCUMENTS: $datas[self::PERIMETER_DOCUMENTS] = $this->getDocumentsActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_MILESTONES: $datas[self::PERIMETER_MILESTONES] = $this->getMilestonesActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_NOTES: $datas[self::PERIMETER_NOTES] = $this->getNotesActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_ORGANIZATIONS: $datas[self::PERIMETER_ORGANIZATIONS] = $this->getOrganizationsActivity( $activity->getId(), $urlPlugin ); break; case self::PERIMETER_PERSONS: $datas[self::PERIMETER_PERSONS] = $this->getPersonsActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_TIMESHEETS: $datas[self::PERIMETER_TIMESHEETS] = $this->getTimesheetsActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_WORKPACKAGES: $datas[self::PERIMETER_WORKPACKAGES] = $this->getWorkpackagesActivity( $activity->getId(), $urlPlugin ); break; } } return $datas; } protected function getContractDocumentService(): ContractDocumentService { return $this->getServiceContainer()->get(ContractDocumentService::class); } public function getCoreActivity(int $id, ?Url $urlPlugin): array { /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); $types = $this->getProjectGrantService()->getActivityTypeService()->getActivityTypeChain( $activity->getActivityType() ); if (count($types) > 0 && $types[0]->getLabel() === 'ROOT') { array_shift($types); } Loading @@ -159,14 +281,7 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO 'url_show' => $urlPlugin->fromRoute('project/show', ['id' => $activity->getProject()->getId()]) ]; } // TODO (Récupération du cache) $datas = [ 'id' => $activity->getId(), 'dateCache' => $this->formatDateTime($activity->getDateCache()), 'credentials' => [], 'datas' => [ 'core' => [ return [ 'id' => $activity->getId(), 'label' => $activity->getLabel(), 'numOscar' => $activity->getOscarNum(), Loading @@ -186,10 +301,16 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO 'dateOpened' => $this->formatDateTime($activity->getDateOpened()), 'urls' => [ 'edit' => $urlPlugin->fromRoute('contract/edit', ['id' => $activity->getId()]), ], 'userid' => $currentUserId, ], 'budget' => [ ] ]; } public function getBudgetActivity(int $id, ?Url $urlPlugin): array { /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); return [ 'amount' => $activity->getAmount(), 'montant' => $activity->getAmount(), 'currency' => $activity->getCurrency()->toJson(), Loading @@ -199,25 +320,14 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO 'fraisDeGestionPartGestionnaire' => $activity->getFraisDeGestionPartGestionnaireDisplay(), 'tva' => (string)$activity->getTva(), 'assietteSubventionnable' => $activity->getAssietteSubventionnable(), ], 'persons' => $this->getPersonsActivity($activity->getId(), $urlPlugin), 'organizations' => $this->getOrganizationsActivity($activity->getId(), $urlPlugin), 'milestones' => $this->getMilestonesActivity($activity->getId(), $urlPlugin), 'documents' => $this->getDocumentsActivity($activity->getId(), $urlPlugin), 'notes' => $this->getNotesActivity($activity->getId(), $urlPlugin, $oscarUserContext), ] ]; return $datas; } protected function getContractDocumentService(): ContractDocumentService { return $this->getServiceContainer()->get(ContractDocumentService::class); } public function getDocumentsActivity(int $id, ?Url $urlPlugin = null): array { /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); $out = [ 'url' => $urlPlugin->fromRoute('contractdocument/activity', ['activity_id' => $id]), 'url_upload_new_doc' => $urlPlugin->fromRoute('contractdocument/upload', ['idactivity' => $id]), Loading Loading @@ -642,6 +752,7 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO 'enrollerLabel' => $activity->getLabel(), 'enrolled' => $activityPerson->getPerson()->getId(), 'enrolledLabel' => $activityPerson->getPerson()->getDisplayName(), 'displayname' => $activityPerson->getPerson()->getDisplayName(), 'start' => $this->formatDateTime($activityPerson->getDateStart()), 'end' => $this->formatDateTime($activityPerson->getDateEnd()), ]; Loading Loading @@ -678,4 +789,105 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO { return $this->getEntityManager()->getRepository('Oscar\Entity\Activity'); } public function getWorkpackagesActivity(int $id, ?Url $urlPlugin = null): array { $out = [ 'entities' => [] ]; /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); /** @var WorkPackage $workPackage */ foreach ($activity->getWorkPackages() as $workPackage) { $wp = $workPackage->toArray(); // $wp = [ // 'id' => $workPackage->getId(), // 'label' => $workPackage->getLabel(), // 'code' => $workPackage->getCode(), // 'description' => $workPackage->getDescription(), // 'persons' => [] // ]; // // /** @var WorkPackagePerson $personWorkpackage */ // foreach ($workPackage->getPersons() as $personWorkpackage) { // $wp['persons'][] = [ // 'id' => $personWorkpackage->getId(), // 'fullname' => $personWorkpackage->getPerson()->getFullname(), // 'duration' => $personWorkpackage->getDuration() // ]; // } $out['entities'][] = $wp; } return $out; } public function getTimesheetsActivity( int $id, ?Url $urlPlugin = null, ?OscarUserContext $oscarUserContext = null ): array { /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); $out = [ 'declarers' => null, 'validators' => [ 'prj' => [], 'sci' => [], 'adm' => [], ], 'url' => $urlPlugin->fromRoute('contract/timesheet', ['id' => $activity->getId()]), 'urlSynthesis' => $urlPlugin->fromRoute( 'timesheet/synthesis' ) . '?activity_id=' . $activity->getId(), ]; /** @var TimesheetService $timesheetService */ $timesheetService = $this->getServiceContainer()->get(TimesheetService::class); ////////////////////////////////////////////////////////////////////////////////// Validateurs /** @var Person $validator */ foreach ($timesheetService->getValidatorsPrj($activity) as $validator) { $out['validators']['prj'][] = [ 'id' => $validator->getId(), 'fullname' => $validator->getFullname(), ]; } foreach ($timesheetService->getValidatorsSci($activity) as $validator) { $out['validators']['sci'][] = [ 'id' => $validator->getId(), 'fullname' => $validator->getFullname(), ]; } foreach ($timesheetService->getValidatorsAdm($activity) as $validator) { $out['validators']['adm'][] = [ 'id' => $validator->getId(), 'fullname' => $validator->getFullname(), ]; } ////////////////////////////////////////////////////////////////////////////////// Déclarants $declarers = []; foreach ($activity->getPersonsDeep() as $personActivity) { if ($activity->hasDeclarant($personActivity->getPerson())) { $hasDeclaration = $personActivity->getPerson()->hasDeclarationIn($activity); $declarers[] = [ 'id' => $personActivity->getPerson()->getId(), 'fullname' => $personActivity->getPerson()->getFullname(), 'hasDeclaration' => $hasDeclaration, 'url_details' => $urlPlugin->fromRoute('timesheet/resume') . '?person_id=' . $personActivity->getPerson()->getId(), ]; } } $out['declarers'] = $declarers; return $out; } } No newline at end of file ui/src/utils/AxiosMessage.js +5 −5 Original line number Diff line number Diff line Loading @@ -16,11 +16,11 @@ export default { }, manageErrorResponse: function (err){ console.log(err.response.data); let code = 500; let code = 504; let message = null; if( err && err.response ){ if( err && err.response && err.response.data ){ code = err.response.status; // Technique de Jean Baptiste pour récupérer les erreurs HTML if (err.response.headers.get('content-type').includes('text/html')) { var el = document.createElement('html'); Loading @@ -35,11 +35,9 @@ export default { if (!errorHTML) { errorHTML = el.querySelector('body'); } message = errorHTML.innerHTML; } else { // Erreur JSON "clean" code = err.response.status; if( err.response.data ){ message = err.response.data.error ? err.response.data.error : err.response.data; } Loading @@ -47,6 +45,8 @@ export default { message = ERROR_MESSAGE_DISCONNECTED; } } } else { message = err; } return { message: message, Loading ui/src/views/Activity.vue +84 −11 File changed.Preview size limit exceeded, changes collapsed. Show changes ui/src/views/ActivityNotes.vue +2 −1 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ import axios from 'axios'; import Loader from '../components/Loader.vue'; import AxiosMessage from "../utils/AxiosMessage.js"; export default { directives: { Loading Loading @@ -184,7 +185,7 @@ export default { } } this.error = err.response.data; this.error = AxiosMessage.manageErrorResponse(err); }, }, Loading Loading
module/Oscar/src/Oscar/Controller/ProjectGrantController.php +2 −0 Original line number Diff line number Diff line Loading @@ -1786,11 +1786,13 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif return $this->jsonOutput($datas); } elseif ($this->isAjax() || $this->getRequest()->getQuery('f') === 'json') { $perimeter = $this->getRequest()->getQuery('p', null); $datas = [ 'activity' => $this->getProjectGrantApiService()->getActivityJson( $entity->getId(), $this->url(), $this->getOscarUserContextService(), $perimeter ), ]; return $this->jsonOutput($datas); Loading
module/Oscar/src/Oscar/Service/ProjectGrantApiService.php +271 −59 Original line number Diff line number Diff line Loading @@ -13,9 +13,12 @@ use Oscar\Entity\ActivityOrganization; use Oscar\Entity\ActivityPerson; use Oscar\Entity\ContractDocument; use Oscar\Entity\OrganizationRole; use Oscar\Entity\Person; use Oscar\Entity\ProjectMember; use Oscar\Entity\ProjectPartner; use Oscar\Entity\Role; use Oscar\Entity\WorkPackage; use Oscar\Entity\WorkPackagePerson; use Oscar\Exception\OscarException; use Oscar\Provider\Privileges; use Oscar\Traits\UseEntityManager; Loading Loading @@ -48,34 +51,42 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO return [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_EDIT, $activity), 'administration' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::MAINTENANCE_MENU_ADMIN), ], 'budget' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_MANAGE, $activity), ], 'core' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_MANAGE, $activity), ], 'project' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::PROJECT_SHOW, $activity->getProject()), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_CHANGE_PROJECT, $activity), ], 'documents' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_DOCUMENT_SHOW, $activity->getProject()), ], 'persons' => [ 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_MANAGE, $activity), 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_SHOW, $activity), 'show' => $oscarUserContext->hasPrivileges(Privileges::PERSON_SHOW), 'notes' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_MANAGE_USER, $activity), 'manage' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_MANAGE_ADMIN, $activity), ], 'milestones' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_MILESTONE_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_MILESTONE_MANAGE, $activity), ], 'organizations' => [ 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_ORGANIZATION_MANAGE, $activity), 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_ORGANIZATION_SHOW, $activity), 'show' => $oscarUserContext->hasPrivileges(Privileges::ORGANIZATION_SHOW), ], 'milestones' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_MILESTONE_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_MILESTONE_MANAGE, $activity), 'persons' => [ 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_MANAGE, $activity), 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PERSON_SHOW, $activity), 'show' => $oscarUserContext->hasPrivileges(Privileges::PERSON_SHOW), ], 'budget' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_MANAGE, $activity), 'project' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::PROJECT_SHOW, $activity->getProject()), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_CHANGE_PROJECT, $activity), ], 'spents' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PAYMENT_SHOW, $activity), Loading @@ -88,58 +99,169 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO $activity ), ], 'notes' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_MANAGE_USER, $activity), 'manage' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_NOTES_MANAGE_ADMIN, $activity), ], 'administration' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::MAINTENANCE_MENU_ADMIN), 'workpackages' => [ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_WORKPACKAGE_SHOW, $activity), 'edit' => $oscarUserContext->hasPrivileges( Privileges::ACTIVITY_WORKPACKAGE_MANAGE, $activity ), ] ]; } public function getActivityJson(int $id, ?Url $urlPlugin = null, ?OscarUserContext $oscarUserContext = null): array { public function getActivityJson( int $id, ?Url $urlPlugin = null, ?OscarUserContext $oscarUserContext = null, ?string $perimeter = null ): array { $credentials = $this->getActivityJsonCredentials($id, $oscarUserContext); $out = [ 'date' => date('Y-m-d H:i:s'), 'error' => null, 'warnings' => null, 'perimeter' => $perimeter, 'credentials' => null, 'datas' => null ]; if ($credentials['read'] !== true) { return []; $out['error'] = 'access denied'; return $out; } else { $datas = $this->getActivityJsonDatas($id, $urlPlugin); $datas['credentials'] = $credentials; foreach ($datas['datas'] as $key => $content) { $out['credentials'] = $credentials; $out['datas'] = $this->getActivityJsonDatas($id, $urlPlugin, $perimeter); foreach ($out['datas'] as $key => $content) { if (!array_key_exists($key, $credentials)) { unset($datas['datas'][$key]); unset($out['datas'][$key]); } else { if ($credentials[$key]['read'] !== true) { unset($datas['datas'][$key]); unset($out['datas'][$key]); } } } return $datas; return $out; } } const PERIMETER_ADMINISTRATION = 'administration'; const PERIMETER_BUDGET = 'budget'; const PERIMETER_CORE = 'core'; const PERIMETER_DOCUMENTS = 'documents'; const PERIMETER_NOTES = 'notes'; const PERIMETER_MILESTONES = 'milestones'; const PERIMETER_ORGANIZATIONS = 'organizations'; const PERIMETER_PERSONS = 'persons'; const PERIMETER_PROJECT = 'project'; const PERIMETER_SPENTS = 'spents'; const PERIMETER_TIMESHEETS = 'timesheets'; const PERIMETER_WORKPACKAGES = 'workpackages'; public function getPerimetersKeys(): array { return [ self::PERIMETER_ADMINISTRATION, self::PERIMETER_BUDGET, self::PERIMETER_CORE, self::PERIMETER_DOCUMENTS, self::PERIMETER_MILESTONES, self::PERIMETER_NOTES, self::PERIMETER_ORGANIZATIONS, self::PERIMETER_PROJECT, self::PERIMETER_PERSONS, self::PERIMETER_SPENTS, self::PERIMETER_TIMESHEETS, self::PERIMETER_WORKPACKAGES, ]; } public function getActivityJsonDatas( int $id, ?Url $urlPlugin = null, ?string $perimeters = null ): array { if ($perimeters !== null) { $perimeters = array_intersect(explode(',', $perimeters), $this->getPerimetersKeys()); } else { $perimeters = $this->getPerimetersKeys(); } /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); /** @var OscarUserContext $oscarUserContext */ $oscarUserContext = $this->getServiceContainer()->get(OscarUserContext::class); $currentUserId = -1; if ($oscarUserContext->getCurrentPerson()) { $currentUserId = $oscarUserContext->getCurrentPerson()->getId(); $currentUserId = $oscarUserContext->getCurrentPersonId() ?: -1; $datas = [ "api" => "Oscar Activity API" ]; foreach ($perimeters as $perimeter) { switch ($perimeter) { case self::PERIMETER_ADMINISTRATION: $datas[self::PERIMETER_ADMINISTRATION] = []; break; case self::PERIMETER_BUDGET: $datas[self::PERIMETER_BUDGET] = $this->getBudgetActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_CORE: $datas[self::PERIMETER_CORE] = $this->getCoreActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_DOCUMENTS: $datas[self::PERIMETER_DOCUMENTS] = $this->getDocumentsActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_MILESTONES: $datas[self::PERIMETER_MILESTONES] = $this->getMilestonesActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_NOTES: $datas[self::PERIMETER_NOTES] = $this->getNotesActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_ORGANIZATIONS: $datas[self::PERIMETER_ORGANIZATIONS] = $this->getOrganizationsActivity( $activity->getId(), $urlPlugin ); break; case self::PERIMETER_PERSONS: $datas[self::PERIMETER_PERSONS] = $this->getPersonsActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_TIMESHEETS: $datas[self::PERIMETER_TIMESHEETS] = $this->getTimesheetsActivity($activity->getId(), $urlPlugin); break; case self::PERIMETER_WORKPACKAGES: $datas[self::PERIMETER_WORKPACKAGES] = $this->getWorkpackagesActivity( $activity->getId(), $urlPlugin ); break; } } return $datas; } protected function getContractDocumentService(): ContractDocumentService { return $this->getServiceContainer()->get(ContractDocumentService::class); } public function getCoreActivity(int $id, ?Url $urlPlugin): array { /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); $types = $this->getProjectGrantService()->getActivityTypeService()->getActivityTypeChain( $activity->getActivityType() ); if (count($types) > 0 && $types[0]->getLabel() === 'ROOT') { array_shift($types); } Loading @@ -159,14 +281,7 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO 'url_show' => $urlPlugin->fromRoute('project/show', ['id' => $activity->getProject()->getId()]) ]; } // TODO (Récupération du cache) $datas = [ 'id' => $activity->getId(), 'dateCache' => $this->formatDateTime($activity->getDateCache()), 'credentials' => [], 'datas' => [ 'core' => [ return [ 'id' => $activity->getId(), 'label' => $activity->getLabel(), 'numOscar' => $activity->getOscarNum(), Loading @@ -186,10 +301,16 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO 'dateOpened' => $this->formatDateTime($activity->getDateOpened()), 'urls' => [ 'edit' => $urlPlugin->fromRoute('contract/edit', ['id' => $activity->getId()]), ], 'userid' => $currentUserId, ], 'budget' => [ ] ]; } public function getBudgetActivity(int $id, ?Url $urlPlugin): array { /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); return [ 'amount' => $activity->getAmount(), 'montant' => $activity->getAmount(), 'currency' => $activity->getCurrency()->toJson(), Loading @@ -199,25 +320,14 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO 'fraisDeGestionPartGestionnaire' => $activity->getFraisDeGestionPartGestionnaireDisplay(), 'tva' => (string)$activity->getTva(), 'assietteSubventionnable' => $activity->getAssietteSubventionnable(), ], 'persons' => $this->getPersonsActivity($activity->getId(), $urlPlugin), 'organizations' => $this->getOrganizationsActivity($activity->getId(), $urlPlugin), 'milestones' => $this->getMilestonesActivity($activity->getId(), $urlPlugin), 'documents' => $this->getDocumentsActivity($activity->getId(), $urlPlugin), 'notes' => $this->getNotesActivity($activity->getId(), $urlPlugin, $oscarUserContext), ] ]; return $datas; } protected function getContractDocumentService(): ContractDocumentService { return $this->getServiceContainer()->get(ContractDocumentService::class); } public function getDocumentsActivity(int $id, ?Url $urlPlugin = null): array { /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); $out = [ 'url' => $urlPlugin->fromRoute('contractdocument/activity', ['activity_id' => $id]), 'url_upload_new_doc' => $urlPlugin->fromRoute('contractdocument/upload', ['idactivity' => $id]), Loading Loading @@ -642,6 +752,7 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO 'enrollerLabel' => $activity->getLabel(), 'enrolled' => $activityPerson->getPerson()->getId(), 'enrolledLabel' => $activityPerson->getPerson()->getDisplayName(), 'displayname' => $activityPerson->getPerson()->getDisplayName(), 'start' => $this->formatDateTime($activityPerson->getDateStart()), 'end' => $this->formatDateTime($activityPerson->getDateEnd()), ]; Loading Loading @@ -678,4 +789,105 @@ class ProjectGrantApiService implements UseEntityManager, UsePersonService, UseO { return $this->getEntityManager()->getRepository('Oscar\Entity\Activity'); } public function getWorkpackagesActivity(int $id, ?Url $urlPlugin = null): array { $out = [ 'entities' => [] ]; /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); /** @var WorkPackage $workPackage */ foreach ($activity->getWorkPackages() as $workPackage) { $wp = $workPackage->toArray(); // $wp = [ // 'id' => $workPackage->getId(), // 'label' => $workPackage->getLabel(), // 'code' => $workPackage->getCode(), // 'description' => $workPackage->getDescription(), // 'persons' => [] // ]; // // /** @var WorkPackagePerson $personWorkpackage */ // foreach ($workPackage->getPersons() as $personWorkpackage) { // $wp['persons'][] = [ // 'id' => $personWorkpackage->getId(), // 'fullname' => $personWorkpackage->getPerson()->getFullname(), // 'duration' => $personWorkpackage->getDuration() // ]; // } $out['entities'][] = $wp; } return $out; } public function getTimesheetsActivity( int $id, ?Url $urlPlugin = null, ?OscarUserContext $oscarUserContext = null ): array { /** @var Activity $activity */ $activity = $this->getActivityRepository()->find($id); $out = [ 'declarers' => null, 'validators' => [ 'prj' => [], 'sci' => [], 'adm' => [], ], 'url' => $urlPlugin->fromRoute('contract/timesheet', ['id' => $activity->getId()]), 'urlSynthesis' => $urlPlugin->fromRoute( 'timesheet/synthesis' ) . '?activity_id=' . $activity->getId(), ]; /** @var TimesheetService $timesheetService */ $timesheetService = $this->getServiceContainer()->get(TimesheetService::class); ////////////////////////////////////////////////////////////////////////////////// Validateurs /** @var Person $validator */ foreach ($timesheetService->getValidatorsPrj($activity) as $validator) { $out['validators']['prj'][] = [ 'id' => $validator->getId(), 'fullname' => $validator->getFullname(), ]; } foreach ($timesheetService->getValidatorsSci($activity) as $validator) { $out['validators']['sci'][] = [ 'id' => $validator->getId(), 'fullname' => $validator->getFullname(), ]; } foreach ($timesheetService->getValidatorsAdm($activity) as $validator) { $out['validators']['adm'][] = [ 'id' => $validator->getId(), 'fullname' => $validator->getFullname(), ]; } ////////////////////////////////////////////////////////////////////////////////// Déclarants $declarers = []; foreach ($activity->getPersonsDeep() as $personActivity) { if ($activity->hasDeclarant($personActivity->getPerson())) { $hasDeclaration = $personActivity->getPerson()->hasDeclarationIn($activity); $declarers[] = [ 'id' => $personActivity->getPerson()->getId(), 'fullname' => $personActivity->getPerson()->getFullname(), 'hasDeclaration' => $hasDeclaration, 'url_details' => $urlPlugin->fromRoute('timesheet/resume') . '?person_id=' . $personActivity->getPerson()->getId(), ]; } } $out['declarers'] = $declarers; return $out; } } No newline at end of file
ui/src/utils/AxiosMessage.js +5 −5 Original line number Diff line number Diff line Loading @@ -16,11 +16,11 @@ export default { }, manageErrorResponse: function (err){ console.log(err.response.data); let code = 500; let code = 504; let message = null; if( err && err.response ){ if( err && err.response && err.response.data ){ code = err.response.status; // Technique de Jean Baptiste pour récupérer les erreurs HTML if (err.response.headers.get('content-type').includes('text/html')) { var el = document.createElement('html'); Loading @@ -35,11 +35,9 @@ export default { if (!errorHTML) { errorHTML = el.querySelector('body'); } message = errorHTML.innerHTML; } else { // Erreur JSON "clean" code = err.response.status; if( err.response.data ){ message = err.response.data.error ? err.response.data.error : err.response.data; } Loading @@ -47,6 +45,8 @@ export default { message = ERROR_MESSAGE_DISCONNECTED; } } } else { message = err; } return { message: message, Loading
ui/src/views/Activity.vue +84 −11 File changed.Preview size limit exceeded, changes collapsed. Show changes
ui/src/views/ActivityNotes.vue +2 −1 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ import axios from 'axios'; import Loader from '../components/Loader.vue'; import AxiosMessage from "../utils/AxiosMessage.js"; export default { directives: { Loading Loading @@ -184,7 +185,7 @@ export default { } } this.error = err.response.data; this.error = AxiosMessage.manageErrorResponse(err); }, }, Loading