Files
tps/src/modules/feature/feature-board.ts
Julien Calixte 05e89f6b03 add quality issue
2023-07-22 17:34:26 +02:00

99 lines
2.2 KiB
TypeScript

import { Feature } from '@/modules/feature/feature'
import { FeatureStep } from '@/modules/feature/feature-steps'
import { features } from '@/modules/feature/feature.fixture'
import { pickRandomElement, popNElement, shuffleArray } from '@/utils'
const hasQualityIssue = (
complexity: number,
tasksInParallel: number
): boolean => {
let probabilityOfQualityIssue = 0
switch (complexity) {
case 1:
probabilityOfQualityIssue = 0.8
break
case 2:
probabilityOfQualityIssue = 0.7
break
case 3:
probabilityOfQualityIssue = 0.6
break
default:
probabilityOfQualityIssue = 0.5
break
}
let multiplicator = 1
switch (tasksInParallel) {
case 1:
multiplicator = 1
case 2:
multiplicator = 1.05
case 3:
multiplicator = 1.08
case 4:
multiplicator = 1.1
case 5:
multiplicator = 1.15
}
return Math.random() > probabilityOfQualityIssue / multiplicator
}
export const createFeatureBoard = () => {
const boardFeatures = shuffleArray(features)
const initBoard = (steps: FeatureStep[]): Feature[] => {
const initialFeatures = popNElement(boardFeatures, 10)
initialFeatures.forEach((feature) => {
const step = pickRandomElement(steps)
feature.status = pickRandomElement(['doing', 'done'])
feature.step = step.stepIndex
})
return initialFeatures
}
const nextDay = (features: Feature[]): Feature[] => {
features.forEach((feature) => {
const isFeatureLive = feature.step === 0 && feature.status === 'done'
if (isFeatureLive) {
return
}
feature.leadTime++
switch (feature.status) {
case 'doing':
feature.status = 'done'
break
case 'done':
feature.status = 'doing'
if (
hasQualityIssue(
feature.complexity,
features.filter(
(f) => f.status === 'doing' && f.step === feature.step
).length
)
) {
feature.step = Math.min(4, feature.step + 1)
feature.qualityIssue++
} else {
feature.step--
}
break
}
})
return features
}
return { initBoard, nextDay }
}