Add business pricing and closure controls with compatible digest optimization

This commit is contained in:
Takeshi
2026-09-09 12:04:12 +09:00
parent 071e338e82
commit b3b82ef03e
35 changed files with 2203 additions and 59 deletions
+28 -3
View File
@@ -15,6 +15,7 @@ const FacilityInstanceType = preload("res://scripts/facility/facility_instance.g
const ServiceRequestType = preload("res://scripts/facility/service_request.gd")
const ServiceInstanceType = preload("res://scripts/facility/service_instance.gd")
const CommandResultType = preload("res://scripts/core/command_result.gd")
const FacilityPricingType = preload("res://scripts/facility/facility_pricing.gd")
const SNAPSHOT_VERSION := 1
const STAFF_REPLACEMENT_GRACE_MINUTES := 5
@@ -175,15 +176,22 @@ func set_policy(
return _not_found("Facility instance", instance_id)
if patch.is_empty():
return _invalid("Policy patch cannot be empty.")
var validation := FacilityPricingType.validate_patch(patch)
if not bool(validation[&"valid"]):
return _invalid(String(validation[&"message"]), {&"reason": validation[&"reason"]})
var normalized_patch: Dictionary = validation[&"patch"]
if effective_at >= 0 and effective_at > current_minute:
instance.schedule_policy_patch(patch, effective_at)
instance.schedule_policy_patch(normalized_patch, effective_at)
last_error = ""
return _success({
&"instance_id": instance_id,
&"pending_revision": instance.policy_pending_revision,
&"effective_at": effective_at,
})
var changed := instance.apply_policy_patch(patch)
var changed := instance.apply_policy_patch(normalized_patch)
var old_state := instance.state
instance.evaluate_state(current_minute)
_emit_state_change(instance, old_state)
last_error = ""
return _success({
&"instance_id": instance_id,
@@ -205,7 +213,7 @@ func create_request(
return null
var quotation := options.duplicate(true)
if not _has_value(quotation, &"quoted_price"):
quotation[&"quoted_price"] = instance.base_price
quotation[&"quoted_price"] = FacilityPricingType.quote(instance.base_price, instance.policy_current)
if not _has_value(quotation, &"expected_quality"):
quotation[&"expected_quality"] = instance.base_quality
if not _has_value(quotation, &"service_minutes"):
@@ -560,6 +568,11 @@ func restore_snapshot(snapshot: Dictionary) -> bool:
if instance == null or restored_instances.has(instance.instance_id):
last_error = "Facility snapshot contains an invalid or duplicate instance."
return false
if not _saved_policy_is_valid(instance.policy_current) or not _saved_policy_is_valid(instance.policy_pending):
return false
for active: ServiceInstance in instance.active_services.values():
if not _saved_policy_is_valid(active.policy_snapshot):
return false
restored_instances[instance.instance_id] = instance
var restored_requests: Dictionary = {}
@@ -571,6 +584,8 @@ func restore_snapshot(snapshot: Dictionary) -> bool:
if request == null or restored_requests.has(request.request_id):
last_error = "Facility snapshot contains an invalid or duplicate request."
return false
if not _saved_policy_is_valid(request.policy_snapshot):
return false
restored_requests[request.request_id] = request
var restored_history: Dictionary = {}
@@ -582,6 +597,8 @@ func restore_snapshot(snapshot: Dictionary) -> bool:
if service == null or not service.is_terminal() or restored_history.has(service.service_id):
last_error = "Facility snapshot contains invalid service history."
return false
if not _saved_policy_is_valid(service.policy_snapshot):
return false
restored_history[service.service_id] = service
var restored_known_instances: Variant = _id_set(_value(snapshot, &"known_instance_ids", []))
@@ -619,6 +636,14 @@ func restore_snapshot(snapshot: Dictionary) -> bool:
return true
func _saved_policy_is_valid(policy: Dictionary) -> bool:
var validation := FacilityPricingType.validate_patch(policy)
if not bool(validation[&"valid"]):
last_error = "Facility snapshot contains an invalid policy: %s" % validation[&"reason"]
return false
return true
func _validate_restored_graph(
instances: Dictionary,
requests: Dictionary,