diagram

Data model ERD (Mermaid)

Rendering diagram...
erDiagram USER { string userId PK } USER_METADATA { string userId PK string name string email string updatedAt } USER_CONTACT { string userId PK string email string updatedAt } VENUE { string id PK string name number latitude number longitude string address string phone string hours string photo } CHECKIN { string id PK string userId string venueId string gpsStatus number latitude number longitude string checkinType string createdAt } FEEDBACK { string id PK string checkinId string userId string venueId string overallRating string recommendedDish string additionalNotes string createdAt string restaurantReply string replyAt string replyBy string editedAt } VOUCHER { string id PK string userId string venueId string code string title string description string status string issuedAt string expiresAt string redeemedAt } SCHEDULED_NOTIFICATION { string id PK string checkinId string userId string venueId string scheduledFor boolean sent string sentAt string createdAt } PUSH_SUBSCRIPTION { string id PK string userId string endpoint string p256dh string auth string createdAt } SCHEDULED_EMAIL_REMINDER { string id PK string checkinId string userId string venueId string scheduledFor string status number attempts string lastError string sentAt string createdAt string updatedAt } VENUE_REWARD_CONFIG { string venueId PK string programName string updatedAt } VENUE_REWARD_PRIZE { string id PK string venueId string code string title string description number checkinCount string triggerType boolean enabled number expirationDays } USER ||--o| USER_METADATA : "has" USER ||--o| USER_CONTACT : "has" VENUE ||--o{ CHECKIN : "venueId" USER ||--o{ CHECKIN : "userId" CHECKIN ||--o| FEEDBACK : "checkinId" USER ||--o{ FEEDBACK : "userId" VENUE ||--o{ FEEDBACK : "venueId" USER ||--o{ VOUCHER : "userId" VENUE ||--o{ VOUCHER : "venueId" CHECKIN ||--o{ SCHEDULED_NOTIFICATION : "checkinId" USER ||--o{ SCHEDULED_NOTIFICATION : "userId" VENUE ||--o{ SCHEDULED_NOTIFICATION : "venueId" USER ||--o{ PUSH_SUBSCRIPTION : "userId" CHECKIN ||--o{ SCHEDULED_EMAIL_REMINDER : "checkinId" USER ||--o{ SCHEDULED_EMAIL_REMINDER : "userId" VENUE ||--o{ SCHEDULED_EMAIL_REMINDER : "venueId" VENUE ||--|| VENUE_REWARD_CONFIG : "config" VENUE_REWARD_CONFIG ||--o{ VENUE_REWARD_PRIZE : "prizes (embedded)"
Mermaid source
erDiagram
  USER {
    string userId PK
  }

  USER_METADATA {
    string userId PK
    string name
    string email
    string updatedAt
  }

  USER_CONTACT {
    string userId PK
    string email
    string updatedAt
  }

  VENUE {
    string id PK
    string name
    number latitude
    number longitude
    string address
    string phone
    string hours
    string photo
  }

  CHECKIN {
    string id PK
    string userId
    string venueId
    string gpsStatus
    number latitude
    number longitude
    string checkinType
    string createdAt
  }

  FEEDBACK {
    string id PK
    string checkinId
    string userId
    string venueId
    string overallRating
    string recommendedDish
    string additionalNotes
    string createdAt
    string restaurantReply
    string replyAt
    string replyBy
    string editedAt
  }

  VOUCHER {
    string id PK
    string userId
    string venueId
    string code
    string title
    string description
    string status
    string issuedAt
    string expiresAt
    string redeemedAt
  }

  SCHEDULED_NOTIFICATION {
    string id PK
    string checkinId
    string userId
    string venueId
    string scheduledFor
    boolean sent
    string sentAt
    string createdAt
  }

  PUSH_SUBSCRIPTION {
    string id PK
    string userId
    string endpoint
    string p256dh
    string auth
    string createdAt
  }

  SCHEDULED_EMAIL_REMINDER {
    string id PK
    string checkinId
    string userId
    string venueId
    string scheduledFor
    string status
    number attempts
    string lastError
    string sentAt
    string createdAt
    string updatedAt
  }

  VENUE_REWARD_CONFIG {
    string venueId PK
    string programName
    string updatedAt
  }

  VENUE_REWARD_PRIZE {
    string id PK
    string venueId
    string code
    string title
    string description
    number checkinCount
    string triggerType
    boolean enabled
    number expirationDays
  }

  USER ||--o| USER_METADATA : "has"
  USER ||--o| USER_CONTACT : "has"

  VENUE ||--o{ CHECKIN : "venueId"
  USER  ||--o{ CHECKIN : "userId"

  CHECKIN ||--o| FEEDBACK : "checkinId"
  USER    ||--o{ FEEDBACK : "userId"
  VENUE   ||--o{ FEEDBACK : "venueId"

  USER  ||--o{ VOUCHER : "userId"
  VENUE ||--o{ VOUCHER : "venueId"

  CHECKIN ||--o{ SCHEDULED_NOTIFICATION : "checkinId"
  USER    ||--o{ SCHEDULED_NOTIFICATION : "userId"
  VENUE   ||--o{ SCHEDULED_NOTIFICATION : "venueId"

  USER ||--o{ PUSH_SUBSCRIPTION : "userId"

  CHECKIN ||--o{ SCHEDULED_EMAIL_REMINDER : "checkinId"
  USER    ||--o{ SCHEDULED_EMAIL_REMINDER : "userId"
  VENUE   ||--o{ SCHEDULED_EMAIL_REMINDER : "venueId"

  VENUE ||--|| VENUE_REWARD_CONFIG : "config"
  VENUE_REWARD_CONFIG ||--o{ VENUE_REWARD_PRIZE : "prizes (embedded)"

diagram (DB real style)

Core (Users/Venues/Check-ins/Feedback/Vouchers)
erDiagram USERS { uuid id PK string email } VENUES { uuid id PK string name } CHECKINS { uuid id PK uuid user_id uuid venue_id string checkin_type string gps_status timestamp created_at } FEEDBACKS { uuid id PK uuid checkin_id string overall_rating timestamp created_at timestamp updated_at } VOUCHERS { uuid id PK uuid user_id uuid awarded_checkin_id string status timestamp issued_at timestamp redeemed_at } USERS ||--o{ CHECKINS : user_id VENUES ||--o{ CHECKINS : venue_id CHECKINS ||--o| FEEDBACKS : checkin_id USERS ||--o{ VOUCHERS : user_id CHECKINS ||--o{ VOUCHERS : awarded_checkin_id
Mermaid source (Core)
erDiagram
  USERS {
    uuid id PK
    string email
  }

  VENUES {
    uuid id PK
    string name
  }

  CHECKINS {
    uuid id PK
    uuid user_id
    uuid venue_id
    string checkin_type
    string gps_status
    timestamp created_at
  }

  FEEDBACKS {
    uuid id PK
    uuid checkin_id
    string overall_rating
    timestamp created_at
    timestamp updated_at
  }

  VOUCHERS {
    uuid id PK
    uuid user_id
    uuid awarded_checkin_id
    string status
    timestamp issued_at
    timestamp redeemed_at
  }

  USERS ||--o{ CHECKINS : user_id
  VENUES ||--o{ CHECKINS : venue_id
  CHECKINS ||--o| FEEDBACKS : checkin_id
  USERS ||--o{ VOUCHERS : user_id
  CHECKINS ||--o{ VOUCHERS : awarded_checkin_id
Rewards (Programs/Prizes)
erDiagram VENUES { uuid id PK string name } REWARD_PROGRAMS { uuid id PK uuid venue_id string program_name } REWARD_PRIZES { uuid id PK uuid reward_program_id string code string title string trigger_type boolean enabled int checkin_count int expiration_days } VOUCHERS { uuid id PK uuid prize_id string status timestamp issued_at } VENUES ||--o{ REWARD_PROGRAMS : venue_id REWARD_PROGRAMS ||--o{ REWARD_PRIZES : reward_program_id REWARD_PRIZES ||--o{ VOUCHERS : prize_id
Mermaid source (Rewards)
erDiagram
  VENUES {
    uuid id PK
    string name
  }

  REWARD_PROGRAMS {
    uuid id PK
    uuid venue_id
    string program_name
  }

  REWARD_PRIZES {
    uuid id PK
    uuid reward_program_id
    string code
    string title
    string trigger_type
    boolean enabled
    int checkin_count
    int expiration_days
  }

  VOUCHERS {
    uuid id PK
    uuid prize_id
    string status
    timestamp issued_at
  }

  VENUES ||--o{ REWARD_PROGRAMS : venue_id
  REWARD_PROGRAMS ||--o{ REWARD_PRIZES : reward_program_id
  REWARD_PRIZES ||--o{ VOUCHERS : prize_id
Comms (Push/Notification log)
erDiagram USERS { uuid id PK string email } VENUES { uuid id PK string name } CHECKINS { uuid id PK uuid user_id uuid venue_id timestamp created_at } PUSH_SUBSCRIPTIONS { uuid id PK uuid user_id string endpoint timestamp created_at timestamp updated_at } COMMUNICATION_LOG { uuid id PK string channel_type string status uuid checkin_id uuid user_id uuid venue_id timestamp scheduled_for int attempts string last_error timestamp sent_at timestamp created_at timestamp updated_at } USERS ||--o{ PUSH_SUBSCRIPTIONS : user_id USERS ||--o{ COMMUNICATION_LOG : user_id VENUES ||--o{ COMMUNICATION_LOG : venue_id CHECKINS ||--o{ COMMUNICATION_LOG : checkin_id
Mermaid source (Comms)
erDiagram
  USERS {
    uuid id PK
    string email
  }

  VENUES {
    uuid id PK
    string name
  }

  CHECKINS {
    uuid id PK
    uuid user_id
    uuid venue_id
    timestamp created_at
  }

  PUSH_SUBSCRIPTIONS {
    uuid id PK
    uuid user_id
    string endpoint
    timestamp created_at
    timestamp updated_at
  }

  COMMUNICATION_LOG {
    uuid id PK
    string channel_type
    string status
    uuid checkin_id
    uuid user_id
    uuid venue_id
    timestamp scheduled_for
    int attempts
    string last_error
    timestamp sent_at
    timestamp created_at
    timestamp updated_at
  }

  USERS ||--o{ PUSH_SUBSCRIPTIONS : user_id
  USERS ||--o{ COMMUNICATION_LOG : user_id
  VENUES ||--o{ COMMUNICATION_LOG : venue_id
  CHECKINS ||--o{ COMMUNICATION_LOG : checkin_id