Lines
73.68 %
Functions
18.33 %
Branches
100 %
use chrono::{DateTime, Utc};
use sqlx::types::Uuid;
use supp_macro::command;
use crate::{config::ConfigError, user::User};
use super::super::{CmdError, CmdResult, PeriodData, ReportData, ReportFilter, ReportMeta};
use super::fetch::{
fetch_accounts, fetch_balance_splits_filtered_no_conversion,
fetch_balance_splits_filtered_with_conversion, fetch_balance_splits_no_conversion,
fetch_balance_splits_with_conversion, fetch_date_range_splits_filtered_no_conversion,
fetch_date_range_splits_filtered_with_conversion, fetch_date_range_splits_no_conversion,
fetch_date_range_splits_with_conversion, fetch_target_symbol,
};
use super::tree::{AccountAmounts, build_tree};
async fn fetch_snapshot(
conn: &mut sqlx::PgConnection,
target_commodity_id: Option<Uuid>,
as_of: Option<DateTime<Utc>>,
report_filter: Option<&ReportFilter>,
) -> Result<AccountAmounts, CmdError> {
match (target_commodity_id, report_filter) {
(Some(tid), Some(f)) => {
let sym = fetch_target_symbol(conn, tid).await?;
fetch_balance_splits_filtered_with_conversion(conn, tid, &sym, as_of, f).await
}
(Some(tid), None) => {
fetch_balance_splits_with_conversion(conn, tid, &sym, as_of).await
(None, Some(f)) => fetch_balance_splits_filtered_no_conversion(conn, as_of, f).await,
(None, None) => fetch_balance_splits_no_conversion(conn, as_of).await,
async fn fetch_range(
from: DateTime<Utc>,
to: DateTime<Utc>,
fetch_date_range_splits_filtered_with_conversion(conn, tid, &sym, from, to, f).await
fetch_date_range_splits_with_conversion(conn, tid, &sym, from, to).await
(None, Some(f)) => fetch_date_range_splits_filtered_no_conversion(conn, from, to, f).await,
(None, None) => fetch_date_range_splits_no_conversion(conn, from, to).await,
command! {
BalanceReport {
#[required]
user_id: Uuid,
#[optional]
target_commodity_id: Uuid,
date_from: DateTime<Utc>,
as_of: DateTime<Utc>,
report_filter: ReportFilter,
} => {
let user = User { id: user_id };
let mut conn = user.get_connection().await.map_err(|err| {
log::error!("{}", t!("Database error: %{err}", err = err : {:?}));
ConfigError::DB
})?;
let accounts = fetch_accounts(&mut conn).await?;
let amounts = match date_from {
Some(from) => {
let to = as_of.unwrap_or_else(Utc::now);
fetch_range(&mut conn, target_commodity_id, from, to, report_filter.as_ref()).await?
None => fetch_snapshot(&mut conn, target_commodity_id, as_of, report_filter.as_ref()).await?,
let roots = build_tree(&accounts, &amounts);
let period = PeriodData { label: None, roots };
Ok(Some(CmdResult::Report(ReportData {
meta: ReportMeta {
date_from,
date_to: as_of,
target_commodity_id,
},
periods: vec![period],
})))