95 lines
3.9 KiB
Python
95 lines
3.9 KiB
Python
from test_est_rea_parity import run
|
|
|
|
|
|
def test_escalation_uses_design_denominator_and_all_price_branches():
|
|
result = run(
|
|
"math",
|
|
"""(()=>{
|
|
const p=EstNative.empty();p.options.SourceRefresh=false;
|
|
p.tables.EstMainDat=[{PkID:1,Code:'R',GN:10,GU:80},{LinkIndex:54}];
|
|
p.tables.Wonga=[{Gubun:'G',Name:'direct',BaseField:'GC'},
|
|
{Gubun:'T',Name:'total',LinkIndex:55,VSusic:'G'}];
|
|
const q=EstBusiness.baseline(EstNative.calculate(p));
|
|
Object.assign(q.tables.EstMainDat[0],{AGU:100,GU:120,EscPlanned:2,EscActual:3,EscProgress:1});
|
|
const before=JSON.stringify(q),output=EstBusiness.escalation(q);
|
|
const cases=[[100,80,120],[80,100,120],[100,80,90],[100,80,60]].map(([a,c,b])=>{
|
|
const x=structuredClone(q);x.tables.EstMainDat[0].AGU=a;x.tables.EstMainDat[0].GU=b;
|
|
x.baseline.tables.EstMainDat[0].GU=c;return EstBusiness.escalation(x).rows[0];
|
|
});
|
|
return {output,cases,same:before===JSON.stringify(q)};
|
|
})()""",
|
|
)
|
|
assert result["same"]
|
|
output = result["output"]
|
|
assert output["errors"] == []
|
|
assert output["designTotal"] == 1000
|
|
assert output["contractTotal"] == 800
|
|
assert output["adjustedTotal"] == 960
|
|
assert output["excludedTotal"] == 240
|
|
assert output["applied"] == 560
|
|
assert output["rate"] == 16
|
|
assert output["adjustment"] == 89
|
|
assert [row["EGU"] for row in result["cases"]] == [16, 20, 0, 0]
|
|
|
|
|
|
def test_native_contract_columns_and_manual_exclusions_and_percent_units():
|
|
result = run(
|
|
"math",
|
|
"""(()=>{
|
|
const p=EstNative.empty();p.options.SourceRefresh=false;
|
|
p.tables.EstMainDat=[{PkID:1,Code:'R',GN:50,GN_:50,Unite:'%',GU:120,GU_:80,AGU:100,
|
|
EscAuto:false,EscManualQuantity:10,EscPlanned:40},{LinkIndex:54}];
|
|
return EstBusiness.escalation(p);
|
|
})()""",
|
|
)
|
|
assert result["errors"] == []
|
|
assert result["rows"][0]["EscExcluded"] == 10
|
|
assert result["rows"][0]["EscApplied"] == 40
|
|
assert result["rows"][0]["GC"] == 48
|
|
assert result["contractTotal"] == 40
|
|
assert result["excludedTotal"] == 8
|
|
assert result["designTotal"] == 50
|
|
|
|
|
|
def test_fixed_contract_amount_excludes_only_the_selected_quantity():
|
|
result = run(
|
|
"math",
|
|
"""(()=>{
|
|
const p=EstNative.empty();p.options.SourceRefresh=false;
|
|
p.tables.EstMainDat=[{PkID:1,Code:'R',GN:10,GC:1000,TC:1000,CalcIndex:1,EscActual:3},
|
|
{LinkIndex:54}];p.options.EscDesignTotal=1200;
|
|
return EstBusiness.escalation(p);
|
|
})()""",
|
|
)
|
|
assert result["errors"] == []
|
|
assert result["contractTotal"] == 1000
|
|
assert result["excludedTotal"] == 300
|
|
assert result["applied"] == 700
|
|
assert result["rate"] == 0
|
|
|
|
|
|
def test_contract_and_bid_file_import_follow_native_record_order_and_preserve_working_file():
|
|
result = run(
|
|
"math",
|
|
"""(()=>{
|
|
const p=EstNative.empty();p.id='123456789012345678901234';p.options.SourceRefresh=false;
|
|
p.tables.EstMainDat=[{PkID:7,Code:'R',GN:10,GU:120},{PkID:8,LinkIndex:54}];
|
|
const incoming=structuredClone(p);incoming.name='contract';
|
|
incoming.tables.EstMainDat[0].PkID=1;incoming.tables.EstMainDat[0].GU=80;
|
|
const before=JSON.stringify(p),q=EstBusiness.importContract(p,incoming);
|
|
incoming.tables.EstMainDat[0].GU=100;
|
|
const r=EstBusiness.importBid(q,incoming);
|
|
const output=EstBusiness.escalation(r);
|
|
incoming.tables.EstMainDat[0].Code='different';let rejected=false;
|
|
try{EstBusiness.importContract(p,incoming);}catch{rejected=true;}
|
|
return {r,output,rejected,same:before===JSON.stringify(p)};
|
|
})()""",
|
|
)
|
|
assert result["same"] and result["rejected"]
|
|
assert result["r"]["id"] == "123456789012345678901234"
|
|
assert result["r"]["tables"]["EstMainDat"][0]["GU"] == 120
|
|
assert result["r"]["baseline"]["tables"]["EstMainDat"][0]["PkID"] == 7
|
|
assert result["output"]["contractTotal"] == 800
|
|
assert result["output"]["designTotal"] == 1000
|
|
assert result["output"]["rate"] == 16
|