CTM Calculators: Add PS billing milestones, Adjust Genesys RAMP
This commit is contained in:
@@ -41,20 +41,46 @@ def test_runrate_saving_annual():
|
||||
assert mw.runrate_saving_annual(regions=["NA"]) == pytest.approx(3_000_000)
|
||||
assert mw.runrate_saving_annual(licence_annual=4_800_000,
|
||||
regions=[]) == pytest.approx(2_500_000)
|
||||
# Contracted frame: managed services stay in the run-rate forever.
|
||||
assert mw.runrate_saving_annual(
|
||||
a4.tco("ccaas_annual"), managed_annual=a4.MANAGED_SERVICES_ANNUAL
|
||||
) == pytest.approx(6_589_081.60)
|
||||
|
||||
|
||||
def _default_wfm_benefits_by_year():
|
||||
ben = mw.wfm_benefits_by_year(_default_benefit_rollout())
|
||||
return {y: float(ben.loc[ben.year == y, "benefit"].sum()) for y in a4.YEARS}
|
||||
|
||||
|
||||
def test_breakeven_extrapolates_past_window():
|
||||
# Deck frame: deck licence rate (6-month ramp), verbatim PS lump,
|
||||
# no managed services.
|
||||
cs = a4.current_state_inputs(SITES)
|
||||
cur = a4.current_costs_by_year(cs)
|
||||
lic = a4.licence_costs_by_year()
|
||||
ps = a4.ps_costs_by_year()
|
||||
total = {y: cur[y] + lic[y] + ps[y] for y in a4.YEARS}
|
||||
ben = mw.wfm_benefits_by_year(_default_benefit_rollout())
|
||||
ben_y = {y: float(ben.loc[ben.year == y, "benefit"].sum()) for y in a4.YEARS}
|
||||
inc, net = a4.case_flows(total, ben_y)
|
||||
assert sum(net.values()) == pytest.approx(-1_553_000, abs=1_000)
|
||||
inc, net = a4.case_flows(total, _default_wfm_benefits_by_year())
|
||||
assert sum(net.values()) == pytest.approx(-3_703_000, abs=1_000)
|
||||
label = mw.runrate_breakeven_label(net, mw.runrate_saving_annual())
|
||||
assert label == "40 months (~Apr 2029, extrapolated)"
|
||||
assert label == "44 months (~Aug 2029, extrapolated)"
|
||||
|
||||
|
||||
def test_contracted_frame_with_sow_and_managed_services():
|
||||
# Contracted frame: signed licence rate, SOW PS milestones, managed
|
||||
# services from MCX go-live — the case the notebook leads with.
|
||||
cs = a4.current_state_inputs(SITES)
|
||||
cur = a4.current_costs_by_year(cs)
|
||||
lic = a4.licence_costs_by_year(annual=a4.tco("ccaas_annual"))
|
||||
ps = a4.ps_costs_by_year(contracted=True)
|
||||
man = a4.managed_services_by_year()
|
||||
total = {y: cur[y] + lic[y] + ps[y] + man[y] for y in a4.YEARS}
|
||||
inc, net = a4.case_flows(total, _default_wfm_benefits_by_year())
|
||||
assert sum(net.values()) == pytest.approx(-1_503_013, abs=1_000)
|
||||
runrate = mw.runrate_saving_annual(
|
||||
a4.tco("ccaas_annual"), managed_annual=a4.MANAGED_SERVICES_ANNUAL)
|
||||
label = mw.runrate_breakeven_label(net, runrate)
|
||||
assert label == "39 months (~Mar 2029, extrapolated)"
|
||||
|
||||
|
||||
def test_breakeven_defers_in_window_and_guards_zero_runrate():
|
||||
|
||||
Reference in New Issue
Block a user