use datasynth_core::models::balance::EntityOpeningBalance;
use datasynth_core::models::journal_entry::JournalEntry;
#[derive(Debug, Clone, Default)]
pub struct ShardContext {
pub entity_code: String,
pub entity_seed: [u8; 32],
pub extra_journal_entries: Vec<JournalEntry>,
pub opening_balances: Vec<EntityOpeningBalance>,
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::NaiveDate;
use datasynth_core::models::journal_entry::{
JournalEntry, JournalEntryHeader, JournalEntryLine,
};
use rust_decimal::Decimal;
#[test]
fn test_default_is_empty() {
let ctx = ShardContext::default();
assert!(ctx.entity_code.is_empty());
assert_eq!(ctx.entity_seed, [0u8; 32]);
assert!(ctx.extra_journal_entries.is_empty());
assert!(ctx.opening_balances.is_empty());
}
#[test]
fn test_can_hold_opening_balances_for_v53_carryover() {
use datasynth_core::models::balance::AccountType;
let mut ctx = ShardContext::default();
ctx.opening_balances.push(EntityOpeningBalance {
account_code: "1000".to_string(),
account_type: AccountType::Asset,
debit: Decimal::from(50_000),
credit: Decimal::ZERO,
});
ctx.opening_balances.push(EntityOpeningBalance {
account_code: "2000".to_string(),
account_type: AccountType::Liability,
debit: Decimal::ZERO,
credit: Decimal::from(30_000),
});
assert_eq!(ctx.opening_balances.len(), 2);
assert_eq!(ctx.opening_balances[0].account_code, "1000");
assert_eq!(ctx.opening_balances[1].net_balance(), Decimal::from(30_000));
}
#[test]
fn test_can_hold_journal_entries() {
let header = JournalEntryHeader::new(
"E_TEST".to_string(),
NaiveDate::from_ymd_opt(2024, 6, 15).expect("valid date"),
);
let mut je = JournalEntry::new(header);
let doc_id = je.header.document_id;
je.add_line(JournalEntryLine::debit(
doc_id,
1,
"1150".to_string(),
Decimal::from(100),
));
je.add_line(JournalEntryLine::credit(
doc_id,
2,
"4500".to_string(),
Decimal::from(100),
));
assert!(je.is_balanced());
let mut ctx = ShardContext {
entity_code: "E_TEST".to_string(),
entity_seed: [42u8; 32],
extra_journal_entries: Vec::new(),
opening_balances: Vec::new(),
};
ctx.extra_journal_entries.push(je);
assert_eq!(ctx.extra_journal_entries.len(), 1);
assert_eq!(ctx.extra_journal_entries[0].header.company_code, "E_TEST");
assert!(ctx.extra_journal_entries[0].is_balanced());
}
}