Sprint 2 Etapas 1-2: modelo recursos utilizationMinutes+units, Dexie v3, ActivityPanel wow

This commit is contained in:
2026-05-19 21:26:34 -03:00
parent 49364f4b18
commit a01380240a
23 changed files with 292265 additions and 244 deletions

View File

@@ -10,7 +10,8 @@ export const ResourceSchema = z.object({
export const ActivityResourceAssignmentSchema = z.object({
resourceId: z.string().uuid(),
utilizationPercent: z.number().min(0).max(1),
utilizationMinutes: z.number().min(0, 'Los minutos no pueden ser negativos'),
units: z.number().int().min(1, 'Las unidades deben ser al menos 1').default(1),
})
export const ActivitySchema = z.object({

View File

@@ -207,7 +207,7 @@ export function runSimulation(input: SimulationInput): SimulationResult {
for (const assignment of activity.assignedResources) {
const resource = resources.get(assignment.resourceId)
if (!resource) continue
const hoursUsed = (executionTimeMinutes / 60) * assignment.utilizationPercent
const hoursUsed = (assignment.utilizationMinutes / 60) * assignment.units
const cost = resource.costPerHour * hoursUsed * execProb
resourceBreakdown.push({ resourceId: resource.id, resourceName: resource.name, cost })
resourceCostDirect += cost
@@ -215,7 +215,7 @@ export function runSimulation(input: SimulationInput): SimulationResult {
const prev = resourceTotals.get(resource.id) ?? { cost: 0, minutes: 0, name: resource.name }
resourceTotals.set(resource.id, {
cost: prev.cost + cost,
minutes: prev.minutes + activity.executionTimeMinutes * assignment.utilizationPercent * execProb,
minutes: prev.minutes + assignment.utilizationMinutes * assignment.units * execProb,
name: resource.name,
})
}

View File

@@ -36,7 +36,8 @@ export interface Activity {
export interface ActivityResourceAssignment {
resourceId: UUID
utilizationPercent: number
utilizationMinutes: number // minutos que este recurso dedica por ejecución (independiente del tiempo de la actividad)
units: number // cantidad de unidades del recurso (ej: 2 impresoras). Default: 1.
}
export type GatewayType = 'exclusive' | 'parallel' | 'inclusive' | 'event-based'