# retailcrm/specialist-booking architecture

> Architecture diagram of the GitHub repository retailcrm/specialist-booking, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/retailcrm/specialist-booking
- Repository: https://github.com/retailcrm/specialist-booking

## Overview

Specialist Booking is a Symfony backend plus an embedded Vue module for RetailCRM/Simla. CRM administrators configure specialists, specialties, branches, and working calendars; the booking UI (or agent API) obtains availability, then records the selected specialist and appointment time on a CRM order. The README documents availability as accounting for existing orders and CRM working/non-working-day settings. The graph preserves setup, administration, booking, and agent-facing capabilities; source excerpts are partial, so unsampled controller wiring is not expanded beyond supported relationships.

Main entry points: [`src/Controller/AdminCalendarController.php`](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AdminCalendarController.php) (Schedule calendar), [`src/Controller/AccountController.php`](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AccountController.php) (Account onboarding), [`embed/src/booking/index.ts`](https://github.com/retailcrm/specialist-booking/blob/master/embed/src/booking/index.ts) (Admin interface), [`src/Controller/AdminSpecialistController.php`](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AdminSpecialistController.php) (Specialist management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_setup["CRM Setup"]
  node_account_setup["Account onboarding"]
  node_account_service["CRM account client<br/>[AccountManager.php]"]
  node_registration["Module registration"]
  node_custom_fields["Order custom fields"]
end

subgraph group_admin["Specialist Admin"]
  node_admin_ui["Admin interface<br/>[index.ts]"]
  node_admin_specialists["Specialist management"]
  node_admin_calendar["Schedule calendar"]
  node_admin_settings["Booking settings"]
end

subgraph group_booking["Booking Runtime"]
  node_embed_ui["Booking embed"]
  node_embed_api["Booking API"]
  node_agent_api["Agent booking API"]
  node_schedule["Slot scheduling"]
  node_busy_slots["CRM busy slots"]
  node_order_reader["Booking reader"]
  node_order_writer["Booking writer"]
end

subgraph group_data["Domain Data"]
  node_specialist_repo["Specialist repository"]
  node_specialty_repo["Specialty repository"]
  node_preference_repo["User preferences"]
  node_domain_store[("Booking domain records<br/>[Specialist.php]")]
end

node_crm_admin(("CRM administrator"))
node_customer(("Booking customer"))
node_agent(("AI agent"))
node_crm["RetailCRM / Simla"]

node_crm_admin -->|"registers account"| node_account_setup
node_account_setup -->|"creates CRM client"| node_account_service
node_account_setup -->|"registers module"| node_registration
node_account_setup -->|"ensures fields"| node_custom_fields
node_registration -->|"registers module"| node_crm
node_custom_fields -->|"creates order fields"| node_crm
node_crm_admin -->|"configures booking"| node_admin_ui
node_admin_ui -->|"manages specialists"| node_admin_specialists
node_admin_ui -->|"views schedule"| node_admin_calendar
node_admin_ui -->|"updates settings"| node_admin_settings
node_admin_specialists -->|"loads specialists"| node_specialist_repo
node_admin_specialists -->|"loads specialties"| node_specialty_repo
node_admin_specialists -->|"persists changes"| node_domain_store
node_admin_calendar -->|"loads specialists"| node_specialist_repo
node_admin_calendar -->|"computes free slots"| node_schedule
node_admin_calendar -->|"loads bookings"| node_order_reader
node_admin_calendar -->|"reads preferences"| node_preference_repo
node_customer -->|"selects appointment"| node_embed_ui
node_embed_ui -->|"requests availability"| node_embed_api
node_embed_api -->|"finds specialists"| node_specialist_repo
node_embed_api -->|"computes availability"| node_schedule
node_schedule -->|"checks busy times"| node_busy_slots
node_busy_slots -->|"loads branches and schedules"| node_crm
node_agent -->|"requests booking"| node_agent_api
node_agent_api -->|"finds specialists"| node_specialist_repo
node_agent_api -->|"validates slot"| node_schedule
node_agent_api -->|"writes appointment"| node_order_writer
node_order_writer -->|"updates order"| node_crm
node_order_reader -->|"reads orders"| node_crm
node_admin_calendar -->|"searches customers"| node_crm

click node_account_setup "https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AccountController.php"
click node_account_service "https://github.com/retailcrm/specialist-booking/blob/master/src/Service/AccountManager.php"
click node_registration "https://github.com/retailcrm/specialist-booking/blob/master/src/Service/CrmModuleRegistration.php"
click node_custom_fields "https://github.com/retailcrm/specialist-booking/blob/master/src/Service/CustomFieldManager.php"
click node_embed_ui "https://github.com/retailcrm/specialist-booking/blob/master/embed/src/booking/BookingExtension.vue"
click node_embed_api "https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/EmbedApiController.php"
click node_agent_api "https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AgentApiController.php"
click node_schedule "https://github.com/retailcrm/specialist-booking/blob/master/src/Service/SpecialistSchedule.php"
click node_busy_slots "https://github.com/retailcrm/specialist-booking/blob/master/src/Service/SpecialistBusySlotFetcher.php"
click node_order_reader "https://github.com/retailcrm/specialist-booking/blob/master/src/Service/OrderBookingReader.php"
click node_order_writer "https://github.com/retailcrm/specialist-booking/blob/master/src/Service/OrderBookingWriter.php"
click node_admin_ui "https://github.com/retailcrm/specialist-booking/blob/master/embed/src/booking/index.ts"
click node_admin_specialists "https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AdminSpecialistController.php"
click node_admin_calendar "https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AdminCalendarController.php"
click node_admin_settings "https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AdminSettingsController.php"
click node_specialist_repo "https://github.com/retailcrm/specialist-booking/blob/master/src/Repository/SpecialistRepository.php"
click node_specialty_repo "https://github.com/retailcrm/specialist-booking/blob/master/src/Repository/SpecialtyRepository.php"
click node_preference_repo "https://github.com/retailcrm/specialist-booking/blob/master/src/Repository/UserPreferenceRepository.php"
click node_domain_store "https://github.com/retailcrm/specialist-booking/blob/master/src/Entity/Specialist.php"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_account_setup,node_account_service,node_registration,node_custom_fields toneBlue
class node_admin_ui,node_admin_specialists,node_admin_calendar,node_admin_settings toneAmber
class node_embed_ui,node_embed_api,node_agent_api,node_schedule,node_busy_slots,node_order_reader,node_order_writer toneMint
class node_specialist_repo,node_specialty_repo,node_preference_repo,node_domain_store toneRose
class node_crm_admin,node_customer,node_agent,node_crm toneIndigo
```

## Components

### CRM Setup

- [Account onboarding](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AccountController.php): `src/Controller/AccountController.php`
- [CRM account client](https://github.com/retailcrm/specialist-booking/blob/master/src/Service/AccountManager.php): `src/Service/AccountManager.php`
- [Module registration](https://github.com/retailcrm/specialist-booking/blob/master/src/Service/CrmModuleRegistration.php): `src/Service/CrmModuleRegistration.php`
- [Order custom fields](https://github.com/retailcrm/specialist-booking/blob/master/src/Service/CustomFieldManager.php): `src/Service/CustomFieldManager.php`

### Specialist Admin

- [Admin interface](https://github.com/retailcrm/specialist-booking/blob/master/embed/src/booking/index.ts): `embed/src/booking/index.ts`
- [Specialist management](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AdminSpecialistController.php): `src/Controller/AdminSpecialistController.php`
- [Schedule calendar](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AdminCalendarController.php): `src/Controller/AdminCalendarController.php`
- [Booking settings](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AdminSettingsController.php): `src/Controller/AdminSettingsController.php`

### Booking Runtime

- [Booking embed](https://github.com/retailcrm/specialist-booking/blob/master/embed/src/booking/BookingExtension.vue): `embed/src/booking/BookingExtension.vue`
- [Booking API](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/EmbedApiController.php): `src/Controller/EmbedApiController.php`
- [Agent booking API](https://github.com/retailcrm/specialist-booking/blob/master/src/Controller/AgentApiController.php): `src/Controller/AgentApiController.php`
- [Slot scheduling](https://github.com/retailcrm/specialist-booking/blob/master/src/Service/SpecialistSchedule.php): `src/Service/SpecialistSchedule.php`
- [CRM busy slots](https://github.com/retailcrm/specialist-booking/blob/master/src/Service/SpecialistBusySlotFetcher.php): `src/Service/SpecialistBusySlotFetcher.php`
- [Booking reader](https://github.com/retailcrm/specialist-booking/blob/master/src/Service/OrderBookingReader.php): `src/Service/OrderBookingReader.php`
- [Booking writer](https://github.com/retailcrm/specialist-booking/blob/master/src/Service/OrderBookingWriter.php): `src/Service/OrderBookingWriter.php`

### Domain Data

- [Specialist repository](https://github.com/retailcrm/specialist-booking/blob/master/src/Repository/SpecialistRepository.php): `src/Repository/SpecialistRepository.php`
- [Specialty repository](https://github.com/retailcrm/specialist-booking/blob/master/src/Repository/SpecialtyRepository.php): `src/Repository/SpecialtyRepository.php`
- [User preferences](https://github.com/retailcrm/specialist-booking/blob/master/src/Repository/UserPreferenceRepository.php): `src/Repository/UserPreferenceRepository.php`
- [Booking domain records](https://github.com/retailcrm/specialist-booking/blob/master/src/Entity/Specialist.php): `src/Entity/Specialist.php`

### Other components

- **CRM administrator**
- **Booking customer**
- **AI agent**
- **RetailCRM / Simla**

## Connections

- CRM administrator → Account onboarding: registers account
- Account onboarding → CRM account client: creates CRM client
- Account onboarding → Module registration: registers module
- Account onboarding → Order custom fields: ensures fields
- Module registration → RetailCRM / Simla: registers module
- Order custom fields → RetailCRM / Simla: creates order fields
- CRM administrator → Admin interface: configures booking
- Admin interface → Specialist management: manages specialists
- Admin interface → Schedule calendar: views schedule
- Admin interface → Booking settings: updates settings
- Specialist management → Specialist repository: loads specialists
- Specialist management → Specialty repository: loads specialties
- Specialist management → Booking domain records: persists changes
- Schedule calendar → Specialist repository: loads specialists
- Schedule calendar → Slot scheduling: computes free slots
- Schedule calendar → Booking reader: loads bookings
- Schedule calendar → User preferences: reads preferences
- Booking customer → Booking embed: selects appointment
- Booking embed → Booking API: requests availability
- Booking API → Specialist repository: finds specialists
- Booking API → Slot scheduling: computes availability
- Slot scheduling → CRM busy slots: checks busy times
- CRM busy slots → RetailCRM / Simla: loads branches and schedules
- AI agent → Agent booking API: requests booking
- Agent booking API → Specialist repository: finds specialists
- Agent booking API → Slot scheduling: validates slot
- Agent booking API → Booking writer: writes appointment
- Booking writer → RetailCRM / Simla: updates order
- Booking reader → RetailCRM / Simla: reads orders
- Schedule calendar → RetailCRM / Simla: searches customers
