Hook up import from file

vetcove-upload
Wes Holland 6 months ago
parent 8291bd123d
commit 801d37202e

@ -47,7 +47,7 @@ pub fn routes() -> Router<AppState> {
) )
.route("/upload", get(upload::index::upload_index_handler)) .route("/upload", get(upload::index::upload_index_handler))
.route("/upload/catalog", post(upload::catalog::catalog_import)) .route("/upload/catalog", post(upload::catalog::catalog_import))
.route("/upload/vetcove/order", post(upload::vetcove::order_details_import)) .route("/upload/vetcove/history", post(upload::vetcove::item_history_import))
.route("/overview", get(overview::overview_handler)) .route("/overview", get(overview::overview_handler))
.route("/reports", get(reports::reports_handler)) .route("/reports", get(reports::reports_handler))
.route("/history", get(history::history_log_handler)) .route("/history", get(history::history_log_handler))

@ -7,7 +7,7 @@ use crate::error::AppError;
use crate::session::SessionUser; use crate::session::SessionUser;
use crate::ingest::vetcove::ingest_item_history_bytes; use crate::ingest::vetcove::ingest_item_history_bytes;
pub async fn order_details_import( pub async fn item_history_import(
State(db): State<SqlitePool>, State(db): State<SqlitePool>,
user: SessionUser, user: SessionUser,
mut multipart: Multipart, mut multipart: Multipart,

@ -1,7 +1,7 @@
use serde::Serialize; use serde::Serialize;
use anyhow::Result; use anyhow::Result;
use chrono::{DateTime, Utc}; use chrono::{DateTime, NaiveDate, Utc};
use sqlx::SqlitePool; use sqlx::SqlitePool;
#[derive(Clone, Debug, Serialize)] #[derive(Clone, Debug, Serialize)]
@ -36,7 +36,7 @@ pub struct DbVetcoveItemHistoryEntry {
pub async fn add_vetcove_item_history_entry(db: &SqlitePool, pub async fn add_vetcove_item_history_entry(db: &SqlitePool,
vetcove_entry_id: i64, vetcove_entry_id: i64,
vetcove_item_id: i64, vetcove_item_id: i64,
order_date: DateTime<Utc>, order_date: NaiveDate,
item_name: String, item_name: String,
order_id: String, order_id: String,
units: f64, units: f64,
@ -55,7 +55,16 @@ pub async fn add_vetcove_item_history_entry(db: &SqlitePool,
unit_measurement: Option<String>, unit_measurement: Option<String>,
item_status: Option<String>, item_status: Option<String>,
supplier_sku: Option<String>) supplier_sku: Option<String>)
-> Result<i64> { -> Result<Option<i64>> {
let existing: i64 = sqlx::query_scalar(r#"
SELECT COUNT(1) FROM VetcoveItemHistory WHERE vetcove_entry_id = ?
"#).bind(vetcove_entry_id).fetch_one(db).await?;
if existing > 0 {
return Ok(None)
}
let res = sqlx::query( let res = sqlx::query(
r#" r#"
INSERT INTO VetcoveItemHistory ( INSERT INTO VetcoveItemHistory (
@ -104,8 +113,8 @@ pub async fn add_vetcove_item_history_entry(db: &SqlitePool,
.bind(item_status) .bind(item_status)
.bind(supplier_sku) .bind(supplier_sku)
.execute(db).await?; .execute(db).await?;
let new_id = res.last_insert_rowid(); let new_id = res.last_insert_rowid();
Ok(new_id) Ok(Some(new_id))
} }

@ -1 +1 @@
mod item_history; pub mod item_history;

@ -4,18 +4,52 @@ use tracing::info;
use axum::body::Bytes; use axum::body::Bytes;
use crate::db::adjustment::add_adjustment_new_stock; use crate::db::adjustment::add_adjustment_new_stock;
use crate::db::inventory_item::add_inventory_item; use crate::db::inventory_item::add_inventory_item;
use crate::db::vetcove::item_history::add_vetcove_item_history_entry;
#[derive(Debug, serde::Deserialize)] #[derive(Debug, serde::Deserialize)]
struct ItemHistoryRecord { struct ItemHistoryRecord {
name: String, #[serde(alias = "Vetcove ID")]
#[serde(alias = "qty")] vetcove_entry_id: i64,
#[serde(alias = "Date")]
order_date: chrono::NaiveDate,
#[serde(alias = "Hospital")]
hospital: String,
#[serde(alias = "Name")]
item_name: String,
#[serde(alias = "Order #")]
order_id: String,
#[serde(alias = "PO Number")]
po_number: String,
#[serde(alias = "Supplier")]
supplier: String,
#[serde(alias = "Manufacturer")]
manufacturer: String,
#[serde(alias = "Manufacturer Number")]
manufacturer_number: String,
#[serde(alias = "Primary Category")]
primary_category: String,
#[serde(alias = "Secondary Category")]
secondary_category: String,
#[serde(alias = "Vetcove Item ID")]
vetcove_item_id: i64,
#[serde(alias = "Cost per Dose")]
cost_per_dose: String,
#[serde(alias = "Units")]
units: f64,
#[serde(alias = "Unit Price")]
unit_price: String,
#[serde(alias = "Unit Measurement")]
unit_measurement: String,
#[serde(alias = "List Price")]
list_price: String,
#[serde(alias = "Quantity")]
quantity: f64, quantity: f64,
unit: String, #[serde(alias = "Total Price")]
fractional: bool, total_price: String,
#[serde(alias = "reorder")] #[serde(alias = "Item Status")]
reorder_point: f64, item_status: String,
#[serde(alias = "price")] #[serde(alias = "Supplier's SKU")]
unit_price: i64, supplier_sku: String,
} }
pub async fn ingest_item_history_bytes(bytes: Bytes, db: SqlitePool, user_id: i64) -> anyhow::Result<()> { pub async fn ingest_item_history_bytes(bytes: Bytes, db: SqlitePool, user_id: i64) -> anyhow::Result<()> {
@ -31,17 +65,35 @@ pub async fn ingest_item_history<T: std::io::Read>(mut reader: csv::Reader<T>, d
for result in reader.deserialize() { for result in reader.deserialize() {
let record: ItemHistoryRecord = result?; let record: ItemHistoryRecord = result?;
/* let query_res = add_vetcove_item_history_entry(
let new_entry_id = add_inventory_item(&db, &db,
&record.name, record.vetcove_entry_id,
record.reorder_point, record.vetcove_item_id,
record.fractional, record.order_date,
&record.unit, record.item_name,
&None, record.order_id,
&None, record.units,
record.quantity,
record.total_price,
Some(record.unit_price),
Some(record.list_price),
Some(record.cost_per_dose),
Some(record.hospital),
Some(record.po_number),
Some(record.supplier),
Some(record.manufacturer),
Some(record.manufacturer_number),
Some(record.primary_category),
Some(record.secondary_category),
Some(record.unit_measurement),
Some(record.item_status),
Some(record.supplier_sku),
).await?; ).await?;
*/
match query_res {
Some(new_db_id) => info!("Added new history item: {} => {}", record.vetcove_entry_id, new_db_id),
None => info!("History item exists, skipping {}", record.vetcove_entry_id),
}
} }
Ok(()) Ok(())
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.