Quellcode durchsuchen

import opentalent/config as parameter, implements, restore unit tests

Olivier Massot vor 2 Jahren
Ursprung
Commit
b691be8cd5

+ 178 - 177
config/opentalent/enum.yaml

@@ -1,177 +1,178 @@
-opentalent:
-  #AccessAndFunction
-    function: 'App\Enum\AccessAndFunction\FunctionEnum'
-    function_activities: 'App\Enum\AccessAndFunction\ActivitiesFunctionEnum'
-    function_administratives: 'App\Enum\AccessAndFunction\AdministrativesFunctionEnum'
-    function_associatives: 'App\Enum\AccessAndFunction\AssociativesFunctionEnum'
-    function_departures_cause: 'App\Enum\AccessAndFunction\DeparturesCauseEnum'
-    function_pedagogics: 'App\Enum\AccessAndFunction\PedagogicsFunctionEnum'
-    function_other: 'App\Enum\AccessAndFunction\OtherFunctionEnum'
-    function_type: 'App\Enum\AccessAndFunction\TypeFunctionEnum'
-    license_type: 'App\Enum\AccessAndFunction\LicenseTypeEnum'
-    license_rate: 'App\Enum\AccessAndFunction\LicenseRateEnum'
-    function_role: 'App\Enum\AccessAndFunction\FunctionalRoleEnum'
-
-  #AccessSocial
-    professional_status: 'App\Enum\AccessSocial\ProfessionalStatusEnum'
-    type_of_contact: 'App\Enum\AccessSocial\TypeOfContractEnum'
-    assisted_contract: 'App\Enum\AccessSocial\AssistedContractEnum'
-    period_unit: 'App\Enum\AccessSocial\PeriodUnitEnum'
-    family_situation: 'App\Enum\AccessSocial\FamilySituationEnum'
-
-  #Core
-    period: 'App\Enum\Core\PeriodEnum'
-    action_status_type: 'App\Enum\Core\ActionStatusTypeEnum'
-    control_type: 'App\Enum\Core\ControlTypeEnum'
-    repair_type: 'App\Enum\Core\RepairTypeEnum'
-    contact_point_type: 'App\Enum\Core\ContactPointTypeEnum'
-    contact_point_type_person: 'App\Enum\Core\ContactPointTypePersonEnum'
-    appreciation: 'App\Enum\Core\AppreciationEnum'
-    semester: 'App\Enum\Core\SemesterEnum'
-    trimester: 'App\Enum\Core\TrimesterEnum'
-    month: 'App\Enum\Core\MonthEnum'
-    notification_type: 'App\Enum\Core\NotificationTypeEnum'
-    tips_priority_level: 'App\Enum\Core\PriorityLevelEnum'
-    tips_type_person: 'App\Enum\Core\TipsTypePersonEnum'
-    tips_network: 'App\Enum\Core\TipsNetworkEnum'
-    tips_product: 'App\Enum\Core\TipsProductEnum'
-    days_enum: 'App\Enum\Core\DaysEnum'
-    timezone: 'App\Enum\Core\TimeZoneEnum'
-    tagtextcolor: 'App\Enum\Core\TagTextColorEnum'
-    tips_legalstatus: 'App\Enum\Core\TipsLegalStatusEnum'
-
-  #Donor
-    donor_displayed_on: 'App\Enum\Donor\DonorDisplayedOnEnum'
-    donor_status: 'App\Enum\Donor\DonorStatusEnum'
-
-  #Network
-    network_leading: 'App\Enum\Network\LeadingCauseEnum'
-    network: 'App\Enum\Network\NetworkEnum'
-
-  #Organization
-    organization_category: 'App\Enum\Organization\CategoryEnum'
-    organization_financial: 'App\Enum\Organization\FinancialEnum'
-    organization_legal: 'App\Enum\Organization\LegalEnum'
-    organization_opca: 'App\Enum\Organization\OpcaEnum'
-    organization_principal_type: 'App\Enum\Organization\PrincipalTypeEnum'
-    organization_school_cat: 'App\Enum\Organization\SchoolCategoryEnum'
-    organization_type_establishment_detail: 'App\Enum\Organization\TypeEstablishmentDetailEnum'
-    organization_type_establishment: 'App\Enum\Organization\TypeEstablishmentEnum'
-    organization_familly_type: 'App\Enum\Organization\FamillyTypeEnum'
-    organization_sub_familly_type: 'App\Enum\Organization\SubFamillyTypeEnum'
-    organization_bulletin_period: 'App\Enum\Organization\BulletinPeriodEnum'
-    organization_bulletin_output: 'App\Enum\Organization\BulletinOutputEnum'
-    organization_bulletin_send_to: 'App\Enum\Organization\SendToBulletinEnum'
-    organization_setting_country: 'App\Enum\Organization\CountryEnum'
-    address_postal_organization: 'App\Enum\Organization\AddressPostalOrganizationTypeEnum'
-
-  #Person
-    person_gender: 'App\Enum\Person\GenderEnum'
-    person_insee: 'App\Enum\Person\InseeEnum'
-    person_medal_type: 'App\Enum\Person\MedalTypeEnum'
-    person_moral_type: 'App\Enum\Person\MoralPersonTypeEnum'
-    medal_type: 'App\Enum\Person\MedalTypeEnum'
-    address_postal_person: 'App\Enum\Person\AddressPostalPersonTypeEnum'
-
-  #Place
-    place_day_of_week: 'App\Enum\Place\DayOfWeekEnum'
-    place_site_status: 'App\Enum\Place\SiteStatusEnum'
-    place_site_type: 'App\Enum\Place\SiteTypeEnum'
-
-  #Product
-    equipment_appreciation: 'App\Enum\Product\AppreciationEnum'
-    equipment_control_type: 'App\Enum\Product\ControlTypeEnum'
-    equipment_loan_type: 'App\Enum\Product\LoanTypeEnum'
-    equipment_category: 'App\Enum\Product\EquipmentCategoryEnum'
-    equipment_detail: 'App\Enum\Product\EquipmentDetailEnum'
-    equipment_family: 'App\Enum\Product\EquipmentFamillyEnum'
-    equipment_group: 'App\Enum\Product\EquipmentGroupEnum'
-    equipment_insurance: 'App\Enum\Product\EquipmentInsuranceEnum'
-    equipment_logistical_platform: 'App\Enum\Product\EquipmentLogisticalPlatformEnum'
-    equipment_status: 'App\Enum\Product\EquipmentStatusEnum'
-    equipment_tone: 'App\Enum\Product\EquipmentToneEnum'
-    equipment_used_for: 'App\Enum\Product\EquipmentUsedForEnum'
-    equipment_repair_type: 'App\Enum\Product\RepairTypeEnum'
-    equipment_band: 'App\Enum\Product\BandEnum'
-    equipment_difficulty: 'App\Enum\Product\DifficultyEnum'
-    equipment_origin: 'App\Enum\Product\OriginMusicScoreEnum'
-    equipment_outcause: 'App\Enum\Product\OutCauseEnum'
-    equipment_checking: 'App\Enum\Product\CheckingEnum'
-    intangible_amount_type: 'App\Enum\Product\IntangibleAmountTypeEnum'
-    equipment_periodicity_control: 'App\Enum\Product\PeriodicityControlEnum'
-
-  #Event
-    event_type: 'App\Enum\Booking\EventTypeEnum'
-    event_visibility: 'App\Enum\Booking\VisibilityEnum'
-    event_type_gender: 'App\Enum\Booking\EventGenderTypeEnum'
-    event_educationalproject_establishment: 'App\Enum\Booking\EducationalProjectEstablishmentEnum'
-    event_educationalproject_specialclass: 'App\Enum\Booking\EducationalProjectSpecialClassEnum'
-    event_educationalproject_educationaldevice: 'App\Enum\Booking\EducationalProjectEducationalDeviceEnum'
-    examen_convocation_status: 'App\Enum\Booking\ExamenConvocationStatusEnum'
-    examen_convocation_presence: 'App\Enum\Booking\ExamenConvocationPresenceEnum'
-    examen_timeline: 'App\Enum\Booking\ExamenTimelineTypeEnum'
-    course_timeline: 'App\Enum\Booking\CourseTimelineTypeEnum'
-    organization_holiday_timeline: 'App\Enum\Booking\OrganizationHolidayTimelineTypeEnum'
-    person_holiday_timeline: 'App\Enum\Booking\PersonHolidayTimelineTypeEnum'
-    event_timeline: 'App\Enum\Booking\EventTimelineTypeEnum'
-    educational_project_timeline: 'App\Enum\Booking\EducationalProjectTimelineTypeEnum'
-    event_participation: 'App\Enum\Booking\ParticipationStatusEnum'
-
-  # File
-    file_visibility: 'App\Enum\Core\FileVisibilityEnum'
-    file_folder: 'App\Enum\Core\FileFolderEnum'
-    file_status: 'App\Enum\Core\FileStatusEnum'
-
-  #education
-    education: 'App\Enum\Education\EducationTypeEnum'
-    education_year: 'App\Enum\Education\YearEnum'
-    education_period: 'App\Enum\Education\PeriodEnum'
-    education_periodicity: 'App\Enum\Education\PeriodicityEnum'
-    advanced_education_notation: 'App\Enum\Education\AdvancedEducationNotationTypeEnum'
-
-    #billing
-    billing_periodicity: 'App\Enum\Billing\PeriodicityEnum'
-    billing_type_periodicity: 'App\Enum\Billing\PeriodicityTypeEnum'
-    billing_pricingline_adhesion: 'App\Enum\Billing\PricingLineAdhesionEnum'
-    billing_pricingline_productrent: 'App\Enum\Billing\PricingLineProductRentEnum'
-    billing_discount_global_tariff_family: 'App\Enum\Billing\DiscountGlobalTariffFamilyEnum'
-    billing_pricingline_invoice_line: 'App\Enum\Billing\PricingLineInvoiceLineEnum'
-    billing_payment_choice: 'App\Enum\Billing\PaymentChoiceEnum'
-    billing_bank: 'App\Enum\Billing\BankEnum'
-    billing_periodicity_payment: 'App\Enum\Billing\PeriodicityPaymentEnum'
-    billing_rent_reduction_type: 'App\Enum\Billing\ReductionTypeEnum'
-    billing_rent_year: 'App\Enum\Billing\RentYearEnum'
-    billing_family_reduction_type: 'App\Enum\Billing\FamilyReductionTypeEnum'
-    billing_payment_state: 'App\Enum\Billing\PaymentStateEnum'
-    billing_period: 'App\Enum\Billing\PeriodEnum'
-    billing_adhesion_choice: 'App\Enum\Billing\AdhesionChoiceEnum'
-    billing_order_adult_type_choice: 'App\Enum\Billing\OrderAdultTypeEnum'
-    billing_adult_condition_type_choice: 'App\Enum\Billing\AdultConditionTypeEnum'
-    billing_payment_type_choice: 'App\Enum\Billing\PaymentTypeEnum'
-    billing_type: 'App\Enum\Billing\BillingTypeEnum'
-
-  #message
-    message_status: 'App\Enum\Message\MessageStatusEnum'
-    report_message_satus: 'App\Enum\Message\ReportMessageSatusEnum'
-    message_sender: 'App\Enum\Message\SenderEnum'
-    message_sender_only_access: 'App\Enum\Message\SenderOnlyAccessEnum'
-    message_send_to: 'App\Enum\Message\SendToEnum'
-
-  #rules
-    default_rules: 'App\Enum\Rulerz\RulesEnum'
-    manager_rules: 'App\Enum\Rulerz\RulesManagerEnum'
-
-  #commission
-    commission_member_function: 'App\Enum\Person\CommissionMemberFunctionEnum'
-    commission_member_cause_output: 'App\Enum\Person\CauseOutputEnum'
-
-  #Cotisation
-    cotisation_function_enum_choices: 'App\Enum\Cotisation\CotisationFunctionEnum'
-    type_of_practices_enum: 'App\Enum\Cotisation\TypeOfPracticeEnum'
-    category_type_of_practices_enum: 'App\Enum\Cotisation\CategoryTypeOfPracticeEnum'
-
-  #OnlineRegistration
-    onlineregistration_registration_status: 'App\Enum\OnlineRegistration\RegistrationStatus'
-    onlineregistration_wish_registration: 'App\Enum\OnlineRegistration\WishRegistration'
-    onlineregistration_file_type: 'App\Enum\OnlineRegistration\FileTypeEnum'
-    onlineregistration_origin_education_student_wish: 'App\Enum\OnlineRegistration\EducationStudentWishOriginEnum'
+parameters:
+    opentalent.enum:
+        #AccessAndFunction
+          function: 'App\Enum\AccessAndFunction\FunctionEnum'
+          function_activities: 'App\Enum\AccessAndFunction\ActivitiesFunctionEnum'
+          function_administratives: 'App\Enum\AccessAndFunction\AdministrativesFunctionEnum'
+          function_associatives: 'App\Enum\AccessAndFunction\AssociativesFunctionEnum'
+          function_departures_cause: 'App\Enum\AccessAndFunction\DeparturesCauseEnum'
+          function_pedagogics: 'App\Enum\AccessAndFunction\PedagogicsFunctionEnum'
+          function_other: 'App\Enum\AccessAndFunction\OtherFunctionEnum'
+          function_type: 'App\Enum\AccessAndFunction\TypeFunctionEnum'
+          license_type: 'App\Enum\AccessAndFunction\LicenseTypeEnum'
+          license_rate: 'App\Enum\AccessAndFunction\LicenseRateEnum'
+          function_role: 'App\Enum\AccessAndFunction\FunctionalRoleEnum'
+
+        #AccessSocial
+          professional_status: 'App\Enum\AccessSocial\ProfessionalStatusEnum'
+          type_of_contact: 'App\Enum\AccessSocial\TypeOfContractEnum'
+          assisted_contract: 'App\Enum\AccessSocial\AssistedContractEnum'
+          period_unit: 'App\Enum\AccessSocial\PeriodUnitEnum'
+          family_situation: 'App\Enum\AccessSocial\FamilySituationEnum'
+
+        #Core
+          period: 'App\Enum\Core\PeriodEnum'
+          action_status_type: 'App\Enum\Core\ActionStatusTypeEnum'
+          control_type: 'App\Enum\Core\ControlTypeEnum'
+          repair_type: 'App\Enum\Core\RepairTypeEnum'
+          contact_point_type: 'App\Enum\Core\ContactPointTypeEnum'
+          contact_point_type_person: 'App\Enum\Core\ContactPointTypePersonEnum'
+          appreciation: 'App\Enum\Core\AppreciationEnum'
+          semester: 'App\Enum\Core\SemesterEnum'
+          trimester: 'App\Enum\Core\TrimesterEnum'
+          month: 'App\Enum\Core\MonthEnum'
+          notification_type: 'App\Enum\Core\NotificationTypeEnum'
+          tips_priority_level: 'App\Enum\Core\PriorityLevelEnum'
+          tips_type_person: 'App\Enum\Core\TipsTypePersonEnum'
+          tips_network: 'App\Enum\Core\TipsNetworkEnum'
+          tips_product: 'App\Enum\Core\TipsProductEnum'
+          days_enum: 'App\Enum\Core\DaysEnum'
+          timezone: 'App\Enum\Core\TimeZoneEnum'
+          tagtextcolor: 'App\Enum\Core\TagTextColorEnum'
+          tips_legalstatus: 'App\Enum\Core\TipsLegalStatusEnum'
+
+        #Donor
+          donor_displayed_on: 'App\Enum\Donor\DonorDisplayedOnEnum'
+          donor_status: 'App\Enum\Donor\DonorStatusEnum'
+
+        #Network
+          network_leading: 'App\Enum\Network\LeadingCauseEnum'
+          network: 'App\Enum\Network\NetworkEnum'
+
+        #Organization
+          organization_category: 'App\Enum\Organization\CategoryEnum'
+          organization_financial: 'App\Enum\Organization\FinancialEnum'
+          organization_legal: 'App\Enum\Organization\LegalEnum'
+          organization_opca: 'App\Enum\Organization\OpcaEnum'
+          organization_principal_type: 'App\Enum\Organization\PrincipalTypeEnum'
+          organization_school_cat: 'App\Enum\Organization\SchoolCategoryEnum'
+          organization_type_establishment_detail: 'App\Enum\Organization\TypeEstablishmentDetailEnum'
+          organization_type_establishment: 'App\Enum\Organization\TypeEstablishmentEnum'
+          organization_familly_type: 'App\Enum\Organization\FamillyTypeEnum'
+          organization_sub_familly_type: 'App\Enum\Organization\SubFamillyTypeEnum'
+          organization_bulletin_period: 'App\Enum\Organization\BulletinPeriodEnum'
+          organization_bulletin_output: 'App\Enum\Organization\BulletinOutputEnum'
+          organization_bulletin_send_to: 'App\Enum\Organization\SendToBulletinEnum'
+          organization_setting_country: 'App\Enum\Organization\CountryEnum'
+          address_postal_organization: 'App\Enum\Organization\AddressPostalOrganizationTypeEnum'
+
+        #Person
+          person_gender: 'App\Enum\Person\GenderEnum'
+          person_insee: 'App\Enum\Person\InseeEnum'
+          person_medal_type: 'App\Enum\Person\MedalTypeEnum'
+          person_moral_type: 'App\Enum\Person\MoralPersonTypeEnum'
+          medal_type: 'App\Enum\Person\MedalTypeEnum'
+          address_postal_person: 'App\Enum\Person\AddressPostalPersonTypeEnum'
+
+        #Place
+          place_day_of_week: 'App\Enum\Place\DayOfWeekEnum'
+          place_site_status: 'App\Enum\Place\SiteStatusEnum'
+          place_site_type: 'App\Enum\Place\SiteTypeEnum'
+
+        #Product
+          equipment_appreciation: 'App\Enum\Product\AppreciationEnum'
+          equipment_control_type: 'App\Enum\Product\ControlTypeEnum'
+          equipment_loan_type: 'App\Enum\Product\LoanTypeEnum'
+          equipment_category: 'App\Enum\Product\EquipmentCategoryEnum'
+          equipment_detail: 'App\Enum\Product\EquipmentDetailEnum'
+          equipment_family: 'App\Enum\Product\EquipmentFamillyEnum'
+          equipment_group: 'App\Enum\Product\EquipmentGroupEnum'
+          equipment_insurance: 'App\Enum\Product\EquipmentInsuranceEnum'
+          equipment_logistical_platform: 'App\Enum\Product\EquipmentLogisticalPlatformEnum'
+          equipment_status: 'App\Enum\Product\EquipmentStatusEnum'
+          equipment_tone: 'App\Enum\Product\EquipmentToneEnum'
+          equipment_used_for: 'App\Enum\Product\EquipmentUsedForEnum'
+          equipment_repair_type: 'App\Enum\Product\RepairTypeEnum'
+          equipment_band: 'App\Enum\Product\BandEnum'
+          equipment_difficulty: 'App\Enum\Product\DifficultyEnum'
+          equipment_origin: 'App\Enum\Product\OriginMusicScoreEnum'
+          equipment_outcause: 'App\Enum\Product\OutCauseEnum'
+          equipment_checking: 'App\Enum\Product\CheckingEnum'
+          intangible_amount_type: 'App\Enum\Product\IntangibleAmountTypeEnum'
+          equipment_periodicity_control: 'App\Enum\Product\PeriodicityControlEnum'
+
+        #Event
+          event_type: 'App\Enum\Booking\EventTypeEnum'
+          event_visibility: 'App\Enum\Booking\VisibilityEnum'
+          event_type_gender: 'App\Enum\Booking\EventGenderTypeEnum'
+          event_educationalproject_establishment: 'App\Enum\Booking\EducationalProjectEstablishmentEnum'
+          event_educationalproject_specialclass: 'App\Enum\Booking\EducationalProjectSpecialClassEnum'
+          event_educationalproject_educationaldevice: 'App\Enum\Booking\EducationalProjectEducationalDeviceEnum'
+          examen_convocation_status: 'App\Enum\Booking\ExamenConvocationStatusEnum'
+          examen_convocation_presence: 'App\Enum\Booking\ExamenConvocationPresenceEnum'
+          examen_timeline: 'App\Enum\Booking\ExamenTimelineTypeEnum'
+          course_timeline: 'App\Enum\Booking\CourseTimelineTypeEnum'
+          organization_holiday_timeline: 'App\Enum\Booking\OrganizationHolidayTimelineTypeEnum'
+          person_holiday_timeline: 'App\Enum\Booking\PersonHolidayTimelineTypeEnum'
+          event_timeline: 'App\Enum\Booking\EventTimelineTypeEnum'
+          educational_project_timeline: 'App\Enum\Booking\EducationalProjectTimelineTypeEnum'
+          event_participation: 'App\Enum\Booking\ParticipationStatusEnum'
+
+        # File
+          file_visibility: 'App\Enum\Core\FileVisibilityEnum'
+          file_folder: 'App\Enum\Core\FileFolderEnum'
+          file_status: 'App\Enum\Core\FileStatusEnum'
+
+        #education
+          education: 'App\Enum\Education\EducationTypeEnum'
+          education_year: 'App\Enum\Education\YearEnum'
+          education_period: 'App\Enum\Education\PeriodEnum'
+          education_periodicity: 'App\Enum\Education\PeriodicityEnum'
+          advanced_education_notation: 'App\Enum\Education\AdvancedEducationNotationTypeEnum'
+
+          #billing
+          billing_periodicity: 'App\Enum\Billing\PeriodicityEnum'
+          billing_type_periodicity: 'App\Enum\Billing\PeriodicityTypeEnum'
+          billing_pricingline_adhesion: 'App\Enum\Billing\PricingLineAdhesionEnum'
+          billing_pricingline_productrent: 'App\Enum\Billing\PricingLineProductRentEnum'
+          billing_discount_global_tariff_family: 'App\Enum\Billing\DiscountGlobalTariffFamilyEnum'
+          billing_pricingline_invoice_line: 'App\Enum\Billing\PricingLineInvoiceLineEnum'
+          billing_payment_choice: 'App\Enum\Billing\PaymentChoiceEnum'
+          billing_bank: 'App\Enum\Billing\BankEnum'
+          billing_periodicity_payment: 'App\Enum\Billing\PeriodicityPaymentEnum'
+          billing_rent_reduction_type: 'App\Enum\Billing\ReductionTypeEnum'
+          billing_rent_year: 'App\Enum\Billing\RentYearEnum'
+          billing_family_reduction_type: 'App\Enum\Billing\FamilyReductionTypeEnum'
+          billing_payment_state: 'App\Enum\Billing\PaymentStateEnum'
+          billing_period: 'App\Enum\Billing\PeriodEnum'
+          billing_adhesion_choice: 'App\Enum\Billing\AdhesionChoiceEnum'
+          billing_order_adult_type_choice: 'App\Enum\Billing\OrderAdultTypeEnum'
+          billing_adult_condition_type_choice: 'App\Enum\Billing\AdultConditionTypeEnum'
+          billing_payment_type_choice: 'App\Enum\Billing\PaymentTypeEnum'
+          billing_type: 'App\Enum\Billing\BillingTypeEnum'
+
+        #message
+          message_status: 'App\Enum\Message\MessageStatusEnum'
+          report_message_satus: 'App\Enum\Message\ReportMessageSatusEnum'
+          message_sender: 'App\Enum\Message\SenderEnum'
+          message_sender_only_access: 'App\Enum\Message\SenderOnlyAccessEnum'
+          message_send_to: 'App\Enum\Message\SendToEnum'
+
+        #rules
+          default_rules: 'App\Enum\Rulerz\RulesEnum'
+          manager_rules: 'App\Enum\Rulerz\RulesManagerEnum'
+
+        #commission
+          commission_member_function: 'App\Enum\Person\CommissionMemberFunctionEnum'
+          commission_member_cause_output: 'App\Enum\Person\CauseOutputEnum'
+
+        #Cotisation
+          cotisation_function_enum_choices: 'App\Enum\Cotisation\CotisationFunctionEnum'
+          type_of_practices_enum: 'App\Enum\Cotisation\TypeOfPracticeEnum'
+          category_type_of_practices_enum: 'App\Enum\Cotisation\CategoryTypeOfPracticeEnum'
+
+        #OnlineRegistration
+          onlineregistration_registration_status: 'App\Enum\OnlineRegistration\RegistrationStatus'
+          onlineregistration_wish_registration: 'App\Enum\OnlineRegistration\WishRegistration'
+          onlineregistration_file_type: 'App\Enum\OnlineRegistration\FileTypeEnum'
+          onlineregistration_origin_education_student_wish: 'App\Enum\OnlineRegistration\EducationStudentWishOriginEnum'

+ 2 - 2
config/opentalent/modulesbyconditions.yaml

@@ -1,5 +1,5 @@
-opentalent:
-    modulesbyconditions:
+parameters:
+    opentalent.modulesbyconditions:
         CotisationCall:
             roles:
                 - ROLE_COTISATION

+ 3 - 3
config/opentalent/products.yaml

@@ -1,5 +1,5 @@
-opentalent:
-    modules:
+parameters:
+  opentalent.modules:
       Core:
         entities:
           - AccessProfile
@@ -266,7 +266,7 @@ opentalent:
         entities:
           - DolibarrAccount
 
-    products:
+  opentalent.products:
       artist:
         modules:
           - Core

+ 55 - 53
config/opentalent/subdomains.yaml

@@ -1,53 +1,55 @@
-# Liste des sous-domaines réservés (sous forme de RegEx, sans les caractères de début et de fin de ligne '^' et '$')
-# @see https://ressources.opentalent.fr/display/SPEC/Nom+de+sous+domaines+reserves+pour+2IOS
-reserved:
-  - opentalent
-  - 2ios
-  - 2iopenservice
-  - app
-  - my
-  - api
-  - ap2i
-  - local
-  - logs?
-  - stats
-  - preprod\d*
-  - test\d*
-  - admin
-  - frames
-  - git
-  - v\d+
-  - myadmin
-  - mailcatcher
-  - mail
-  - gitlab
-  - metabase
-  - dolibarr
-  - prod
-  - production
-  - assistance
-  - ressources
-  - support
-  - statistiques.*
-  - drive
-  - cloud
-  - www
-  - ww\d*
-  - agenda
-  - store
-  - boutique
-  - annuaire
-  - opentalent
-  - 2iopenservice
-  - typo3
-  - actus?
-  - actualites?
-  - news
-  - annonces?
-  - mobile
-  - membres
-  - mercure
-  - kibana
-  - phpmyadmin
-  - elasticsearch
-  - es
+parameters:
+  opentalent.subdomains:
+    # Liste des sous-domaines réservés (sous forme de RegEx, sans les caractères de début et de fin de ligne '^' et '$')
+    # @see https://ressources.opentalent.fr/display/SPEC/Nom+de+sous+domaines+reserves+pour+2IOS
+    reserved:
+      - opentalent
+      - 2ios
+      - 2iopenservice
+      - app
+      - my
+      - api
+      - ap2i
+      - local
+      - logs?
+      - stats
+      - preprod\d*
+      - test\d*
+      - admin
+      - frames
+      - git
+      - v\d+
+      - myadmin
+      - mailcatcher
+      - mail
+      - gitlab
+      - metabase
+      - dolibarr
+      - prod
+      - production
+      - assistance
+      - ressources
+      - support
+      - statistiques.*
+      - drive
+      - cloud
+      - www
+      - ww\d*
+      - agenda
+      - store
+      - boutique
+      - annuaire
+      - opentalent
+      - 2iopenservice
+      - typo3
+      - actus?
+      - actualites?
+      - news
+      - annonces?
+      - mobile
+      - membres
+      - mercure
+      - kibana
+      - phpmyadmin
+      - elasticsearch
+      - es

+ 4 - 0
config/services.yaml

@@ -1,3 +1,7 @@
+# config/services.yaml
+imports:
+    - { resource: opentalent/* }
+
 # Put parameters here that don't need to change on each machine where the app is deployed
 # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
 parameters:

+ 7 - 16
src/Service/Security/Module.php

@@ -4,9 +4,9 @@ declare(strict_types=1);
 namespace App\Service\Security;
 
 use App\Entity\Organization\Organization;
-use App\Service\Utils\ConfigUtils;
 use App\Service\Utils\Reflection;
 use Doctrine\Common\Cache\ApcuCache;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
 /**
@@ -15,19 +15,9 @@ use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  */
 class Module
 {
-    /**
-     * @var mixed[]|null $moduleConfig
-     */
-    private array | null $moduleConfig = null;
-
-    /**
-     * @var mixed[]|null $moduleByConditionsConfig
-     */
-    private array | null $moduleByConditionsConfig = null;
-
     public function __construct(
         readonly private Reflection $reflection,
-        readonly private ConfigUtils $configUtils
+        readonly private ParameterBagInterface $parameterBag
     ) {}
 
     /**
@@ -87,7 +77,7 @@ class Module
     public function getModulesByConditions(Organization $organization): array
     {
         $modulesByConditions = [];
-        $modules = $this->configUtils->loadFromFile('modulesbyconditions')['opentalent']['modulesbyconditions'];
+        $modules = $this->parameterBag->get('opentalent.modulesbyconditions');
         foreach ($modules as $moduleName => $module) {
             try{
                 $response = $this->reflection->dynamicInvokeServiceWithArgsAndMethod(
@@ -114,11 +104,12 @@ class Module
     public function getModulesByProductConfiguration(string $product): ?array
     {
         $product = str_replace('-', '_', $product);
+        $opentalentProducts = $this->parameterBag->get('opentalent.products');
 
-        if (!array_key_exists($product, $this->configUtils->loadFromFile('products')['opentalent']['products'])) {
+        if (!array_key_exists($product, $opentalentProducts)) {
             throw new AccessDeniedHttpException(sprintf('The product %s does not exist !', $product));
         }
-        $productConfig = $this->configUtils->loadFromFile('products')['opentalent']['products'][$product];
+        $productConfig = $opentalentProducts[$product];
         $modules = $productConfig['modules'] ?? [];
 
         if (array_key_exists('extend', $productConfig)) {
@@ -136,7 +127,7 @@ class Module
      */
     public function getModuleByResourceName(string $resource): int|string|null
     {
-        $modules = $this->configUtils->loadFromFile('products')['opentalent']['modules'];
+        $modules = $this->parameterBag->get('opentalent.products');
         foreach ($modules as $module => $data) {
             if ($data['entities'] && in_array($resource, $data['entities'], true)) {
                 return $module;

+ 5 - 3
src/Service/Typo3/SubdomainService.php

@@ -11,11 +11,11 @@ use App\Repository\Access\AccessRepository;
 use App\Repository\Organization\SubdomainRepository;
 use App\Service\Mailer\Model\SubdomainChangeModel;
 use App\Service\Organization\Utils as OrganizationUtils;
-use App\Service\Utils\ConfigUtils;
 use Doctrine\ORM\EntityManagerInterface;
 use Symfony\Bundle\SecurityBundle\Security;
 use Symfony\Component\Console\Exception\InvalidArgumentException;
 use Symfony\Component\Messenger\MessageBusInterface;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
 
 /**
  * Service de gestion des sous-domaines des utilisateurs
@@ -35,7 +35,7 @@ class SubdomainService
         private readonly OrganizationUtils $organizationUtils,
         private readonly BindFileService $bindFileService,
         private readonly AccessRepository $accessRepository,
-        private readonly ConfigUtils $configUtils
+        private readonly ParameterBagInterface $parameterBag
     ) {}
 
     /**
@@ -72,8 +72,10 @@ class SubdomainService
      * @throws \Exception
      */
     public function isReservedSubdomain(string $subdomainValue): bool {
-        $reservedSubdomains = $this->configUtils->loadFromFile('subdomains')['reserved'];
+//        $reservedSubdomains = $this->configUtils->get('subdomains')['reserved'];
+        dd($this->parameterBag->get('modules'));
 
+        $reservedSubdomains = $this->parameterBag->get('opentalent')['reserved_subdomains'];
         $subRegexes = array_map(
             function (string $s) { return '(' . trim($s, '^$/\s') . ')'; },
             $reservedSubdomains

+ 0 - 47
src/Service/Utils/ConfigUtils.php

@@ -1,47 +0,0 @@
-<?php
-
-namespace App\Service\Utils;
-
-use App\Service\Utils\Parser\YamlParser;
-
-/**
- * Fonctions d'accès à la configuration Opentalent
- */
-class ConfigUtils
-{
-    private array $cache = [];
-
-    public function __construct(
-        readonly private string     $opentalentConfig,
-        private YamlParser          $yamlParser
-    ) {}
-
-    /**
-     * Parse et retourne le contenu du fichier de configuration yaml donné
-     *
-     * Exemple :
-     *
-     *     $this->configUtils->loadFromFile('products');
-     *
-     * @return mixed
-     * @throws \Exception
-     */
-    public function loadFromFile(string $filename): mixed
-    {
-        $filename = strtolower($filename);
-        if (pathinfo($filename, PATHINFO_EXTENSION) !== 'yaml') {
-            $filename = $filename . '.yaml';
-        }
-
-        if (array_key_exists($filename, $this->cache)) {
-            return $this->cache[$filename];
-        }
-
-        $path = Path::locate([$this->opentalentConfig], $filename);
-        $data = $this->yamlParser->parseFile($path);
-
-        $cache[$filename] = $data;
-
-        return $data;
-    }
-}

+ 4 - 4
src/State/Provider/Enum/EnumProvider.php

@@ -7,11 +7,11 @@ use ApiPlatform\Metadata\GetCollection;
 use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Enum\Enum;
-use App\Service\Utils\ConfigUtils;
 use App\Service\Utils\Parser\YamlParser;
 use App\Service\Utils\Reflection;
 use Exception;
 use RuntimeException;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 
 /**
@@ -21,8 +21,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 final class EnumProvider implements ProviderInterface
 {
     public function __construct(
-        private ConfigUtils $configUtils,
-        private Reflection $reflection
+        private Reflection $reflection,
+        private readonly ParameterBagInterface $parameterBag
     )
     { }
 
@@ -39,7 +39,7 @@ final class EnumProvider implements ProviderInterface
         }
 
         $id = $uriVariables['id'];
-        $enums = $this->configUtils->loadFromFile('enum');
+        $enums = $this->parameterBag->get('opentalent.enum');
         $enumClass = $enums['opentalent'][$id];
 
         if(!$enumClass) {

+ 27 - 48
tests/Unit/Service/Security/ModuleTest.php

@@ -13,6 +13,7 @@ use Hoa\Iterator\Mock;
 use PHPUnit\Framework\MockObject\MockObject;
 use PHPUnit\Framework\TestCase;
 use PHPUnit\Util\Test;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
 class TestableModule extends Module {
@@ -21,20 +22,18 @@ class TestableModule extends Module {
 
 class ModuleTest extends TestCase
 {
-    private const OPENTALENT_CONFIG = __DIR__.'/../../../config/opentalent';
-
     private MockObject | Reflection $reflection;
-    private MockObject | YamlParser $parser;
+    private MockObject | ParameterBagInterface $parameterBag;
 
     public function setUp():void
     {
         $this->reflection = $this->getMockBuilder(Reflection::class)->disableOriginalConstructor()->getMock();
-        $this->configUtils = $this->getMockBuilder(ConfigUtils::class)->disableOriginalConstructor()->getMock();
+        $this->parameterBag = $this->getMockBuilder(ParameterBagInterface::class)->disableOriginalConstructor()->getMock();
     }
 
     public function getMockForMethod(string $methodName): MockObject | TestableModule {
         return $this->getMockBuilder(TestableModule::class)
-            ->setConstructorArgs([$this->reflection, $this->configUtils])
+            ->setConstructorArgs([$this->reflection, $this->parameterBag])
             ->setMethodsExcept([$methodName])
             ->getMock();
     }
@@ -92,20 +91,16 @@ class ModuleTest extends TestCase
     {
         $module = $this->getMockForMethod('getModulesByConditions');
 
-        $this->configUtils->method('loadFromFile')->with('modulesbyconditions')->willReturn(
-            ['opentalent' =>
-                ['modulesbyconditions' =>
-                    ['CotisationCall' => [
-                        'roles' => ['ROLE_COTISATION'],
-                        'conditions' => [
-                            'service' => [
-                                'name' => CotisationUtils::class,
-                                'function' => 'isLastParentAndCMF'
-                            ]
-                        ]
-                    ]]
+        $this->parameterBag->method('get')->with('opentalent.modulesbyconditions')->willReturn(
+            ['CotisationCall' => [
+                'roles' => ['ROLE_COTISATION'],
+                'conditions' => [
+                    'service' => [
+                        'name' => CotisationUtils::class,
+                        'function' => 'isLastParentAndCMF'
+                    ]
                 ]
-            ]
+            ]]
         );
 
         $organization = $this->getMockBuilder(Organization::class)->getMock();
@@ -124,12 +119,8 @@ class ModuleTest extends TestCase
     {
         $module = $this->getMockForMethod('getModulesByConditions');
 
-        $this->configUtils->method('loadFromFile')->with('modulesbyconditions')->willReturn(
-            ['opentalent' =>
-                ['modulesbyconditions' =>
-                    ['CotisationCall' => []]
-                ]
-            ]
+        $this->parameterBag->method('get')->with('opentalent.modulesbyconditions')->willReturn(
+            ['CotisationCall' => []]
         );
 
         $organization = $this->getMockBuilder(Organization::class)->getMock();
@@ -150,8 +141,8 @@ class ModuleTest extends TestCase
     {
         $module = $this->getMockForMethod('getModulesByProductConfiguration');
 
-        $this->configUtils->method('loadFromFile')->with('products')->willReturn(
-            ['opentalent' => ['products' => ['artist' => ['modules' => ['foo']]]]]
+        $this->parameterBag->method('get')->with('opentalent.products')->willReturn(
+            ['artist' => ['modules' => ['foo']]]
         );
 
         $this->assertEquals(['foo'], $module->getModulesByProductConfiguration('artist')) ;
@@ -164,14 +155,10 @@ class ModuleTest extends TestCase
     {
         $module = $this->getMockForMethod('getModulesByProductConfiguration');
 
-        $this->configUtils->method('loadFromFile')->with('products')->willReturn(
-            ['opentalent' =>
-                ['products' =>
-                    [
-                        'artist' => ['modules' => ['foo']],
-                        'artist_premium' => ['extend' => 'artist', 'modules' => ['bar']]
-                    ]
-                ]
+        $this->parameterBag->method('get')->with('opentalent.products')->willReturn(
+            [
+                'artist' => ['modules' => ['foo']],
+                'artist_premium' => ['extend' => 'artist', 'modules' => ['bar']]
             ]
         );
 
@@ -190,8 +177,8 @@ class ModuleTest extends TestCase
 
         $module = $this->getMockForMethod('getModulesByProductConfiguration');
 
-        $this->configUtils->method('loadFromFile')->with('products')->willReturn(
-            ['opentalent' => ['products' => ['artist' => ['modules' => ['foo']]]]]
+        $this->parameterBag->method('get')->with('opentalent.products')->willReturn(
+            ['artist' => ['modules' => ['foo']]]
         );
 
         $this->expectException(AccessDeniedHttpException::class);
@@ -206,12 +193,8 @@ class ModuleTest extends TestCase
     public function testGetModuleByResourceName(): void {
         $module = $this->getMockForMethod('getModuleByResourceName');
 
-        $this->configUtils->method('loadFromFile')->with('products')->willReturn(
-            ['opentalent' =>
-                ['modules' =>
-                    ['Core' => ['entities' => ['foo', 'bar']]]
-                ]
-            ]
+        $this->parameterBag->method('get')->with('opentalent.products')->willReturn(
+            ['Core' => ['entities' => ['foo', 'bar']]]
         );
 
         $this->assertEquals('Core', $module->getModuleByResourceName('foo'));
@@ -223,12 +206,8 @@ class ModuleTest extends TestCase
     public function testGetModuleByResourceNameNotFound(): void {
         $module = $this->getMockForMethod('getModuleByResourceName');
 
-        $this->configUtils->method('loadFromFile')->with('products')->willReturn(
-            ['opentalent' =>
-                ['modules' =>
-                    ['Core' => ['entities' => ['bar']]]
-                ]
-            ]
+        $this->parameterBag->method('get')->with('opentalent.products')->willReturn(
+            ['Core' => ['entities' => ['bar']]]
         );
 
         $this->assertNull($module->getModuleByResourceName('foo'));

+ 10 - 8
tests/Unit/Service/Typo3/SubdomainServiceTest.php

@@ -20,6 +20,7 @@ use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\ORM\EntityManagerInterface;
 use PHPUnit\Framework\MockObject\MockObject;
 use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
 use Symfony\Component\Messenger\Envelope;
 use Symfony\Component\Messenger\MessageBusInterface;
 
@@ -47,12 +48,13 @@ class TestableSubdomainService extends SubdomainService {
 }
 class SubdomainServiceTest extends TestCase
 {
-    private SubdomainRepository $subdomainRepository;
-    private OrganizationUtils $organizationUtils;
-    private BindFileService $bindFileService;
-    private MessageBusInterface $messageBus;
-    private EntityManagerInterface $entityManager;
-    private AccessRepository $accessRepository;
+    private MockObject | SubdomainRepository $subdomainRepository;
+    private MockObject | OrganizationUtils $organizationUtils;
+    private MockObject | BindFileService $bindFileService;
+    private MockObject | MessageBusInterface $messageBus;
+    private MockObject | EntityManagerInterface $entityManager;
+    private MockObject | AccessRepository $accessRepository;
+    private MockObject | ParameterBagInterface $parameterBag;
 
     public function setUp():void
     {
@@ -62,7 +64,7 @@ class SubdomainServiceTest extends TestCase
         $this->organizationUtils = $this->getMockBuilder(OrganizationUtils::class)->disableOriginalConstructor()->getMock();
         $this->bindFileService = $this->getMockBuilder(BindFileService::class)->disableOriginalConstructor()->getMock();
         $this->accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
-        $this->configUtils = $this->getMockBuilder(ConfigUtils::class)->disableOriginalConstructor()->getMock();
+        $this->parameterBag = $this->getMockBuilder(ParameterBagInterface::class)->disableOriginalConstructor()->getMock();
     }
 
     private function makeSubdomainServiceMockFor(string $methodName): MockObject | TestableSubdomainService {
@@ -74,7 +76,7 @@ class SubdomainServiceTest extends TestCase
                 $this->organizationUtils,
                 $this->bindFileService,
                 $this->accessRepository,
-                $this->configUtils
+                $this->parameterBag
             ])
             ->setMethodsExcept([$methodName])
             ->getMock();