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 <noreply@anthropic.com>
This commit is contained in:
rckrdmrd 2026-01-18 03:42:48 -06:00
parent 8ba0b7ec56
commit b535856159

View File

@ -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<CoverageResult> {
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<CoverageResult> {
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<DeliveryZone[]> {
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<Delivery> {
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<Delivery | null> {
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<Delivery | null> {
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<Delivery[]> {
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<Delivery> {
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) {