Improve the frontend 2

This commit is contained in:
Urtzi Alfaro
2025-10-29 06:58:05 +01:00
parent 858d985c92
commit 36217a2729
98 changed files with 6652 additions and 4230 deletions

View File

@@ -9,7 +9,8 @@ import type {
EquipmentCreate,
EquipmentUpdate,
EquipmentResponse,
EquipmentListResponse
EquipmentListResponse,
EquipmentDeletionSummary
} from '../types/equipment';
class EquipmentService {
@@ -163,7 +164,7 @@ class EquipmentService {
}
/**
* Delete an equipment item
* Delete an equipment item (soft delete)
*/
async deleteEquipment(tenantId: string, equipmentId: string): Promise<void> {
await apiClient.delete(
@@ -173,6 +174,34 @@ class EquipmentService {
}
);
}
/**
* Permanently delete an equipment item (hard delete)
*/
async hardDeleteEquipment(tenantId: string, equipmentId: string): Promise<void> {
await apiClient.delete(
`${this.baseURL}/${tenantId}/production/equipment/${equipmentId}?permanent=true`,
{
headers: { 'X-Tenant-ID': tenantId }
}
);
}
/**
* Get deletion summary for an equipment item
*/
async getEquipmentDeletionSummary(
tenantId: string,
equipmentId: string
): Promise<EquipmentDeletionSummary> {
const data: EquipmentDeletionSummary = await apiClient.get(
`${this.baseURL}/${tenantId}/production/equipment/${equipmentId}/deletion-summary`,
{
headers: { 'X-Tenant-ID': tenantId }
}
);
return data;
}
}
export const equipmentService = new EquipmentService();

View File

@@ -20,25 +20,25 @@ import type {
SupplierResponse,
SupplierSummary,
SupplierApproval,
SupplierQueryParams,
SupplierSearchParams,
SupplierStatistics,
SupplierDeletionSummary,
TopSuppliersResponse,
SupplierResponse as SupplierResponse_,
PurchaseOrderCreate,
PurchaseOrderUpdate,
PurchaseOrderResponse,
PurchaseOrderApproval,
PurchaseOrderQueryParams,
PurchaseOrderSearchParams,
DeliveryCreate,
DeliveryUpdate,
DeliveryResponse,
DeliveryReceiptConfirmation,
DeliveryQueryParams,
PerformanceCalculationRequest,
PerformanceMetrics,
DeliverySearchParams,
PerformanceMetric,
PerformanceAlert,
PaginatedResponse,
ApiResponse,
SupplierPriceListCreate,
SupplierPriceListUpdate,
SupplierPriceListResponse
} from '../types/suppliers';
class SuppliersService {
@@ -59,10 +59,71 @@ class SuppliersService {
);
}
// ===================================================================
// ATOMIC: Supplier Price Lists CRUD
// Backend: services/suppliers/app/api/suppliers.py (price list endpoints)
// ===================================================================
async getSupplierPriceLists(
tenantId: string,
supplierId: string,
isActive: boolean = true
): Promise<SupplierPriceListResponse[]> {
const params = new URLSearchParams();
params.append('is_active', isActive.toString());
return apiClient.get<SupplierPriceListResponse[]>(
`${this.baseUrl}/${tenantId}/suppliers/${supplierId}/price-lists?${params.toString()}`
);
}
async getSupplierPriceList(
tenantId: string,
supplierId: string,
priceListId: string
): Promise<SupplierPriceListResponse> {
return apiClient.get<SupplierPriceListResponse>(
`${this.baseUrl}/${tenantId}/suppliers/${supplierId}/price-lists/${priceListId}`
);
}
async createSupplierPriceList(
tenantId: string,
supplierId: string,
priceListData: SupplierPriceListCreate
): Promise<SupplierPriceListResponse> {
return apiClient.post<SupplierPriceListResponse>(
`${this.baseUrl}/${tenantId}/suppliers/${supplierId}/price-lists`,
priceListData
);
}
async updateSupplierPriceList(
tenantId: string,
supplierId: string,
priceListId: string,
priceListData: SupplierPriceListUpdate
): Promise<SupplierPriceListResponse> {
return apiClient.put<SupplierPriceListResponse>(
`${this.baseUrl}/${tenantId}/suppliers/${supplierId}/price-lists/${priceListId}`,
priceListData
);
}
async deleteSupplierPriceList(
tenantId: string,
supplierId: string,
priceListId: string
): Promise<{ message: string }> {
return apiClient.delete<{ message: string }>(
`${this.baseUrl}/${tenantId}/suppliers/${supplierId}/price-lists/${priceListId}`
);
}
async getSuppliers(
tenantId: string,
queryParams?: SupplierQueryParams
): Promise<PaginatedResponse<SupplierSummary>> {
queryParams?: SupplierSearchParams
): Promise<SupplierSummary[]> {
const params = new URLSearchParams();
if (queryParams?.search_term) params.append('search_term', queryParams.search_term);
@@ -70,11 +131,9 @@ class SuppliersService {
if (queryParams?.status) params.append('status', queryParams.status);
if (queryParams?.limit) params.append('limit', queryParams.limit.toString());
if (queryParams?.offset) params.append('offset', queryParams.offset.toString());
if (queryParams?.sort_by) params.append('sort_by', queryParams.sort_by);
if (queryParams?.sort_order) params.append('sort_order', queryParams.sort_order);
const queryString = params.toString() ? `?${params.toString()}` : '';
return apiClient.get<PaginatedResponse<SupplierSummary>>(
return apiClient.get<SupplierSummary[]>(
`${this.baseUrl}/${tenantId}/suppliers${queryString}`
);
}
@@ -142,10 +201,10 @@ class SuppliersService {
);
}
async getPurchaseOrders(
async getPurchaseOrders(
tenantId: string,
queryParams?: PurchaseOrderQueryParams
): Promise<PaginatedResponse<PurchaseOrderResponse>> {
queryParams?: PurchaseOrderSearchParams
): Promise<PurchaseOrderResponse[]> {
const params = new URLSearchParams();
if (queryParams?.supplier_id) params.append('supplier_id', queryParams.supplier_id);
@@ -155,11 +214,9 @@ class SuppliersService {
if (queryParams?.date_to) params.append('date_to', queryParams.date_to);
if (queryParams?.limit) params.append('limit', queryParams.limit.toString());
if (queryParams?.offset) params.append('offset', queryParams.offset.toString());
if (queryParams?.sort_by) params.append('sort_by', queryParams.sort_by);
if (queryParams?.sort_order) params.append('sort_order', queryParams.sort_order);
const queryString = params.toString() ? `?${params.toString()}` : '';
return apiClient.get<PaginatedResponse<PurchaseOrderResponse>>(
return apiClient.get<PurchaseOrderResponse[]>(
`${this.baseUrl}/${tenantId}/suppliers/purchase-orders${queryString}`
);
}
@@ -209,8 +266,8 @@ class SuppliersService {
async getDeliveries(
tenantId: string,
queryParams?: DeliveryQueryParams
): Promise<PaginatedResponse<DeliveryResponse>> {
queryParams?: DeliverySearchParams
): Promise<DeliveryResponse[]> {
const params = new URLSearchParams();
if (queryParams?.supplier_id) params.append('supplier_id', queryParams.supplier_id);
@@ -226,11 +283,9 @@ class SuppliersService {
}
if (queryParams?.limit) params.append('limit', queryParams.limit.toString());
if (queryParams?.offset) params.append('offset', queryParams.offset.toString());
if (queryParams?.sort_by) params.append('sort_by', queryParams.sort_by);
if (queryParams?.sort_order) params.append('sort_order', queryParams.sort_order);
const queryString = params.toString() ? `?${params.toString()}` : '';
return apiClient.get<PaginatedResponse<DeliveryResponse>>(
return apiClient.get<DeliveryResponse[]>(
`${this.baseUrl}/${tenantId}/suppliers/deliveries${queryString}`
);
}
@@ -276,8 +331,8 @@ class SuppliersService {
async getActiveSuppliers(
tenantId: string,
queryParams?: Omit<SupplierQueryParams, 'status'>
): Promise<PaginatedResponse<SupplierSummary>> {
queryParams?: SupplierSearchParams
): Promise<SupplierSummary[]> {
const params = new URLSearchParams();
if (queryParams?.search_term) params.append('search_term', queryParams.search_term);
if (queryParams?.supplier_type) params.append('supplier_type', queryParams.supplier_type);
@@ -285,10 +340,10 @@ class SuppliersService {
if (queryParams?.offset) params.append('offset', queryParams.offset.toString());
const queryString = params.toString() ? `?${params.toString()}` : '';
return apiClient.get<PaginatedResponse<SupplierSummary>>(
return apiClient.get<SupplierSummary[]>(
`${this.baseUrl}/${tenantId}/suppliers/operations/active${queryString}`
);
}
}
async getTopSuppliers(tenantId: string): Promise<TopSuppliersResponse> {
return apiClient.get<TopSuppliersResponse>(
@@ -356,11 +411,11 @@ class SuppliersService {
async getSupplierPerformanceMetrics(
tenantId: string,
supplierId: string
): Promise<PerformanceMetrics> {
return apiClient.get<PerformanceMetrics>(
): Promise<PerformanceMetric[]> {
return apiClient.get<PerformanceMetric[]>(
`${this.baseUrl}/${tenantId}/suppliers/analytics/performance/${supplierId}/metrics`
);
}
}
async evaluatePerformanceAlerts(
tenantId: string