"""Deterministic fictional planning fixture, not a production migration simulator.""" import csv, json from pathlib import Path HERE=Path(__file__).parent MODULES=[ dict(module='Catalog',accepted_wave=1,last_old_consumer_wave=1,historical_access_ready_wave=2), dict(module='Orders',accepted_wave=2,last_old_consumer_wave=4,historical_access_ready_wave=3), dict(module='Billing',accepted_wave=3,last_old_consumer_wave=5,historical_access_ready_wave=4), dict(module='Reporting',accepted_wave=3,last_old_consumer_wave=3,historical_access_ready_wave=5), dict(module='Notifications',accepted_wave=4,last_old_consumer_wave=4,historical_access_ready_wave=5), dict(module='Partner feed',accepted_wave=4,last_old_consumer_wave=6,historical_access_ready_wave=5), ] def evaluate(modules, observation_waves=1): assert observation_waves>=1 rows=[] for module in modules: assert all(isinstance(v,int) and v>=0 for k,v in module.items() if k!='module') row=dict(module) row['retirement_wave']=max(row['accepted_wave']+observation_waves,row['last_old_consumer_wave'],row['historical_access_ready_wave']) rows.append(row) end=max(row['retirement_wave'] for row in rows) waves=[dict(wave=w,accepted_modules=sum(r['accepted_wave']<=w for r in rows),retired_modules=sum(r['retirement_wave']<=w for r in rows)) for w in range(end+1)] return dict(scenario='Fictional six-module modernization plan',observation_waves=observation_waves,units='Ordered planning waves, not calendar weeks',assumptions=['One full planning-wave observation interval after acceptance is an invented fixture rule, not universal guidance.','Historical access readiness may be satisfied by an approved independent data export; no legal retention period is prescribed.','Last old-system consumer removal is an input assumption, not discovered automatically.','No prices, operational success probability or vendor performance is modeled.'],modules=rows,waves=waves) def main(): result=evaluate(MODULES) assert result['waves'][4]==dict(wave=4,accepted_modules=6,retired_modules=2) delayed=[{**m,'last_old_consumer_wave':8} if m['module']=='Partner feed' else m for m in MODULES] assert evaluate(delayed)['modules'][-1]['retirement_wave']==8 assert all(r['retirement_wave']>=r['accepted_wave']+2 for r in evaluate(MODULES,2)['modules']) (HERE/'results.json').write_text(json.dumps(result,indent=2)+'\n') for filename,rows in [('migration-modules.csv',result['modules']),('migration-waves.csv',result['waves'])]: with (HERE/filename).open('w',newline='') as f: writer=csv.DictWriter(f,fieldnames=rows[0]);writer.writeheader();writer.writerows(rows) print(json.dumps({'wave4':result['waves'][4],'retirementWaves':[r['retirement_wave'] for r in result['modules']],'checks':'PASS: base fixture, late consumer and longer observation interval'})) if __name__=='__main__':main()