diff --git a/.sqlx/query-691f8a6b4fc87073c53ad9a639f7893e77b7acdf278ef6259d2fec6185ba9eec.json b/.sqlx/query-0e8d869fa387d0b7b4face618fd35f8c41a671bd5499d79efd24e99fdefc3fd5.json similarity index 89% rename from .sqlx/query-691f8a6b4fc87073c53ad9a639f7893e77b7acdf278ef6259d2fec6185ba9eec.json rename to .sqlx/query-0e8d869fa387d0b7b4face618fd35f8c41a671bd5499d79efd24e99fdefc3fd5.json index f68cb73..26fbc8a 100644 --- a/.sqlx/query-691f8a6b4fc87073c53ad9a639f7893e77b7acdf278ef6259d2fec6185ba9eec.json +++ b/.sqlx/query-0e8d869fa387d0b7b4face618fd35f8c41a671bd5499d79efd24e99fdefc3fd5.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n ship.id,\n ship.quantity,\n sup.raw_material_kind as \"material_type: RawMaterial\"\n FROM shipments AS ship\n JOIN suppliers AS sup ON ship.supplier_id = sup.id\n WHERE request_date + delivery_time = $1\n ", + "query": "\n SELECT\n ship.id,\n ship.quantity,\n sup.raw_material_kind as \"material_type: RawMaterial\"\n FROM shipments AS ship\n JOIN suppliers AS sup ON ship.supplier_id = sup.id\n WHERE request_date + delivery_time = $1\n AND arrival_date IS NULL\n ", "describe": { "columns": [ { @@ -47,5 +47,5 @@ false ] }, - "hash": "691f8a6b4fc87073c53ad9a639f7893e77b7acdf278ef6259d2fec6185ba9eec" + "hash": "0e8d869fa387d0b7b4face618fd35f8c41a671bd5499d79efd24e99fdefc3fd5" } diff --git a/.sqlx/query-f3407da68295e9fcca1d8e0bf39314eee04edebd5a09c2b799cf02e8df247897.json b/.sqlx/query-f3407da68295e9fcca1d8e0bf39314eee04edebd5a09c2b799cf02e8df247897.json deleted file mode 100644 index ba357c0..0000000 --- a/.sqlx/query-f3407da68295e9fcca1d8e0bf39314eee04edebd5a09c2b799cf02e8df247897.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n WITH item_prices AS (\n SELECT unit_price\n FROM suppliers\n JOIN shipments AS sh\n ON sh.supplier_id = suppliers.id WHERE sh.id = $1\n )\n UPDATE\n items\n SET\n status = 'in_stock',\n warehouse = 'W1',\n acc_cost = (SELECT unit_price FROM item_prices)\n WHERE id IN\n (\n SELECT items.id\n FROM items\n JOIN raw_material_shipments AS rs\n ON rs.raw_material_id = items.id\n JOIN shipments AS s\n ON rs.shipment_id = s.id\n WHERE s.id = $1\n )\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [] - }, - "hash": "f3407da68295e9fcca1d8e0bf39314eee04edebd5a09c2b799cf02e8df247897" -} diff --git a/migrations/012_shipments.sql b/migrations/012_shipments.sql index 06f5fd0..a3cef98 100644 --- a/migrations/012_shipments.sql +++ b/migrations/012_shipments.sql @@ -6,3 +6,38 @@ CREATE TABLE IF NOT EXISTS shipments ( quantity int NOT NULL, cost money NOT NULL ); + +CREATE FUNCTION shipment_arrived() RETURNS TRIGGER AS $$ + BEGIN + WITH item_prices AS ( + SELECT unit_price + FROM suppliers + JOIN shipments AS sh + ON sh.supplier_id = suppliers.id WHERE sh.id = NEW.id + ) + UPDATE + items + SET + status = 'in_stock', + warehouse = 'W1', + acc_cost = (SELECT unit_price FROM item_prices) + WHERE id IN + ( + SELECT items.id + FROM items + JOIN raw_material_shipments AS rs + ON rs.raw_material_id = items.id + JOIN shipments AS s + ON rs.shipment_id = s.id + WHERE s.id = NEW.id + ); + + RAISE NOTICE 'Shipment % arrived', NEW.id; + RETURN NEW; + END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER shipment_arrived_trigger +AFTER UPDATE OF arrival_date ON shipments +FOR EACH ROW +EXECUTE FUNCTION shipment_arrived(); diff --git a/src/db_api/shipments.rs b/src/db_api/shipments.rs index 177bfe5..498b17f 100644 --- a/src/db_api/shipments.rs +++ b/src/db_api/shipments.rs @@ -43,36 +43,6 @@ impl Shipment { } pub async fn arrived(id: i64, date: i32, con: &PgPool) -> sqlx::Result<()> { - sqlx::query!( - r#" - WITH item_prices AS ( - SELECT unit_price - FROM suppliers - JOIN shipments AS sh - ON sh.supplier_id = suppliers.id WHERE sh.id = $1 - ) - UPDATE - items - SET - status = 'in_stock', - warehouse = 'W1', - acc_cost = (SELECT unit_price FROM item_prices) - WHERE id IN - ( - SELECT items.id - FROM items - JOIN raw_material_shipments AS rs - ON rs.raw_material_id = items.id - JOIN shipments AS s - ON rs.shipment_id = s.id - WHERE s.id = $1 - ) - "#, - id, - ) - .execute(con) - .await?; - sqlx::query!( r#" UPDATE shipments @@ -102,6 +72,7 @@ impl Shipment { FROM shipments AS ship JOIN suppliers AS sup ON ship.supplier_id = sup.id WHERE request_date + delivery_time = $1 + AND arrival_date IS NULL "#, date )