/** * Production API Service - Handles all production-related API calls */ import { apiClient } from '../client/apiClient'; import { // Types ProductionBatchResponse, ProductionBatchCreate, ProductionBatchUpdate, ProductionBatchStatusUpdate, ProductionBatchListResponse, ProductionBatchFilters, ProductionScheduleResponse, ProductionScheduleCreate, ProductionScheduleUpdate, ProductionScheduleFilters, ProductionCapacityResponse, ProductionCapacityFilters, QualityCheckResponse, QualityCheckCreate, QualityCheckFilters, ProductionPerformanceAnalytics, YieldTrendsAnalytics, TopDefectsAnalytics, EquipmentEfficiencyAnalytics, CapacityBottlenecks, ProductionDashboardSummary, BatchStatistics, } from '../types/production'; export class ProductionService { private baseUrl = '/production'; // ================================================================ // PRODUCTION BATCH ENDPOINTS // ================================================================ async getBatches( tenantId: string, filters?: ProductionBatchFilters ): Promise { const params = new URLSearchParams(); if (filters?.status) params.append('status', filters.status); if (filters?.product_id) params.append('product_id', filters.product_id); if (filters?.order_id) params.append('order_id', filters.order_id); if (filters?.start_date) params.append('start_date', filters.start_date); if (filters?.end_date) params.append('end_date', filters.end_date); if (filters?.page) params.append('page', filters.page.toString()); if (filters?.page_size) params.append('page_size', filters.page_size.toString()); const queryString = params.toString(); const url = `/tenants/${tenantId}${this.baseUrl}/batches${queryString ? `?${queryString}` : ''}`; return apiClient.get(url); } async getBatch(tenantId: string, batchId: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/batches/${batchId}`); } async createBatch( tenantId: string, batchData: ProductionBatchCreate ): Promise { return apiClient.post( `/tenants/${tenantId}${this.baseUrl}/batches`, batchData ); } async updateBatch( tenantId: string, batchId: string, batchData: ProductionBatchUpdate ): Promise { return apiClient.put( `/tenants/${tenantId}${this.baseUrl}/batches/${batchId}`, batchData ); } async deleteBatch(tenantId: string, batchId: string): Promise { return apiClient.delete(`/tenants/${tenantId}${this.baseUrl}/batches/${batchId}`); } async updateBatchStatus( tenantId: string, batchId: string, statusData: ProductionBatchStatusUpdate ): Promise { return apiClient.patch( `/tenants/${tenantId}${this.baseUrl}/batches/${batchId}/status`, statusData ); } async startBatch(tenantId: string, batchId: string): Promise { return apiClient.post( `/tenants/${tenantId}${this.baseUrl}/batches/${batchId}/start` ); } async completeBatch( tenantId: string, batchId: string, completionData?: { actual_quantity?: number; notes?: string } ): Promise { return apiClient.post( `/tenants/${tenantId}${this.baseUrl}/batches/${batchId}/complete`, completionData || {} ); } async getBatchStatistics( tenantId: string, startDate?: string, endDate?: string ): Promise { const params = new URLSearchParams(); if (startDate) params.append('start_date', startDate); if (endDate) params.append('end_date', endDate); const queryString = params.toString(); const url = `/tenants/${tenantId}${this.baseUrl}/batches/stats${queryString ? `?${queryString}` : ''}`; return apiClient.get(url); } // ================================================================ // PRODUCTION SCHEDULE ENDPOINTS // ================================================================ async getSchedules( tenantId: string, filters?: ProductionScheduleFilters ): Promise<{ schedules: ProductionScheduleResponse[]; total_count: number; page: number; page_size: number }> { const params = new URLSearchParams(); if (filters?.start_date) params.append('start_date', filters.start_date); if (filters?.end_date) params.append('end_date', filters.end_date); if (filters?.is_finalized !== undefined) params.append('is_finalized', filters.is_finalized.toString()); if (filters?.page) params.append('page', filters.page.toString()); if (filters?.page_size) params.append('page_size', filters.page_size.toString()); const queryString = params.toString(); const url = `/tenants/${tenantId}${this.baseUrl}/schedules${queryString ? `?${queryString}` : ''}`; return apiClient.get(url); } async getSchedule(tenantId: string, scheduleId: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/schedules/${scheduleId}`); } async createSchedule( tenantId: string, scheduleData: ProductionScheduleCreate ): Promise { return apiClient.post( `/tenants/${tenantId}${this.baseUrl}/schedules`, scheduleData ); } async updateSchedule( tenantId: string, scheduleId: string, scheduleData: ProductionScheduleUpdate ): Promise { return apiClient.put( `/tenants/${tenantId}${this.baseUrl}/schedules/${scheduleId}`, scheduleData ); } async deleteSchedule(tenantId: string, scheduleId: string): Promise { return apiClient.delete(`/tenants/${tenantId}${this.baseUrl}/schedules/${scheduleId}`); } async finalizeSchedule(tenantId: string, scheduleId: string): Promise { return apiClient.post( `/tenants/${tenantId}${this.baseUrl}/schedules/${scheduleId}/finalize` ); } async getTodaysSchedule(tenantId: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/schedules/today`); } // ================================================================ // PRODUCTION CAPACITY ENDPOINTS // ================================================================ async getCapacity( tenantId: string, filters?: ProductionCapacityFilters ): Promise<{ capacity: ProductionCapacityResponse[]; total_count: number; page: number; page_size: number }> { const params = new URLSearchParams(); if (filters?.resource_type) params.append('resource_type', filters.resource_type); if (filters?.date) params.append('date', filters.date); if (filters?.availability !== undefined) params.append('availability', filters.availability.toString()); if (filters?.page) params.append('page', filters.page.toString()); if (filters?.page_size) params.append('page_size', filters.page_size.toString()); const queryString = params.toString(); const url = `/tenants/${tenantId}${this.baseUrl}/capacity${queryString ? `?${queryString}` : ''}`; return apiClient.get(url); } async getCapacityByDate(tenantId: string, date: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/capacity/date/${date}`); } async getCapacityByResource(tenantId: string, resourceId: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/capacity/resource/${resourceId}`); } // ================================================================ // QUALITY CHECK ENDPOINTS // ================================================================ async getQualityChecks( tenantId: string, filters?: QualityCheckFilters ): Promise<{ quality_checks: QualityCheckResponse[]; total_count: number; page: number; page_size: number }> { const params = new URLSearchParams(); if (filters?.batch_id) params.append('batch_id', filters.batch_id); if (filters?.product_id) params.append('product_id', filters.product_id); if (filters?.start_date) params.append('start_date', filters.start_date); if (filters?.end_date) params.append('end_date', filters.end_date); if (filters?.pass_fail !== undefined) params.append('pass_fail', filters.pass_fail.toString()); if (filters?.page) params.append('page', filters.page.toString()); if (filters?.page_size) params.append('page_size', filters.page_size.toString()); const queryString = params.toString(); const url = `/tenants/${tenantId}${this.baseUrl}/quality-checks${queryString ? `?${queryString}` : ''}`; return apiClient.get(url); } async getQualityCheck(tenantId: string, checkId: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/quality-checks/${checkId}`); } async createQualityCheck( tenantId: string, checkData: QualityCheckCreate ): Promise { return apiClient.post( `/tenants/${tenantId}${this.baseUrl}/quality-checks`, checkData ); } async getQualityChecksByBatch(tenantId: string, batchId: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/quality-checks/batch/${batchId}`); } // ================================================================ // ANALYTICS ENDPOINTS // ================================================================ async getPerformanceAnalytics( tenantId: string, startDate: string, endDate: string ): Promise { return apiClient.get( `/tenants/${tenantId}${this.baseUrl}/analytics/performance?start_date=${startDate}&end_date=${endDate}` ); } async getYieldTrends( tenantId: string, period: 'week' | 'month' = 'week' ): Promise { return apiClient.get( `/tenants/${tenantId}${this.baseUrl}/analytics/yield-trends?period=${period}` ); } async getTopDefects( tenantId: string, startDate?: string, endDate?: string ): Promise { const params = new URLSearchParams(); if (startDate) params.append('start_date', startDate); if (endDate) params.append('end_date', endDate); const queryString = params.toString(); const url = `/tenants/${tenantId}${this.baseUrl}/analytics/defects${queryString ? `?${queryString}` : ''}`; return apiClient.get(url); } async getEquipmentEfficiency( tenantId: string, startDate?: string, endDate?: string ): Promise { const params = new URLSearchParams(); if (startDate) params.append('start_date', startDate); if (endDate) params.append('end_date', endDate); const queryString = params.toString(); const url = `/tenants/${tenantId}${this.baseUrl}/analytics/equipment-efficiency${queryString ? `?${queryString}` : ''}`; return apiClient.get(url); } async getCapacityBottlenecks( tenantId: string, days: number = 7 ): Promise { return apiClient.get( `/tenants/${tenantId}${this.baseUrl}/analytics/capacity-bottlenecks?days=${days}` ); } // ================================================================ // DASHBOARD ENDPOINTS // ================================================================ async getDashboardSummary(tenantId: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/dashboard/summary`); } async getDailyProductionPlan(tenantId: string, date?: string): Promise { const queryString = date ? `?date=${date}` : ''; return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/dashboard/daily-plan${queryString}`); } async getProductionRequirements(tenantId: string, date: string): Promise { return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/dashboard/requirements/${date}`); } async getCapacityOverview(tenantId: string, date?: string): Promise { const queryString = date ? `?date=${date}` : ''; return apiClient.get(`/tenants/${tenantId}${this.baseUrl}/dashboard/capacity-overview${queryString}`); } async getQualityOverview( tenantId: string, startDate?: string, endDate?: string ): Promise { const params = new URLSearchParams(); if (startDate) params.append('start_date', startDate); if (endDate) params.append('end_date', endDate); const queryString = params.toString(); const url = `/tenants/${tenantId}${this.baseUrl}/dashboard/quality-overview${queryString ? `?${queryString}` : ''}`; return apiClient.get(url); } } export const productionService = new ProductionService(); export default productionService;