From 5cb06357fa455a9e995a28036e863f82b6505084 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 16 Sep 2025 10:19:17 -0400 Subject: [PATCH] add delta to ledger entries --- .../2025-09-05-003050_wallet_ledger_entries/up.sql | 5 +++++ _sql/migrations_squashed/wallets/wallet_ledger_entries.sql | 5 +++++ .../internal_insert_wallet_created_ledger_entry.rs | 1 + .../internal_insert_wallet_ledger_entry.rs | 5 +++++ .../queries/wallets/add_durable_banked_balance_to_wallet.rs | 3 +++ .../wallets/refill_monthly_credits_balance_on_wallet.rs | 3 +++ .../queries/wallets/spend/try_to_spend_wallet_balance.rs | 6 +++++- 7 files changed, 27 insertions(+), 1 deletion(-) diff --git a/_sql/migrations/2025-09-05-003050_wallet_ledger_entries/up.sql b/_sql/migrations/2025-09-05-003050_wallet_ledger_entries/up.sql index 5a2b2c9827..dd2d247348 100644 --- a/_sql/migrations/2025-09-05-003050_wallet_ledger_entries/up.sql +++ b/_sql/migrations/2025-09-05-003050_wallet_ledger_entries/up.sql @@ -21,6 +21,11 @@ CREATE TABLE wallet_ledger_entries ( -- Length is VARCHAR(255) to accommodate Stripe IDs. maybe_entity_ref VARCHAR(255) DEFAULT NULL, + -- Signed integer that shows the delta of credits for this event. + -- This combines impacts to both banked_credits and monthly_credits. + -- This is less authoritative than the before/after fields, but is useful + credits_delta INTEGER NOT NULL DEFAULT 0, + -- Balance of banked credits before the event. -- Max value unsigned: 4,294,967,295 (U32) banked_credits_before INTEGER UNSIGNED NOT NULL DEFAULT 0, diff --git a/_sql/migrations_squashed/wallets/wallet_ledger_entries.sql b/_sql/migrations_squashed/wallets/wallet_ledger_entries.sql index 6d9ad93ece..48d04475c1 100644 --- a/_sql/migrations_squashed/wallets/wallet_ledger_entries.sql +++ b/_sql/migrations_squashed/wallets/wallet_ledger_entries.sql @@ -21,6 +21,11 @@ CREATE TABLE wallet_ledger_entries ( -- Length is VARCHAR(255) to accommodate Stripe IDs. maybe_entity_ref VARCHAR(255) DEFAULT NULL, + -- Signed integer that shows the delta of credits for this event. + -- This combines impacts to both banked_credits and monthly_credits. + -- This is less authoritative than the before/after fields, but is useful + credits_delta INTEGER NOT NULL DEFAULT 0, + -- Balance of banked credits before the event. -- Max value unsigned: 4,294,967,295 (U32) banked_credits_before INTEGER UNSIGNED NOT NULL DEFAULT 0, diff --git a/crates/schema/database/mysql_queries/src/queries/wallet_ledger_entries/internal_insert_wallet_created_ledger_entry.rs b/crates/schema/database/mysql_queries/src/queries/wallet_ledger_entries/internal_insert_wallet_created_ledger_entry.rs index 7f51e16b8c..e2db444df5 100644 --- a/crates/schema/database/mysql_queries/src/queries/wallet_ledger_entries/internal_insert_wallet_created_ledger_entry.rs +++ b/crates/schema/database/mysql_queries/src/queries/wallet_ledger_entries/internal_insert_wallet_created_ledger_entry.rs @@ -13,6 +13,7 @@ pub (crate) async fn internal_insert_wallet_created_ledger_entry( wallet_token, entry_type: WalletLedgerEntryType::Create, maybe_entity_ref: None, + credits_delta: 0, banked_credits_before: 0, banked_credits_after: 0, monthly_credits_before: 0, diff --git a/crates/schema/database/mysql_queries/src/queries/wallet_ledger_entries/internal_insert_wallet_ledger_entry.rs b/crates/schema/database/mysql_queries/src/queries/wallet_ledger_entries/internal_insert_wallet_ledger_entry.rs index e1c1719725..8c211ba195 100644 --- a/crates/schema/database/mysql_queries/src/queries/wallet_ledger_entries/internal_insert_wallet_ledger_entry.rs +++ b/crates/schema/database/mysql_queries/src/queries/wallet_ledger_entries/internal_insert_wallet_ledger_entry.rs @@ -21,6 +21,9 @@ pub (crate) struct InsertWalletLedgerEntry<'a> { /// An optional reference for this entry. Could be an internal ID (eg. job) or an /// external ID (eg. Stripe payment intent, invoice, etc.) pub maybe_entity_ref: Option, + + /// Change in credits (positive or negative) across banked and/or monthly credits. + pub credits_delta: i64, /// Banked credits before change. pub banked_credits_before: u64, @@ -80,6 +83,7 @@ SET wallet_token = ?, entry_type = ?, maybe_entity_ref = ?, + credits_delta = ?, banked_credits_before = ?, banked_credits_after = ?, monthly_credits_before = ?, @@ -89,6 +93,7 @@ SET self.wallet_token.as_str(), self.entry_type.to_str(), self.maybe_entity_ref, + self.credits_delta, self.banked_credits_before, self.banked_credits_after, self.monthly_credits_before, diff --git a/crates/schema/database/mysql_queries/src/queries/wallets/add_durable_banked_balance_to_wallet.rs b/crates/schema/database/mysql_queries/src/queries/wallets/add_durable_banked_balance_to_wallet.rs index e2148fbf8b..c84ee38071 100644 --- a/crates/schema/database/mysql_queries/src/queries/wallets/add_durable_banked_balance_to_wallet.rs +++ b/crates/schema/database/mysql_queries/src/queries/wallets/add_durable_banked_balance_to_wallet.rs @@ -2,6 +2,7 @@ use crate::queries::wallet_ledger_entries::internal_insert_wallet_ledger_entry:: use crate::queries::wallets::internal_select_wallet_balance_for_update::internal_select_wallet_balance_for_update; use crate::queries::wallets::wallet_update_summary::WalletUpdateSummary; use enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType; +use num_traits::ToPrimitive; use sqlx::MySql; use tokens::tokens::wallets::WalletToken; @@ -40,6 +41,8 @@ pub async fn add_durable_banked_balance_to_wallet( entry_type: WalletLedgerEntryType::CreditBanked, maybe_entity_ref: maybe_ledger_ref.map(|t| t.to_string()), + credits_delta: amount_to_add.to_i64().unwrap_or(0), + // Updated banked credits banked_credits_before: existing_banked_balance, banked_credits_after: new_banked_balance, diff --git a/crates/schema/database/mysql_queries/src/queries/wallets/refill_monthly_credits_balance_on_wallet.rs b/crates/schema/database/mysql_queries/src/queries/wallets/refill_monthly_credits_balance_on_wallet.rs index 61652d5cf3..3e94bcc4ca 100644 --- a/crates/schema/database/mysql_queries/src/queries/wallets/refill_monthly_credits_balance_on_wallet.rs +++ b/crates/schema/database/mysql_queries/src/queries/wallets/refill_monthly_credits_balance_on_wallet.rs @@ -2,6 +2,7 @@ use crate::queries::wallet_ledger_entries::internal_insert_wallet_ledger_entry:: use crate::queries::wallets::internal_select_wallet_balance_for_update::internal_select_wallet_balance_for_update; use crate::queries::wallets::wallet_update_summary::WalletUpdateSummary; use enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType; +use num_traits::ToPrimitive; use sqlx::MySql; use tokens::tokens::wallets::WalletToken; @@ -40,6 +41,8 @@ pub async fn refill_monthly_credits_balance_on_wallet( entry_type: WalletLedgerEntryType::CreditMonthly, maybe_entity_ref: maybe_ledger_ref.map(|s| s.to_string()), + credits_delta: monthly_amount.to_i64().unwrap_or(0), + monthly_credits_before: existing_monthly_balance, monthly_credits_after: new_monthly_balance, diff --git a/crates/schema/database/mysql_queries/src/queries/wallets/spend/try_to_spend_wallet_balance.rs b/crates/schema/database/mysql_queries/src/queries/wallets/spend/try_to_spend_wallet_balance.rs index 42086b61db..9a3f219611 100644 --- a/crates/schema/database/mysql_queries/src/queries/wallets/spend/try_to_spend_wallet_balance.rs +++ b/crates/schema/database/mysql_queries/src/queries/wallets/spend/try_to_spend_wallet_balance.rs @@ -3,7 +3,9 @@ use crate::queries::wallets::internal_select_wallet_balance_for_update::internal use crate::queries::wallets::spend::wallet_spend_error::WalletSpendError; use crate::queries::wallets::wallet_update_summary::WalletUpdateSummary; use enums::by_table::wallet_ledger_entries::wallet_ledger_entry_type::WalletLedgerEntryType; +use num_traits::ToPrimitive; use sqlx::MySql; +use std::ops::Neg; use tokens::tokens::wallets::WalletToken; // TODO(bt, 2025-09-12): This needs tests and a better interface. @@ -95,13 +97,15 @@ pub async fn try_to_spend_wallet_balance( wallet_token.as_str(), ).execute(&mut **transaction).await?; - // TODO: Insert the spend delta (as i64) into a new field ! + let spent = amount_to_spend_request.to_i64().unwrap_or(0).neg(); let record = InsertWalletLedgerEntry { wallet_token, entry_type: ledger_entry_type, maybe_entity_ref: maybe_ledger_ref.map(|t| t.to_string()), + credits_delta: spent, + // Original amounts monthly_credits_before: existing_monthly_balance, banked_credits_before: existing_banked_balance,