Files
Hotel-Booking/Frontend/src/features/guest_management/services/complaintService.ts
Iliyan Angelov 7acf05e186 big update
2025-12-12 01:48:04 +02:00

140 lines
3.5 KiB
TypeScript

/**
* Service for managing guest complaints
*/
import apiClient from '../../../shared/services/apiClient';
export interface Complaint {
id: number;
title: string;
description: string;
category: string;
priority: 'low' | 'medium' | 'high' | 'urgent';
status: 'open' | 'in_progress' | 'resolved' | 'closed' | 'escalated';
guest_id: number;
booking_id?: number;
room_id?: number;
assigned_to?: number;
resolution?: string;
resolved_at?: string;
resolved_by?: number;
guest_satisfaction_rating?: number;
guest_feedback?: string;
internal_notes?: string;
attachments?: string[];
requires_follow_up: boolean;
follow_up_date?: string;
created_at: string;
updated_at: string;
updates?: ComplaintUpdate[];
}
export interface ComplaintUpdate {
id: number;
update_type: string;
description: string;
updated_by: number;
created_at: string;
}
export interface CreateComplaintRequest {
booking_id?: number;
room_id?: number;
category: string;
priority?: string;
title: string;
description: string;
attachments?: string[];
}
export interface UpdateComplaintRequest {
status?: string;
priority?: string;
assigned_to?: number;
resolution?: string;
internal_notes?: string;
requires_follow_up?: boolean;
follow_up_date?: string;
}
export interface ResolveComplaintRequest {
resolution: string;
guest_satisfaction_rating?: number;
guest_feedback?: string;
}
export interface AddComplaintUpdateRequest {
update_type: string;
description: string;
metadata?: Record<string, unknown>;
}
export interface ComplaintFilters {
status?: string;
priority?: string;
category?: string;
assigned_to?: number;
page?: number;
limit?: number;
}
const complaintService = {
/**
* Create a new complaint
*/
async createComplaint(data: CreateComplaintRequest) {
const response = await apiClient.post('/complaints', data);
return response.data;
},
/**
* Get complaints with filters
*/
async getComplaints(filters: ComplaintFilters = {}) {
const params = new URLSearchParams();
if (filters.status) params.append('status', filters.status);
if (filters.priority) params.append('priority', filters.priority);
if (filters.category) params.append('category', filters.category);
if (filters.assigned_to) params.append('assigned_to', filters.assigned_to.toString());
if (filters.page) params.append('page', filters.page.toString());
if (filters.limit) params.append('limit', filters.limit.toString());
const response = await apiClient.get(`/complaints?${params.toString()}`);
return response.data;
},
/**
* Get a specific complaint
*/
async getComplaint(complaintId: number) {
const response = await apiClient.get(`/complaints/${complaintId}`);
return response.data;
},
/**
* Update a complaint (admin/staff only)
*/
async updateComplaint(complaintId: number, data: UpdateComplaintRequest) {
const response = await apiClient.put(`/complaints/${complaintId}`, data);
return response.data;
},
/**
* Resolve a complaint (admin/staff only)
*/
async resolveComplaint(complaintId: number, data: ResolveComplaintRequest) {
const response = await apiClient.post(`/complaints/${complaintId}/resolve`, data);
return response.data;
},
/**
* Add an update to a complaint
*/
async addComplaintUpdate(complaintId: number, data: AddComplaintUpdateRequest) {
const response = await apiClient.post(`/complaints/${complaintId}/updates`, data);
return response.data;
},
};
export default complaintService;