pack.mojo (1905B)
1 from hyf_core.domain.quantity import Quantity 2 from hyf_core.domain.units import unit_dimension 3 4 5 @fieldwise_init 6 struct PackRule(Copyable, Movable): 7 var product_id: String 8 var pack_unit: String 9 var inner_unit: String 10 var per_pack_value: Int 11 var per_pack_scale: Int 12 var version: String 13 14 15 def pack_rule( 16 product_id: String, 17 pack_unit: String, 18 inner_unit: String, 19 per_pack_value: Int, 20 per_pack_scale: Int, 21 version: String, 22 ) raises -> PackRule: 23 if product_id.strip() == "" or version.strip() == "": 24 raise Error("pack rule requires product_id and version") 25 if pack_unit.strip() == "" or inner_unit.strip() == "": 26 raise Error("pack rule requires pack_unit and inner_unit") 27 if per_pack_value <= 0: 28 raise Error("pack rule per_pack_value must be positive") 29 if per_pack_scale < 0 or per_pack_scale > 9: 30 raise Error("pack rule per_pack_scale must be between 0 and 9") 31 if unit_dimension(inner_unit) == "unknown": 32 raise Error("pack rule inner_unit dimension is unknown") 33 return PackRule( 34 product_id=String(product_id), 35 pack_unit=String(pack_unit), 36 inner_unit=String(inner_unit), 37 per_pack_value=per_pack_value, 38 per_pack_scale=per_pack_scale, 39 version=String(version), 40 ) 41 42 43 def apply_pack_conversion( 44 product_id: String, packs: Quantity, rule: PackRule 45 ) raises -> Quantity: 46 if product_id != rule.product_id: 47 raise Error("pack rule does not apply to product " + product_id) 48 if packs.unit != rule.pack_unit: 49 raise Error("pack rule does not apply to unit " + packs.unit) 50 var result = packs.copy() 51 result.value = packs.value * rule.per_pack_value 52 result.scale = packs.scale + rule.per_pack_scale 53 result.unit = String(rule.inner_unit) 54 result.dimension = String(unit_dimension(rule.inner_unit)) 55 return result^