diff --git a/admin/app/components/organizations/information-section-edit.gjs b/admin/app/components/organizations/information-section-edit.gjs new file mode 100644 index 00000000000..0449e1ffc5b --- /dev/null +++ b/admin/app/components/organizations/information-section-edit.gjs @@ -0,0 +1,263 @@ +import PixButton from '@1024pix/pix-ui/components/pix-button'; +import PixCheckbox from '@1024pix/pix-ui/components/pix-checkbox'; +import PixInput from '@1024pix/pix-ui/components/pix-input'; +import PixSelect from '@1024pix/pix-ui/components/pix-select'; +import { fn } from '@ember/helper'; +import { on } from '@ember/modifier'; +import { action } from '@ember/object'; +import { service } from '@ember/service'; +import Component from '@glimmer/component'; +import { tracked } from '@glimmer/tracking'; + +export default class OrganizationInformationSectionEditionMode extends Component { + @service accessControl; + @service store; + @service oidcIdentityProviders; + + @tracked isEditMode = false; + @tracked showArchivingConfirmationModal = false; + + noIdentityProviderOption = { label: 'Aucun', value: 'None' }; + garIdentityProviderOption = { label: 'GAR', value: 'GAR' }; + + constructor() { + super(...arguments); + this.form = this.store.createRecord('organization-form'); + this._initForm(); + } + + get isManagingStudentAvailable() { + return ( + !this.args.organization.isLearnerImportEnabled && + (this.args.organization.isOrganizationSCO || this.args.organization.isOrganizationSUP) + ); + } + + get identityProviderOptions() { + const oidcIdentityProvidersOptions = this.oidcIdentityProviders.list.map((identityProvider) => ({ + value: identityProvider.code, + label: identityProvider.organizationName, + })); + return [this.noIdentityProviderOption, this.garIdentityProviderOption, ...oidcIdentityProvidersOptions]; + } + + @action + onChangeIdentityProvider(newIdentityProvider) { + this.form.identityProviderForCampaigns = newIdentityProvider; + } + + @action + closeAndResetForm() { + this.args.toggleEditMode(); + this._initForm(); + } + + @action + updateFormCheckBoxValue(key) { + this.form[key] = !this.form[key]; + } + + @action + updateFormValue(key, event) { + this.form[key] = event.target.value; + } + + @action + async updateOrganization(event) { + event.preventDefault(); + + const { validations } = await this.form.validate(); + if (!validations.isValid) { + return; + } + + if (this.form.identityProviderForCampaigns === 'None') { + this.form.identityProviderForCampaigns = null; + } + + this.args.organization.set('name', this.form.name); + this.args.organization.set('externalId', this.form.externalId); + this.args.organization.set('provinceCode', this.form.provinceCode); + this.args.organization.set('dataProtectionOfficerFirstName', this.form.dataProtectionOfficerFirstName); + this.args.organization.set('dataProtectionOfficerLastName', this.form.dataProtectionOfficerLastName); + this.args.organization.set('dataProtectionOfficerEmail', this.form.dataProtectionOfficerEmail); + this.args.organization.set('email', this.form.email); + this.args.organization.set('credit', this.form.credit); + this.args.organization.set('isManagingStudents', this.form.isManagingStudents); + this.args.organization.set('documentationUrl', this.form.documentationUrl); + this.args.organization.set('showSkills', this.form.showSkills); + this.args.organization.set('identityProviderForCampaigns', this.form.identityProviderForCampaigns); + this.args.organization.set('isMultipleSendingAssessmentEnabled', this.form.isMultipleSendingAssessmentEnabled); + this.args.organization.set('isPlacesManagementEnabled', this.form.isPlacesManagementEnabled); + + this.closeAndResetForm(); + return this.args.onSubmit(); + } + + _initForm() { + this.form.name = this.args.organization.name; + this.form.externalId = this.args.organization.externalId; + this.form.provinceCode = this.args.organization.provinceCode; + this.form.dataProtectionOfficerFirstName = this.args.organization.dataProtectionOfficerFirstName; + this.form.dataProtectionOfficerLastName = this.args.organization.dataProtectionOfficerLastName; + this.form.dataProtectionOfficerEmail = this.args.organization.dataProtectionOfficerEmail; + this.form.email = this.args.organization.email; + this.form.credit = this.args.organization.credit; + this.form.isManagingStudents = this.args.organization.isManagingStudents; + this.form.documentationUrl = this.args.organization.documentationUrl; + this.form.showSkills = this.args.organization.showSkills; + this.form.isMultipleSendingAssessmentEnabled = this.args.organization.isMultipleSendingAssessmentEnabled; + this.form.isPlacesManagementEnabled = this.args.organization.isPlacesManagementEnabled; + this.form.identityProviderForCampaigns = + this.args.organization.identityProviderForCampaigns ?? this.noIdentityProviderOption.value; + } + + +} diff --git a/admin/app/components/organizations/information-section-edit.hbs b/admin/app/components/organizations/information-section-edit.hbs deleted file mode 100644 index e9ef1fda3c2..00000000000 --- a/admin/app/components/organizations/information-section-edit.hbs +++ /dev/null @@ -1,146 +0,0 @@ -
-
- - - Les champs marqués de - - sont obligatoires. - - -
- <:label> - - Nom - -
- -
- <:label>Identifiant externe -
- -
- <:label>Département (en 3 chiffres) -
- -
- <:label>Prénom du DPO -
- -
- <:label>Nom du DPO -
- -
- <:label>Adresse e-mail du DPO -
- -
- <:label>Crédits -
- -
- <:label>Lien vers la documentation -
- -
- <:label>Affichage des acquis dans l'export de résultats -
- -
- - <:label>SSO - -
- -
- <:label>Adresse e-mail d'activation SCO -
- - {{#if (or @organization.isOrganizationSCO @organization.isOrganizationSUP)}} -
- <:label>Gestion d’élèves/étudiants -
- {{/if}} - -
- - <:label>Activer l'envoi multiple pour les campagnes de type évaluation - -
-
- - <:label>Activer la page Places sur PixOrga - -
-
- Annuler - Enregistrer -
-
-
\ No newline at end of file diff --git a/admin/app/components/organizations/information-section-edit.js b/admin/app/components/organizations/information-section-edit.js deleted file mode 100644 index 01ac31a35b4..00000000000 --- a/admin/app/components/organizations/information-section-edit.js +++ /dev/null @@ -1,100 +0,0 @@ -import { action } from '@ember/object'; -import { service } from '@ember/service'; -import Component from '@glimmer/component'; -import { tracked } from '@glimmer/tracking'; - -export default class OrganizationInformationSectionEditionMode extends Component { - @service accessControl; - @service store; - @service oidcIdentityProviders; - - @tracked isEditMode = false; - @tracked showArchivingConfirmationModal = false; - noIdentityProviderOption = { label: 'Aucun', value: 'None' }; - garIdentityProviderOption = { label: 'GAR', value: 'GAR' }; - - constructor() { - super(...arguments); - this.form = this.store.createRecord('organization-form'); - this._initForm(); - } - - get identityProviderOptions() { - const oidcIdentityProvidersOptions = this.oidcIdentityProviders.list.map((identityProvider) => ({ - value: identityProvider.code, - label: identityProvider.organizationName, - })); - return [this.noIdentityProviderOption, this.garIdentityProviderOption, ...oidcIdentityProvidersOptions]; - } - - @action - onChangeIdentityProvider(newIdentityProvider) { - this.form.identityProviderForCampaigns = newIdentityProvider; - } - - @action - closeAndResetForm() { - this.args.toggleEditMode(); - this._initForm(); - } - - @action - updateFormCheckBoxValue(key) { - this.form[key] = !this.form[key]; - } - - @action - updateFormValue(key, event) { - this.form[key] = event.target.value; - } - - @action - async updateOrganization(event) { - event.preventDefault(); - - const { validations } = await this.form.validate(); - if (!validations.isValid) { - return; - } - - if (this.form.identityProviderForCampaigns === 'None') { - this.form.identityProviderForCampaigns = null; - } - - this.args.organization.set('name', this.form.name); - this.args.organization.set('externalId', this.form.externalId); - this.args.organization.set('provinceCode', this.form.provinceCode); - this.args.organization.set('dataProtectionOfficerFirstName', this.form.dataProtectionOfficerFirstName); - this.args.organization.set('dataProtectionOfficerLastName', this.form.dataProtectionOfficerLastName); - this.args.organization.set('dataProtectionOfficerEmail', this.form.dataProtectionOfficerEmail); - this.args.organization.set('email', this.form.email); - this.args.organization.set('credit', this.form.credit); - this.args.organization.set('isManagingStudents', this.form.isManagingStudents); - this.args.organization.set('documentationUrl', this.form.documentationUrl); - this.args.organization.set('showSkills', this.form.showSkills); - this.args.organization.set('identityProviderForCampaigns', this.form.identityProviderForCampaigns); - this.args.organization.set('isMultipleSendingAssessmentEnabled', this.form.isMultipleSendingAssessmentEnabled); - this.args.organization.set('isPlacesManagementEnabled', this.form.isPlacesManagementEnabled); - - this.closeAndResetForm(); - return this.args.onSubmit(); - } - - _initForm() { - this.form.name = this.args.organization.name; - this.form.externalId = this.args.organization.externalId; - this.form.provinceCode = this.args.organization.provinceCode; - this.form.dataProtectionOfficerFirstName = this.args.organization.dataProtectionOfficerFirstName; - this.form.dataProtectionOfficerLastName = this.args.organization.dataProtectionOfficerLastName; - this.form.dataProtectionOfficerEmail = this.args.organization.dataProtectionOfficerEmail; - this.form.email = this.args.organization.email; - this.form.credit = this.args.organization.credit; - this.form.isManagingStudents = this.args.organization.isManagingStudents; - this.form.documentationUrl = this.args.organization.documentationUrl; - this.form.showSkills = this.args.organization.showSkills; - this.form.isMultipleSendingAssessmentEnabled = this.args.organization.isMultipleSendingAssessmentEnabled; - this.form.isPlacesManagementEnabled = this.args.organization.isPlacesManagementEnabled; - this.form.identityProviderForCampaigns = - this.args.organization.identityProviderForCampaigns ?? this.noIdentityProviderOption.value; - } -} diff --git a/admin/app/components/organizations/information-section-view.gjs b/admin/app/components/organizations/information-section-view.gjs new file mode 100644 index 00000000000..8d3646abcbc --- /dev/null +++ b/admin/app/components/organizations/information-section-view.gjs @@ -0,0 +1,203 @@ +import PixButton from '@1024pix/pix-ui/components/pix-button'; +import PixButtonLink from '@1024pix/pix-ui/components/pix-button-link'; +import PixMessage from '@1024pix/pix-ui/components/pix-message'; +import PixTag from '@1024pix/pix-ui/components/pix-tag'; +import { LinkTo } from '@ember/routing'; +import { service } from '@ember/service'; +import Component from '@glimmer/component'; +import { tracked } from '@glimmer/tracking'; +import { t } from 'ember-intl'; +import ENV from 'pix-admin/config/environment'; + +export default class OrganizationInformationSection extends Component { + @service oidcIdentityProviders; + @service accessControl; + @tracked tags; + @tracked hasOrganizationChildren; + + constructor() { + super(...arguments); + if (this.args.organization.tags) { + Promise.resolve(this.args.organization.tags).then((tags) => { + this.tags = tags; + }); + } + if (this.args.organization.children) { + Promise.resolve(this.args.organization.children).then((children) => { + this.hasOrganizationChildren = children.length > 0; + }); + } + } + + get isManagingStudentAvailable() { + return ( + !this.args.organization.isLearnerImportEnabled && + (this.args.organization.isOrganizationSCO || this.args.organization.isOrganizationSUP) + ); + } + + get identityProviderName() { + const GARIdentityProvider = { code: 'GAR', organizationName: 'GAR' }; + const allIdentityProviderList = [...this.oidcIdentityProviders.list, GARIdentityProvider]; + const identityProvider = allIdentityProviderList.findBy( + 'code', + this.args.organization.identityProviderForCampaigns, + ); + const identityProviderName = identityProvider?.organizationName; + return identityProviderName ?? 'Aucun'; + } + + get externalURL() { + const urlDashboardPrefix = ENV.APP.ORGANIZATION_DASHBOARD_URL; + return urlDashboardPrefix && urlDashboardPrefix + this.args.organization.id; + } + + +} diff --git a/admin/app/components/organizations/information-section-view.hbs b/admin/app/components/organizations/information-section-view.hbs deleted file mode 100644 index d3bf897e999..00000000000 --- a/admin/app/components/organizations/information-section-view.hbs +++ /dev/null @@ -1,140 +0,0 @@ -
-

{{@organization.name}}

- - {{#if this.tags}} - - {{else}} - Cette organisation - n'a pas de tags. - - {{/if}} -
- {{#if this.hasOrganizationChildren}} - {{t "components.organizations.information-section-view.parent-organization"}} - {{/if}} - {{#if @organization.parentOrganizationId}} - - {{/if}} -
- {{#if @organization.isArchived}} - - Archivée le - {{@organization.archivedFormattedDate}} - par - {{@organization.archivistFullName}}. - - {{/if}} - -
-
-
    -
  • Type : {{@organization.type}}
  • -
  • Créée par : {{@organization.creatorFullName}} ({{@organization.createdBy}})
  • -
  • Créée le : {{@organization.createdAtFormattedDate}}
  • - {{#if @organization.externalId}} -
  • Identifiant externe : {{@organization.externalId}}
  • - {{/if}} - {{#if @organization.provinceCode}} -
  • Département : {{@organization.provinceCode}}
  • - {{/if}} - -
    - -
  • Nom du DPO : {{@organization.dataProtectionOfficerFullName}}
  • -
  • Adresse e-mail du DPO : {{@organization.dataProtectionOfficerEmail}}
  • -
    -
  • Crédits : {{@organization.credit}}
  • -
  • Lien vers la documentation : - {{#if @organization.documentationUrl}} - {{@organization.documentationUrl}} - {{else}} - Non spécifié - {{/if}} -
  • -
  • SSO : {{this.identityProviderName}}
  • - -
    - -
  • Adresse e-mail d'activation SCO : {{@organization.email}}
  • - -
    - -
  • Lien vers le formulaire du Net Promoter Score : - {{#if @organization.formNPSUrl}} - {{@organization.formNPSUrl}} - {{else}} - Non spécifié - {{/if}} -
  • -
  • Affichage du Net Promoter Score : {{if @organization.showNPS "Oui" "Non"}}
  • -
-

Fonctionnalités disponibles :

-
    -
  • Affichage des acquis dans l'export de résultats : {{if @organization.showSkills "Oui" "Non"}}
  • - {{#if (or @organization.isOrganizationSCO @organization.isOrganizationSUP)}} -
  • Gestion d’élèves/étudiants : {{if @organization.isManagingStudents "Oui" "Non"}}
  • - {{/if}} -
  • Activer l'envoi multiple sur les campagnes d'évaluation : - {{if @organization.isMultipleSendingAssessmentEnabled "Oui" "Non"}}
  • -
  • Activer la page Places sur PixOrga : - {{if @organization.isPlacesManagementEnabled "Oui" "Non"}}
  • - {{#if @organization.code}} -
    -
  • Code : {{@organization.code}}
  • - {{/if}} - {{#if @organization.isComputeCertificabilityEnabled}} -
  • Certificabilité automatique activée
  • - {{/if}} -
- {{#if this.accessControl.hasAccessToOrganizationActionsScope}} -
- - Modifier - - {{#unless @organization.isArchived}} - - Archiver l'organisation - - {{/unless}} -
- {{/if}} -
-
- Tableau de bord - -
-
-
\ No newline at end of file diff --git a/admin/app/components/organizations/information-section-view.js b/admin/app/components/organizations/information-section-view.js deleted file mode 100644 index fca346e1844..00000000000 --- a/admin/app/components/organizations/information-section-view.js +++ /dev/null @@ -1,41 +0,0 @@ -import { service } from '@ember/service'; -import Component from '@glimmer/component'; -import { tracked } from '@glimmer/tracking'; -import ENV from 'pix-admin/config/environment'; - -export default class OrganizationInformationSection extends Component { - @service oidcIdentityProviders; - @service accessControl; - @tracked tags; - @tracked hasOrganizationChildren; - - constructor() { - super(...arguments); - if (this.args.organization.tags) { - Promise.resolve(this.args.organization.tags).then((tags) => { - this.tags = tags; - }); - } - if (this.args.organization.children) { - Promise.resolve(this.args.organization.children).then((children) => { - this.hasOrganizationChildren = children.length > 0; - }); - } - } - - get identityProviderName() { - const GARIdentityProvider = { code: 'GAR', organizationName: 'GAR' }; - const allIdentityProviderList = [...this.oidcIdentityProviders.list, GARIdentityProvider]; - const identityProvider = allIdentityProviderList.findBy( - 'code', - this.args.organization.identityProviderForCampaigns, - ); - const identityProviderName = identityProvider?.organizationName; - return identityProviderName ?? 'Aucun'; - } - - get externalURL() { - const urlDashboardPrefix = ENV.APP.ORGANIZATION_DASHBOARD_URL; - return urlDashboardPrefix && urlDashboardPrefix + this.args.organization.id; - } -} diff --git a/admin/app/models/organization.js b/admin/app/models/organization.js index 61dd1222c37..8d052dd210e 100644 --- a/admin/app/models/organization.js +++ b/admin/app/models/organization.js @@ -43,6 +43,7 @@ export default class Organization extends Model { MULTIPLE_SENDING_ASSESSMENT: 'MULTIPLE_SENDING_ASSESSMENT', PLACES_MANAGEMENT: 'PLACES_MANAGEMENT', COMPUTE_ORGANIZATION_LEARNER_CERTIFICABILITY: 'COMPUTE_ORGANIZATION_LEARNER_CERTIFICABILITY', + LEARNER_IMPORT: 'LEARNER_IMPORT', }; } @@ -51,6 +52,16 @@ export default class Organization extends Model { return this.features[Organization.featureList.COMPUTE_ORGANIZATION_LEARNER_CERTIFICABILITY].active; } + get isLearnerImportEnabled() { + if (!this.features) return false; + return this.features[Organization.featureList.LEARNER_IMPORT].active; + } + + get learnerImportFormatName() { + if (!this.isLearnerImportEnabled) return null; + return this.features[Organization.featureList.LEARNER_IMPORT].params.name; + } + get isMultipleSendingAssessmentEnabled() { if (!this.features) return false; return this.features[Organization.featureList.MULTIPLE_SENDING_ASSESSMENT].active; diff --git a/admin/tests/acceptance/authenticated/organizations/information-management-test.js b/admin/tests/acceptance/authenticated/organizations/information-management-test.js index 0200a877686..b11bdc01bc7 100644 --- a/admin/tests/acceptance/authenticated/organizations/information-management-test.js +++ b/admin/tests/acceptance/authenticated/organizations/information-management-test.js @@ -20,6 +20,7 @@ module('Acceptance | Organizations | Information management', function (hooks) { name: 'oldOrganizationName', features: { PLACES_MANAGEMENT: { active: false }, + LEARNER_IMPORT: { active: false }, MULTIPLE_SENDING_ASSESSMENT: { active: false }, COMPUTE_ORGANIZATION_LEARNER_CERTIFICABILITY: { active: false }, }, diff --git a/admin/tests/unit/models/organization-test.js b/admin/tests/unit/models/organization-test.js index e5de0999d91..192bcbcabda 100644 --- a/admin/tests/unit/models/organization-test.js +++ b/admin/tests/unit/models/organization-test.js @@ -48,6 +48,94 @@ module('Unit | Model | organization', function (hooks) { }); }); + module('#isLearnerImportEnabled', function () { + module('#get', function () { + test('it returns true when feature is enabled', function (assert) { + // given + const store = this.owner.lookup('service:store'); + const model = store.createRecord('organization', { + features: { ['LEARNER_IMPORT']: { active: true } }, + }); + + // when + const isLearnerImportEnabled = model.isLearnerImportEnabled; + + // then + assert.true(isLearnerImportEnabled); + }); + + test('it returns false when feature is disabled', function (assert) { + // given + const store = this.owner.lookup('service:store'); + const model = store.createRecord('organization', { + features: { ['LEARNER_IMPORT']: { active: false } }, + }); + + // when + const isLearnerImportEnabled = model.isLearnerImportEnabled; + + // then + assert.false(isLearnerImportEnabled); + }); + + test('it returns false when no features are provided', function (assert) { + // given + const store = this.owner.lookup('service:store'); + const model = store.createRecord('organization', {}); + + // when + const isLearnerImportEnabled = model.isLearnerImportEnabled; + + // then + assert.false(isLearnerImportEnabled); + }); + }); + }); + + module('#learnerImportFormatName', function () { + module('#get', function () { + test('it returns the name of the format when import format feature is enabled', function (assert) { + // given + const store = this.owner.lookup('service:store'); + const model = store.createRecord('organization', { + features: { ['LEARNER_IMPORT']: { active: true, params: { name: 'TOTO' } } }, + }); + + // when + const learnerImportFormatName = model.learnerImportFormatName; + + // then + assert.strictEqual(learnerImportFormatName, 'TOTO'); + }); + + test('it returns null when import formatfeature is disabled', function (assert) { + // given + const store = this.owner.lookup('service:store'); + const model = store.createRecord('organization', { + features: { ['LEARNER_IMPORT']: { active: false, params: { name: 'TOTO' } } }, + }); + + // when + const learnerImportFormatName = model.learnerImportFormatName; + + // then + assert.strictEqual(learnerImportFormatName, null); + }); + + test('it returns null when no features are provided', function (assert) { + // given + const store = this.owner.lookup('service:store'); + const model = store.createRecord('organization', {}); + + // when + const learnerImportFormatName = model.learnerImportFormatName; + + // then + assert.strictEqual(learnerImportFormatName, null); + }); + }); + }); + module('#isPlacesManagementEnabled', function () { module('#get', function () { test('it returns true when feature is enabled', function (assert) { diff --git a/api/src/organizational-entities/domain/models/OrganizationForAdmin.js b/api/src/organizational-entities/domain/models/OrganizationForAdmin.js index 3be0924c6ca..6c0dccc3a7a 100644 --- a/api/src/organizational-entities/domain/models/OrganizationForAdmin.js +++ b/api/src/organizational-entities/domain/models/OrganizationForAdmin.js @@ -138,6 +138,13 @@ class OrganizationForAdmin { this.identityProviderForCampaigns = identityProviderForCampaigns; } + updateIsManagingStudents(isManagingStudents, features) { + const hasLearnerImportFeature = + features[ORGANIZATION_FEATURE.LEARNER_IMPORT.key] && features[ORGANIZATION_FEATURE.LEARNER_IMPORT.key].active; + + this.isManagingStudents = hasLearnerImportFeature ? false : isManagingStudents; + } + updateWithDataProtectionOfficerAndTags(organization, dataProtectionOfficer = {}, tags = []) { const isAEFE = Boolean(tags.find((tag) => tag.name === 'AEFE')); @@ -148,8 +155,8 @@ class OrganizationForAdmin { this.credit = organization.credit; this.externalId = organization.externalId; this.updateProvinceCode(organization.provinceCode); - this.isManagingStudents = organization.isManagingStudents; this.documentationUrl = organization.documentationUrl; + this.updateIsManagingStudents(organization.isManagingStudents, organization.features); this.showSkills = organization.showSkills; this.updateIdentityProviderForCampaigns(organization.identityProviderForCampaigns); this.dataProtectionOfficer.updateInformation(dataProtectionOfficer); diff --git a/api/tests/organizational-entities/unit/domain/models/OrganizationForAdmin_test.js b/api/tests/organizational-entities/unit/domain/models/OrganizationForAdmin_test.js index 7224bbb7ecc..57da9525c72 100644 --- a/api/tests/organizational-entities/unit/domain/models/OrganizationForAdmin_test.js +++ b/api/tests/organizational-entities/unit/domain/models/OrganizationForAdmin_test.js @@ -267,20 +267,56 @@ describe('Unit | Organizational Entities | Domain | Model | OrganizationForAdmin expect(givenOrganization.provinceCode).to.equal(newProvinceCode); }); - it('updates organization isManagingStudents', function () { - // given - const givenOrganization = new OrganizationForAdmin({ - isManagingStudents: false, + context('updates organization isManagingStudents', function () { + it('updates organization isManagingStudents when LEARNER_IMPORT feature does not exist', function () { + // given + const givenOrganization = new OrganizationForAdmin({ + isManagingStudents: false, + }); + + // when + givenOrganization.updateWithDataProtectionOfficerAndTags({ + isManagingStudents: true, + features: {}, + }); + + // then + expect(givenOrganization.isManagingStudents).to.equal(true); }); - // when - givenOrganization.updateWithDataProtectionOfficerAndTags({ - isManagingStudents: true, - features: {}, + it('updates organization isManagingStudents when LEARNER_IMPORT feature is false', function () { + // given + const givenOrganization = new OrganizationForAdmin({ + isManagingStudents: false, + features: { LEARNER_IMPORT: { active: false } }, + }); + + // when + givenOrganization.updateWithDataProtectionOfficerAndTags({ + isManagingStudents: true, + features: {}, + }); + + // then + expect(givenOrganization.isManagingStudents).to.equal(true); }); - // then - expect(givenOrganization.isManagingStudents).to.equal(true); + it('not updates organization isManagingStudents when LEARNER_IMPORT feature is true', function () { + // given + const givenOrganization = new OrganizationForAdmin({ + isManagingStudents: false, + features: {}, + }); + + // when + givenOrganization.updateWithDataProtectionOfficerAndTags({ + isManagingStudents: true, + features: { LEARNER_IMPORT: { active: true } }, + }); + + // then + expect(givenOrganization.isManagingStudents).to.equal(false); + }); }); it('enables compute organization learner certificability when updating SCO organization isManagingStudents to true', function () {