feat(warehouse): add TanStack Query options and types
This commit is contained in:
385
src/admin/lib/queries/warehouse.ts
Normal file
385
src/admin/lib/queries/warehouse.ts
Normal file
@@ -0,0 +1,385 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery, paginatedJsonQuery } from "../apiAdapter";
|
||||
|
||||
// --- Types ---
|
||||
|
||||
export interface WarehouseItem {
|
||||
id: number;
|
||||
item_number: string | null;
|
||||
name: string;
|
||||
description: string | null;
|
||||
category_id: number | null;
|
||||
unit: string;
|
||||
min_quantity: number | null;
|
||||
is_active: boolean;
|
||||
notes: string | null;
|
||||
category?: { id: number; name: string } | null;
|
||||
total_quantity?: number;
|
||||
available_quantity?: number;
|
||||
stock_value?: number;
|
||||
below_minimum?: boolean;
|
||||
}
|
||||
|
||||
export interface WarehouseReceipt {
|
||||
id: number;
|
||||
receipt_number: string | null;
|
||||
supplier_id: number | null;
|
||||
delivery_note_number: string | null;
|
||||
delivery_note_date: string | null;
|
||||
received_by: number | null;
|
||||
notes: string | null;
|
||||
status: "DRAFT" | "CONFIRMED" | "CANCELLED";
|
||||
created_at: string;
|
||||
modified_at: string | null;
|
||||
supplier?: { id: number; name: string } | null;
|
||||
received_by_user?: {
|
||||
id: number;
|
||||
first_name: string;
|
||||
last_name: string;
|
||||
} | null;
|
||||
lines?: WarehouseReceiptLine[];
|
||||
attachments?: WarehouseReceiptAttachment[];
|
||||
}
|
||||
|
||||
export interface WarehouseReceiptLine {
|
||||
id: number;
|
||||
receipt_id: number;
|
||||
item_id: number;
|
||||
quantity: number;
|
||||
unit_price: number;
|
||||
location_id: number | null;
|
||||
notes: string | null;
|
||||
item?: WarehouseItem;
|
||||
location?: { id: number; code: string; name: string } | null;
|
||||
}
|
||||
|
||||
export interface WarehouseReceiptAttachment {
|
||||
id: number;
|
||||
receipt_id: number;
|
||||
file_name: string;
|
||||
file_mime: string;
|
||||
file_size: number;
|
||||
file_path: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
export interface WarehouseIssue {
|
||||
id: number;
|
||||
issue_number: string | null;
|
||||
project_id: number;
|
||||
issued_by: number | null;
|
||||
notes: string | null;
|
||||
status: "DRAFT" | "CONFIRMED" | "CANCELLED";
|
||||
created_at: string;
|
||||
modified_at: string | null;
|
||||
project?: { id: number; name: string; project_number: string } | null;
|
||||
issued_by_user?: { id: number; first_name: string; last_name: string } | null;
|
||||
lines?: WarehouseIssueLine[];
|
||||
}
|
||||
|
||||
export interface WarehouseIssueLine {
|
||||
id: number;
|
||||
issue_id: number;
|
||||
item_id: number;
|
||||
batch_id: number;
|
||||
quantity: number;
|
||||
location_id: number | null;
|
||||
reservation_id: number | null;
|
||||
notes: string | null;
|
||||
item?: WarehouseItem;
|
||||
batch?: {
|
||||
id: number;
|
||||
quantity: number;
|
||||
unit_price: number;
|
||||
received_at: string;
|
||||
} | null;
|
||||
location?: { id: number; code: string; name: string } | null;
|
||||
reservation?: { id: number; quantity: number; remaining_qty: number } | null;
|
||||
}
|
||||
|
||||
export interface WarehouseReservation {
|
||||
id: number;
|
||||
item_id: number;
|
||||
project_id: number;
|
||||
quantity: number;
|
||||
remaining_qty: number;
|
||||
reserved_by: number | null;
|
||||
notes: string | null;
|
||||
status: "ACTIVE" | "FULFILLED" | "CANCELLED";
|
||||
created_at: string;
|
||||
modified_at: string | null;
|
||||
item?: WarehouseItem;
|
||||
project?: { id: number; name: string } | null;
|
||||
reserved_by_user?: {
|
||||
id: number;
|
||||
first_name: string;
|
||||
last_name: string;
|
||||
} | null;
|
||||
}
|
||||
|
||||
export interface WarehouseInventorySession {
|
||||
id: number;
|
||||
session_number: string | null;
|
||||
notes: string | null;
|
||||
status: "DRAFT" | "CONFIRMED";
|
||||
created_at: string;
|
||||
modified_at: string | null;
|
||||
lines?: WarehouseInventoryLine[];
|
||||
}
|
||||
|
||||
export interface WarehouseInventoryLine {
|
||||
id: number;
|
||||
session_id: number;
|
||||
item_id: number;
|
||||
location_id: number | null;
|
||||
system_qty: number;
|
||||
actual_qty: number;
|
||||
difference: number;
|
||||
notes: string | null;
|
||||
item?: WarehouseItem;
|
||||
location?: { id: number; code: string; name: string } | null;
|
||||
}
|
||||
|
||||
export interface WarehouseCategory {
|
||||
id: number;
|
||||
name: string;
|
||||
description: string | null;
|
||||
sort_order: number;
|
||||
}
|
||||
|
||||
export interface WarehouseLocation {
|
||||
id: number;
|
||||
code: string;
|
||||
name: string;
|
||||
description: string | null;
|
||||
is_active: boolean;
|
||||
}
|
||||
|
||||
export interface WarehouseSupplier {
|
||||
id: number;
|
||||
name: string;
|
||||
ico: string | null;
|
||||
dic: string | null;
|
||||
contact_person: string | null;
|
||||
email: string | null;
|
||||
phone: string | null;
|
||||
address: string | null;
|
||||
notes: string | null;
|
||||
is_active: boolean;
|
||||
}
|
||||
|
||||
// --- Query Options ---
|
||||
|
||||
export const warehouseItemListOptions = (filters: {
|
||||
search?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
sort?: string;
|
||||
order?: string;
|
||||
category_id?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "items", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
if (filters.sort) params.set("sort", filters.sort);
|
||||
if (filters.order) params.set("order", filters.order);
|
||||
if (filters.category_id)
|
||||
params.set("category_id", String(filters.category_id));
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery<WarehouseItem>(
|
||||
`/api/admin/warehouse/items${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const warehouseItemDetailOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "items", id],
|
||||
queryFn: () => jsonQuery<WarehouseItem>(`/api/admin/warehouse/items/${id}`),
|
||||
enabled: !!id,
|
||||
});
|
||||
|
||||
export const warehouseCategoryListOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "categories"],
|
||||
queryFn: () =>
|
||||
jsonQuery<WarehouseCategory[]>("/api/admin/warehouse/categories"),
|
||||
});
|
||||
|
||||
export const warehouseSupplierListOptions = (filters: {
|
||||
search?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "suppliers", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery<WarehouseSupplier>(
|
||||
`/api/admin/warehouse/suppliers${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const warehouseLocationListOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "locations"],
|
||||
queryFn: () =>
|
||||
jsonQuery<WarehouseLocation[]>("/api/admin/warehouse/locations"),
|
||||
});
|
||||
|
||||
export const warehouseReceiptListOptions = (filters: {
|
||||
search?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
status?: string;
|
||||
supplier_id?: number;
|
||||
date_from?: string;
|
||||
date_to?: string;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "receipts", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
if (filters.status) params.set("status", filters.status);
|
||||
if (filters.supplier_id)
|
||||
params.set("supplier_id", String(filters.supplier_id));
|
||||
if (filters.date_from) params.set("date_from", filters.date_from);
|
||||
if (filters.date_to) params.set("date_to", filters.date_to);
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery<WarehouseReceipt>(
|
||||
`/api/admin/warehouse/receipts${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const warehouseReceiptDetailOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "receipts", id],
|
||||
queryFn: () =>
|
||||
jsonQuery<WarehouseReceipt>(`/api/admin/warehouse/receipts/${id}`),
|
||||
enabled: !!id,
|
||||
});
|
||||
|
||||
export const warehouseIssueListOptions = (filters: {
|
||||
search?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
status?: string;
|
||||
project_id?: number;
|
||||
date_from?: string;
|
||||
date_to?: string;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "issues", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
if (filters.status) params.set("status", filters.status);
|
||||
if (filters.project_id)
|
||||
params.set("project_id", String(filters.project_id));
|
||||
if (filters.date_from) params.set("date_from", filters.date_from);
|
||||
if (filters.date_to) params.set("date_to", filters.date_to);
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery<WarehouseIssue>(
|
||||
`/api/admin/warehouse/issues${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const warehouseIssueDetailOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "issues", id],
|
||||
queryFn: () =>
|
||||
jsonQuery<WarehouseIssue>(`/api/admin/warehouse/issues/${id}`),
|
||||
enabled: !!id,
|
||||
});
|
||||
|
||||
export const warehouseReservationListOptions = (filters: {
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
item_id?: number;
|
||||
project_id?: number;
|
||||
status?: string;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "reservations", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
if (filters.item_id) params.set("item_id", String(filters.item_id));
|
||||
if (filters.project_id)
|
||||
params.set("project_id", String(filters.project_id));
|
||||
if (filters.status) params.set("status", filters.status);
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery<WarehouseReservation>(
|
||||
`/api/admin/warehouse/reservations${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const warehouseInventoryListOptions = (filters: {
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
status?: string;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "inventory", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
if (filters.status) params.set("status", filters.status);
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery<WarehouseInventorySession>(
|
||||
`/api/admin/warehouse/inventory${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const warehouseInventoryDetailOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "inventory", id],
|
||||
queryFn: () =>
|
||||
jsonQuery<WarehouseInventorySession>(
|
||||
`/api/admin/warehouse/inventory/${id}`,
|
||||
),
|
||||
enabled: !!id,
|
||||
});
|
||||
|
||||
export const warehouseStockStatusOptions = (filters?: {
|
||||
category_id?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "stock-status", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters?.category_id)
|
||||
params.set("category_id", String(filters.category_id));
|
||||
const qs = params.toString();
|
||||
return jsonQuery<WarehouseItem[]>(
|
||||
`/api/admin/warehouse/stock-status${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const warehouseBelowMinimumOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["warehouse", "below-minimum"],
|
||||
queryFn: () =>
|
||||
jsonQuery<WarehouseItem[]>("/api/admin/warehouse/below-minimum"),
|
||||
});
|
||||
Reference in New Issue
Block a user