tktax-check 0.2.2

A Rust library for identifying and handling treasury or check transactions in the TKTAX system.
Documentation
// ---------------- [ File: tktax-check/src/checks_and_treasury.rs ]
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
    }
}