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:
parent
8ba0b7ec56
commit
b535856159
@ -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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user