#nullable enable using Baya.Domain.Entities.Catalog; using Baya.Domain.Entities.Verification; using Baya.Infrastructure.Persistence.Configuration.GeographyConfig; namespace Baya.Infrastructure.Persistence.Services.Seeding; /// /// The static, deterministic description of the Development demo marketplace the /// materialises. Kept as plain data (not inline in the seeder) so the exact demo world — the phone numbers a /// developer logs in with, which nurse is verified, the priced variants and coverage — reads at a glance and /// stays the single source of truth for the runbook / frontend de-mock hand-off. /// /// All money is IRR Rials as an integer (no Toman, no float). Category ids are the fixed catalog seed /// ids (1…5); the Tehran city id and district ids are the fixed geography seed ids. /// /// internal static class DemoWorldDefinitions { public const long TehranCityId = GeographySeed.TehranCityId; // Tehran municipal district ids from the geography seed (1000 + n). public const long District1 = 1001; public const long District2 = 1002; public const long District3 = 1003; public const long District6 = 1006; public const long District12 = 1012; // Catalog category ids from the catalog seed. public const long ElderlyCare = 1; public const long PostSurgery = 2; public const long InfantCare = 3; public const long ChronicIllness = 4; /// The single cross-category, required demo pricing dimension (شیفت / shift type). Seeding it in /// Development gives the frontend variant builder a required option-group to render on the real path /// (the "fresh catalog has categories but no option groups" data gap) without polluting a production DB. public const string ShiftGroupNameEn = "Shift Type"; public const string ShiftGroupNameFa = "نوع شیفت"; public const string ShiftDaytime = "Daytime"; public const string ShiftNight = "Night"; public const string ShiftLiveIn = "Live-in"; public static readonly (string NameFa, string NameEn)[] ShiftValues = [ ("روزانه", ShiftDaytime), ("شبانه", ShiftNight), ("شبانه‌روزی", ShiftLiveIn), ]; public static readonly NursePersona[] Nurses = [ new NursePersona( Phone: "09120000001", UserName: "demo_nurse_azizi", Name: "زهرا", FamilyName: "عزیزی", Gender: "female", NationalId: "0012345678", Bio: "پرستار سالمند با هشت سال سابقه مراقبت در منزل.", YearsOfExperience: 8, IsVerified: true, Credentials: [ new CredentialDef(CredentialTypes.MohCompetencyLicense, "پروانه صلاحیت وزارت بهداشت", "MOH-84512"), new CredentialDef(CredentialTypes.CriminalRecord, "گواهی عدم سوء پیشینه", "CR-2025-1187"), ], Bank: new BankDef("بانک ملت", "زهرا عزیزی", "IR820170000000123456789012", MatchedNationalId: true), Variants: [ new VariantDef(ElderlyCare, PriceUnits.Per24H, 3_500_000, SessionCount: null, ShiftLiveIn, "مراقبت شبانه‌روزی سالمند"), new VariantDef(ElderlyCare, PriceUnits.PerHour, 250_000, SessionCount: null, ShiftDaytime, "مراقبت ساعتی سالمند"), new VariantDef(PostSurgery, PriceUnits.PerDay, 2_000_000, SessionCount: null, ShiftDaytime, "مراقبت روزانه پس از جراحی"), ], Areas: [ new AreaDef(TehranCityId, null), // whole-city Tehran new AreaDef(TehranCityId, District1), new AreaDef(TehranCityId, District3), ]), new NursePersona( Phone: "09120000002", UserName: "demo_nurse_karimi", Name: "علی", FamilyName: "کریمی", Gender: "male", NationalId: "0023456789", Bio: "پرستار مراقبت پس از جراحی و بیماری‌های مزمن.", YearsOfExperience: 5, IsVerified: true, Credentials: [ new CredentialDef(CredentialTypes.MohCompetencyLicense, "پروانه صلاحیت وزارت بهداشت", "MOH-77120"), ], Bank: new BankDef("بانک ملی", "علی کریمی", "IR330120000000098765432101", MatchedNationalId: true), Variants: [ new VariantDef(ChronicIllness, PriceUnits.PerDay, 1_800_000, SessionCount: null, ShiftDaytime, "مدیریت روزانه بیماری مزمن"), new VariantDef(PostSurgery, PriceUnits.Per24H, 3_200_000, SessionCount: null, ShiftLiveIn, "مراقبت شبانه‌روزی پس از جراحی"), ], Areas: [ new AreaDef(TehranCityId, District3), new AreaDef(TehranCityId, District6), new AreaDef(TehranCityId, District12), ]), // Unverified: has a profile + a variant + a covered area, but is_verified=0 so the search-index // maintainer computes is_searchable=0 and this nurse must never surface in discovery. new NursePersona( Phone: "09120000003", UserName: "demo_nurse_ahmadi", Name: "مریم", FamilyName: "احمدی", Gender: "female", NationalId: null, Bio: "در انتظار تکمیل مراحل احراز هویت.", YearsOfExperience: 2, IsVerified: false, Credentials: [], Bank: null, Variants: [ new VariantDef(InfantCare, PriceUnits.PerSession, 800_000, SessionCount: 1, ShiftDaytime, "مراقبت جلسه‌ای نوزاد"), ], Areas: [ new AreaDef(TehranCityId, District2), ]), ]; public static readonly CustomerPersona[] Customers = [ new CustomerPersona( Phone: "09120000010", UserName: "demo_customer_mohammadi", Name: "سارا", FamilyName: "محمدی", Gender: "female", EmergencyContactName: "بهرام محمدی", EmergencyContactPhone: "09121110010", Patients: [ new PatientDef("حسن محمدی", "حسن", "محمدی", "male", new DateOnly(1948, 3, 15), "A+", "سابقه فشار خون و دیابت."), new PatientDef("فاطمه محمدی", "فاطمه", "محمدی", "female", new DateOnly(1955, 9, 2), "O+", "بدون سابقه بیماری خاص."), ], Addresses: [ new AddressDef("خانه", District3, "تهران، ونک، خیابان ملاصدرا، پلاک ۱۲", "1991834511", "بهرام محمدی", "09121110010", 35.7595m, 51.4100m, IsPrimary: true), ]), new CustomerPersona( Phone: "09120000011", UserName: "demo_customer_hosseini", Name: "رضا", FamilyName: "حسینی", Gender: "male", EmergencyContactName: "نازنین حسینی", EmergencyContactPhone: "09121110011", Patients: [ new PatientDef("امیرعلی حسینی", "امیرعلی", "حسینی", "male", new DateOnly(2025, 1, 20), "B+", "نوزاد سالم، نیازمند مراقبت روزانه."), ], Addresses: [ new AddressDef("خانه", District6, "تهران، سعادت‌آباد، بلوار دریا، پلاک ۴۵", "1998765432", "نازنین حسینی", "09121110011", 35.7870m, 51.3760m, IsPrimary: true), ]), ]; } internal sealed record NursePersona( string Phone, string UserName, string Name, string FamilyName, string Gender, string? NationalId, string Bio, int YearsOfExperience, bool IsVerified, CredentialDef[] Credentials, BankDef? Bank, VariantDef[] Variants, AreaDef[] Areas); internal sealed record CredentialDef(string Type, string IssuingAuthority, string Number); internal sealed record BankDef(string BankName, string AccountHolderName, string Iban, bool MatchedNationalId); internal sealed record VariantDef( long CategoryId, string PriceUnit, long Price, int? SessionCount, string ShiftValueEn, string DisplayName); internal sealed record AreaDef(long CityId, long? DistrictId); internal sealed record CustomerPersona( string Phone, string UserName, string Name, string FamilyName, string Gender, string EmergencyContactName, string EmergencyContactPhone, PatientDef[] Patients, AddressDef[] Addresses); internal sealed record PatientDef( string DisplayName, string FirstName, string LastName, string Gender, DateOnly BirthDate, string BloodType, string InitialMedicalNotes); internal sealed record AddressDef( string Title, long DistrictId, string AddressLine, string PostalCode, string RecipientName, string RecipientPhone, decimal Latitude, decimal Longitude, bool IsPrimary);