diff --git a/application/receipts/__pycache__/receipts_api.cpython-313.pyc b/application/receipts/__pycache__/receipts_api.cpython-313.pyc index 6970a56..e57363d 100644 Binary files a/application/receipts/__pycache__/receipts_api.cpython-313.pyc and b/application/receipts/__pycache__/receipts_api.cpython-313.pyc differ diff --git a/application/receipts/__pycache__/receipts_processes.cpython-313.pyc b/application/receipts/__pycache__/receipts_processes.cpython-313.pyc index 63536cd..159121e 100644 Binary files a/application/receipts/__pycache__/receipts_processes.cpython-313.pyc and b/application/receipts/__pycache__/receipts_processes.cpython-313.pyc differ diff --git a/application/receipts/receipts_api.py b/application/receipts/receipts_api.py index 2d8ccee..f51f2cf 100644 --- a/application/receipts/receipts_api.py +++ b/application/receipts/receipts_api.py @@ -197,6 +197,19 @@ def postLinkedItem(): return jsonify({'error': False, "message": "Line Saved Succesfully"}) return jsonify({'error': True, "message": "Something went wrong while saving line!"}) +@receipt_api.route('/api/saveBarcodeLink', methods=["POST"]) +@access_api.login_required +def saveBarcodeLink(): + if request.method == "POST": + print(request.get_json()) + site_name = session['selected_site'] + user_id = session['user_id'] + receipts_processes.linkBarcodeToItem(site_name, user_id, request.get_json()) + #receipts_processes.linkItem(site_name, user_id, payload) + + return jsonify({'error': False, "message": "Line Saved Succesfully"}) + return jsonify({'error': True, "message": "Something went wrong while saving line!"}) + @receipt_api.route('/api/resolveLine', methods=["POST"]) @access_api.login_required def resolveLine(): diff --git a/application/receipts/receipts_processes.py b/application/receipts/receipts_processes.py index 4132e5c..f49ae11 100644 --- a/application/receipts/receipts_processes.py +++ b/application/receipts/receipts_processes.py @@ -5,7 +5,7 @@ import PIL import openfoodfacts import psycopg2 import datetime - +import pprint # APPLICATION IMPORTS from application.receipts import receipts_database from application import database_payloads @@ -23,6 +23,52 @@ def create_pdf_preview(pdf_path, output_path, size=(600, 400)): img.save(output_path) return file_name + '.jpg' +def linkBarcodeToItem(site, user_id, data, conn=None): + self_conn = False + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = False + self_conn = True + + receipt_item_id = data['receipt_item_id'] + payload = data['payload'] + item_uuid = payload['item_uuid'] + + receipt_item = receipts_database.selectReceiptItemsTuple(site, (receipt_item_id,)) + item = receipts_database.getItemAllByUUID(site, (item_uuid,)) + + barcode_tuple = database_payloads.BarcodesPayload( + barcode=receipt_item['barcode'], + item_uuid=item_uuid, + in_exchange=payload['in_exchange'], + out_exchange=payload['out_exchange'], + descriptor=payload['descriptor'] + ) + + receipts_database.insertBarcodesTuple(site, barcode_tuple.payload(), conn=conn) + + new_data = receipt_item['data'] + new_quantity = float(receipt_item['qty'] * payload['in_exchange']) + new_data['expires'] = item['food_info']['expires'] + receipts_item_update = {'id': receipt_item_id, 'update': { + 'type': 'sku', + 'name': item['item_name'], + 'uom': item['item_info']['uom']['id'], + 'item_uuid': item['item_uuid'], + 'data': new_data, + 'qty': new_quantity + }} + + receipts_database.updateReceiptItemsTuple(site, receipts_item_update, conn=conn) + + if self_conn: + conn.commit() + conn.close() + return False + + return conn + def linkItem(site, user_id, data, conn=None): """ this is a higher level function used to process a new item into the system, link it to another item, and update the receipt_item to the new linked item data. @@ -119,6 +165,7 @@ def postLine(site, user_id, data, conn=None): expiration = None #if receipt_item['type'] == 'sku': + # receipts_database.get # linked_item = receipts_database.getLinkedItemByBarcode(site, (receipt_item['barcode'], ), conn=conn) # if len(linked_item) > 1: # conv_factor = linked_item['conv_factor'] diff --git a/application/receipts/static/js/receiptHandler.js b/application/receipts/static/js/receiptHandler.js index 988f4dc..9358f71 100644 --- a/application/receipts/static/js/receiptHandler.js +++ b/application/receipts/static/js/receiptHandler.js @@ -118,7 +118,7 @@ async function replenishLinesTable(receipt_items) { linkOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') linkOp.setAttribute('uk-icon', 'icon: link') linkOp.onclick = async function () { - await openLinksSelectModal(receipt_items[i].id) + await openItemBarcodeSelectModal(receipt_items[i].id) } let editOp = document.createElement('a') @@ -870,4 +870,177 @@ async function updateLinksPaginationElement() { console.log(nextElement.innerHTML) } paginationElement.append(nextElement) +} + +// Select Barcode Link Functions +var ItemBarcodeSelectModal_limit = 50 +var ItemBarcodeSelectModal_page = 1 +var ItemBarcodeSelectModal_page_end = 1 +var selectedReceiptItemID = 0 + +async function openItemBarcodeSelectModal(receipt_item_id) { + selectedReceiptItemID = receipt_item_id + await setupItemsBarcodeSelect() + UIkit.modal(document.getElementById("ItemBarcodeSelectModal")).show(); +} + +async function setupItemsBarcodeSelect() { + let items = await getItemsForModal() + await generateItemsBarcodeSelectTable(items) + await updateItemsBarcodeSelectPagination() +} + +async function generateItemsBarcodeSelectTable(items) { + let ItemBarcodeSelectTable = document.getElementById('ItemBarcodeSelectTable') + ItemBarcodeSelectTable.innerHTML = "" + + for(let i = 0; i < items.length; i++){ + let tableRow = document.createElement('tr') + + let nameCell = document.createElement('td') + nameCell.innerHTML = items[i].item_name + + let inCell = document.createElement('td') + inCell.innerHTML = `` + + let outCell = document.createElement('td') + outCell.innerHTML = `` + + let descriptorCell = document.createElement('td') + descriptorCell.innerHTML = `` + + + let opCell = document.createElement('td') + + let selectButton = document.createElement('button') + selectButton.setAttribute('class', 'uk-button uk-button-small uk-button-primary') + selectButton.innerHTML = "Select" + selectButton.onclick = async function() { + let payload = { + item_uuid: items[i].item_uuid, + in_exchange: parseFloat(document.getElementById(`${items[i].item_uuid}_in`).value), + out_exchange: parseFloat(document.getElementById(`${items[i].item_uuid}_out`).value), + descriptor: document.getElementById(`${items[i].item_uuid}_descriptor`).value + } + await updateReceiptItemBarcode(payload) + } + + opCell.append(selectButton) + + tableRow.append(nameCell, inCell, outCell, descriptorCell, opCell) + + ItemBarcodeSelectTable.append(tableRow) + } +} + + +async function getItemsForModal() { + const url = new URL('/receipts/api/getItems', window.location.origin); + url.searchParams.append('page', ItemBarcodeSelectModal_page); + url.searchParams.append('limit', ItemBarcodeSelectModal_limit); + const response = await fetch(url); + data = await response.json(); + ItemBarcodeSelectModal_page_end = data.end + let items = data.items; + return items; +} + +async function updateItemsBarcodeSelectPagination() { + let paginationElement = document.getElementById("ItemBarcodeSelectModalPage"); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(ItemBarcodeSelectModal_page-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${ItemBarcodeSelectModal_page-1}` + paginationElement.append(lastElement) + } + // current + if(ItemBarcodeSelectModal_page!=1 && ItemBarcodeSelectModal_page != ItemBarcodeSelectModal_page_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
Select an Item from the system...
+ +| Name | +In Exchange | +Out Exchange | +Descriptor | +Operations | +
|---|