///|
pub fn resolution_label(value : Resolution) -> String {
match value {
Settled => "settled"
AwaitingPayment => "awaiting_payment"
OverCollected => "over_collected"
RefundRisk => "refund_risk"
NeedsReview => "needs_review"
}
}
///|
pub fn severity_label(value : Severity) -> String {
match value {
Info => "info"
Warning => "warning"
Error => "error"
}
}
///|
pub fn finding_code_label(value : FindingCode) -> String {
match value {
DuplicateOrderId => "duplicate_order_id"
DuplicatePaymentId => "duplicate_payment_id"
DuplicateRefundId => "duplicate_refund_id"
DuplicateAdjustmentId => "duplicate_adjustment_id"
InvalidAmount => "invalid_amount"
InvalidCurrency => "invalid_currency"
UnknownOrder => "unknown_order"
CurrencyMismatch => "currency_mismatch"
PaymentAfterDeadline => "payment_after_deadline"
PaymentForCancelledOrder => "payment_for_cancelled_order"
RefundExceedsPayment => "refund_exceeds_payment"
Overpaid => "overpaid"
Underpaid => "underpaid"
OpenPastDue => "open_past_due"
PaymentVoided => "payment_voided"
MissingReference => "missing_reference"
}
}
///|
pub fn render_summary(result : ReconciliationResult) -> String {
let state = if result.valid { "PASS" } else { "REVIEW REQUIRED" }
"LedgerWeave reconciliation: \{state}\norders=\{result.balances.length()} findings=\{result.findings.length()}"
}
///|
pub fn render_balances(result : ReconciliationResult) -> String {
let mut out = "ORDER | EXPECTED | CAPTURED | REFUNDED | OUTSTANDING | RESOLUTION\n"
for balance in result.balances {
out = out +
"\{balance.order_id} | \{balance.expected_minor} | \{balance.captured_minor} | \{balance.refunded_minor} | \{balance.outstanding_minor} | \{resolution_label(balance.resolution)}\n"
}
out
}
///|
pub fn render_findings(result : ReconciliationResult) -> String {
let mut out = "SEVERITY | CODE | RECORD | MESSAGE\n"
for finding in result.findings {
out = out +
"\{severity_label(finding.severity)} | \{finding_code_label(finding.code)} | \{finding.record_id} | \{finding.message}\n"
}
out
}