Progress towards inventory
This commit is contained in:
parent
48ec66d64b
commit
aecde207f9
3 changed files with 95 additions and 15 deletions
|
@ -83,7 +83,7 @@ fn put_client(file: &str, payload: &[u8]) -> Result<Easy2<Collector>, ()> {
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub async fn pull_data(
|
pub async fn pull_data(
|
||||||
state: State<'_, Mutex<AppState>>,
|
_state: State<'_, Mutex<AppState>>,
|
||||||
) -> Result<String, ()> {
|
) -> Result<String, ()> {
|
||||||
let mut client = data_client("")?;
|
let mut client = data_client("")?;
|
||||||
client.custom_request("PROPFIND").map_err(|_| ())?;
|
client.custom_request("PROPFIND").map_err(|_| ())?;
|
||||||
|
@ -95,8 +95,8 @@ pub async fn pull_data(
|
||||||
async fn push_key(id: &u64, key: &SigningKey) -> Result<(), ()> {
|
async fn push_key(id: &u64, key: &SigningKey) -> Result<(), ()> {
|
||||||
let file = format!("{:016X}.key", id);
|
let file = format!("{:016X}.key", id);
|
||||||
let v_key = key.verifying_key();
|
let v_key = key.verifying_key();
|
||||||
let mut client = put_client(&file, v_key.as_ref())?;
|
let client = put_client(&file, v_key.as_ref())?;
|
||||||
let perf = client.perform()
|
let _perf = client.perform()
|
||||||
.map_err(|e| println!("{:?}", e))?;
|
.map_err(|e| println!("{:?}", e))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -109,8 +109,8 @@ fn push_db(id: &u64, db: &Connection, app: tauri::AppHandle) -> Result<(), ()> {
|
||||||
.map_err(|e| println!("{:?}", e))?;
|
.map_err(|e| println!("{:?}", e))?;
|
||||||
let buf = std::fs::read(&path)
|
let buf = std::fs::read(&path)
|
||||||
.map_err(|e| println!("{:?}", e))?;
|
.map_err(|e| println!("{:?}", e))?;
|
||||||
let mut client = put_client(&filename, buf.as_ref())?;
|
let client = put_client(&filename, buf.as_ref())?;
|
||||||
let perf = client.perform()
|
let _perf = client.perform()
|
||||||
.map_err(|e| println!("{:?}", e))?;
|
.map_err(|e| println!("{:?}", e))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -122,6 +122,6 @@ pub async fn push_data(
|
||||||
) -> Result<(), ()> {
|
) -> Result<(), ()> {
|
||||||
let state = state.lock().await;
|
let state = state.lock().await;
|
||||||
push_key(&state.id, &state.key).await?;
|
push_key(&state.id, &state.key).await?;
|
||||||
push_db(&state.id, &state.db, app);
|
push_db(&state.id, &state.db, app)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use chrono::offset::Utc;
|
use chrono::offset::Utc;
|
||||||
use rand::prelude::*;
|
use rusqlite::{types::ToSqlOutput, ToSql};
|
||||||
use rusqlite::{types::ToSqlOutput, Connection, ToSql};
|
|
||||||
use tauri::{Manager, State};
|
use tauri::{Manager, State};
|
||||||
use tauri_plugin_fs::FsExt;
|
use tauri_plugin_fs::FsExt;
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
|
@ -11,7 +10,7 @@ mod data_door;
|
||||||
|
|
||||||
use app_state::AppState;
|
use app_state::AppState;
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
enum Store {
|
enum Store {
|
||||||
Aldi,
|
Aldi,
|
||||||
Edeka,
|
Edeka,
|
||||||
|
@ -21,6 +20,24 @@ enum Store {
|
||||||
Tegut,
|
Tegut,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
enum Account {
|
||||||
|
Sumpf,
|
||||||
|
Heinersyndikat,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Inventory {
|
||||||
|
acc: Account,
|
||||||
|
cash: i64,
|
||||||
|
vouchers: Vec<VoucherInventory>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct VoucherInventory {
|
||||||
|
store: Store,
|
||||||
|
count: i64,
|
||||||
|
}
|
||||||
|
|
||||||
impl TryFrom<&str> for Store {
|
impl TryFrom<&str> for Store {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
|
@ -37,6 +54,18 @@ impl TryFrom<&str> for Store {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TryFrom<&str> for Account {
|
||||||
|
type Error = ();
|
||||||
|
|
||||||
|
fn try_from(s: &str) -> Result<Self, Self::Error> {
|
||||||
|
match s {
|
||||||
|
"sumpf" => Ok(Account::Sumpf),
|
||||||
|
"hs" => Ok(Account::Heinersyndikat),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ToSql for Store {
|
impl ToSql for Store {
|
||||||
fn to_sql(&self) -> rusqlite::Result<ToSqlOutput<'_>> {
|
fn to_sql(&self) -> rusqlite::Result<ToSqlOutput<'_>> {
|
||||||
match self {
|
match self {
|
||||||
|
@ -50,12 +79,60 @@ impl ToSql for Store {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ToSql for Account {
|
||||||
|
fn to_sql(&self) -> rusqlite::Result<ToSqlOutput<'_>> {
|
||||||
|
match self {
|
||||||
|
Account::Sumpf => 0.to_sql(),
|
||||||
|
Account::Heinersyndikat => 1.to_sql(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_inventory(data: HashMap<String, String>) -> Result<Inventory, ()> {
|
||||||
|
let a = data.get("cafe-inventory-acc").ok_or(())?;
|
||||||
|
let acc: Account = Account::try_from(a.as_ref())?;
|
||||||
|
let mut vouchers = Vec::new();
|
||||||
|
for s in ["aldi", "dm", "lidl", "rewe", "tegut"] {
|
||||||
|
let Ok(store) = s.try_into() else {
|
||||||
|
println!("Did not find '{}' in inventory data.", s);
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
match data.get(&format!("cafe-inventory-{}", s)) {
|
||||||
|
None => (),
|
||||||
|
Some(c) => {
|
||||||
|
let c = if c == "" {"0"} else {c};
|
||||||
|
let Ok(count) = c.parse() else {
|
||||||
|
println!("Invalid count '{}' for '{}' in inventory data.", c, s);
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
let v = VoucherInventory { store, count };
|
||||||
|
vouchers.push(v);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
async fn inventory(
|
async fn inventory(
|
||||||
data: HashMap<String, String>,
|
data: HashMap<String, String>,
|
||||||
state: State<'_, Mutex<AppState>>,
|
state: State<'_, Mutex<AppState>>,
|
||||||
) -> Result<(), ()> {
|
) -> Result<(), ()> {
|
||||||
println!("{:?}", data);
|
let now = Utc::now().timestamp();
|
||||||
|
let state = state.lock().await;
|
||||||
|
let inv = parse_inventory(data)?;
|
||||||
|
for v in inv.vouchers {
|
||||||
|
state.db.execute(
|
||||||
|
"INSERT INTO voucher_inventory VALUES ()",
|
||||||
|
(
|
||||||
|
inv.acc,
|
||||||
|
v.store,
|
||||||
|
v.count,
|
||||||
|
now,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.map_err(|e| println!("{:?}", e))?;
|
||||||
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,12 +143,10 @@ async fn swap(
|
||||||
state: State<'_, Mutex<AppState>>,
|
state: State<'_, Mutex<AppState>>,
|
||||||
) -> Result<(), ()> {
|
) -> Result<(), ()> {
|
||||||
let state = state.lock().await;
|
let state = state.lock().await;
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
let store: Store = store.try_into()?;
|
let store: Store = store.try_into()?;
|
||||||
state.db.execute(
|
state.db.execute(
|
||||||
"INSERT INTO swap VALUES (?1, ?2, ?3, ?4, ?5, ?6)",
|
"INSERT INTO swap VALUES (?1, ?2, ?3, ?4, ?5)",
|
||||||
(
|
(
|
||||||
rng.gen::<i64>(),
|
|
||||||
store,
|
store,
|
||||||
acc,
|
acc,
|
||||||
i64::from_ne_bytes(state.id.to_ne_bytes()),
|
i64::from_ne_bytes(state.id.to_ne_bytes()),
|
||||||
|
|
|
@ -55,8 +55,6 @@ body {
|
||||||
.logo {
|
.logo {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
padding: 0em 0em;
|
padding: 0em 0em;
|
||||||
will-change: filter;
|
|
||||||
transition: 0.75s;
|
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
@ -96,8 +94,15 @@ button {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#cafe-inventory form button {
|
||||||
|
height: 1.5cm;
|
||||||
|
font-size: 7mm;
|
||||||
|
}
|
||||||
|
|
||||||
input[type=number] {
|
input[type=number] {
|
||||||
border: 1px solid #eee;
|
border: 1px solid #eee;
|
||||||
|
text-align: right;
|
||||||
|
font-size: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=radio] {
|
input[type=radio] {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue