You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
5.8 KiB

import json, csv, datetime, copy
import requests
from flask import Flask
from flask import render_template, send_from_directory, request, Response, send_file, session
app = Flask(__name__)
class Item():
items = {}
def __init__(self, name, price, itemid=None):
self.id = itemid if itemid != None else 0
self.name = name
self.price = price
self.events = []
Item.items[self.id] = self
def newEvent(self, type, value, date=None):
event = {}
if date==None:
# date = datetime.datetime.now().strftime('%Y-%m-%d')
print ("no date given, using now")
date = datetime.datetime.now()
event['date'] = date
event['type'] = type
event['value'] = value
self.events.append(event)
def recount(self, count, date=None):
if count < 0:
return False
self.newEvent('count', count, date)
Item.fileSave()
return True
def add(self, count, date=None):
self.newEvent('add', count, date)
Item.fileSave()
return True
def howMany(self):
count = 0
for event in self.events:
if event['type']=='add':
count += event['value']
if event['type']=='count':
count = event['value']
return count
def countSold(self, fromDate=None, verbose=False):
count = 0
totalSold = 0
lastDate = 'the start'
for event in self.events:
if event['type']=='add':
count += event['value']
if event['type']=='count':
newCount = event['value']
if newCount<count:
sold = count - newCount
totalSold += sold
if verbose:
print("sold {} between {} and {}".format(sold, lastDate, event['date'].strftime('%Y-%m-%d')))
lastDate = event['date']
count = newCount
return totalSold
def soldValue(self, fromDate=None):
return self.countSold() * self.price
@staticmethod
def fileSave():
fileContent = []
for key, item in Item.items.items():
itemEntity = {}
itemEntity['id'] = item.id
itemEntity['name'] = item.name
itemEntity['price'] = item.price
itemEntity['events'] = copy.deepcopy(item.events)
for event in itemEntity['events']:
event['date'] = event['date'].strftime('%Y-%m-%d')
fileContent.append(itemEntity)
with open('data.json', 'w') as outfile:
json.dump(fileContent, outfile)
print ("Saved to file.")
@staticmethod
def fileLoad():
with open('data.json', 'r') as f:
fileContent = json.load(f)
for itemEntry in fileContent:
item = Item(itemEntry['name'], itemEntry['price'], itemid=itemEntry['id'])
for event in itemEntry['events']:
item.newEvent(event['type'], event['value'], datetime.datetime.strptime(event['date'], '%Y-%m-%d'))
print ("Loaded from file")
@app.route('/')
def index():
return render_template('inventory.html')
@app.route('/recount', methods=['POST'])
def recount():
if 'id' not in request.form or 'count' not in request.form:
return "bad request"
itemid = int(request.form['id'])
count = int(request.form['count'])
if itemid in Item.items:
if Item.items[itemid].recount(count):
return 'ok'
else:
return 'error'
else:
return 'item not found'
@app.route('/restock', methods=['POST'])
def restock():
if 'id' not in request.form or 'count' not in request.form:
return "bad request"
itemid = int(request.form['id'])
count = int(request.form['count'])
if itemid in Item.items:
if Item.items[itemid].add(count):
return 'ok'
else:
return 'error'
else:
return 'item not found'
@app.route('/getdata')
def data():
jsonContent = []
for key, item in Item.items.items():
itemEntity = {}
itemEntity['id'] = item.id
itemEntity['name'] = item.name
itemEntity['price'] = str(item.price/100) + '.00'
itemEntity['quantity'] = item.howMany()
jsonContent.append(itemEntity)
return json.dumps(jsonContent)
@app.route('/salestats/<startDate>')
def saleStats(startDate = 0):
if startDate !=0:
try:
startDate = datetime.datetime.strptime(startDate, '%Y-%m-%d')
except:
return "invalid date format"
jsonContent = {}
jsonContent['totalCount'] = 0
jsonContent['totalValue'] = 0
itemTable = []
for key, item in Item.items.items():
itemEntity = {}
itemEntity['id'] = item.id
itemEntity['name'] = item.name
itemEntity['price'] = str(item.price/100) + '.00'
if startDate != 0:
itemEntity['soldQuantity'] = item.countSold(startDate)
else:
itemEntity['soldQuantity'] = item.countSold()
itemEntity['soldValue'] = str(itemEntity['soldQuantity'] * item.price / 100) + '.00'
jsonContent['totalCount'] += itemEntity['soldQuantity']
jsonContent['totalValue'] += itemEntity['soldQuantity'] * item.price/100
itemTable.append(itemEntity)
jsonContent['items'] = itemTable
jsonContent['startDate'] = startDate.strftime('%Y-%m-%d') if startDate != 0 else "2018-09-01"
jsonContent['endDate'] = datetime.datetime.now().strftime('%Y-%m-%d')
return json.dumps(jsonContent)
@app.route('/salestats')
def saleStatsNoDate():
return saleStats()
if __name__ == '__main__':
# app.secret_key = 'asuiygdiahsdo[ainsfl]asfkjnb;asklnj'
# app.config['SESSION_TYPE'] = 'memcached'
print("is this the work?")
Item.fileLoad()
app.run('0.0.0.0')