1
import { Injectable } from '@nestjs/common';
2
import { FulfillableCapacityService, type CapacityFactor } from '../capacity/fulfillable-capacity.service';
3
import { DistributionIntelligenceService, type DistributionChannelDemand, type DistributionIntelligenceRecommendation } from './distribution-intelligence.service';
4
import { IntelligenceReadinessService, type IntelligenceReadiness } from '../intelligence/intelligence-readiness.service';
5
6
export interface DistributionPlanningInput {
7
factors: CapacityFactor[];
8
channels: DistributionChannelDemand[];
9
operationalReady?: boolean;
10
}
11
12
export interface DistributionPlanningResult {
13
fulfillableCapacity: number;
14
limitingFactors: string[];
15
recommendation: DistributionIntelligenceRecommendation;
16
readiness: IntelligenceReadiness;
17
requiresHumanConfirmation: true;
18
}
19
20
@Injectable()
21
export class DistributionPlanningService {
22
constructor(
23
private readonly capacity: FulfillableCapacityService,
24
private readonly distribution: DistributionIntelligenceService,
25
private readonly readiness: IntelligenceReadinessService,
26
) {}
27
28
prepare(input: DistributionPlanningInput): DistributionPlanningResult {
29
if (!input || typeof input !== 'object' || !Array.isArray(input.factors) || !Array.isArray(input.channels) || input.factors.length > 100 || input.channels.length > 1000 || (input.operationalReady !== undefined && typeof input.operationalReady !== 'boolean')) throw new Error('distribution_planning.invalid');
30
const capacity = this.capacity.calculate(input.factors);
31
const recommendation = this.distribution.recommend({fulfillableCapacity: capacity.capacity, channels: input.channels});
32
const readiness = this.readiness.evaluate({evidenceCount: input.channels.length, capacityAvailable: capacity.capacity > 0, operationalReady: input.operationalReady !== false, requiresHumanConfirmation: true});
33
return {fulfillableCapacity: capacity.capacity, limitingFactors: capacity.limitingFactors, recommendation, readiness, requiresHumanConfirmation: true};
34
}
35
}
36