|
|
@@ -1,10 +1,12 @@
|
|
|
use crate::categories::get_category;
|
|
|
use crate::categories::CatStats;
|
|
|
use crate::receipt;
|
|
|
+use crate::user::User;
|
|
|
use chrono::{Date, Utc};
|
|
|
use qif_generator::{account::Account, split::Split, transaction::Transaction};
|
|
|
use std::fs;
|
|
|
|
|
|
+/// Read json file with receipt and convert it into `receipt::Purchase`
|
|
|
pub fn read_file(f: &str) -> receipt::Purchase {
|
|
|
let json = fs::read_to_string(f).expect("Can't read file");
|
|
|
receipt::parse_purchase(&json)
|
|
|
@@ -27,6 +29,7 @@ mod tests {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/// Generate set of QIF Splits from a Purchase items
|
|
|
pub fn gen_splits(items: &[receipt::Item], cs: &mut CatStats) -> Vec<Split> {
|
|
|
let mut result: Vec<Split> = Vec::new();
|
|
|
for i in items.iter() {
|
|
|
@@ -41,16 +44,18 @@ pub fn gen_splits(items: &[receipt::Item], cs: &mut CatStats) -> Vec<Split> {
|
|
|
result
|
|
|
}
|
|
|
|
|
|
+/// Generate QIF transaction from `splits`
|
|
|
pub fn gen_trans<'a>(
|
|
|
acc: &'a Account,
|
|
|
date: Date<Utc>,
|
|
|
sum: i64,
|
|
|
- splits: &'a [Split],
|
|
|
+ memo: &str,
|
|
|
+ splits: Vec<Split>,
|
|
|
) -> Result<Transaction<'a>, String> {
|
|
|
let t = Transaction::new(acc)
|
|
|
.date(date)
|
|
|
- .memo("New")
|
|
|
- .splits(splits)
|
|
|
+ .memo(memo)
|
|
|
+ .splits(&splits)
|
|
|
.build();
|
|
|
|
|
|
match t {
|
|
|
@@ -68,3 +73,15 @@ pub fn gen_trans<'a>(
|
|
|
Err(e) => Err(e),
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+/// Convert `filename` into a QIF transaction
|
|
|
+pub fn convert<'a>(
|
|
|
+ filename: &'a str,
|
|
|
+ memo: &str,
|
|
|
+ user: &'a mut User,
|
|
|
+ acc: &'a Account,
|
|
|
+) -> Result<Transaction<'a>, String> {
|
|
|
+ let purchase = read_file(filename);
|
|
|
+ let splits = gen_splits(&purchase.items, &mut user.catmap);
|
|
|
+ gen_trans(&acc, purchase.date(), purchase.total_sum(), memo, splits)
|
|
|
+}
|