Files
Hotel-Booking/Frontend/src/services/api/invoiceService.ts
Iliyan Angelov 627959f52b updates
2025-11-23 18:59:18 +02:00

191 lines
5.3 KiB
TypeScript

import apiClient from './apiClient';
export interface InvoiceItem {
id: number;
description: string;
quantity: number;
unit_price: number;
tax_rate: number;
discount_amount: number;
line_total: number;
room_id?: number;
service_id?: number;
}
export interface Invoice {
id: number;
invoice_number: string;
booking_id: number;
user_id: number;
issue_date: string;
due_date: string;
paid_date?: string;
subtotal: number;
tax_rate: number;
tax_amount: number;
discount_amount: number;
total_amount: number;
amount_paid: number;
balance_due: number;
status: 'draft' | 'sent' | 'paid' | 'overdue' | 'cancelled';
company_name?: string;
company_address?: string;
company_phone?: string;
company_email?: string;
company_tax_id?: string;
company_logo_url?: string;
customer_name: string;
customer_email: string;
customer_address?: string;
customer_phone?: string;
customer_tax_id?: string;
notes?: string;
terms_and_conditions?: string;
payment_instructions?: string;
is_proforma?: boolean;
promotion_code?: string;
items: InvoiceItem[];
created_at: string;
updated_at: string;
}
export interface InvoiceResponse {
status: string;
message?: string;
data: {
invoice?: Invoice;
invoices?: Invoice[];
total?: number;
page?: number;
limit?: number;
total_pages?: number;
};
}
export interface CreateInvoiceData {
booking_id: number;
tax_rate?: number;
discount_amount?: number;
due_days?: number;
company_name?: string;
company_address?: string;
company_phone?: string;
company_email?: string;
company_tax_id?: string;
company_logo_url?: string;
customer_tax_id?: string;
notes?: string;
terms_and_conditions?: string;
payment_instructions?: string;
}
export interface UpdateInvoiceData {
company_name?: string;
company_address?: string;
company_phone?: string;
company_email?: string;
company_tax_id?: string;
company_logo_url?: string;
notes?: string;
terms_and_conditions?: string;
payment_instructions?: string;
status?: string;
due_date?: string;
tax_rate?: number;
discount_amount?: number;
}
export const getInvoices = async (params?: {
booking_id?: number;
status?: string;
page?: number;
limit?: number;
}): Promise<InvoiceResponse> => {
const response = await apiClient.get<any>('/invoices', { params });
const data = response.data;
// Handle both 'status: success' and 'success: true' formats
return {
status: data.status === 'success' || data.success === true ? 'success' : 'error',
data: data.data || {},
message: data.message,
};
};
export const getInvoiceById = async (id: number): Promise<InvoiceResponse> => {
const response = await apiClient.get<any>(`/invoices/${id}`);
const data = response.data;
// Handle both 'status: success' and 'success: true' formats
return {
status: data.status === 'success' || data.success === true ? 'success' : 'error',
data: data.data || {},
message: data.message,
};
};
export const getInvoicesByBooking = async (bookingId: number): Promise<InvoiceResponse> => {
const response = await apiClient.get<any>(`/invoices/booking/${bookingId}`);
const data = response.data;
// Handle both 'status: success' and 'success: true' formats
return {
status: data.status === 'success' || data.success === true ? 'success' : 'error',
data: data.data || {},
message: data.message,
};
};
export const createInvoice = async (data: CreateInvoiceData): Promise<InvoiceResponse> => {
const response = await apiClient.post<any>('/invoices', data);
const responseData = response.data;
// Handle both 'status: success' and 'success: true' formats
return {
status: responseData.status === 'success' || responseData.success === true ? 'success' : 'error',
data: responseData.data || {},
message: responseData.message,
};
};
export const updateInvoice = async (id: number, data: UpdateInvoiceData): Promise<InvoiceResponse> => {
const response = await apiClient.put<any>(`/invoices/${id}`, data);
const responseData = response.data;
// Handle both 'status: success' and 'success: true' formats
return {
status: responseData.status === 'success' || responseData.success === true ? 'success' : 'error',
data: responseData.data || {},
message: responseData.message,
};
};
export const markInvoiceAsPaid = async (id: number, amount?: number): Promise<InvoiceResponse> => {
const response = await apiClient.post<any>(`/invoices/${id}/mark-paid`, { amount });
const responseData = response.data;
// Handle both 'status: success' and 'success: true' formats
return {
status: responseData.status === 'success' || responseData.success === true ? 'success' : 'error',
data: responseData.data || {},
message: responseData.message,
};
};
export const deleteInvoice = async (id: number): Promise<{ status: string; message: string }> => {
const response = await apiClient.delete<any>(`/invoices/${id}`);
const data = response.data;
// Handle both 'status: success' and 'success: true' formats
return {
status: data.status === 'success' || data.success === true ? 'success' : 'error',
message: data.message || 'Invoice deleted successfully',
};
};
const invoiceService = {
getInvoices,
getInvoiceById,
getInvoicesByBooking,
createInvoice,
updateInvoice,
markInvoiceAsPaid,
deleteInvoice,
};
export default invoiceService;