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()
|
@Injectable()
|
||||||
export class BackendApiService {
|
export class BackendApiService {
|
||||||
private readonly logger = new Logger(BackendApiService.name);
|
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 ==========
|
// ========== HELPERS ==========
|
||||||
|
|
||||||
private getTenantHeaders(tenantId: string) {
|
private getTenantHeaders(tenantId: string) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user