commit 1a0260fa46be246dc33138f5d1d3254ea397ce5b
parent 7eb2000f9451e89e3df9d65e5cb996ea29598fe6
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 12:59:44 +0000
core: add supply claim types
Diffstat:
2 files changed, 80 insertions(+), 0 deletions(-)
diff --git a/src/hyf_core/domain/supply_claim.mojo b/src/hyf_core/domain/supply_claim.mojo
@@ -0,0 +1,58 @@
+from hyf_core.domain.product import ProductRef
+
+
+@fieldwise_init
+struct SupplyClaim(Copyable, Movable):
+ var claim_id: String
+ var product: ProductRef
+ var status: String
+ var quantity_state: String
+ var quantity_value: Int
+ var quantity_scale: Int
+ var unit: String
+ var qualifier: String
+ var review_required: Bool
+
+
+def supply_claim(
+ claim_id: String,
+ product: ProductRef,
+ status: String,
+ quantity_state: String,
+ quantity_value: Int,
+ quantity_scale: Int,
+ unit: String,
+ qualifier: String,
+) raises -> SupplyClaim:
+ if claim_id.strip() == "":
+ raise Error("claim id must not be empty")
+ var allowed = ["offered", "forecast", "unavailable", "correction", "unclear"]
+ var known = False
+ for candidate in allowed:
+ if candidate == status:
+ known = True
+ if not known:
+ raise Error("unknown supply status: " + status)
+ if quantity_state != "known" and quantity_state != "unknown":
+ raise Error("quantity state must be 'known' or 'unknown'")
+ if quantity_scale < 0 or quantity_scale > 9:
+ raise Error("quantity scale must be between 0 and 9")
+ return SupplyClaim(
+ claim_id=String(claim_id),
+ product=product.copy(),
+ status=String(status),
+ quantity_state=String(quantity_state),
+ quantity_value=quantity_value,
+ quantity_scale=quantity_scale,
+ unit=String(unit),
+ qualifier=String(qualifier),
+ review_required=True,
+ )
+
+
+def claim_confirms_inventory(claim: SupplyClaim) -> Bool:
+ return False
+
+
+def claim_is_forecast(claim: SupplyClaim) -> Bool:
+ return claim.status == "forecast"
diff --git a/tests/test_domain.mojo b/tests/test_domain.mojo
@@ -343,3 +343,25 @@ def test_product_reference_resolution_and_unknown() raises:
assert_true(not product_matches(tomato, unknown))
with assert_raises():
_ = resolved_product("x", "")
+
+
+from hyf_core.domain.supply_claim import (
+ claim_confirms_inventory,
+ claim_is_forecast,
+ supply_claim,
+)
+
+
+def test_supply_claims_are_per_product_and_not_inventory() raises:
+ var tomatoes = resolved_product("Roma tomatoes", "tomato.roma")
+ var basil = resolved_product("Basil", "basil")
+ var tomato_claim = supply_claim("c1", tomatoes, "offered", "known", 80, 0, "lb", "approximate")
+ var basil_claim = supply_claim("c2", basil, "unavailable", "unknown", 0, 0, "", "unknown")
+ assert_equal(tomato_claim.status, "offered")
+ assert_equal(basil_claim.status, "unavailable")
+ assert_true(not claim_confirms_inventory(tomato_claim))
+ var forecast = supply_claim("c3", basil, "forecast", "unknown", 0, 0, "", "unknown")
+ assert_true(claim_is_forecast(forecast))
+ assert_true(not claim_is_forecast(tomato_claim))
+ with assert_raises():
+ _ = supply_claim("c4", tomatoes, "probably", "known", 1, 0, "kg", "exact")