ERP-node/frontend/lib/api/taxInvoice.ts

291 lines
6.9 KiB
TypeScript
Raw Normal View History

2025-12-08 16:01:59 +09:00
/**
* API
*/
import { apiClient } from "./client";
2025-12-08 16:18:44 +09:00
// 비용 유형
export type CostType = "purchase" | "installation" | "repair" | "maintenance" | "disposal" | "other";
// 비용 유형 라벨
export const costTypeLabels: Record<CostType, string> = {
purchase: "구매",
installation: "설치",
repair: "수리",
maintenance: "유지보수",
disposal: "폐기",
other: "기타",
};
2025-12-08 16:01:59 +09:00
// 세금계산서 타입
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;
2025-12-08 16:18:44 +09:00
cost_type: CostType | null; // 비용 유형
2025-12-08 16:01:59 +09:00
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[];
2025-12-08 16:18:44 +09:00
cost_type?: CostType; // 비용 유형
2025-12-08 16:01:59 +09:00
}
// 품목 생성 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;
2025-12-08 16:18:44 +09:00
cost_type?: CostType; // 비용 유형 필터
2025-12-08 16:01:59 +09:00
}
// 목록 응답
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;
}
2025-12-08 16:18:44 +09:00
// 비용 유형별 통계 응답
export interface CostTypeStatsResponse {
success: boolean;
data: {
by_cost_type: Array<{
cost_type: CostType | null;
count: number;
supply_amount: number;
tax_amount: number;
total_amount: number;
}>;
by_month: Array<{
year_month: string;
cost_type: CostType | null;
count: number;
total_amount: number;
}>;
summary: {
total_count: number;
total_amount: number;
purchase_amount: number;
installation_amount: number;
repair_amount: number;
maintenance_amount: number;
disposal_amount: number;
other_amount: number;
};
};
period: { year?: number; month?: number };
}
/**
*
*/
export async function getCostTypeStats(
year?: number,
month?: number
): Promise<CostTypeStatsResponse> {
const params: Record<string, number> = {};
if (year) params.year = year;
if (month) params.month = month;
const response = await apiClient.get("/tax-invoice/stats/cost-type", { params });
return response.data;
}