Skip to content

Commit 2469f20

Browse files
committed
Settle trade budget recalculation
1 parent 90b3fe3 commit 2469f20

4 files changed

Lines changed: 101 additions & 54 deletions

File tree

site/admin/index.html

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
})();
1919
</script>
2020
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='10' fill='%2314171a'/%3E%3Cpath d='M8 8h32L8 40z' fill='%23f0c33b'/%3E%3Cpath d='M56 56H24l32-32z' fill='%230d65d9'/%3E%3C/svg%3E">
21-
<link rel="stylesheet" href="../css/base.css?v=20260604-value-added-trade">
22-
<link rel="stylesheet" href="../css/trade.css?v=20260604-value-added-trade">
23-
<link rel="stylesheet" href="../css/ledger.css?v=20260604-value-added-trade">
24-
<link rel="stylesheet" href="../css/simulation.css?v=20260604-value-added-trade">
25-
<link rel="stylesheet" href="../css/records.css?v=20260604-value-added-trade">
26-
<link rel="stylesheet" href="../css/responsive.css?v=20260604-value-added-trade">
21+
<link rel="stylesheet" href="../css/base.css?v=20260604-trade-settle">
22+
<link rel="stylesheet" href="../css/trade.css?v=20260604-trade-settle">
23+
<link rel="stylesheet" href="../css/ledger.css?v=20260604-trade-settle">
24+
<link rel="stylesheet" href="../css/simulation.css?v=20260604-trade-settle">
25+
<link rel="stylesheet" href="../css/records.css?v=20260604-trade-settle">
26+
<link rel="stylesheet" href="../css/responsive.css?v=20260604-trade-settle">
2727
</head>
2828
<body data-app-mode="admin">
2929
<header class="topbar">
@@ -63,24 +63,24 @@ <h1>Global Ledger</h1>
6363
<span id="sourceNote"></span>
6464
</footer>
6565

66-
<script src="../data.js?v=20260604-value-added-trade"></script>
67-
<script src="../js/engine/fiscal.js?v=20260604-value-added-trade"></script>
68-
<script src="../js/engine/tradePolicy.js?v=20260604-value-added-trade"></script>
69-
<script src="../js/engine/trade.js?v=20260604-value-added-trade"></script>
70-
<script src="../engine.js?v=20260604-value-added-trade"></script>
71-
<script src="../js/app/config.js?v=20260604-value-added-trade"></script>
72-
<script src="../js/app/format.js?v=20260604-value-added-trade"></script>
73-
<script src="../js/app/sync.js?v=20260604-value-added-trade"></script>
74-
<script src="../js/app/statusTables.js?v=20260604-value-added-trade"></script>
75-
<script src="../js/app/recordsParser.js?v=20260604-value-added-trade"></script>
76-
<script src="../js/app/records.js?v=20260604-value-added-trade"></script>
77-
<script src="../js/app/tradeMapShapes.js?v=20260604-value-added-trade"></script>
78-
<script src="../js/app/tradeZones.js?v=20260604-value-added-trade"></script>
79-
<script src="../js/app/tradeRouteMesh.js?v=20260604-value-added-trade"></script>
80-
<script src="../js/app/tradeLaneSkeleton.js?v=20260604-value-added-trade"></script>
81-
<script src="../js/app/tradeMap.js?v=20260604-value-added-trade"></script>
82-
<script src="../js/app/tradeView.js?v=20260604-value-added-trade"></script>
83-
<script src="../js/app/editorView.js?v=20260604-value-added-trade"></script>
84-
<script src="../app.js?v=20260604-value-added-trade"></script>
66+
<script src="../data.js?v=20260604-trade-settle"></script>
67+
<script src="../js/engine/fiscal.js?v=20260604-trade-settle"></script>
68+
<script src="../js/engine/tradePolicy.js?v=20260604-trade-settle"></script>
69+
<script src="../js/engine/trade.js?v=20260604-trade-settle"></script>
70+
<script src="../engine.js?v=20260604-trade-settle"></script>
71+
<script src="../js/app/config.js?v=20260604-trade-settle"></script>
72+
<script src="../js/app/format.js?v=20260604-trade-settle"></script>
73+
<script src="../js/app/sync.js?v=20260604-trade-settle"></script>
74+
<script src="../js/app/statusTables.js?v=20260604-trade-settle"></script>
75+
<script src="../js/app/recordsParser.js?v=20260604-trade-settle"></script>
76+
<script src="../js/app/records.js?v=20260604-trade-settle"></script>
77+
<script src="../js/app/tradeMapShapes.js?v=20260604-trade-settle"></script>
78+
<script src="../js/app/tradeZones.js?v=20260604-trade-settle"></script>
79+
<script src="../js/app/tradeRouteMesh.js?v=20260604-trade-settle"></script>
80+
<script src="../js/app/tradeLaneSkeleton.js?v=20260604-trade-settle"></script>
81+
<script src="../js/app/tradeMap.js?v=20260604-trade-settle"></script>
82+
<script src="../js/app/tradeView.js?v=20260604-trade-settle"></script>
83+
<script src="../js/app/editorView.js?v=20260604-trade-settle"></script>
84+
<script src="../app.js?v=20260604-trade-settle"></script>
8585
</body>
8686
</html>

site/engine.js

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,25 @@
272272
.join("|");
273273
}
274274

275+
function recalculationSignature(data) {
276+
return Object.keys(data.national || {})
277+
.sort()
278+
.map((id) => {
279+
const national = data.national[id] || {};
280+
const trade = data.trade?.[id] || {};
281+
return [
282+
id,
283+
roundCurrency(national.budgetCapacity),
284+
roundCurrency(national.budgetExpenditure),
285+
roundCurrency(national.budgetBalance),
286+
roundCurrency(trade.tradeCapacity),
287+
roundCurrency(trade.tradeBalance),
288+
roundCurrency(trade.tradeFlow)
289+
].join(":");
290+
})
291+
.join("|");
292+
}
293+
275294
function load(baseData) {
276295
const saved = localStorage.getItem(STORAGE_KEY);
277296
if (saved) {
@@ -784,9 +803,14 @@
784803
delete data.meta.tradeV4BudgetBalanceTargets;
785804
return data;
786805
}
787-
recalculateTrade(data, options);
788-
recalculateBudgets(data, options);
789-
recalculateTrade(data, options);
806+
let previousSignature = "";
807+
for (let attempt = 0; attempt < 8; attempt++) {
808+
recalculateTrade(data, options);
809+
recalculateBudgets(data, options);
810+
const nextSignature = recalculationSignature(data);
811+
if (attempt > 0 && nextSignature === previousSignature) break;
812+
previousSignature = nextSignature;
813+
}
790814
return data;
791815
}
792816

site/index.html

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
})();
2929
</script>
3030
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='10' fill='%2314171a'/%3E%3Cpath d='M8 8h32L8 40z' fill='%23f0c33b'/%3E%3Cpath d='M56 56H24l32-32z' fill='%230d65d9'/%3E%3C/svg%3E">
31-
<link rel="stylesheet" href="css/base.css?v=20260604-value-added-trade">
32-
<link rel="stylesheet" href="css/trade.css?v=20260604-value-added-trade">
33-
<link rel="stylesheet" href="css/ledger.css?v=20260604-value-added-trade">
34-
<link rel="stylesheet" href="css/simulation.css?v=20260604-value-added-trade">
35-
<link rel="stylesheet" href="css/records.css?v=20260604-value-added-trade">
36-
<link rel="stylesheet" href="css/responsive.css?v=20260604-value-added-trade">
31+
<link rel="stylesheet" href="css/base.css?v=20260604-trade-settle">
32+
<link rel="stylesheet" href="css/trade.css?v=20260604-trade-settle">
33+
<link rel="stylesheet" href="css/ledger.css?v=20260604-trade-settle">
34+
<link rel="stylesheet" href="css/simulation.css?v=20260604-trade-settle">
35+
<link rel="stylesheet" href="css/records.css?v=20260604-trade-settle">
36+
<link rel="stylesheet" href="css/responsive.css?v=20260604-trade-settle">
3737
</head>
3838
<body data-app-mode="public">
3939
<header class="topbar">
@@ -75,24 +75,24 @@ <h1>Global Ledger</h1>
7575
</span>
7676
</footer>
7777

78-
<script src="data.js?v=20260604-value-added-trade"></script>
79-
<script src="js/engine/fiscal.js?v=20260604-value-added-trade"></script>
80-
<script src="js/engine/tradePolicy.js?v=20260604-value-added-trade"></script>
81-
<script src="js/engine/trade.js?v=20260604-value-added-trade"></script>
82-
<script src="engine.js?v=20260604-value-added-trade"></script>
83-
<script src="js/app/config.js?v=20260604-value-added-trade"></script>
84-
<script src="js/app/format.js?v=20260604-value-added-trade"></script>
85-
<script src="js/app/sync.js?v=20260604-value-added-trade"></script>
86-
<script src="js/app/statusTables.js?v=20260604-value-added-trade"></script>
87-
<script src="js/app/recordsParser.js?v=20260604-value-added-trade"></script>
88-
<script src="js/app/records.js?v=20260604-value-added-trade"></script>
89-
<script src="js/app/tradeMapShapes.js?v=20260604-value-added-trade"></script>
90-
<script src="js/app/tradeZones.js?v=20260604-value-added-trade"></script>
91-
<script src="js/app/tradeRouteMesh.js?v=20260604-value-added-trade"></script>
92-
<script src="js/app/tradeLaneSkeleton.js?v=20260604-value-added-trade"></script>
93-
<script src="js/app/tradeMap.js?v=20260604-value-added-trade"></script>
94-
<script src="js/app/tradeView.js?v=20260604-value-added-trade"></script>
95-
<script src="js/app/editorView.js?v=20260604-value-added-trade"></script>
96-
<script src="app.js?v=20260604-value-added-trade"></script>
78+
<script src="data.js?v=20260604-trade-settle"></script>
79+
<script src="js/engine/fiscal.js?v=20260604-trade-settle"></script>
80+
<script src="js/engine/tradePolicy.js?v=20260604-trade-settle"></script>
81+
<script src="js/engine/trade.js?v=20260604-trade-settle"></script>
82+
<script src="engine.js?v=20260604-trade-settle"></script>
83+
<script src="js/app/config.js?v=20260604-trade-settle"></script>
84+
<script src="js/app/format.js?v=20260604-trade-settle"></script>
85+
<script src="js/app/sync.js?v=20260604-trade-settle"></script>
86+
<script src="js/app/statusTables.js?v=20260604-trade-settle"></script>
87+
<script src="js/app/recordsParser.js?v=20260604-trade-settle"></script>
88+
<script src="js/app/records.js?v=20260604-trade-settle"></script>
89+
<script src="js/app/tradeMapShapes.js?v=20260604-trade-settle"></script>
90+
<script src="js/app/tradeZones.js?v=20260604-trade-settle"></script>
91+
<script src="js/app/tradeRouteMesh.js?v=20260604-trade-settle"></script>
92+
<script src="js/app/tradeLaneSkeleton.js?v=20260604-trade-settle"></script>
93+
<script src="js/app/tradeMap.js?v=20260604-trade-settle"></script>
94+
<script src="js/app/tradeView.js?v=20260604-trade-settle"></script>
95+
<script src="js/app/editorView.js?v=20260604-trade-settle"></script>
96+
<script src="app.js?v=20260604-trade-settle"></script>
9797
</body>
9898
</html>

tools/trade-v4-budget-migration.test.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ test("Trade V4 value-added strength lets advanced import-heavy economies profit
311311
const Engine = loadEngine();
312312
const data = valueAddedFixture();
313313

314-
for (let attempt = 0; attempt < 3; attempt++) Engine.recalculateAll(data);
314+
Engine.recalculateAll(data);
315315

316316
assert.ok(
317317
data.trade.solara.tradeBalance >= 325000,
@@ -330,3 +330,26 @@ test("Trade V4 value-added strength lets advanced import-heavy economies profit
330330
`expected value-added economy to outperform weak importer; got ${data.national.low_value_importer.budgetCapacity} vs ${data.national.solara.budgetCapacity}`
331331
);
332332
});
333+
334+
test("Trade V4 recalculation settles trade and budget feedback in one call", () => {
335+
const Engine = loadEngine();
336+
const data = valueAddedFixture();
337+
338+
Engine.recalculateAll(data);
339+
const first = {
340+
solaraBudget: data.national.solara.budgetCapacity,
341+
solaraTradeBalance: data.trade.solara.tradeBalance,
342+
xanaquBudget: data.national.xanaqu.budgetCapacity,
343+
xanaquTradeBalance: data.trade.xanaqu.tradeBalance
344+
};
345+
346+
Engine.recalculateAll(data);
347+
const second = {
348+
solaraBudget: data.national.solara.budgetCapacity,
349+
solaraTradeBalance: data.trade.solara.tradeBalance,
350+
xanaquBudget: data.national.xanaqu.budgetCapacity,
351+
xanaquTradeBalance: data.trade.xanaqu.tradeBalance
352+
};
353+
354+
assert.deepEqual(second, first);
355+
});

0 commit comments

Comments
 (0)