BillCare 초기 소스 등록

비즈케어 홈즈 홈상품 운용관리(BillCare) 프론트/백엔드/Docker 구성을 exdev git에 등록합니다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Macbook
2026-07-12 05:05:17 +09:00
commit 03cd93e1f2
160 changed files with 47915 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
import client, { apiPrefix, unwrap, type ApiResponse } from './client'
export type Stock = Record<string, unknown> & { id: number; state: string; statusLabel: string }
export type StockSearch = { total: number; list: Stock[]; counts: Record<string, number> }
export type StockHistoryItem = {
id: number
processDate?: string
statusLabel?: string
companyLabel?: string
processor?: string
}
export type StockNoteItem = {
id: number
stockId?: number
contents?: string
authorName?: string
noteDate?: string
}
export type StockDetail = {
stock: Stock
histories: StockHistoryItem[]
notes: StockNoteItem[]
}
export const stockApi = {
async search(params: Record<string, unknown>) {
const { data } = await client.get<ApiResponse<StockSearch>>(`${apiPrefix()}/stocks/search`, { params })
return unwrap(data)
},
async detail(id: number) {
const { data } = await client.get<ApiResponse<StockDetail>>(`${apiPrefix()}/stocks/${id}/detail`)
return unwrap(data)
},
async save(id: number, payload: Record<string, unknown>) {
const { data } = await client.put<ApiResponse<StockDetail>>(`${apiPrefix()}/stocks/${id}`, payload)
return unwrap(data)
},
async create(payload: Record<string, unknown>) {
const { data } = await client.post<ApiResponse<StockDetail | Stock>>(`${apiPrefix()}/stocks`, payload)
return unwrap(data)
},
async remove(id: number) {
const { data } = await client.delete<ApiResponse>(`${apiPrefix()}/stocks/${id}`)
return unwrap(data)
},
async action(id: number, payload: Record<string, unknown>) {
const { data } = await client.post<ApiResponse<StockDetail>>(`${apiPrefix()}/stocks/${id}/action`, payload)
return unwrap(data)
},
async addNote(id: number, payload: { contents: string; authorName?: string }) {
const { data } = await client.post<ApiResponse<StockNoteItem>>(`${apiPrefix()}/stocks/${id}/notes`, payload)
return unwrap(data)
},
async deleteNote(id: number, noteId: number) {
const { data } = await client.delete<ApiResponse>(`${apiPrefix()}/stocks/${id}/notes/${noteId}`)
return unwrap(data)
},
async bulkIn(payload: Record<string, unknown>) {
const { data } = await client.post<ApiResponse>(`${apiPrefix()}/stocks/bulk-in`, payload)
return unwrap(data)
},
async bulkAction(ids: number[], state: string) {
const { data } = await client.post<ApiResponse>(`${apiPrefix()}/stocks/bulk-action`, { ids, state })
return unwrap(data)
},
async sheet(params: Record<string, unknown>) {
const { data } = await client.get<ApiResponse<StockSearch>>(`${apiPrefix()}/stocks/sheet`, { params })
return unwrap(data)
},
exportUrl(params: Record<string, unknown>) {
const query = new URLSearchParams(Object.entries(params).filter(([, value]) => value !== undefined && value !== '').map(([key, value]) => [key, String(value)]))
return `${apiPrefix()}/stocks/export?${query}`
},
}