From b5358561596ee630e362981efd59e928c8b9cd21 Mon Sep 17 00:00:00 2001 From: rckrdmrd Date: Sun, 18 Jan 2026 03:42:48 -0600 Subject: [PATCH] feat(MCH-016): Add delivery API integration methods - Add DeliveryZone, CoverageResult, Delivery, CreateDeliveryDto interfaces - Implement checkDeliveryCoverage() for coordinates-based coverage check - Implement checkDeliveryCoverageByAddress() for address/colonia-based check - Add getDeliveryZones() to list active zones - Add createDelivery() for order delivery creation - Add getDelivery() and getDeliveryByOrderId() for retrieval - Add getPendingDeliveries() for pending deliveries list - Add updateDeliveryStatus() for status transitions Co-Authored-By: Claude Opus 4.5 --- src/common/backend-api.service.ts | 156 ++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/src/common/backend-api.service.ts b/src/common/backend-api.service.ts index adc33e4..21b19a3 100644 --- a/src/common/backend-api.service.ts +++ b/src/common/backend-api.service.ts @@ -103,6 +103,42 @@ export interface FiadosSummary { }>; } +// ========== DELIVERY INTERFACES ========== + +export interface DeliveryZone { + id: string; + name: string; + deliveryFee: number; + estimatedTimeMinutes: number; + minOrder: number; +} + +export interface CoverageResult { + covered: boolean; + zone?: DeliveryZone; + message?: string; +} + +export interface Delivery { + id: string; + orderId: string; + status: 'pending' | 'assigned' | 'picked_up' | 'in_transit' | 'arrived' | 'delivered' | 'failed' | 'cancelled'; + deliveryAddress: string; + deliveryFee: number; + estimatedMinutes?: number; + assignedToName?: string; + customerPhone?: string; + createdAt: string; +} + +export interface CreateDeliveryDto { + orderId: string; + deliveryAddress: string; + deliveryCoordinates?: { lat: number; lng: number }; + deliveryNotes?: string; + customerPhone?: string; +} + @Injectable() export class BackendApiService { private readonly logger = new Logger(BackendApiService.name); @@ -335,6 +371,126 @@ export class BackendApiService { } } + // ========== DELIVERY ========== + + async checkDeliveryCoverage( + tenantId: string, + coordinates: { lat: number; lng: number }, + ): Promise { + try { + const { data } = await this.client.post('/delivery/check-coverage', { + coordinates, + }, { + headers: this.getTenantHeaders(tenantId), + }); + return data; + } catch (error) { + this.logger.warn(`Failed to check coverage: ${error.message}`); + return { covered: false, message: 'No pudimos verificar la cobertura' }; + } + } + + async checkDeliveryCoverageByAddress( + tenantId: string, + address: string, + colonia?: string, + ): Promise { + try { + const { data } = await this.client.post('/delivery/check-coverage/address', { + address, + colonia, + }, { + headers: this.getTenantHeaders(tenantId), + }); + return data; + } catch (error) { + this.logger.warn(`Failed to check coverage by address: ${error.message}`); + return { covered: false, message: 'No pudimos verificar la cobertura' }; + } + } + + async getDeliveryZones(tenantId: string): Promise { + try { + const { data } = await this.client.get('/delivery/zones', { + headers: this.getTenantHeaders(tenantId), + params: { active: 'true' }, + }); + return data; + } catch (error) { + this.logger.warn(`Failed to get delivery zones: ${error.message}`); + return []; + } + } + + async createDelivery(tenantId: string, dto: CreateDeliveryDto): Promise { + try { + const { data } = await this.client.post('/delivery', dto, { + headers: this.getTenantHeaders(tenantId), + }); + this.logger.log(`Delivery created for order: ${dto.orderId}`); + return data; + } catch (error) { + this.logger.error(`Failed to create delivery: ${error.message}`); + throw error; + } + } + + async getDelivery(tenantId: string, deliveryId: string): Promise { + try { + const { data } = await this.client.get(`/delivery/${deliveryId}`, { + headers: this.getTenantHeaders(tenantId), + }); + return data; + } catch (error) { + this.logger.warn(`Failed to get delivery: ${error.message}`); + return null; + } + } + + async getDeliveryByOrderId(tenantId: string, orderId: string): Promise { + try { + const { data } = await this.client.get(`/delivery/order/${orderId}`, { + headers: this.getTenantHeaders(tenantId), + }); + return data; + } catch (error) { + this.logger.warn(`Failed to get delivery by order: ${error.message}`); + return null; + } + } + + async getPendingDeliveries(tenantId: string): Promise { + try { + const { data } = await this.client.get('/delivery/pending', { + headers: this.getTenantHeaders(tenantId), + }); + return data; + } catch (error) { + this.logger.warn(`Failed to get pending deliveries: ${error.message}`); + return []; + } + } + + async updateDeliveryStatus( + tenantId: string, + deliveryId: string, + status: Delivery['status'], + notes?: string, + ): Promise { + try { + const { data } = await this.client.put(`/delivery/${deliveryId}/status`, { + status, + notes, + }, { + headers: this.getTenantHeaders(tenantId), + }); + return data; + } catch (error) { + this.logger.error(`Failed to update delivery status: ${error.message}`); + throw error; + } + } + // ========== HELPERS ========== private getTenantHeaders(tenantId: string) {