370 lines
17 KiB
Python
370 lines
17 KiB
Python
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
|
|
from config import config, sites_config
|
|
from main import unfoldCostLayers
|
|
|
|
database_api= Blueprint('database_api', __name__)
|
|
|
|
@database_api.route("/changeSite", methods=["POST"])
|
|
def changeSite():
|
|
if request.method == "POST":
|
|
site = request.json['site']
|
|
session['selected_site'] = site
|
|
return jsonify({'error': False, 'message': 'Site Changed!'})
|
|
|
|
|
|
@database_api.route("/getGroups")
|
|
def paginate_groups():
|
|
page = int(request.args.get('page', 1))
|
|
limit = int(request.args.get('limit', 10))
|
|
site_name = session['selected_site']
|
|
offset = (page - 1) * limit
|
|
|
|
groups = []
|
|
count = 0
|
|
|
|
database_config = config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"SELECT * FROM {site_name}_groups LIMIT %s OFFSET %s;"
|
|
count = f"SELECT COUNT(*) FROM {site_name}_groups"
|
|
|
|
cur.execute(sql, (limit, offset))
|
|
groups = cur.fetchall()
|
|
cur.execute(count)
|
|
count = cur.fetchone()[0]
|
|
|
|
|
|
sql_item = f"SELECT {site_name}_items.barcode, {site_name}_items.item_name, {site_name}_logistics_info.quantity_on_hand FROM {site_name}_items LEFT JOIN {site_name}_logistics_info ON {site_name}_items.logistics_info_id = {site_name}_logistics_info.id WHERE {site_name}_items.id = %s; "
|
|
new_groups = []
|
|
for group in groups:
|
|
qty = 0
|
|
group = list(group)
|
|
items = []
|
|
print(group[3])
|
|
for item_id in group[3]:
|
|
cur.execute(sql_item, (item_id,))
|
|
item_row = list(cur.fetchone())
|
|
cur.execute(f"SELECT quantity_on_hand FROM {site_name}_item_locations WHERE part_id=%s;", (item_id, ))
|
|
item_locations = cur.fetchall()[0]
|
|
qty += float(sum(item_locations))
|
|
item_row[2] = sum(item_locations)
|
|
items.append(item_row)
|
|
group[3] = items
|
|
group.append(qty)
|
|
new_groups.append(group)
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
|
|
return jsonify({'groups': new_groups, "end": math.ceil(count/limit)})
|
|
|
|
|
|
@database_api.route("/getVendors")
|
|
def get_vendors():
|
|
database_config = config()
|
|
site_name = session['selected_site']
|
|
vendors = []
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"SELECT * FROM {site_name}_vendors;"
|
|
cur.execute(sql)
|
|
vendors = cur.fetchall()
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
|
|
return jsonify(vendors=vendors)
|
|
|
|
|
|
@database_api.route("/addGroup")
|
|
def addGroup():
|
|
name = str(request.args.get('name', ""))
|
|
description = str(request.args.get('description', ""))
|
|
group_type = str(request.args.get('type', ""))
|
|
site_name = session['selected_site']
|
|
state = "FAILED"
|
|
|
|
database_config = config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"INSERT INTO {site_name}_groups (name, description, included_items, group_type) VALUES (%s, %s, %s, %s);"
|
|
cur.execute(sql, (name, description, json.dumps({}), group_type))
|
|
state = "SUCCESS"
|
|
conn.commit()
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
conn.rollback()
|
|
|
|
|
|
return jsonify({'state': state})
|
|
|
|
@database_api.route("/getGroup")
|
|
def get_group():
|
|
id = int(request.args.get('id', 1))
|
|
database_config = config()
|
|
site_name = session['selected_site']
|
|
|
|
group = []
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"SELECT * FROM {site_name}_groups WHERE id=%s;"
|
|
cur.execute(sql, (id, ))
|
|
group = list(cur.fetchone())
|
|
|
|
sql_item = f"SELECT {site_name}_items.id, {site_name}_items.barcode, {site_name}_items.item_name, {site_name}_logistics_info.quantity_on_hand FROM {site_name}_items LEFT JOIN {site_name}_logistics_info ON {site_name}_items.logistics_info_id = {site_name}_logistics_info.id WHERE {site_name}_items.id = %s;"
|
|
qty = 0
|
|
group = list(group)
|
|
items = []
|
|
print(group[3])
|
|
for item_id in group[3]:
|
|
cur.execute(sql_item, (item_id,))
|
|
item_row = cur.fetchone()
|
|
qty += float(item_row[3])
|
|
items.append(item_row)
|
|
group[3] = items
|
|
group.append(qty)
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
|
|
return jsonify(group=group)
|
|
|
|
@database_api.route("/updateGroup", methods=["POST"])
|
|
def update_group():
|
|
if request.method == "POST":
|
|
site_name = session['selected_site']
|
|
group_id = request.get_json()['id']
|
|
items = request.get_json()['items']
|
|
name = request.get_json()['name']
|
|
description = request.get_json()['description']
|
|
group_type = request.get_json()['group_type']
|
|
data = (name, description, items, group_type, group_id)
|
|
database_config = config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
# Start by updating the group -> included items with the up to date list
|
|
sql = f"UPDATE {site_name}_groups SET name = %s, description = %s, included_items = %s, group_type = %s WHERE id=%s;"
|
|
cur.execute(sql, data)
|
|
|
|
update_item_sql = f"UPDATE {site_name}_item_info SET groups = %s WHERE id = %s;"
|
|
select_item_sql = f"SELECT {site_name}_item_info.id, {site_name}_item_info.groups FROM {site_name}_items LEFT JOIN {site_name}_item_info ON {site_name}_items.item_info_id = {site_name}_item_info.id WHERE {site_name}_items.id = %s;"
|
|
# Now we will fetch each item row one by one and check if the group id is already inside of its groups array
|
|
for item_id in items:
|
|
cur.execute(select_item_sql, (item_id, ))
|
|
item = cur.fetchone()
|
|
print(item)
|
|
item_groups: set = set(item[1])
|
|
# Condition check, adds it if it doesnt exist.
|
|
if group_id not in item_groups:
|
|
item_groups.add(group_id)
|
|
cur.execute(update_item_sql, (list(item_groups), item[0]))
|
|
|
|
# Now we fetch all items that have the group id in its groups array
|
|
fetch_items_with_group = f"SELECT {site_name}_items.id, groups, {site_name}_item_info.id FROM {site_name}_item_info LEFT JOIN {site_name}_items ON {site_name}_items.item_info_id = {site_name}_item_info.id WHERE groups @> ARRAY[%s];"
|
|
cur.execute(fetch_items_with_group, (group_id, ))
|
|
group_items = cur.fetchall()
|
|
print(items)
|
|
# We will then check each item id against the groups new included_items list to see if the item should be in there
|
|
for item_id, group, info_id in group_items:
|
|
# If it is not we remove the group form the items list and update the item
|
|
if item_id not in items:
|
|
groups: list = list(group)
|
|
groups.remove(group_id)
|
|
cur.execute(update_item_sql, (list(groups), info_id))
|
|
|
|
conn.commit()
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
conn.rollback()
|
|
|
|
return jsonify({"state": "SUCCESS"})
|
|
return jsonify({"state": "FAILED"})
|
|
|
|
@database_api.route("/addList")
|
|
def addList():
|
|
name = str(request.args.get('name', ""))
|
|
description = str(request.args.get('description', ""))
|
|
list_type = str(request.args.get('type', ""))
|
|
site_name = session['selected_site']
|
|
|
|
print(name, description, list_type)
|
|
state = "FAILED"
|
|
|
|
#if name or description or group_type == "":
|
|
# print("this is empty")
|
|
# return jsonify({'state': state})
|
|
timestamp = datetime.datetime.now()
|
|
data = (name, description, [], json.dumps({}), [], [], 0, timestamp, list_type)
|
|
database_config = config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"INSERT INTO {site_name}_shopping_lists (name, description, pantry_items, custom_items, recipes, groups, author, creation_date, type) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s);"
|
|
cur.execute(sql, data)
|
|
state = "SUCCESS"
|
|
conn.commit()
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
conn.rollback()
|
|
|
|
|
|
return jsonify({'state': state})
|
|
|
|
@database_api.route("/getLists")
|
|
def paginate_lists():
|
|
page = int(request.args.get('page', 1))
|
|
limit = int(request.args.get('limit', 10))
|
|
site_name = session['selected_site']
|
|
|
|
offset = (page - 1) * limit
|
|
|
|
lists = []
|
|
count = 0
|
|
|
|
database_config = config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"SELECT * FROM {site_name}_shopping_lists LIMIT %s OFFSET %s;"
|
|
count = f"SELECT COUNT(*) FROM {site_name}_shopping_lists;"
|
|
|
|
cur.execute(sql, (limit, offset))
|
|
temp_lists = list(cur.fetchall())
|
|
cur.execute(count)
|
|
count = cur.fetchone()[0]
|
|
|
|
for shopping_list in temp_lists:
|
|
shopping_list: list = list(shopping_list)
|
|
pantry_items = shopping_list[3]
|
|
custom_items = shopping_list[4]
|
|
list_length = len(custom_items)
|
|
|
|
sqlfile = open(f"sites/{site_name}/sql/unique/shopping_lists_safetystock_count.sql", "r+")
|
|
sql = "\n".join(sqlfile.readlines())
|
|
sqlfile.close()
|
|
print(sql)
|
|
if shopping_list[10] == 'calculated':
|
|
print(shopping_list[0])
|
|
cur.execute(sql, (shopping_list[0], ))
|
|
list_length += cur.fetchone()[0]
|
|
|
|
else:
|
|
list_length += len(pantry_items)
|
|
|
|
shopping_list.append(list_length)
|
|
lists.append(shopping_list)
|
|
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
|
|
return jsonify({'lists': lists, 'end': math.ceil(count/limit)})
|
|
|
|
@database_api.route("/getListView")
|
|
def get_list_view():
|
|
id = int(request.args.get('id', 1))
|
|
site_name = session['selected_site']
|
|
shopping_list = []
|
|
database_config = config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"SELECT * FROM {site_name}_shopping_lists WHERE id=%s;"
|
|
cur.execute(sql, (id, ))
|
|
shopping_list = list(cur.fetchone())
|
|
|
|
if shopping_list[10] == "calculated":
|
|
sqlfile = open(f"sites/{site_name}/sql/unique/shopping_lists_safetystock.sql", "r+")
|
|
sql = "\n".join(sqlfile.readlines())
|
|
sqlfile.close()
|
|
else:
|
|
sqlfile = open(f"sites/{site_name}/sql/unique/shopping_lists_safetystock_uncalculated.sql", "r+")
|
|
sql = "\n".join(sqlfile.readlines())
|
|
sqlfile.close()
|
|
|
|
cur.execute(sql, (id, ))
|
|
shopping_list[3] = list(cur.fetchall())
|
|
print(shopping_list[4])
|
|
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
|
|
return jsonify(shopping_list=shopping_list)
|
|
|
|
@database_api.route("/getList")
|
|
def get_list():
|
|
id = int(request.args.get('id', 1))
|
|
database_config = config()
|
|
site_name = session['selected_site']
|
|
shopping_list = []
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"SELECT * FROM {site_name}_shopping_lists WHERE id=%s;"
|
|
cur.execute(sql, (id, ))
|
|
shopping_list = list(cur.fetchone())
|
|
itemSQL = f"SELECT {site_name}_items.id, {site_name}_items.barcode, {site_name}_items.item_name, {site_name}_items.links, {site_name}_item_info.uom FROM {site_name}_items LEFT JOIN {site_name}_item_info ON {site_name}_items.item_info_id = {site_name}_item_info.id WHERE {site_name}_item_info.shopping_lists @> ARRAY[%s];"
|
|
cur.execute(itemSQL, (id, ))
|
|
shopping_list[3] = list(cur.fetchall())
|
|
print(shopping_list)
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
|
|
return jsonify(shopping_list=shopping_list)
|
|
|
|
@database_api.route("/updateList", methods=["POST"])
|
|
def update_list():
|
|
if request.method == "POST":
|
|
site_name = session['selected_site']
|
|
list_id = request.get_json()['id']
|
|
items = request.get_json()['items']
|
|
print(items)
|
|
custom_items = request.get_json()['custom']
|
|
name = request.get_json()['name']
|
|
description = request.get_json()['description']
|
|
list_type = request.get_json()['list_type']
|
|
quantities = request.get_json()['quantities']
|
|
data = (name, description, items, json.dumps(custom_items), list_type, json.dumps(quantities), list_id)
|
|
database_config = config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
# Start by updating the group -> included items with the up to date list
|
|
sql = f"UPDATE {site_name}_shopping_lists SET name = %s, description = %s, pantry_items = %s, custom_items = %s, type = %s, quantities = %s WHERE id=%s;"
|
|
cur.execute(sql, data)
|
|
|
|
update_item_sql = f"UPDATE {site_name}_item_info SET shopping_lists = %s WHERE id = %s;"
|
|
select_item_sql = f"SELECT {site_name}_item_info.id, {site_name}_item_info.shopping_lists FROM {site_name}_items LEFT JOIN {site_name}_item_info ON {site_name}_items.item_info_id = {site_name}_item_info.id WHERE {site_name}_items.id = %s;"
|
|
# Now we will fetch each item row one by one and check if the group id is already inside of its groups array
|
|
for item_id in items:
|
|
cur.execute(select_item_sql, (item_id, ))
|
|
item = cur.fetchone()
|
|
print(item)
|
|
shopping_lists: set = set(item[1])
|
|
# Condition check, adds it if it doesnt exist.
|
|
if list_id not in shopping_lists:
|
|
shopping_lists.add(list_id)
|
|
cur.execute(update_item_sql, (list(shopping_lists), item[0]))
|
|
|
|
# Now we fetch all items that have the group id in its groups array
|
|
fetch_items_with_list = f"SELECT {site_name}_items.id, {site_name}_item_info.shopping_lists, {site_name}_item_info.id FROM {site_name}_item_info LEFT JOIN {site_name}_items ON {site_name}_items.item_info_id = {site_name}_item_info.id WHERE {site_name}_item_info.shopping_lists @> ARRAY[%s];"
|
|
cur.execute(fetch_items_with_list, (list_id, ))
|
|
list_items = cur.fetchall()
|
|
print(items)
|
|
# We will then check each item id against the groups new included_items list to see if the item should be in there
|
|
for item_id, shopping_list, info_id in list_items:
|
|
# If it is not we remove the group form the items list and update the item
|
|
if item_id not in items:
|
|
shopping_lists: list = list(shopping_list)
|
|
shopping_lists.remove(list_id)
|
|
cur.execute(update_item_sql, (list(shopping_lists), info_id))
|
|
|
|
conn.commit()
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
conn.rollback()
|
|
|
|
return jsonify({"state": "SUCCESS"})
|
|
return jsonify({"state": "FAILED"}) |