From 1018414200b49bc069578a4eae1b057e19fa4312 Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Fri, 4 Jul 2025 12:38:25 -0500 Subject: [PATCH] Finished basic migration for POE module --- application/items/items_API.py | 23 ++---- application/poe/poe_api.py | 83 +++++-------------- application/poe/poe_database.py | 90 +++++++++++++++++++++ application/poe/poe_processes.py | 28 +++---- application/poe/sql/getItemAllByBarcode.sql | 75 +++++++++++++++++ application/poe/sql/getItemAllByID.sql | 86 ++++++++++++++++++++ application/poe/templates/receipts.html | 5 +- application/poe/templates/scanner.html | 7 +- application/postsqldb.py | 17 ++++ 9 files changed, 310 insertions(+), 104 deletions(-) create mode 100644 application/poe/sql/getItemAllByBarcode.sql create mode 100644 application/poe/sql/getItemAllByID.sql diff --git a/application/items/items_API.py b/application/items/items_API.py index 517f79c..d6af383 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -4,19 +4,10 @@ from flask import ( ) import psycopg2 import math -import json -import datetime -import copy -import requests -import pprint + # applications imports -from config import config, sites_config -from main import unfoldCostLayers -import process -import database -import main -import MyDataclasses +from config import config from user_api import login_required import application.postsqldb as db from application.items import database_items @@ -36,7 +27,7 @@ def update_session_user(): @login_required def items(): update_session_user() - sites = [site[1] for site in main.get_sites(session['user']['sites'])] + sites = [site[1] for site in db.get_sites(session['user']['sites'])] return render_template("index.html", current_site=session['selected_site'], sites=sites) @@ -44,7 +35,7 @@ def items(): @items_api.route("/") @login_required def item(id): - sites = [site[1] for site in main.get_sites(session['user']['sites'])] + sites = [site[1] for site in db.get_sites(session['user']['sites'])] database_config = config() with psycopg2.connect(**database_config) as conn: units = db.UnitsTable.getAll(conn) @@ -53,7 +44,7 @@ def item(id): @items_api.route("/transaction") @login_required def transaction(): - sites = [site[1] for site in main.get_sites(session['user']['sites'])] + sites = [site[1] for site in db.get_sites(session['user']['sites'])] database_config = config() with psycopg2.connect(**database_config) as conn: units = db.UnitsTable.getAll(conn) @@ -74,13 +65,13 @@ def transactions(id): 200: description: Returns the transactions.html webpage for the item with passed ID """ - sites = [site[1] for site in main.get_sites(session['user']['sites'])] + sites = [site[1] for site in db.get_sites(session['user']['sites'])] return render_template("transactions.html", id=id, current_site=session['selected_site'], sites=sites) @items_api.route("//itemLink/") @login_required def itemLink(parent_id, id): - sites = [site[1] for site in main.get_sites(session['user']['sites'])] + sites = [site[1] for site in db.get_sites(session['user']['sites'])] return render_template("itemlink.html", current_site=session['selected_site'], sites=sites, proto={'referrer': request.referrer}, id=id) @items_api.route("/getTransactions", methods=["GET"]) diff --git a/application/poe/poe_api.py b/application/poe/poe_api.py index c1a49f2..5447570 100644 --- a/application/poe/poe_api.py +++ b/application/poe/poe_api.py @@ -1,103 +1,55 @@ -from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response -import psycopg2, math, json, datetime, main, copy, requests, process, database, pprint, MyDataclasses -from config import config, sites_config -from main import unfoldCostLayers -from threading import Thread -from queue import Queue -import time, process +# 3rd Party imports +from flask import ( + Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response + ) +import psycopg2 + +# applications imports +from config import config from user_api import login_required -import webpush -from application.poe import poe_processes +from application.poe import poe_processes, poe_database from application import postsqldb + point_of_ease = Blueprint('poe', __name__, template_folder="templates", static_folder="static") @point_of_ease.route('/scanner', methods=["GET"]) +@login_required def scannerEndpoint(): - sites = [site[1] for site in main.get_sites(session['user']['sites'])] + sites = [site[1] for site in postsqldb.get_sites(session['user']['sites'])] return render_template('scanner.html', current_site=session['selected_site'], sites=sites) @point_of_ease.route('/receipts', methods=["GET"]) +@login_required def receiptsEndpoint(): - sites = [site[1] for site in main.get_sites(session['user']['sites'])] + sites = [site[1] for site in postsqldb.get_sites(session['user']['sites'])] database_config = config() with psycopg2.connect(**database_config) as conn: units = postsqldb.UnitsTable.getAll(conn) - #units = db.UnitsTable.getAll(conn) return render_template('receipts.html', current_site=session['selected_site'], sites=sites, units=units) -# DONT NEED -@point_of_ease.route('/getItemLocations', methods=["GET"]) -def getItemLocations(): - recordset = [] - count = 0 - if request.method == "GET": - item_id = int(request.args.get('id', 1)) - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 10)) - site_name = session['selected_site'] - offset = (page - 1) * limit - database_config = config() - with psycopg2.connect(**database_config) as conn: - recordset, count = database.getItemLocations(conn, site_name, (item_id, limit, offset), convert=True) - return jsonify({"locations":recordset, "end":math.ceil(count/limit), "error":False, "message":"item fetched succesfully!"}) - return jsonify({"locations":recordset, "end": math.ceil(count/limit), "error":True, "message":"There was an error with this GET statement"}) - - -# in item api, DONT NEED -@point_of_ease.route('/getItem', methods=["GET"]) -def getItem(): - record = {} - if request.method == "GET": - item_id = int(request.args.get('id', 1)) - site_name = session['selected_site'] - database_config = config() - with psycopg2.connect(**database_config) as conn: - record = database.getItemAllByID(conn, site_name, (item_id, ), convert=True) - return jsonify({"item":record, "error":False, "message":"item fetched succesfully!"}) - return jsonify({"item":record, "error":True, "message":"There was an error with this GET statement"}) - @point_of_ease.route('/getItem/barcode', methods=["GET"]) +@login_required def getItemBarcode(): record = {} if request.method == "GET": item_barcode = f"%{str(request.args.get('barcode', 1))}%" site_name = session['selected_site'] - database_config = config() - with psycopg2.connect(**database_config) as conn: - record = database.getItemAllByBarcode(conn, site_name, (item_barcode, ), convert=True) + record = poe_database.selectItemAllByBarcode(site_name, (item_barcode,)) if record == {}: return jsonify({"item":None, "error":True, "message":"Item either does not exist or there was a larger problem!"}) else: return jsonify({"item":record, "error":False, "message":"item fetched succesfully!"}) return jsonify({"item":record, "error":True, "message":"There was an error with this GET statement"}) -# in items api DONT NEED -@point_of_ease.route('/getModalItems', methods=["GET"]) -@login_required -def getModalItems(): - recordset = [] - count = {'count': 0} - if request.method == "GET": - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 10)) - search_string = request.args.get('search_string', '') - site_name = session['selected_site'] - offset = (page - 1) * limit - database_config = config() - with psycopg2.connect(**database_config) as conn: - payload = (search_string, limit, offset) - recordset, count = database.getItemsForModal(conn, site_name, payload, convert=True) - return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":False, "message":"items fetched succesfully!"}) - return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":True, "message":"There was an error with this GET statement"}) @point_of_ease.route('/postTransaction', methods=["POST"]) +@login_required def post_transaction(): if request.method == "POST": - print('test two') result = poe_processes.postTransaction( site_name=session['selected_site'], user_id=session['user_id'], @@ -108,6 +60,7 @@ def post_transaction(): @point_of_ease.route('/postReceipt', methods=["POST"]) +@login_required def post_receipt(): if request.method == "POST": site_name = session['selected_site'] diff --git a/application/poe/poe_database.py b/application/poe/poe_database.py index 3d690b2..d7440b2 100644 --- a/application/poe/poe_database.py +++ b/application/poe/poe_database.py @@ -155,6 +155,96 @@ def selectItemLocationsTuple(site_name, payload, convert=True, conn=None): except Exception as error: return error + +def selectLinkedItemByBarcode(site, payload, convert=True, conn=None): + item = () + self_conn = False + sql = f"SELECT * FROM {site}_itemlinks WHERE barcode=%s;" + try: + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = True + self_conn = True + + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + item = postsqldb.tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + item = rows + + if self_conn: + conn.commit() + conn.close() + + return item + except (Exception, psycopg2.DatabaseError) as error: + raise postsqldb.DatabaseError(error, payload, sql) + +def selectItemAllByID(site, payload, convert=True, conn=None): + item = () + self_conn = False + + with open(f"application/poe/sql/getItemAllByID.sql", "r+") as file: + getItemAllByID_sql = file.read().replace("%%site_name%%", site) + try: + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = True + self_conn = True + + with conn.cursor() as cur: + cur.execute(getItemAllByID_sql, payload) + rows = cur.fetchone() + if rows and convert: + item = postsqldb.tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + item = rows + + if self_conn: + conn.commit() + conn.close() + + return item + except (Exception, psycopg2.DatabaseError) as error: + raise postsqldb.DatabaseError(error, payload, getItemAllByID_sql) + +def selectItemAllByBarcode(site, payload, convert=True, conn=None): + item = () + self_conn = False + linked_item = selectLinkedItemByBarcode(site, (payload[0],)) + + if len(linked_item) > 1: + item = selectItemAllByID(site, payload=(linked_item['link'], ), convert=convert) + item['item_info']['uom_quantity'] = linked_item['conv_factor'] + else: + with open(f"application/poe/sql/getItemAllByBarcode.sql", "r+") as file: + getItemAllByBarcode_sql = file.read().replace("%%site_name%%", site) + try: + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = True + self_conn = True + + with conn.cursor() as cur: + cur.execute(getItemAllByBarcode_sql, payload) + rows = cur.fetchone() + if rows and convert: + item = postsqldb.tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + item = rows + + if self_conn: + conn.commit() + conn.close() + + except (Exception, psycopg2.DatabaseError) as error: + raise postsqldb.DatabaseError(error, payload, getItemAllByBarcode_sql) + return item def insertCostLayersTuple(site, payload, convert=True, conn=None): cost_layer = () diff --git a/application/poe/poe_processes.py b/application/poe/poe_processes.py index 1d0a9e0..a8510f0 100644 --- a/application/poe/poe_processes.py +++ b/application/poe/poe_processes.py @@ -1,12 +1,18 @@ -from application import postsqldb, database_payloads -from application.poe import poe_database - +# 3rd Party imports import datetime import psycopg2 +# applications imports +from application import postsqldb, database_payloads +from application.poe import poe_database import config +""" This module will hold all the multilayerd/complex process used in the +point of ease module. """ + + def postTransaction(site_name, user_id, data: dict, conn=None): + '''Takes a set of data as a dictionary and inserts them into the system for passed site_name. ''' #dict_keys(['item_id', 'logistics_info_id', 'barcode', 'item_name', 'transaction_type', # 'quantity', 'description', 'cost', 'vendor', 'expires', 'location_id']) def quantityFactory(quantity_on_hand:float, quantity:float, transaction_type:str): @@ -47,18 +53,15 @@ def postTransaction(site_name, user_id, data: dict, conn=None): user_id=user_id, ) - #location = database.selectItemLocationsTuple(conn, site_name, payload=(data['item_id'], data['location_id']), convert=True) location = poe_database.selectItemLocationsTuple(site_name, payload=(data['item_id'], data['location_id']), conn=conn) cost_layers: list = location['cost_layers'] if data['transaction_type'] == "Adjust In": cost_layer = poe_database.insertCostLayersTuple(site_name, cost_layer.payload(), conn=conn) - #cost_layer = database.insertCostLayersTuple(conn, site_name, cost_layer.payload(), convert=True) cost_layers.append(cost_layer['id']) if data['transaction_type'] == "Adjust Out": if float(location['quantity_on_hand']) < float(data['quantity']): return {"error":True, "message":f"The quantity on hand in the chosen location is not enough to satisfy your transaction!"} - #cost_layers = database.selectCostLayersTuple(conn, site_name, (location['id'], ), convert=True) cost_layers = poe_database.selectCostLayersTuple(site_name, payload=(location['id'], )) new_cost_layers = [] @@ -73,12 +76,10 @@ def postTransaction(site_name, user_id, data: dict, conn=None): layer['quantity'] -= qty new_cost_layers.append(layer['id']) poe_database.updateCostLayersTuple(site_name, {'id': layer['id'], 'update': {'quantity': layer['quantity']}}, conn=conn) - #database.__updateTuple(conn, site_name, f"{site_name}_cost_layers", {'id': layer['id'], 'update': {'quantity': layer['quantity']}}) qty = 0.0 if layer['quantity'] == 0.0: poe_database.deleteCostLayersTuple(site_name, (layer['id'],), conn=conn) - #database.deleteCostLayersTuple(conn, site_name, (layer['id'], )) cost_layers = new_cost_layers @@ -86,15 +87,12 @@ def postTransaction(site_name, user_id, data: dict, conn=None): updated_item_location_payload = (cost_layers, quantity_on_hand, data['item_id'], data['location_id']) poe_database.updateItemLocation(site_name, updated_item_location_payload, conn=conn) - #database.updateItemLocation(conn, site_name, updated_item_location_payload) site_location = poe_database.selectLocationsTuple(site_name, (location['location_id'], ), conn=conn) - #site_location = database.__selectTuple(conn, site_name, f"{site_name}_locations", (location['location_id'], ), convert=True) transaction.data = {'location': site_location['uuid']} poe_database.insertTransactionsTuple(site_name, transaction.payload(), conn=conn) - #database.insertTransactionsTuple(conn, site_name, transaction.payload()) if self_conn: conn.commit() @@ -103,6 +101,8 @@ def postTransaction(site_name, user_id, data: dict, conn=None): return {"error": False, "message":f"Transaction Successful!"} def post_receipt(site_name, user_id, data: dict, conn=None): + '''Takes a list of items and opens and creates a SIR (SCANNED IN RECEIPT) into the system with the items linked + to said receipt.''' # data = {'items': items} self_conn = False items = data['items'] @@ -118,10 +118,9 @@ def post_receipt(site_name, user_id, data: dict, conn=None): receipt_id=receipt_id, submitted_by=user_id ) - #receipt = database.insertReceiptsTuple(conn, site_name, receipt.payload(), convert=True) receipt = poe_database.insertReceiptsTuple(site_name, receipt.payload(), conn=conn) + for item in items: - receipt_item = database_payloads.ReceiptItemPayload( type=item['type'], receipt_id=receipt['id'], @@ -131,10 +130,7 @@ def post_receipt(site_name, user_id, data: dict, conn=None): uom=item['item']['uom'], data=item['item']['data'] ) - #database.insertReceiptItemsTuple(conn, site_name, receipt_item.payload()) poe_database.insertReceiptItemsTuple(site_name, receipt_item.payload(), conn=conn) - #webpush.push_notifications('New Receipt', f"Receipt {receipt['receipt_id']} was added to Site -> {site_name}!") - #webpush.push_ntfy('New Receipt', f"Receipt {receipt['receipt_id']} was added to Site -> {site_name}!") if self_conn: conn.commit() diff --git a/application/poe/sql/getItemAllByBarcode.sql b/application/poe/sql/getItemAllByBarcode.sql new file mode 100644 index 0000000..b2c4b8d --- /dev/null +++ b/application/poe/sql/getItemAllByBarcode.sql @@ -0,0 +1,75 @@ +WITH passed_id AS (SELECT id AS passed_id FROM %%site_name%%_items WHERE barcode=%s), + logistics_id AS (SELECT logistics_info_id FROM %%site_name%%_items WHERE id=(SELECT passed_id FROM passed_id)), + info_id AS (SELECT item_info_id FROM %%site_name%%_items WHERE id=(SELECT passed_id FROM passed_id)), + cte_item_info AS ( + SELECT + %%site_name%%_item_info.*, + row_to_json(units.*) as uom + FROM %%site_name%%_item_info + LEFT JOIN units ON %%site_name%%_item_info.uom = units.id + WHERE %%site_name%%_item_info.id = (SELECT item_info_id FROM info_id) + ), + cte_groups AS ( + SELECT + %%site_name%%_groups.*, + %%site_name%%_group_items.uuid, + %%site_name%%_group_items.item_type, + %%site_name%%_group_items.qty + FROM %%site_name%%_groups + JOIN %%site_name%%_group_items ON %%site_name%%_groups.id = %%site_name%%_group_items.gr_id + WHERE %%site_name%%_group_items.item_id = (SELECT passed_id FROM passed_id) + ), + cte_shopping_lists AS ( + SELECT + %%site_name%%_shopping_lists.*, + %%site_name%%_shopping_list_items.uuid, + %%site_name%%_shopping_list_items.item_type, + %%site_name%%_shopping_list_items.qty + FROM %%site_name%%_shopping_lists + JOIN %%site_name%%_shopping_list_items ON %%site_name%%_shopping_lists.id = %%site_name%%_shopping_list_items.sl_id + WHERE %%site_name%%_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) + ), + cte_itemlinks AS ( + SELECT * FROM %%site_name%%_itemlinks WHERE link=(SELECT passed_id FROM passed_id) + ), + cte_item_locations AS ( + SELECT * FROM %%site_name%%_item_locations + LEFT JOIN %%site_name%%_locations ON %%site_name%%_locations.id = %%site_name%%_item_locations.location_id + WHERE part_id = (SELECT passed_id FROM passed_id) + ), + cte_logistics_info AS ( + SELECT + li.*, + row_to_json(pl) AS primary_location, + row_to_json(ail) AS auto_issue_location, + row_to_json(pz) AS primary_zone, + row_to_json(aiz) AS auto_issue_zone + FROM %%site_name%%_logistics_info AS li + LEFT JOIN %%site_name%%_locations AS pl ON li.primary_location = pl.id + LEFT JOIN %%site_name%%_locations AS ail ON li.auto_issue_location = ail.id + LEFT JOIN %%site_name%%_zones AS pz ON li.primary_zone = pz.id + LEFT JOIN %%site_name%%_zones AS aiz ON li.auto_issue_zone = aiz.id + WHERE li.id=(SELECT logistics_info_id FROM logistics_id) + ) + +SELECT + (SELECT passed_id FROM passed_id) AS passed_id, + %%site_name%%_items.*, + (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, + row_to_json(%%site_name%%_food_info.*) as food_info, + row_to_json(%%site_name%%_brands.*) as brand, + (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, + (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, + (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, + (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, + (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations +FROM %%site_name%%_items + LEFT JOIN %%site_name%%_item_info ON %%site_name%%_items.item_info_id = %%site_name%%_item_info.id + LEFT JOIN %%site_name%%_food_info ON %%site_name%%_items.food_info_id = %%site_name%%_food_info.id + LEFT JOIN %%site_name%%_brands ON %%site_name%%_items.brand = %%site_name%%_brands.id + LEFT JOIN units ON %%site_name%%_item_info.uom = units.id + LEFT JOIN cte_groups ON %%site_name%%_items.id = cte_groups.id + LEFT JOIN cte_shopping_lists ON %%site_name%%_items.id = cte_shopping_lists.id +WHERE %%site_name%%_items.id=(SELECT passed_id FROM passed_id) +GROUP BY + %%site_name%%_items.id, %%site_name%%_item_info.id, %%site_name%%_food_info.id, %%site_name%%_brands.id; \ No newline at end of file diff --git a/application/poe/sql/getItemAllByID.sql b/application/poe/sql/getItemAllByID.sql new file mode 100644 index 0000000..8b5ca81 --- /dev/null +++ b/application/poe/sql/getItemAllByID.sql @@ -0,0 +1,86 @@ +WITH passed_id AS (SELECT %s AS passed_id), + logistics_id AS (SELECT logistics_info_id FROM %%site_name%%_items WHERE id=(SELECT passed_id FROM passed_id)), + info_id AS (SELECT item_info_id FROM %%site_name%%_items WHERE id=(SELECT passed_id FROM passed_id)), + cte_conversions AS ( + SELECT + %%site_name%%_conversions.id as conv_id, + %%site_name%%_conversions.conv_factor as conv_factor, + units.* as uom + FROM %%site_name%%_conversions + LEFT JOIN units ON %%site_name%%_conversions.uom_id = units.id + WHERE %%site_name%%_conversions.item_id = (SELECT passed_id FROM passed_id) + ), + cte_item_info AS ( + SELECT + %%site_name%%_item_info.*, + row_to_json(units.*) as uom, + COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, + COALESCE((SELECT json_agg(p.*) FROM %%site_name%%_sku_prefix as p WHERE p.id = ANY(%%site_name%%_item_info.prefixes)), '[]'::json) as prefixes + FROM %%site_name%%_item_info + LEFT JOIN units ON %%site_name%%_item_info.uom = units.id + WHERE %%site_name%%_item_info.id = (SELECT item_info_id FROM info_id) + ), + cte_groups AS ( + SELECT + %%site_name%%_groups.*, + %%site_name%%_group_items.uuid, + %%site_name%%_group_items.item_type, + %%site_name%%_group_items.qty + FROM %%site_name%%_groups + JOIN %%site_name%%_group_items ON %%site_name%%_groups.id = %%site_name%%_group_items.gr_id + WHERE %%site_name%%_group_items.item_id = (SELECT passed_id FROM passed_id) + ), + cte_shopping_lists AS ( + SELECT + %%site_name%%_shopping_lists.*, + %%site_name%%_shopping_list_items.uuid, + %%site_name%%_shopping_list_items.item_type, + %%site_name%%_shopping_list_items.qty + FROM %%site_name%%_shopping_lists + JOIN %%site_name%%_shopping_list_items ON %%site_name%%_shopping_lists.id = %%site_name%%_shopping_list_items.sl_id + WHERE %%site_name%%_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) + ), + cte_itemlinks AS ( + SELECT * FROM %%site_name%%_itemlinks WHERE link=(SELECT passed_id FROM passed_id) + ), + cte_item_locations AS ( + SELECT * FROM %%site_name%%_item_locations + LEFT JOIN %%site_name%%_locations ON %%site_name%%_locations.id = %%site_name%%_item_locations.location_id + WHERE part_id = (SELECT passed_id FROM passed_id) + ), + cte_logistics_info AS ( + SELECT + li.*, + row_to_json(pl) AS primary_location, + row_to_json(ail) AS auto_issue_location, + row_to_json(pz) AS primary_zone, + row_to_json(aiz) AS auto_issue_zone + FROM %%site_name%%_logistics_info AS li + LEFT JOIN %%site_name%%_locations AS pl ON li.primary_location = pl.id + LEFT JOIN %%site_name%%_locations AS ail ON li.auto_issue_location = ail.id + LEFT JOIN %%site_name%%_zones AS pz ON li.primary_zone = pz.id + LEFT JOIN %%site_name%%_zones AS aiz ON li.auto_issue_zone = aiz.id + WHERE li.id=(SELECT logistics_info_id FROM logistics_id) + ) + +SELECT + (SELECT passed_id FROM passed_id) AS passed_id, + %%site_name%%_items.*, + (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, + row_to_json(%%site_name%%_food_info.*) as food_info, + row_to_json(%%site_name%%_brands.*) as brand, + (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, + (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, + (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, + (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, + (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations +FROM %%site_name%%_items + LEFT JOIN %%site_name%%_item_info ON %%site_name%%_items.item_info_id = %%site_name%%_item_info.id + LEFT JOIN %%site_name%%_food_info ON %%site_name%%_items.food_info_id = %%site_name%%_food_info.id + LEFT JOIN %%site_name%%_brands ON %%site_name%%_items.brand = %%site_name%%_brands.id + LEFT JOIN units ON %%site_name%%_item_info.uom = units.id + LEFT JOIN cte_groups ON %%site_name%%_items.id = cte_groups.id + LEFT JOIN cte_shopping_lists ON %%site_name%%_items.id = cte_shopping_lists.id +WHERE %%site_name%%_items.id=(SELECT passed_id FROM passed_id) +GROUP BY + %%site_name%%_items.id, %%site_name%%_item_info.id, %%site_name%%_food_info.id, %%site_name%%_brands.id; \ No newline at end of file diff --git a/application/poe/templates/receipts.html b/application/poe/templates/receipts.html index f812556..7555adc 100644 --- a/application/poe/templates/receipts.html +++ b/application/poe/templates/receipts.html @@ -86,9 +86,8 @@ -
  • Logistics
  • -
  • Items
  • -
  • Add Transaction
  • +
  • Point of Ease
  • +
  • Scan to Receipt
  • diff --git a/application/poe/templates/scanner.html b/application/poe/templates/scanner.html index c948d26..098fb9c 100644 --- a/application/poe/templates/scanner.html +++ b/application/poe/templates/scanner.html @@ -73,7 +73,7 @@
      -
    • {{current_site}} +
    • {{current_site}}
        {% for site in sites %} @@ -86,9 +86,8 @@
    • -
    • Logistics
    • -
    • Items
    • -
    • Add Transaction
    • +
    • Point of Ease
    • +
    • Scan To Transaction
    diff --git a/application/postsqldb.py b/application/postsqldb.py index 64844f8..57e8288 100644 --- a/application/postsqldb.py +++ b/application/postsqldb.py @@ -4,6 +4,7 @@ import psycopg2.extras from dataclasses import dataclass, field import random import string +import config class DatabaseError(Exception): def __init__(self, message, payload=[], sql=""): @@ -44,6 +45,22 @@ def getUUID(n): random_string = ''.join(random.choices(string.ascii_letters + string.digits, k=n)) return random_string +def get_sites(sites=[]): + database_config = config.config() + with psycopg2.connect(**database_config) as conn: + try: + with conn.cursor() as cur: + site_rows = [] + for each in sites: + cur.execute(f"SELECT * FROM sites WHERE id=%s;", (each, )) + site_rows.append(cur.fetchone()) + return site_rows + except (Exception, psycopg2.DatabaseError) as error: + print(error) + conn.rollback() + return False + + class ConversionsTable: @dataclass class Payload: