Consigne : scheduling, calendriers et liste d'attente
Vous construisez la moitié du contexte délimité scheduling (le cœur). Nom du worker :
scheduling-calendar. Un autre worker, scheduling-appointment, construit l'autre moitié dans
le même dossier au même moment.
Périmètre
- Vous possédez : les agrégats
CalendaretWaitlistavec leurs objets-valeurs, repositories, builders et tables ; la projection des praticiens ; les commandes, requêtes et routes des lignes 18, 19, 20, 28, 29 ; le portSchedulingRelationshipset son adaptateur (ligne 21 : vous les créez avec la méthode des calendriers ; l'autre worker ajoute la méthode des rendez-vous). - Vous ne touchez pas :
Appointment, leScheduler, les commandes des rendez-vous, la projection de l'agenda, les politiques. Fichiers partagés du contexte (scheduling.permissions.ts,create-scheduling-tables.schema.ts,scheduling.schema.ts,scheduling.routes.ts,CONTEXT.md) : les générateurs les écrivent ; quand vous en modifiez un à la main, relisez-le juste avant et ne changez que vos lignes. - Générateurs que vous pouvez lancer : value-object, entity, domain-event, error, domain-service, command, query, route, port, adapter, event-handler, builder, e2e.
La jonction avec scheduling-appointment, fixée : ils génèrent l'objet-valeur Slot en premier
(Slot.between(startsAt, endsAt, heldUntil) : début, fin du rendez-vous, fin de ce qu'il occupe
avec le battement ; overlaps(other)). Vous fournissez sur Calendar, aussi tôt que vous le
pouvez, même avant que les règles qui sont derrière soient complètes :
slotFor(appointmentTypeId: string, startsAt: Date, now: Date): Slot (lève les erreurs de
disponibilité de la règle 22 : OUTSIDE_AVAILABILITY, OFF_GRID, BOOKING_TOO_LATE,
BOOKING_TOO_FAR, UNKNOWN_APPOINTMENT_TYPE), confirmationDeadlineFor(appointmentTypeId, now): Date | undefined
(défini quand le type demande une confirmation), et les accesseurs practiceId, practitionerId,
limit (les rendez-vous futurs qu'un patient peut détenir), timeZone (un objet-valeur avec
dayOf(instant): string, YYYY-MM-DD à l'horloge murale du cabinet, écrit sans aucune
bibliothèque : Intl.DateTimeFormat suffit). Ne leur dites rien d'autre : ils lisent votre
agrégat. Pour la ligne 29, vous avez besoin de leur fabrique Appointment.request(...) : faites
cette ligne en dernier.
Tranches, dans cet ordre : 18, 19, 21 (partie calendrier), 20, 28, 29. Les projections n'ont pas de
générateur : écrivez application/projections/<name>.projection.ts d'après le README de
@ddd-ts-kit/kernel (« Projections ») et de @ddd-ts-kit/knex (« Read models »), et rapportez ce
qu'en dit le checker. La ligne 28 lit le modèle de lecture de l'agenda que scheduling-appointment
construit à la ligne 26 : ne vous accordez sur rien, lisez leur port quand il existe ; s'il n'existe
pas encore quand vous y arrivez, faites d'abord la 29.
Terminé quand : vos lignes sont construites et testées (jours de changement d'heure
d'Europe/Paris compris pour les disponibilités), aucun marqueur ne reste dans vos fichiers, eslint,
vitest et check sont propres sur vos fichiers. Suivez docs/architecture/briefings/README.md pour
les règles communes et le rapport.