import Big from "big.js"; import { Component, createMemo } from "solid-js"; import { createStore } from "solid-js/store"; import { TextInput } from "./Form"; import { calculateAgileQuantity } from "./Positions"; import { formatAmount } from "./SwissInvoice"; const AgileCalculator: Component = () => { const [agileCalculator, setAgileCalculator] = createStore({ minPoints: 0, maxPoints: 10, risk: 70, singlePrice: 10.0, hoursPerPoint: 1, }); const hours = createMemo(() => calculateAgileQuantity( agileCalculator.hoursPerPoint, new Big(agileCalculator.risk).div(100).toNumber(), agileCalculator.minPoints, agileCalculator.maxPoints ) ); const quantity = createMemo(() => agileCalculator.hoursPerPoint > 0 ? new Big(hours()).div(agileCalculator.hoursPerPoint).toNumber() : hours() ); return (

Rechnungsbeispiel

!Number.isNaN(e.currentTarget.valueAsNumber) && setAgileCalculator("risk", e.currentTarget.valueAsNumber) } /> !Number.isNaN(e.currentTarget.valueAsNumber) && setAgileCalculator("minPoints", e.currentTarget.valueAsNumber) } /> !Number.isNaN(e.currentTarget.valueAsNumber) && setAgileCalculator("maxPoints", e.currentTarget.valueAsNumber) } /> !Number.isNaN(e.currentTarget.valueAsNumber) && setAgileCalculator("hoursPerPoint", e.currentTarget.valueAsNumber) } /> !Number.isNaN(e.currentTarget.valueAsNumber) && setAgileCalculator("singlePrice", e.currentTarget.valueAsNumber) } />
{"("} {new Big(-100).plus(agileCalculator.risk).abs().toNumber()}% {" "} *{" "} {agileCalculator.minPoints} SP {")"} + {"("} {agileCalculator.risk}% {" "} *{" "} {agileCalculator.maxPoints > agileCalculator.minPoints ? agileCalculator.maxPoints : agileCalculator.minPoints}{" "} SP {")"} =
Gewichtete Story Points: {quantity()} SP
{quantity()} SP {" "} *{" "} {agileCalculator.hoursPerPoint} h {" "} =
Menge: {hours()} h
{hours()} h {" "} *{" "} {agileCalculator.singlePrice} CHF {" "} =
Gesamtpreis: {formatAmount( new Big(hours()).mul(agileCalculator.singlePrice).toNumber() )}{" "} CHF
); }; export default AgileCalculator;