230 lines
5.4 KiB
TypeScript
230 lines
5.4 KiB
TypeScript
/**
|
|
* 세금계산서 API 클라이언트
|
|
*/
|
|
|
|
import { apiClient } from "./client";
|
|
|
|
// 세금계산서 타입
|
|
export interface TaxInvoice {
|
|
id: string;
|
|
company_code: string;
|
|
invoice_number: string;
|
|
invoice_type: "sales" | "purchase";
|
|
invoice_status: "draft" | "issued" | "sent" | "cancelled";
|
|
supplier_business_no: string;
|
|
supplier_name: string;
|
|
supplier_ceo_name: string;
|
|
supplier_address: string;
|
|
supplier_business_type: string;
|
|
supplier_business_item: string;
|
|
buyer_business_no: string;
|
|
buyer_name: string;
|
|
buyer_ceo_name: string;
|
|
buyer_address: string;
|
|
buyer_email: string;
|
|
supply_amount: number;
|
|
tax_amount: number;
|
|
total_amount: number;
|
|
invoice_date: string;
|
|
issue_date: string | null;
|
|
remarks: string;
|
|
order_id: string | null;
|
|
customer_id: string | null;
|
|
attachments: TaxInvoiceAttachment[] | null;
|
|
created_date: string;
|
|
updated_date: string;
|
|
writer: string;
|
|
}
|
|
|
|
// 첨부파일 타입
|
|
export interface TaxInvoiceAttachment {
|
|
id: string;
|
|
file_name: string;
|
|
file_path: string;
|
|
file_size: number;
|
|
file_type: string;
|
|
uploaded_at: string;
|
|
uploaded_by: string;
|
|
}
|
|
|
|
// 세금계산서 품목 타입
|
|
export interface TaxInvoiceItem {
|
|
id: string;
|
|
tax_invoice_id: string;
|
|
company_code: string;
|
|
item_seq: number;
|
|
item_date: string;
|
|
item_name: string;
|
|
item_spec: string;
|
|
quantity: number;
|
|
unit_price: number;
|
|
supply_amount: number;
|
|
tax_amount: number;
|
|
remarks: string;
|
|
}
|
|
|
|
// 생성 DTO
|
|
export interface CreateTaxInvoiceDto {
|
|
invoice_type: "sales" | "purchase";
|
|
supplier_business_no?: string;
|
|
supplier_name?: string;
|
|
supplier_ceo_name?: string;
|
|
supplier_address?: string;
|
|
supplier_business_type?: string;
|
|
supplier_business_item?: string;
|
|
buyer_business_no?: string;
|
|
buyer_name?: string;
|
|
buyer_ceo_name?: string;
|
|
buyer_address?: string;
|
|
buyer_email?: string;
|
|
supply_amount: number;
|
|
tax_amount: number;
|
|
total_amount: number;
|
|
invoice_date: string;
|
|
remarks?: string;
|
|
order_id?: string;
|
|
customer_id?: string;
|
|
items?: CreateTaxInvoiceItemDto[];
|
|
attachments?: TaxInvoiceAttachment[];
|
|
}
|
|
|
|
// 품목 생성 DTO
|
|
export interface CreateTaxInvoiceItemDto {
|
|
item_date?: string;
|
|
item_name: string;
|
|
item_spec?: string;
|
|
quantity: number;
|
|
unit_price: number;
|
|
supply_amount: number;
|
|
tax_amount: number;
|
|
remarks?: string;
|
|
}
|
|
|
|
// 목록 조회 파라미터
|
|
export interface TaxInvoiceListParams {
|
|
page?: number;
|
|
pageSize?: number;
|
|
invoice_type?: "sales" | "purchase";
|
|
invoice_status?: string;
|
|
start_date?: string;
|
|
end_date?: string;
|
|
search?: string;
|
|
buyer_name?: string;
|
|
}
|
|
|
|
// 목록 응답
|
|
export interface TaxInvoiceListResponse {
|
|
success: boolean;
|
|
data: TaxInvoice[];
|
|
pagination: {
|
|
page: number;
|
|
pageSize: number;
|
|
total: number;
|
|
totalPages: number;
|
|
};
|
|
}
|
|
|
|
// 상세 응답
|
|
export interface TaxInvoiceDetailResponse {
|
|
success: boolean;
|
|
data: {
|
|
invoice: TaxInvoice;
|
|
items: TaxInvoiceItem[];
|
|
};
|
|
}
|
|
|
|
// 월별 통계 응답
|
|
export interface TaxInvoiceMonthlyStatsResponse {
|
|
success: boolean;
|
|
data: {
|
|
sales: { count: number; supply_amount: number; tax_amount: number; total_amount: number };
|
|
purchase: { count: number; supply_amount: number; tax_amount: number; total_amount: number };
|
|
};
|
|
period: { year: number; month: number };
|
|
}
|
|
|
|
/**
|
|
* 세금계산서 목록 조회
|
|
*/
|
|
export async function getTaxInvoiceList(
|
|
params?: TaxInvoiceListParams
|
|
): Promise<TaxInvoiceListResponse> {
|
|
const response = await apiClient.get("/tax-invoice", { params });
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* 세금계산서 상세 조회
|
|
*/
|
|
export async function getTaxInvoiceById(id: string): Promise<TaxInvoiceDetailResponse> {
|
|
const response = await apiClient.get(`/tax-invoice/${id}`);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* 세금계산서 생성
|
|
*/
|
|
export async function createTaxInvoice(
|
|
data: CreateTaxInvoiceDto
|
|
): Promise<{ success: boolean; data: TaxInvoice; message: string }> {
|
|
const response = await apiClient.post("/tax-invoice", data);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* 세금계산서 수정
|
|
*/
|
|
export async function updateTaxInvoice(
|
|
id: string,
|
|
data: Partial<CreateTaxInvoiceDto>
|
|
): Promise<{ success: boolean; data: TaxInvoice; message: string }> {
|
|
const response = await apiClient.put(`/tax-invoice/${id}`, data);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* 세금계산서 삭제
|
|
*/
|
|
export async function deleteTaxInvoice(
|
|
id: string
|
|
): Promise<{ success: boolean; message: string }> {
|
|
const response = await apiClient.delete(`/tax-invoice/${id}`);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* 세금계산서 발행
|
|
*/
|
|
export async function issueTaxInvoice(
|
|
id: string
|
|
): Promise<{ success: boolean; data: TaxInvoice; message: string }> {
|
|
const response = await apiClient.post(`/tax-invoice/${id}/issue`);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* 세금계산서 취소
|
|
*/
|
|
export async function cancelTaxInvoice(
|
|
id: string,
|
|
reason?: string
|
|
): Promise<{ success: boolean; data: TaxInvoice; message: string }> {
|
|
const response = await apiClient.post(`/tax-invoice/${id}/cancel`, { reason });
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* 월별 통계 조회
|
|
*/
|
|
export async function getTaxInvoiceMonthlyStats(
|
|
year?: number,
|
|
month?: number
|
|
): Promise<TaxInvoiceMonthlyStatsResponse> {
|
|
const params: Record<string, number> = {};
|
|
if (year) params.year = year;
|
|
if (month) params.month = month;
|
|
const response = await apiClient.get("/tax-invoice/stats/monthly", { params });
|
|
return response.data;
|
|
}
|
|
|