crate::ix!();
#[derive(Getters,Debug,Clone)]
#[getset(get="pub")]
pub struct CheckOrTreasuryTransaction<'a,TxCat:TransactionCategory + 'static> {
category: TxCat,
tx: &'a Transaction,
}
impl<'a,TxCat:TransactionCategory + 'static> fmt::Display for CheckOrTreasuryTransaction<'a,TxCat> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{} - {}", self.category, self.tx)
}
}
impl<'a,TxCat:TransactionCategory + 'static> LineItem<TxCat> for CheckOrTreasuryTransaction<'a,TxCat> {
fn tag() -> &'static str {
"check-or-treasury"
}
fn quantity(&self) -> Decimal {
Decimal::ONE
}
fn price(&self) -> MonetaryAmount {
self.tx_amount()
}
fn category(&self) -> TxCat {
self.category
}
fn tx_amount(&self) -> MonetaryAmount {
self.tx.amount()
}
fn tx(&self) -> Option<&Transaction> {
Some(&self.tx)
}
}
pub trait GetTreasuryTransactionsAndChecks {
fn treasury_transactions_and_checks<TxCat:TransactionCategory + 'static>(&self, category_map: &CategoryMap<TxCat>)
-> Vec<CheckOrTreasuryTransaction<TxCat>>;
}
impl GetTreasuryTransactionsAndChecks for Account {
fn treasury_transactions_and_checks<TxCat:TransactionCategory + 'static>(&self, category_map: &CategoryMap<TxCat>)
-> Vec<CheckOrTreasuryTransaction<TxCat>>
{
let mut line_items = vec![];
for tx in self.txns().iter() {
let predicted = predict_category(&tx.description(), category_map);
if predicted.len() > 0 {
let prediction = &predicted[0];
let categories = TxCat::treasury_and_checks_categories();
if categories.contains(&prediction.category()) {
line_items.push(CheckOrTreasuryTransaction { category: *prediction.category(), tx });
}
}
}
line_items.sort_by(|a,b| a.category.cmp(&b.category));
line_items
}
}