Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions specification/policies/p2p-trading-interdiscom.rego
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import rego.v1
#
# Config:
# data.config.minDeliveryLeadHours - minimum hours of lead time (default: 4)
# data.config.validateDeliverySlotDuration - enforce exactly 1 hour slot (default: false)

default min_lead_hours := 4

Expand All @@ -77,6 +78,12 @@ min_lead_hours := to_number(data.config.minDeliveryLeadHours) if {

ns_per_hour := 1000 * 1000 * 1000 * 60 * 60

default validate_delivery_slot_duration := false

validate_delivery_slot_duration := true if {
data.config.validateDeliverySlotDuration == true
}

# Parse the trade timestamp from context
trade_time := time.parse_rfc3339_ns(input.context.timestamp)

Expand Down Expand Up @@ -175,6 +182,8 @@ _order_violations contains msg if {

# Rule 3 – Delivery window must be exactly 1 hour
_order_violations contains msg if {
validate_delivery_slot_duration

item := input.message.order["beckn:orderItems"][i]
offer_attrs := item["beckn:acceptedOffer"]["beckn:offerAttributes"]

Expand Down Expand Up @@ -679,6 +688,8 @@ _publish_violations contains msg if {

# Publish Rule 5b — Delivery window must be exactly 1 hour (mirrors O3)
_publish_violations contains msg if {
validate_delivery_slot_duration

offer := input.message.catalogs[_]["beckn:offers"][j]
offer_attrs := offer["beckn:offerAttributes"]

Expand Down
64 changes: 64 additions & 0 deletions specification/policies/p2p-trading-interdiscom_test.rego
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,67 @@ test_t1_mixed_buyer_utility_fail if {
contains(msg, "buyer utilityId")
contains(msg, "TEST_DISCOM_BUYER")
}

# ──────────────────────────────────────────────────────────────────────────────
# Delivery slot duration toggle (O3 / P3b)
# ──────────────────────────────────────────────────────────────────────────────

_input_order_duration_two_hours := {
"context": {
"version": "2.0.0",
"action": "confirm",
"timestamp": "2024-10-04T10:00:00Z",
"domain": "beckn.one:deg:p2p-trading-interdiscom:2.0.0",
},
"message": {"order": {
"beckn:orderItems": [{
"beckn:acceptedOffer": {"beckn:offerAttributes": {
"deliveryWindow": {
"schema:startTime": "2024-10-04T14:00:00Z",
"schema:endTime": "2024-10-04T16:00:00Z",
},
}},
}],
}},
}

_input_publish_duration_half_hour := {
"context": {
"version": "2.0.0",
"action": "catalog_publish",
"timestamp": "2024-10-04T10:00:00Z",
"domain": "beckn.one:deg:p2p-trading-interdiscom:2.0.0",
},
"message": {
"catalogs": [{
"beckn:offers": [{
"beckn:offerAttributes": {
"deliveryWindow": {
"schema:startTime": "2024-10-04T10:00:00Z",
"schema:endTime": "2024-10-04T10:30:00Z",
},
},
}],
}],
},
}

test_delivery_slot_duration_disabled_by_default_order if {
not some msg in _order_violations with input as _input_order_duration_two_hours
contains(msg, "delivery window (")
}

test_delivery_slot_duration_disabled_by_default_publish if {
not some msg in _publish_violations with input as _input_publish_duration_half_hour
contains(msg, "delivery window (")
}

test_delivery_slot_duration_enabled_order if {
some msg in _order_violations with input as _input_order_duration_two_hours with data.config as {"validateDeliverySlotDuration": true}
contains(msg, "must be exactly 1 hour")
}

test_delivery_slot_duration_enabled_publish if {
some msg in _publish_violations with input as _input_publish_duration_half_hour with data.config as {"validateDeliverySlotDuration": true}
contains(msg, "must be exactly 1 hour")
}