app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 6655a36134f0e22237006c91cd210f5610e3f329
parent f79415c78ea2080a3eb518023f307a3e53d91b7e
Author: triesap <tyson@radroots.org>
Date:   Wed, 15 Jul 2026 15:53:04 +0000

runtime: align sdk signer and workflow states

Diffstat:
MCargo.lock | 2++
Mcrates/desktop/src/runtime.rs | 14+++++---------
Mcrates/desktop/src/source_guards.rs | 6+++---
Mcrates/desktop/src/window.rs | 22+++++++++++-----------
Mcrates/i18n/src/keys.rs | 4++--
Mcrates/i18n/src/lib.rs | 10+++++-----
Mcrates/runtime/src/sdk.rs | 5++++-
Mcrates/store/migrations/0023_order_workflow_display_projection.sql | 2+-
Mcrates/store/migrations/0025_order_workflow_agreement_projection.sql | 10++--------
Mcrates/store/migrations/0029_order_workflow_validation_receipt_agreement.sql | 10++--------
Mcrates/store/src/interop.rs | 31++++++++++++++++---------------
Mcrates/store/src/lib.rs | 12++++++------
Mcrates/store/src/repo/orders.rs | 2+-
Mcrates/store/src/repo/workflow.rs | 4++--
Mcrates/view/src/lib.rs | 83++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mi18n/locales/en/messages.json | 4++--
16 files changed, 106 insertions(+), 115 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -5342,8 +5342,10 @@ dependencies = [ "radroots_nostr_connect", "radroots_nostr_signer", "radroots_outbox", + "radroots_protected_store", "radroots_runtime_contract_v1", "radroots_runtime_paths", + "radroots_secret_vault", "radroots_trade", "radroots_transport", "radroots_transport_nostr", diff --git a/crates/desktop/src/runtime.rs b/crates/desktop/src/runtime.rs @@ -2921,11 +2921,7 @@ impl DesktopAppRuntimeState { } let lifecycle = self.resolve_order_lifecycle_evidence(&request)?; if lifecycle.decision.is_some() - || !matches!( - lifecycle.status, - RadrootsTradeWorkflowState::Requested - | RadrootsTradeWorkflowState::RevisionProposed - ) + || !matches!(lifecycle.status, RadrootsTradeWorkflowState::Requested) { return Err(AppSqliteError::InvalidProjection { reason: "buyer order revision requires active pre-agreement negotiation", @@ -3075,8 +3071,7 @@ impl DesktopAppRuntimeState { } match lifecycle.status { RadrootsTradeWorkflowState::Requested => {} - RadrootsTradeWorkflowState::RevisionProposed - | RadrootsTradeWorkflowState::AgreedPendingRhi + RadrootsTradeWorkflowState::AgreedPendingValidation | RadrootsTradeWorkflowState::Committed => { return Err(AppSqliteError::InvalidProjection { reason: "buyer order cancellation requires an open pre-agreement order", @@ -3085,6 +3080,7 @@ impl DesktopAppRuntimeState { RadrootsTradeWorkflowState::Missing | RadrootsTradeWorkflowState::Declined | RadrootsTradeWorkflowState::Cancelled + | RadrootsTradeWorkflowState::ValidationExpired | RadrootsTradeWorkflowState::Invalid => { return Err(AppSqliteError::InvalidProjection { reason: "buyer order cancellation requires an open pre-agreement order", @@ -15556,7 +15552,7 @@ mod tests { assert_eq!(persisted_order_status(&runtime, order_id), "needs_action"); assert_eq!( persisted_order_workflow_agreement(&runtime, order_id), - "agreed_pending_rhi" + "agreed_pending_validation" ); assert_eq!(relay.event_count(), 1); @@ -16294,7 +16290,7 @@ mod tests { assert_eq!(detail.status, BuyerOrderStatus::Placed); assert_eq!( detail.workflow.agreement, - TradeAgreementStatus::AgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!( detail.workflow.provenance.last_event_id.as_deref(), diff --git a/crates/desktop/src/source_guards.rs b/crates/desktop/src/source_guards.rs @@ -717,11 +717,11 @@ const REQUIRED_WINDOW_COPY_KEYS: &[&str] = &[ "AppTextKey::TradeWorkflowAxisInventory", "AppTextKey::TradeWorkflowAxisSource", "AppTextKey::TradeWorkflowAgreementRequested", - "AppTextKey::TradeWorkflowAgreementRevisionProposed", - "AppTextKey::TradeWorkflowAgreementAgreedPendingRhi", + "AppTextKey::TradeWorkflowAgreementAgreedPendingValidation", "AppTextKey::TradeWorkflowAgreementCommitted", "AppTextKey::TradeWorkflowAgreementDeclined", "AppTextKey::TradeWorkflowAgreementCancelled", + "AppTextKey::TradeWorkflowAgreementValidationExpired", "AppTextKey::TradeWorkflowAgreementInvalid", "AppTextKey::TradeWorkflowRevisionNone", "AppTextKey::TradeWorkflowRevisionChangeProposed", @@ -1544,7 +1544,7 @@ fn app_store_validation_receipts_do_not_commit_without_trust_policy() { let branch = &source[start..end]; assert!(branch.contains("OrderStatus::NeedsAction.storage_key()")); - assert!(branch.contains("TradeAgreementStatus::AgreedPendingRhi.storage_key()")); + assert!(branch.contains("TradeAgreementStatus::AgreedPendingValidation.storage_key()")); assert!(branch.contains("TradeInventoryStatus::Reserved.storage_key()")); assert!(!branch.contains("OrderStatus::Scheduled.storage_key()")); assert!(!branch.contains("TradeAgreementStatus::Committed.storage_key()")); diff --git a/crates/desktop/src/window.rs b/crates/desktop/src/window.rs @@ -11668,15 +11668,15 @@ fn trade_workflow_value_badge(value_key: AppTextKey) -> AnyElement { fn trade_agreement_status_key(status: TradeAgreementStatus) -> AppTextKey { match status { TradeAgreementStatus::Requested => AppTextKey::TradeWorkflowAgreementRequested, - TradeAgreementStatus::RevisionProposed => { - AppTextKey::TradeWorkflowAgreementRevisionProposed - } - TradeAgreementStatus::AgreedPendingRhi => { - AppTextKey::TradeWorkflowAgreementAgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation => { + AppTextKey::TradeWorkflowAgreementAgreedPendingValidation } TradeAgreementStatus::Committed => AppTextKey::TradeWorkflowAgreementCommitted, TradeAgreementStatus::Declined => AppTextKey::TradeWorkflowAgreementDeclined, TradeAgreementStatus::Cancelled => AppTextKey::TradeWorkflowAgreementCancelled, + TradeAgreementStatus::ValidationExpired => { + AppTextKey::TradeWorkflowAgreementValidationExpired + } TradeAgreementStatus::Invalid => AppTextKey::TradeWorkflowAgreementInvalid, } } @@ -16789,12 +16789,8 @@ mod tests { AppTextKey::TradeWorkflowAgreementRequested, ), ( - TradeAgreementStatus::RevisionProposed, - AppTextKey::TradeWorkflowAgreementRevisionProposed, - ), - ( - TradeAgreementStatus::AgreedPendingRhi, - AppTextKey::TradeWorkflowAgreementAgreedPendingRhi, + TradeAgreementStatus::AgreedPendingValidation, + AppTextKey::TradeWorkflowAgreementAgreedPendingValidation, ), ( TradeAgreementStatus::Committed, @@ -16809,6 +16805,10 @@ mod tests { AppTextKey::TradeWorkflowAgreementCancelled, ), ( + TradeAgreementStatus::ValidationExpired, + AppTextKey::TradeWorkflowAgreementValidationExpired, + ), + ( TradeAgreementStatus::Invalid, AppTextKey::TradeWorkflowAgreementInvalid, ), diff --git a/crates/i18n/src/keys.rs b/crates/i18n/src/keys.rs @@ -433,11 +433,11 @@ define_app_text_keys! { TradeWorkflowAxisInventory => "trade.workflow.axis.inventory", TradeWorkflowAxisSource => "trade.workflow.axis.source", TradeWorkflowAgreementRequested => "trade.workflow.agreement.requested", - TradeWorkflowAgreementRevisionProposed => "trade.workflow.agreement.revision_proposed", - TradeWorkflowAgreementAgreedPendingRhi => "trade.workflow.agreement.agreed_pending_rhi", + TradeWorkflowAgreementAgreedPendingValidation => "trade.workflow.agreement.agreed_pending_validation", TradeWorkflowAgreementCommitted => "trade.workflow.agreement.committed", TradeWorkflowAgreementDeclined => "trade.workflow.agreement.declined", TradeWorkflowAgreementCancelled => "trade.workflow.agreement.cancelled", + TradeWorkflowAgreementValidationExpired => "trade.workflow.agreement.validation_expired", TradeWorkflowAgreementInvalid => "trade.workflow.agreement.invalid", TradeWorkflowRevisionNone => "trade.workflow.revision.none", TradeWorkflowRevisionChangeProposed => "trade.workflow.revision.change_proposed", diff --git a/crates/i18n/src/lib.rs b/crates/i18n/src/lib.rs @@ -639,11 +639,7 @@ mod tests { "Requested" ); assert_eq!( - app_text(AppTextKey::TradeWorkflowAgreementRevisionProposed), - "Revision proposed" - ); - assert_eq!( - app_text(AppTextKey::TradeWorkflowAgreementAgreedPendingRhi), + app_text(AppTextKey::TradeWorkflowAgreementAgreedPendingValidation), "Pending validation" ); assert_eq!( @@ -651,6 +647,10 @@ mod tests { "Committed" ); assert_eq!( + app_text(AppTextKey::TradeWorkflowAgreementValidationExpired), + "Validation expired" + ); + assert_eq!( app_text(AppTextKey::TradeWorkflowAgreementInvalid), "Invalid" ); diff --git a/crates/runtime/src/sdk.rs b/crates/runtime/src/sdk.rs @@ -1387,7 +1387,10 @@ async fn build_sdk_runtime_with_signer( config: &AppSdkConfig, keys: RadrootsNostrKeys, ) -> Result<RadrootsClient, AppSdkRuntimeIssue> { - let signer = RadrootsSdkLocalKeySigner::new(keys) + let local_signer = RadrootsLocalEventSigner::new(keys).map_err(|error| { + AppSdkRuntimeIssue::runtime_error("sdk_signer_init_failed", error.to_string()) + })?; + let signer = RadrootsSdkLocalKeySigner::from_event_signer(local_signer) .map_err(|error| AppSdkRuntimeIssue::from_sdk_error(&error))?; let transport_profile = app_transport_profile(config) .map_err(|error| AppSdkRuntimeIssue::from_sdk_error(&error))?; diff --git a/crates/store/migrations/0023_order_workflow_display_projection.sql b/crates/store/migrations/0023_order_workflow_display_projection.sql @@ -1,6 +1,6 @@ ALTER TABLE orders ADD COLUMN workflow_agreement TEXT NOT NULL DEFAULT 'requested' CHECK ( - workflow_agreement IN ('requested', 'revision_proposed', 'agreed_pending_rhi', 'committed', 'declined', 'cancelled', 'invalid') + workflow_agreement IN ('requested', 'agreed_pending_validation', 'committed', 'declined', 'cancelled', 'validation_expired', 'invalid') ); ALTER TABLE orders diff --git a/crates/store/migrations/0025_order_workflow_agreement_projection.sql b/crates/store/migrations/0025_order_workflow_agreement_projection.sql @@ -27,7 +27,7 @@ CREATE TABLE orders ( workflow_revision IN ('none', 'change_proposed', 'updated', 'kept_as_placed') ), workflow_agreement TEXT NOT NULL DEFAULT 'requested' CHECK ( - workflow_agreement IN ('requested', 'revision_proposed', 'agreed_pending_rhi', 'committed', 'declined', 'cancelled', 'invalid') + workflow_agreement IN ('requested', 'agreed_pending_validation', 'committed', 'declined', 'cancelled', 'validation_expired', 'invalid') ), workflow_inventory TEXT NOT NULL DEFAULT 'needs_review' CHECK ( workflow_inventory IN ('available', 'reserved', 'sold_out', 'needs_review') @@ -69,13 +69,7 @@ SELECT buyer_phone, buyer_order_note, workflow_revision, - CASE workflow_agreement - WHEN 'ordered' THEN 'requested' - WHEN 'pending_rhi' THEN 'agreed_pending_rhi' - WHEN 'confirmed' THEN 'committed' - WHEN 'needs_review' THEN 'invalid' - ELSE workflow_agreement - END, + workflow_agreement, workflow_inventory, workflow_provenance_source, workflow_provenance_last_event_id diff --git a/crates/store/migrations/0029_order_workflow_validation_receipt_agreement.sql b/crates/store/migrations/0029_order_workflow_validation_receipt_agreement.sql @@ -30,7 +30,7 @@ CREATE TABLE orders ( workflow_revision IN ('none', 'change_proposed', 'updated', 'kept_as_placed') ), workflow_agreement TEXT NOT NULL DEFAULT 'requested' CHECK ( - workflow_agreement IN ('requested', 'revision_proposed', 'agreed_pending_rhi', 'committed', 'declined', 'cancelled', 'invalid') + workflow_agreement IN ('requested', 'agreed_pending_validation', 'committed', 'declined', 'cancelled', 'validation_expired', 'invalid') ), workflow_inventory TEXT NOT NULL DEFAULT 'needs_review' CHECK ( workflow_inventory IN ('available', 'reserved', 'sold_out', 'needs_review') @@ -72,13 +72,7 @@ SELECT buyer_phone, buyer_order_note, workflow_revision, - CASE workflow_agreement - WHEN 'ordered' THEN 'requested' - WHEN 'pending_rhi' THEN 'agreed_pending_rhi' - WHEN 'confirmed' THEN 'committed' - WHEN 'needs_review' THEN 'invalid' - ELSE workflow_agreement - END, + workflow_agreement, workflow_inventory, workflow_provenance_source, workflow_provenance_last_event_id diff --git a/crates/store/src/interop.rs b/crates/store/src/interop.rs @@ -1489,7 +1489,7 @@ impl<'a> AppLocalInteropRepository<'a> { }; if !matches!( agreement.as_str(), - value if value == TradeAgreementStatus::AgreedPendingRhi.storage_key() + value if value == TradeAgreementStatus::AgreedPendingValidation.storage_key() || value == TradeAgreementStatus::Committed.storage_key() || value == TradeAgreementStatus::Invalid.storage_key() ) { @@ -1527,7 +1527,7 @@ impl<'a> AppLocalInteropRepository<'a> { let (status, agreement, inventory) = match result.as_str() { "valid" => ( OrderStatus::NeedsAction.storage_key(), - TradeAgreementStatus::AgreedPendingRhi.storage_key(), + TradeAgreementStatus::AgreedPendingValidation.storage_key(), TradeInventoryStatus::Reserved.storage_key(), ), "needs_review" => ( @@ -5278,7 +5278,7 @@ mod tests { ); assert_eq!( buyer_orders.rows[0].workflow.agreement, - TradeAgreementStatus::AgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!( buyer_orders.rows[0].workflow.inventory, @@ -5642,7 +5642,7 @@ mod tests { assert_eq!(seller_orders.rows[0].status, OrderStatus::NeedsAction); assert_eq!( seller_orders.rows[0].workflow.agreement, - TradeAgreementStatus::AgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!( seller_orders.rows[0].workflow.inventory, @@ -5652,8 +5652,9 @@ mod tests { } #[test] - fn valid_validation_receipt_keeps_buyer_and_seller_order_pending_rhi() { - let fixture = validation_receipt_order_fixture("validation-receipt-valid-pending-rhi"); + fn valid_validation_receipt_keeps_buyer_and_seller_order_pending_validation() { + let fixture = + validation_receipt_order_fixture("validation-receipt-valid-pending-validation"); let valid_event = validation_receipt_event( hex_event_id(29).as_str(), fixture.seller_pubkey.as_str(), @@ -5667,7 +5668,7 @@ mod tests { fixture .events .append_record(&signed_order_event_record( - "cli:signed_event:validation-receipt:valid-pending-rhi", + "cli:signed_event:validation-receipt:valid-pending-validation", &valid_event, fixture.listing_addr.as_str(), SourceRuntime::Cli, @@ -5682,23 +5683,23 @@ mod tests { let buyer_detail = fixture .app_store .load_buyer_order_detail(&fixture.buyer_context, fixture.order_id) - .expect("load buyer pending-rhi validation receipt detail") - .expect("buyer pending-rhi validation receipt detail"); + .expect("load buyer pending-validation validation receipt detail") + .expect("buyer pending-validation validation receipt detail"); let seller_detail = fixture .app_store .load_order_detail(fixture.seller_farm_id, fixture.order_id) - .expect("load seller pending-rhi validation receipt detail") - .expect("seller pending-rhi validation receipt detail"); + .expect("load seller pending-validation validation receipt detail") + .expect("seller pending-validation validation receipt detail"); assert_eq!(buyer_detail.status, BuyerOrderStatus::Placed); assert_eq!(seller_detail.status, OrderStatus::NeedsAction); assert_eq!( buyer_detail.workflow.agreement, - TradeAgreementStatus::AgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!( seller_detail.workflow.agreement, - TradeAgreementStatus::AgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!( buyer_detail.workflow.inventory, @@ -6084,7 +6085,7 @@ mod tests { assert_eq!(seller_detail.status, OrderStatus::NeedsAction); assert_eq!( buyer_detail.workflow.agreement, - TradeAgreementStatus::AgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!(seller_detail.primary_action, None); } @@ -6254,7 +6255,7 @@ mod tests { assert_eq!(seller_orders.rows[0].status, OrderStatus::NeedsAction); assert_eq!( seller_orders.rows[0].workflow.agreement, - TradeAgreementStatus::AgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!( seller_orders.rows[0].workflow.revision, diff --git a/crates/store/src/lib.rs b/crates/store/src/lib.rs @@ -1193,18 +1193,18 @@ mod tests { workflow_agreement, workflow_inventory ) VALUES ( - 'order_agreed_pending_rhi', + 'order_agreed_pending_validation', 'farm_schema', - 'agreed pending rhi', + 'agreed pending validation', 'Buyer', 'needs_action', '2026-01-01T00:00:00Z', - 'agreed_pending_rhi', + 'agreed_pending_validation', 'reserved' )", crate::empty_params(), ) - .expect("pending rhi workflow projection should insert"); + .expect("pending validation workflow projection should insert"); let invalid_result = connection.execute( "INSERT INTO orders ( @@ -1354,10 +1354,10 @@ mod tests { assert_eq!(status, "needs_review"); connection .execute( - "UPDATE orders SET workflow_agreement = 'agreed_pending_rhi' WHERE id = 'order_status'", + "UPDATE orders SET workflow_agreement = 'agreed_pending_validation' WHERE id = 'order_status'", crate::empty_params(), ) - .expect("agreed pending rhi agreement should satisfy current check"); + .expect("agreed pending validation agreement should satisfy current check"); } fn table_exists(connection: &AppSqliteDatabase, table_name: &str) -> bool { diff --git a/crates/store/src/repo/orders.rs b/crates/store/src/repo/orders.rs @@ -1181,7 +1181,7 @@ fn primary_action_for_order( ) -> Option<OrderPrimaryAction> { match status { OrderStatus::NeedsAction - if workflow.agreement == TradeAgreementStatus::AgreedPendingRhi => + if workflow.agreement == TradeAgreementStatus::AgreedPendingValidation => { None } diff --git a/crates/store/src/repo/workflow.rs b/crates/store/src/repo/workflow.rs @@ -39,11 +39,11 @@ fn parse_trade_agreement_status( ) -> Result<TradeAgreementStatus, AppSqliteError> { match value.as_str() { "requested" => Ok(TradeAgreementStatus::Requested), - "revision_proposed" => Ok(TradeAgreementStatus::RevisionProposed), - "agreed_pending_rhi" => Ok(TradeAgreementStatus::AgreedPendingRhi), + "agreed_pending_validation" => Ok(TradeAgreementStatus::AgreedPendingValidation), "committed" => Ok(TradeAgreementStatus::Committed), "declined" => Ok(TradeAgreementStatus::Declined), "cancelled" => Ok(TradeAgreementStatus::Cancelled), + "validation_expired" => Ok(TradeAgreementStatus::ValidationExpired), "invalid" => Ok(TradeAgreementStatus::Invalid), _ => Err(AppSqliteError::DecodeEnum { field, value }), } diff --git a/crates/view/src/lib.rs b/crates/view/src/lib.rs @@ -1076,11 +1076,11 @@ pub struct BuyerOrderReviewProjection { pub enum TradeAgreementStatus { #[default] Requested, - RevisionProposed, - AgreedPendingRhi, + AgreedPendingValidation, Committed, Declined, Cancelled, + ValidationExpired, Invalid, } @@ -1088,11 +1088,11 @@ impl TradeAgreementStatus { pub const fn storage_key(self) -> &'static str { match self { Self::Requested => "requested", - Self::RevisionProposed => "revision_proposed", - Self::AgreedPendingRhi => "agreed_pending_rhi", + Self::AgreedPendingValidation => "agreed_pending_validation", Self::Committed => "committed", Self::Declined => "declined", Self::Cancelled => "cancelled", + Self::ValidationExpired => "validation_expired", Self::Invalid => "invalid", } } @@ -1100,11 +1100,13 @@ impl TradeAgreementStatus { pub const fn label_key_id(self) -> &'static str { match self { Self::Requested => "messages.trade.workflow.agreement.requested", - Self::RevisionProposed => "messages.trade.workflow.agreement.revision_proposed", - Self::AgreedPendingRhi => "messages.trade.workflow.agreement.agreed_pending_rhi", + Self::AgreedPendingValidation => { + "messages.trade.workflow.agreement.agreed_pending_validation" + } Self::Committed => "messages.trade.workflow.agreement.committed", Self::Declined => "messages.trade.workflow.agreement.declined", Self::Cancelled => "messages.trade.workflow.agreement.cancelled", + Self::ValidationExpired => "messages.trade.workflow.agreement.validation_expired", Self::Invalid => "messages.trade.workflow.agreement.invalid", } } @@ -1113,11 +1115,11 @@ impl TradeAgreementStatus { match status { RadrootsTradeWorkflowState::Missing => Self::Invalid, RadrootsTradeWorkflowState::Requested => Self::Requested, - RadrootsTradeWorkflowState::RevisionProposed => Self::RevisionProposed, - RadrootsTradeWorkflowState::AgreedPendingRhi => Self::AgreedPendingRhi, + RadrootsTradeWorkflowState::AgreedPendingValidation => Self::AgreedPendingValidation, RadrootsTradeWorkflowState::Committed => Self::Committed, RadrootsTradeWorkflowState::Declined => Self::Declined, RadrootsTradeWorkflowState::Cancelled => Self::Cancelled, + RadrootsTradeWorkflowState::ValidationExpired => Self::ValidationExpired, RadrootsTradeWorkflowState::Invalid => Self::Invalid, } } @@ -1221,16 +1223,15 @@ impl TradeInventoryStatus { pub fn from_active_order_projection(projection: &RadrootsOrderProjection) -> Self { match projection.status { - RadrootsTradeWorkflowState::Requested - | RadrootsTradeWorkflowState::RevisionProposed => Self::NeedsReview, - RadrootsTradeWorkflowState::AgreedPendingRhi + RadrootsTradeWorkflowState::Requested => Self::NeedsReview, + RadrootsTradeWorkflowState::AgreedPendingValidation | RadrootsTradeWorkflowState::Committed => Self::Reserved, RadrootsTradeWorkflowState::Declined | RadrootsTradeWorkflowState::Cancelled => { Self::Available } - RadrootsTradeWorkflowState::Missing | RadrootsTradeWorkflowState::Invalid => { - Self::NeedsReview - } + RadrootsTradeWorkflowState::Missing + | RadrootsTradeWorkflowState::ValidationExpired + | RadrootsTradeWorkflowState::Invalid => Self::NeedsReview, } } } @@ -1585,8 +1586,8 @@ pub fn order_status_from_active_order_projection( match projection.status { RadrootsTradeWorkflowState::Missing => None, RadrootsTradeWorkflowState::Requested - | RadrootsTradeWorkflowState::RevisionProposed - | RadrootsTradeWorkflowState::AgreedPendingRhi => Some(OrderStatus::NeedsAction), + | RadrootsTradeWorkflowState::AgreedPendingValidation + | RadrootsTradeWorkflowState::ValidationExpired => Some(OrderStatus::NeedsAction), RadrootsTradeWorkflowState::Committed => Some(OrderStatus::Scheduled), RadrootsTradeWorkflowState::Declined | RadrootsTradeWorkflowState::Cancelled => { Some(OrderStatus::Declined) @@ -2889,21 +2890,21 @@ mod tests { ); assert_eq!( TradeAgreementStatus::from_active_order_status( - &RadrootsTradeWorkflowState::RevisionProposed - ), - TradeAgreementStatus::RevisionProposed - ); - assert_eq!( - TradeAgreementStatus::from_active_order_status( - &RadrootsTradeWorkflowState::AgreedPendingRhi + &RadrootsTradeWorkflowState::AgreedPendingValidation ), - TradeAgreementStatus::AgreedPendingRhi + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!( TradeAgreementStatus::from_active_order_status(&RadrootsTradeWorkflowState::Committed), TradeAgreementStatus::Committed ); assert_eq!( + TradeAgreementStatus::from_active_order_status( + &RadrootsTradeWorkflowState::ValidationExpired + ), + TradeAgreementStatus::ValidationExpired + ); + assert_eq!( TradeAgreementStatus::from_active_order_status(&RadrootsTradeWorkflowState::Invalid), TradeAgreementStatus::Invalid ); @@ -2960,24 +2961,24 @@ mod tests { Some(OrderStatus::Scheduled) ); - let pending_rhi_order = - test_active_order_projection(RadrootsTradeWorkflowState::AgreedPendingRhi); - let pending_rhi_projection = TradeWorkflowProjection::from_active_order_projection( + let pending_validation_order = + test_active_order_projection(RadrootsTradeWorkflowState::AgreedPendingValidation); + let pending_validation_projection = TradeWorkflowProjection::from_active_order_projection( order_id, - &pending_rhi_order, + &pending_validation_order, TradeRevisionStatus::None, TradeProvenanceProjection::from_primary_source(TradeWorkflowSource::RuntimeStore), ); assert_eq!( - pending_rhi_projection.agreement, - TradeAgreementStatus::AgreedPendingRhi + pending_validation_projection.agreement, + TradeAgreementStatus::AgreedPendingValidation ); assert_eq!( - pending_rhi_projection.inventory, + pending_validation_projection.inventory, TradeInventoryStatus::Reserved ); assert_eq!( - order_status_from_active_order_projection(&pending_rhi_order), + order_status_from_active_order_projection(&pending_validation_order), Some(OrderStatus::NeedsAction) ); @@ -3060,14 +3061,14 @@ mod tests { ); assert_eq!(TradeAgreementStatus::Requested.storage_key(), "requested"); assert_eq!( - TradeAgreementStatus::RevisionProposed.storage_key(), - "revision_proposed" + TradeAgreementStatus::AgreedPendingValidation.storage_key(), + "agreed_pending_validation" ); + assert_eq!(TradeAgreementStatus::Committed.storage_key(), "committed"); assert_eq!( - TradeAgreementStatus::AgreedPendingRhi.storage_key(), - "agreed_pending_rhi" + TradeAgreementStatus::ValidationExpired.storage_key(), + "validation_expired" ); - assert_eq!(TradeAgreementStatus::Committed.storage_key(), "committed"); assert_eq!(TradeAgreementStatus::Invalid.storage_key(), "invalid"); assert_eq!( TradeRevisionStatus::KeptAsPlaced.storage_key(), @@ -3084,12 +3085,12 @@ mod tests { "messages.trade.workflow.agreement.requested" ); assert_eq!( - TradeAgreementStatus::RevisionProposed.label_key_id(), - "messages.trade.workflow.agreement.revision_proposed" + TradeAgreementStatus::AgreedPendingValidation.label_key_id(), + "messages.trade.workflow.agreement.agreed_pending_validation" ); assert_eq!( - TradeAgreementStatus::AgreedPendingRhi.label_key_id(), - "messages.trade.workflow.agreement.agreed_pending_rhi" + TradeAgreementStatus::ValidationExpired.label_key_id(), + "messages.trade.workflow.agreement.validation_expired" ); assert_eq!( TradeAgreementStatus::Invalid.label_key_id(), diff --git a/i18n/locales/en/messages.json b/i18n/locales/en/messages.json @@ -413,11 +413,11 @@ "trade.workflow.axis.inventory": "Stock", "trade.workflow.axis.source": "Source", "trade.workflow.agreement.requested": "Requested", - "trade.workflow.agreement.revision_proposed": "Revision proposed", - "trade.workflow.agreement.agreed_pending_rhi": "Pending validation", + "trade.workflow.agreement.agreed_pending_validation": "Pending validation", "trade.workflow.agreement.committed": "Committed", "trade.workflow.agreement.declined": "Declined", "trade.workflow.agreement.cancelled": "Cancelled", + "trade.workflow.agreement.validation_expired": "Validation expired", "trade.workflow.agreement.invalid": "Invalid", "trade.workflow.revision.none": "No change", "trade.workflow.revision.change_proposed": "Change proposed",