# asteriacreations/portico architecture

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

- Interactive diagram: https://gitdiagram.com/asteriacreations/portico
- Repository: https://github.com/asteriacreations/portico

## Overview

Portico is a club membership and event-operations application centered on concurrent, per-event door check-in. Staff use the admin panel to find members, select events, apply admission and payment rules, and record attendance; an optional kiosk provides self check-in. Other major capabilities include membership and subscription administration, event and staff scheduling, register accounting, and analytics. The graph combines documented capabilities with relationships visible in sampled source; unsampled subsystems are represented at their existing directories, and links are omitted where call evidence was unavailable.

Main entry points: [`app/Http/Controllers/KioskCheckInController.php`](https://github.com/asteriacreations/portico/blob/main/app/Http/Controllers/KioskCheckInController.php) (Kiosk endpoints), [`app/Models/Member.php`](https://github.com/asteriacreations/portico/blob/main/app/Models/Member.php) (Member records), [`app/Models/Event.php`](https://github.com/asteriacreations/portico/blob/main/app/Models/Event.php) (Events), [`app/Services/CheckInService.php`](https://github.com/asteriacreations/portico/blob/main/app/Services/CheckInService.php) (Check-in processing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_door["Admission and check-in"]
  node_checkin["Check-in desk<br/>[CheckIn.php]"]
  node_admission["Admission decisions"]
  node_checkinservice["Check-in processing<br/>[CheckInService.php]"]
  node_attendance[("Attendance records<br/>[Attendance.php]")]
  node_kioskcontroller["Kiosk endpoints"]
  node_kioskservice["Kiosk scanning"]
end

subgraph group_membership["Members and payments"]
  node_members[("Member records<br/>[Member.php]")]
  node_subscriptions[("Subscriptions<br/>[Subscription.php]")]
  node_plans["Plans and coverage"]
  node_perks["Manager subscription perk"]
  node_memberadmin["Member administration"]
  node_registers["Register accounting"]
end

subgraph group_operations["Events and staffing"]
  node_events[("Events<br/>[Event.php]")]
  node_eventadmin["Event administration"]
  node_staffing["Staff scheduling<br/>[Staffing.php]"]
  node_shifts["Shift work records"]
end

subgraph group_platform["Admin and reporting"]
  node_settings[("Club settings")]
  node_analytics["Reports and analytics<br/>[Analytics.php]"]
  node_access["Role authorization"]
end

node_staff(("Door staff"))
node_tablet(("Kiosk tablet"))

node_staff -->|"uses"| node_checkin
node_checkin -.->|"processes check-in"| node_checkinservice
node_checkinservice -.->|"checks admission"| node_admission
node_checkinservice -.->|"records visits"| node_attendance
node_tablet -->|"scans codes"| node_kioskcontroller
node_kioskcontroller -->|"delegates scans"| node_kioskservice
node_kioskcontroller -->|"reads settings"| node_settings
node_kioskcontroller -->|"checks active events"| node_events
node_members -->|"has subscriptions"| node_subscriptions
node_plans -.->|"configures coverage"| node_subscriptions
node_perks -->|"creates subscription"| node_subscriptions
node_perks -->|"checks eligibility"| node_members
node_memberadmin -->|"manages records"| node_members
node_eventadmin -->|"manages events"| node_events
node_staffing -->|"reads event schedule"| node_events
node_staffing -->|"records shift work"| node_shifts
node_registers -->|"reads visit records"| node_attendance
node_analytics -.->|"reports on activity"| node_events
node_access -.->|"gates access"| node_members
node_settings -.->|"enables kiosk"| node_kioskcontroller

click node_members "https://github.com/asteriacreations/portico/blob/main/app/Models/Member.php"
click node_events "https://github.com/asteriacreations/portico/blob/main/app/Models/Event.php"
click node_checkin "https://github.com/asteriacreations/portico/blob/main/app/Filament/Admin/Pages/CheckIn.php"
click node_admission "https://github.com/asteriacreations/portico/blob/main/app/Services/AdmissionPolicy.php"
click node_checkinservice "https://github.com/asteriacreations/portico/blob/main/app/Services/CheckInService.php"
click node_attendance "https://github.com/asteriacreations/portico/blob/main/app/Models/Attendance.php"
click node_kioskcontroller "https://github.com/asteriacreations/portico/blob/main/app/Http/Controllers/KioskCheckInController.php"
click node_kioskservice "https://github.com/asteriacreations/portico/blob/main/app/Services/KioskCheckInService.php"
click node_settings "https://github.com/asteriacreations/portico/blob/main/app/Models/MembershipSetting.php"
click node_subscriptions "https://github.com/asteriacreations/portico/blob/main/app/Models/Subscription.php"
click node_plans "https://github.com/asteriacreations/portico/tree/main/app/Filament/Admin/Resources/Plans"
click node_perks "https://github.com/asteriacreations/portico/blob/main/app/Services/ManagerPerkService.php"
click node_memberadmin "https://github.com/asteriacreations/portico/tree/main/app/Filament/Admin/Resources/Members"
click node_eventadmin "https://github.com/asteriacreations/portico/tree/main/app/Filament/Admin/Resources/Events"
click node_staffing "https://github.com/asteriacreations/portico/blob/main/app/Filament/Admin/Pages/Staffing.php"
click node_shifts "https://github.com/asteriacreations/portico/blob/main/app/Services/ShiftWorkService.php"
click node_registers "https://github.com/asteriacreations/portico/blob/main/app/Services/RegisterShiftService.php"
click node_analytics "https://github.com/asteriacreations/portico/blob/main/app/Filament/Admin/Pages/Analytics.php"
click node_access "https://github.com/asteriacreations/portico/tree/main/app/Policies"

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_checkin,node_admission,node_checkinservice,node_attendance,node_kioskcontroller,node_kioskservice toneBlue
class node_members,node_subscriptions,node_plans,node_perks,node_memberadmin,node_registers toneAmber
class node_events,node_eventadmin,node_staffing,node_shifts toneMint
class node_settings,node_analytics,node_access toneRose
class node_staff,node_tablet toneIndigo
```

## Components

### Admission and check-in

- [Check-in desk](https://github.com/asteriacreations/portico/blob/main/app/Filament/Admin/Pages/CheckIn.php): `app/Filament/Admin/Pages/CheckIn.php`
- [Admission decisions](https://github.com/asteriacreations/portico/blob/main/app/Services/AdmissionPolicy.php): `app/Services/AdmissionPolicy.php`
- [Check-in processing](https://github.com/asteriacreations/portico/blob/main/app/Services/CheckInService.php): `app/Services/CheckInService.php`
- [Attendance records](https://github.com/asteriacreations/portico/blob/main/app/Models/Attendance.php): `app/Models/Attendance.php`
- [Kiosk endpoints](https://github.com/asteriacreations/portico/blob/main/app/Http/Controllers/KioskCheckInController.php): `app/Http/Controllers/KioskCheckInController.php`
- [Kiosk scanning](https://github.com/asteriacreations/portico/blob/main/app/Services/KioskCheckInService.php): `app/Services/KioskCheckInService.php`

### Members and payments

- [Member records](https://github.com/asteriacreations/portico/blob/main/app/Models/Member.php): `app/Models/Member.php`
- [Subscriptions](https://github.com/asteriacreations/portico/blob/main/app/Models/Subscription.php): `app/Models/Subscription.php`
- [Plans and coverage](https://github.com/asteriacreations/portico/tree/main/app/Filament/Admin/Resources/Plans): `app/Filament/Admin/Resources/Plans`
- [Manager subscription perk](https://github.com/asteriacreations/portico/blob/main/app/Services/ManagerPerkService.php): `app/Services/ManagerPerkService.php`
- [Member administration](https://github.com/asteriacreations/portico/tree/main/app/Filament/Admin/Resources/Members): `app/Filament/Admin/Resources/Members`
- [Register accounting](https://github.com/asteriacreations/portico/blob/main/app/Services/RegisterShiftService.php): `app/Services/RegisterShiftService.php`

### Events and staffing

- [Events](https://github.com/asteriacreations/portico/blob/main/app/Models/Event.php): `app/Models/Event.php`
- [Event administration](https://github.com/asteriacreations/portico/tree/main/app/Filament/Admin/Resources/Events): `app/Filament/Admin/Resources/Events`
- [Staff scheduling](https://github.com/asteriacreations/portico/blob/main/app/Filament/Admin/Pages/Staffing.php): `app/Filament/Admin/Pages/Staffing.php`
- [Shift work records](https://github.com/asteriacreations/portico/blob/main/app/Services/ShiftWorkService.php): `app/Services/ShiftWorkService.php`

### Admin and reporting

- [Club settings](https://github.com/asteriacreations/portico/blob/main/app/Models/MembershipSetting.php): `app/Models/MembershipSetting.php`
- [Reports and analytics](https://github.com/asteriacreations/portico/blob/main/app/Filament/Admin/Pages/Analytics.php): `app/Filament/Admin/Pages/Analytics.php`
- [Role authorization](https://github.com/asteriacreations/portico/tree/main/app/Policies): `app/Policies`

### Other components

- **Door staff**
- **Kiosk tablet**

## Connections

- Door staff → Check-in desk: uses (evidence: `README.md`)
- Check-in desk → Check-in processing: processes check-in
- Check-in processing → Admission decisions: checks admission
- Check-in processing → Attendance records: records visits
- Kiosk tablet → Kiosk endpoints: scans codes (evidence: `README.md`)
- Kiosk endpoints → Kiosk scanning: delegates scans (evidence: `app/Http/Controllers/KioskCheckInController.php`)
- Kiosk endpoints → Club settings: reads settings (evidence: `app/Http/Controllers/KioskCheckInController.php`)
- Kiosk endpoints → Events: checks active events (evidence: `app/Http/Controllers/KioskCheckInController.php`)
- Member records → Subscriptions: has subscriptions (evidence: `app/Models/Member.php`)
- Plans and coverage → Subscriptions: configures coverage
- Manager subscription perk → Subscriptions: creates subscription (evidence: `app/Services/ManagerPerkService.php`)
- Manager subscription perk → Member records: checks eligibility (evidence: `app/Services/ManagerPerkService.php`)
- Member administration → Member records: manages records (evidence: `README.md`)
- Event administration → Events: manages events (evidence: `README.md`)
- Staff scheduling → Events: reads event schedule (evidence: `app/Filament/Admin/Pages/Staffing.php`)
- Staff scheduling → Shift work records: records shift work (evidence: `app/Filament/Admin/Resources/Events/RelationManagers/ShiftSlotsRelationManager.php`)
- Register accounting → Attendance records: reads visit records (evidence: `app/Services/RegisterShiftService.php`)
- Reports and analytics → Events: reports on activity
- Role authorization → Member records: gates access
- Club settings → Kiosk endpoints: enables kiosk (evidence: `app/Http/Controllers/KioskCheckInController.php`)
