Files

112 lines
5.0 KiB
Python

from app import db
from app.utils.time_utils import now_eastern
class SupportTicket(db.Model):
__tablename__ = 'support_tickets'
id = db.Column(db.Integer, primary_key=True)
customer_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'), nullable=True)
facility_id = db.Column(db.Integer, db.ForeignKey('facilities.id', ondelete='SET NULL'), nullable=True)
subject = db.Column(db.String(200), nullable=False)
body = db.Column(db.Text, nullable=False)
status = db.Column(db.String(20), nullable=False, default='open') # open / answered / closed
created_at = db.Column(db.DateTime, default=now_eastern, nullable=False)
customer = db.relationship('User', foreign_keys=[customer_id], backref='support_tickets')
facility = db.relationship('Facility', foreign_keys=[facility_id], backref='support_tickets')
replies = db.relationship(
'SupportTicketReply', backref='ticket',
cascade='all, delete-orphan',
order_by='SupportTicketReply.created_at',
lazy='dynamic',
)
def __repr__(self):
return f'<SupportTicket {self.id} [{self.status}]>'
class SupportTicketReply(db.Model):
__tablename__ = 'support_ticket_replies'
id = db.Column(db.Integer, primary_key=True)
ticket_id = db.Column(db.Integer, db.ForeignKey('support_tickets.id', ondelete='CASCADE'), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'), nullable=True)
body = db.Column(db.Text, nullable=False)
created_at = db.Column(db.DateTime, default=now_eastern, nullable=False)
author = db.relationship('User', foreign_keys=[user_id])
def __repr__(self):
return f'<SupportTicketReply {self.id} ticket={self.ticket_id}>'
# ── AI support-chat persistence (phase37) ─────────────────────────────────────
class SupportChatSession(db.Model):
"""One saved AI-chat conversation for a customer. Persisted so both the
customer and staff can reference past conversations and maintain continuity
(prior messages are reloaded into the chat window on return)."""
__tablename__ = 'support_chat_sessions'
id = db.Column(db.Integer, primary_key=True)
customer_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'),
nullable=False, index=True)
created_at = db.Column(db.DateTime, default=now_eastern, nullable=False)
updated_at = db.Column(db.DateTime, default=now_eastern, nullable=False, index=True)
customer = db.relationship('User', foreign_keys=[customer_id])
messages = db.relationship(
'SupportChatMessage', backref='session',
cascade='all, delete-orphan',
order_by='SupportChatMessage.created_at',
lazy='dynamic',
)
@property
def message_count(self):
return self.messages.count()
@property
def preview(self):
"""First user message, for list views."""
first = self.messages.filter_by(role='user').first()
return first.content if first else '(no messages)'
def __repr__(self):
return f'<SupportChatSession {self.id} customer={self.customer_id}>'
class SupportChatMessage(db.Model):
"""A single turn in a SupportChatSession. role = 'user' | 'assistant'."""
__tablename__ = 'support_chat_messages'
id = db.Column(db.Integer, primary_key=True)
session_id = db.Column(db.Integer, db.ForeignKey('support_chat_sessions.id', ondelete='CASCADE'),
nullable=False, index=True)
role = db.Column(db.String(16), nullable=False) # 'user' | 'assistant'
content = db.Column(db.Text, nullable=False)
created_at = db.Column(db.DateTime, default=now_eastern, nullable=False)
def __repr__(self):
return f'<SupportChatMessage {self.id} session={self.session_id} role={self.role}>'
class SupportKnowledge(db.Model):
"""Admin-curated knowledge entries injected into the AI support chat's system
prompt (phase38). Lets staff 'train' the chatbot's app knowledge without code
changes — each active entry is appended to the prompt on every chat request."""
__tablename__ = 'support_knowledge'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False) # topic / question
content = db.Column(db.Text, nullable=False) # the answer / knowledge
active = db.Column(db.Boolean, nullable=False, default=True)
sort_order = db.Column(db.Integer, nullable=False, default=0)
created_by = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'), nullable=True)
created_at = db.Column(db.DateTime, default=now_eastern, nullable=False)
updated_at = db.Column(db.DateTime, default=now_eastern, nullable=False)
def __repr__(self):
return f'<SupportKnowledge {self.id} "{self.title[:30]}" active={self.active}>'