using Omika.Core.Compatibility; using Omika.Core.Domain.Entities.Planning; using Omika.Core.Domain.ValueObjects; using OmikaModels = Omika.Data.HfSql.Models.Omika; using OmikaMappers = Omika.Data.Mapping.Omika; namespace Omika.Tests.Mapping; /// /// Tests unitaires du mapping Omika de l'affectation Collaborateur d'un /// rendez-vous (table RDV_Collaborateur). Aucune base réelle : uniquement des /// objets en mémoire. /// public class OmikaRendezVousMapperTests { [Fact] public void MapCollaborateur_DateFinAnterieureADateDeb_NeLevePasEtPeriodeNull() { var row = new OmikaModels.RDVCollaborateurRow { RVCPKID = 1, RVCGUIDColb = "0f8fad5b-d9cb-469f-a165-70867728950e", RVCDateDeb = new DateTime(2026, 8, 19, 10, 0, 0), RVCDateFin = new DateTime(2026, 8, 19, 9, 0, 0), // antérieure → anomalie historique RVCResponsable = true, RVCTempsValide = true }; // Aucune DomainValidationException ne doit remonter. AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row); Assert.NotNull(affectation); Assert.Null(affectation.PeriodeParticuliere); // L'affectation elle-même est conservée (identifiant + flags). Assert.NotNull(affectation.CollaborateurId); Assert.True(affectation.Responsable); Assert.True(affectation.TempsValide); } [Fact] public void MapCollaborateur_PlageValide_PeriodeMappee() { var debut = new DateTime(2026, 8, 19, 9, 0, 0); var fin = new DateTime(2026, 8, 19, 10, 0, 0); var row = new OmikaModels.RDVCollaborateurRow { RVCDateDeb = debut, RVCDateFin = fin }; AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row); Assert.NotNull(affectation.PeriodeParticuliere); Assert.Equal(debut, affectation.PeriodeParticuliere!.Start); Assert.Equal(fin, affectation.PeriodeParticuliere.End); } [Fact] public void MapCollaborateur_DateEgale_PeriodeMappee() { var instant = new DateTime(2026, 8, 19, 9, 0, 0); var row = new OmikaModels.RDVCollaborateurRow { RVCDateDeb = instant, RVCDateFin = instant }; AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row); Assert.NotNull(affectation.PeriodeParticuliere); Assert.Equal(instant, affectation.PeriodeParticuliere!.Start); Assert.Equal(instant, affectation.PeriodeParticuliere.End); } [Fact] public void MapCollaborateur_DatesParDefaut_PeriodeNull() { var row = new OmikaModels.RDVCollaborateurRow { RVCDateDeb = default, RVCDateFin = default }; AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row); Assert.Null(affectation.PeriodeParticuliere); } [Fact] public void MapCollaborateur_PkNumeriqueFourni_SourceReferencePorteNumericIdEtEntityGuid() { Guid guid = Guid.Parse("0f8fad5b-d9cb-469f-a165-70867728950e"); var row = new OmikaModels.RDVCollaborateurRow { RVCGUIDColb = guid.ToString("D") }; AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row, collaborateurNumericId: 42); Assert.NotNull(affectation.SourceReference); Assert.Equal(42, affectation.SourceReference!.NumericId); Assert.Equal(guid, affectation.SourceReference.EntityGuid); } [Fact] public void MapCollaborateur_SansPkNumerique_SourceReferenceSansNumericId() { Guid guid = Guid.Parse("0f8fad5b-d9cb-469f-a165-70867728950e"); var row = new OmikaModels.RDVCollaborateurRow { RVCGUIDColb = guid.ToString("D") }; AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row); Assert.NotNull(affectation.SourceReference); Assert.Null(affectation.SourceReference!.NumericId); Assert.Equal(guid, affectation.SourceReference.EntityGuid); } [Fact] public void Map_RVIdInterPresent_InterventionSourceReferenceAvecGUID() { var interventionGuid = Guid.Parse("11111111-1111-1111-1111-111111111111"); var row = new OmikaModels.RDVPlanningRow { RVPKID = 1, GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", RVDate = new DateOnly(2026, 8, 19), RVIdInter = 105 }; var interventionGuids = new Dictionary { [105] = interventionGuid }; CanonicalMappingResult mapped = OmikaMappers.OmikaRendezVousMapper.Map(row, null, interventionGuids); Assert.NotNull(mapped.Value.InterventionSourceReference); Assert.Equal(105, mapped.Value.InterventionSourceReference.NumericId); Assert.Equal(interventionGuid, mapped.Value.InterventionSourceReference.EntityGuid); } [Fact] public void Map_RVIdInterAbsent_InterventionSourceReferenceNull() { var row = new OmikaModels.RDVPlanningRow { RVPKID = 1, GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", RVDate = new DateOnly(2026, 8, 19), RVIdInter = 0 }; CanonicalMappingResult mapped = OmikaMappers.OmikaRendezVousMapper.Map(row, null, null); Assert.Null(mapped.Value.InterventionSourceReference); } [Fact] public void Map_RVIdInterOrphelin_InterventionSourceReferenceSansGUID() { var row = new OmikaModels.RDVPlanningRow { RVPKID = 1, GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", RVDate = new DateOnly(2026, 8, 19), RVIdInter = 999 }; CanonicalMappingResult mapped = OmikaMappers.OmikaRendezVousMapper.Map(row, null, new Dictionary()); Assert.NotNull(mapped.Value.InterventionSourceReference); Assert.Equal(999, mapped.Value.InterventionSourceReference.NumericId); Assert.Null(mapped.Value.InterventionSourceReference.EntityGuid); } [Fact] public void Map_AnnulationAvecReferentiel_LibellesOrigineEtMotifResolus() { // La fiche du rendez-vous affiche le motif et l'origine d'annulation : sans // résolution dans le référentiel, elle n'afficherait que le CODE du // paramètre (« O.ANU.RDV.E.CLI ») au lieu de son libellé. var row = new OmikaModels.RDVPlanningRow { RVPKID = 7, GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", RVDate = new DateOnly(2026, 8, 19), RVCleOrigineAnnu = "O.ANU.RDV.E.CLI", RVCleMotifAnnu = "M.ANU.RDV.ABS" }; var references = new Dictionary(StringComparer.OrdinalIgnoreCase) { ["O.ANU.RDV.E.CLI"] = new OmikaModels.ParametreMetierRow { PAPKID = 10, PACLE = "O.ANU.RDV.E.CLI", PACategorie = "O.ANU.RDV", PALibelle = "Externe : Client" }, ["M.ANU.RDV.ABS"] = new OmikaModels.ParametreMetierRow { PAPKID = 11, PACLE = "M.ANU.RDV.ABS", PACategorie = "M.ANU.RDV", PALibelle = "Absent" } }; CanonicalMappingResult mapped = OmikaMappers.OmikaRendezVousMapper.Map(row, references, null); Assert.NotNull(mapped.Value.Annulation); Assert.Equal("O.ANU.RDV.E.CLI", mapped.Value.Annulation!.Origine!.Key); Assert.Equal("Externe : Client", mapped.Value.Annulation.Origine!.Label); Assert.Equal("M.ANU.RDV.ABS", mapped.Value.Annulation.Motif!.Key); Assert.Equal("Absent", mapped.Value.Annulation.Motif!.Label); } [Fact] public void Map_AnnulationSansReferentiel_ConserveLaCleSansInventerDeLibelle() { var row = new OmikaModels.RDVPlanningRow { RVPKID = 8, GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", RVDate = new DateOnly(2026, 8, 19), RVCleMotifAnnu = "M.ANU.RDV.ABS" }; CanonicalMappingResult mapped = OmikaMappers.OmikaRendezVousMapper.Map(row, null, null); Assert.NotNull(mapped.Value.Annulation); Assert.Equal("M.ANU.RDV.ABS", mapped.Value.Annulation!.Motif!.Key); Assert.True(string.IsNullOrEmpty(mapped.Value.Annulation.Motif!.Label)); Assert.Null(mapped.Value.Annulation.Origine); } [Fact] public void Map_SansAnnulation_AucuneAnnulation() { var row = new OmikaModels.RDVPlanningRow { RVPKID = 9, GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", RVDate = new DateOnly(2026, 8, 19) }; CanonicalMappingResult mapped = OmikaMappers.OmikaRendezVousMapper.Map(row, null, null); Assert.Null(mapped.Value.Annulation); } }