From 0446ae6a093afbc72061d66c1de39a044ebc4921 Mon Sep 17 00:00:00 2001 From: Marek Baczynski Date: Sat, 20 Jul 2019 22:01:25 +0200 Subject: [PATCH] first prototype --- data copy.json | 1 + data.json | 1 + inventory.py | 178 +++++++++++++++++++++++++++++++++++++++++++++++ static/script.js | 56 ++++++++------- 4 files changed, 211 insertions(+), 25 deletions(-) create mode 100644 data copy.json create mode 100644 data.json create mode 100644 inventory.py diff --git a/data copy.json b/data copy.json new file mode 100644 index 0000000..33602b4 --- /dev/null +++ b/data copy.json @@ -0,0 +1 @@ +[{"id": 1, "name": "Arduino Nano", "price": 2500, "events": [{"date": "2019-01-19", "type": "add", "value": 18}, {"date": "2019-03-01", "type": "count", "value": 18}]}, {"id": 2, "name": "Arduino pro micro", "price": 5600, "events": [{"date": "2019-01-19", "type": "add", "value": 17}, {"date": "2019-03-01", "type": "count", "value": 17}]}, {"id": 3, "name": "Arduino Uno", "price": 3000, "events": [{"date": "2019-01-19", "type": "add", "value": 7}, {"date": "2019-03-01", "type": "count", "value": 7}, {"date": "2019-06-30", "type": "count", "value": 2}, {"date": "2019-06-30", "type": "add", "value": 5}, {"date": "2019-06-30", "type": "count", "value": 0}, {"date": "2019-06-30", "type": "add", "value": 5}, {"date": "2019-06-30", "type": "add", "value": -1}]}, {"id": 4, "name": "ESP32", "price": 5000, "events": [{"date": "2019-01-19", "type": "add", "value": 2}, {"date": "2019-03-01", "type": "count", "value": 2}]}, {"id": 5, "name": "ESP8622", "price": 4000, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}, {"date": "2019-06-30", "type": "add", "value": 3}]}, {"id": 6, "name": "ESP12F", "price": 2500, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 7, "name": "STM32 BluePill", "price": 3000, "events": [{"date": "2019-01-19", "type": "add", "value": 7}, {"date": "2019-03-01", "type": "count", "value": 7}, {"date": "2019-06-30", "type": "add", "value": -3}]}, {"id": 8, "name": "STM32 Programmer", "price": 3500, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 9, "name": "CSR8645", "price": 5000, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 10, "name": "FTDI UART", "price": 1700, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 11, "name": "CP2102 UART", "price": 1700, "events": [{"date": "2019-01-19", "type": "add", "value": 7}, {"date": "2019-03-01", "type": "count", "value": 7}]}, {"id": 12, "name": "microSD 4GB", "price": 2300, "events": [{"date": "2019-01-19", "type": "add", "value": 17}, {"date": "2019-03-01", "type": "count", "value": 17}]}, {"id": 13, "name": "microSD 8GB", "price": 2700, "events": [{"date": "2019-01-19", "type": "add", "value": 23}, {"date": "2019-03-01", "type": "count", "value": 23}]}, {"id": 14, "name": "Ultrasonic sensor", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 9}, {"date": "2019-03-01", "type": "count", "value": 9}]}, {"id": 15, "name": "Motion sensor", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 16, "name": "IR tracker", "price": 600, "events": [{"date": "2019-01-19", "type": "add", "value": 7}, {"date": "2019-03-01", "type": "count", "value": 7}]}, {"id": 17, "name": "Acc/gyro/compas MPU950", "price": 3300, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 18, "name": "Laser TOF sensor", "price": 5500, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}, {"date": "2019-06-30", "type": "add", "value": 5}]}, {"id": 19, "name": "Liquid level sensor", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 20, "name": "50A current sensor", "price": 5000, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 21, "name": "3A current/volt sensor", "price": 2500, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 22, "name": "Soil moisture sensor", "price": 2500, "events": [{"date": "2019-01-19", "type": "add", "value": 10}, {"date": "2019-03-01", "type": "count", "value": 10}]}, {"id": 23, "name": "Sound level sensor", "price": 700, "events": [{"date": "2019-01-19", "type": "add", "value": 10}, {"date": "2019-03-01", "type": "count", "value": 10}]}, {"id": 24, "name": "Microphone with amplifier", "price": 1800, "events": [{"date": "2019-01-19", "type": "add", "value": 9}, {"date": "2019-03-01", "type": "count", "value": 9}]}, {"id": 25, "name": "Touch sensor", "price": 300, "events": [{"date": "2019-01-19", "type": "add", "value": 27}, {"date": "2019-03-01", "type": "count", "value": 27}]}, {"id": 26, "name": "Rotary encode", "price": 1000, "events": [{"date": "2019-01-19", "type": "add", "value": 6}, {"date": "2019-03-01", "type": "count", "value": 6}]}, {"id": 27, "name": "Vibration sensor", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 28, "name": "Relay", "price": 1400, "events": [{"date": "2019-01-19", "type": "add", "value": 11}, {"date": "2019-03-01", "type": "count", "value": 11}]}, {"id": 29, "name": "A4988 Stepper motor driver", "price": 1800, "events": [{"date": "2019-01-19", "type": "add", "value": 8}, {"date": "2019-03-01", "type": "count", "value": 8}, {"date": "2019-06-30", "type": "count", "value": 0}, {"date": "2019-06-30", "type": "add", "value": 5}, {"date": "2019-06-30", "type": "count", "value": 0}]}, {"id": 30, "name": "DRV8833 Motor driver", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 12}, {"date": "2019-03-01", "type": "count", "value": 12}]}, {"id": 31, "name": "DFPlayer wav mp3 player", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 32, "name": "XPT8871 Amp", "price": 600, "events": [{"date": "2019-01-19", "type": "add", "value": 2}, {"date": "2019-03-01", "type": "count", "value": 2}]}, {"id": 33, "name": "PAM8403 Amp", "price": 500, "events": [{"date": "2019-01-19", "type": "add", "value": 14}, {"date": "2019-03-01", "type": "count", "value": 14}]}, {"id": 34, "name": "MP3 player", "price": 1500, "events": [{"date": "2019-01-19", "type": "add", "value": 12}, {"date": "2019-03-01", "type": "count", "value": 12}]}, {"id": 35, "name": "Relay x4", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 36, "name": "Relay x8", "price": 4500, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 37, "name": "Buck 5A XL4015", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 8}, {"date": "2019-03-01", "type": "count", "value": 8}]}, {"id": 38, "name": "Buck LM2576HV", "price": 3800, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}, {"date": "2019-06-30", "type": "add", "value": -3}]}, {"id": 39, "name": "Buck 1.5A", "price": 500, "events": [{"date": "2019-01-19", "type": "add", "value": 14}, {"date": "2019-03-01", "type": "count", "value": 14}]}, {"id": 40, "name": "Buck AXH005A0X", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 73}, {"date": "2019-03-01", "type": "count", "value": 73}]}, {"id": 41, "name": "Boost 3A", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 42, "name": "Boost 2A", "price": 600, "events": [{"date": "2019-01-19", "type": "add", "value": 12}, {"date": "2019-03-01", "type": "count", "value": 12}]}, {"id": 43, "name": "USB 5V boost", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 12}, {"date": "2019-03-01", "type": "count", "value": 12}]}, {"id": 44, "name": "USB Li-ion charger", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 34}, {"date": "2019-03-01", "type": "count", "value": 34}]}, {"id": 45, "name": "181650 holder", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 10}, {"date": "2019-03-01", "type": "count", "value": 10}]}, {"id": 46, "name": "3S Battery BMS", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 47, "name": "2S Battery BMS", "price": 1000, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 48, "name": "4X AA battery", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 6}, {"date": "2019-03-01", "type": "count", "value": 6}, {"date": "2019-06-30", "type": "add", "value": -2}]}, {"id": 49, "name": "Breadboard small", "price": 1500, "events": [{"date": "2019-01-19", "type": "add", "value": 34}, {"date": "2019-03-01", "type": "count", "value": 34}]}, {"id": 50, "name": "Breadboard large", "price": 3000, "events": [{"date": "2019-01-19", "type": "add", "value": 19}, {"date": "2019-03-01", "type": "count", "value": 19}]}, {"id": 51, "name": "Jumper 10cm 10pcs", "price": 30, "events": [{"date": "2019-01-19", "type": "add", "value": 200}, {"date": "2019-03-01", "type": "count", "value": 200}, {"date": "2019-06-30", "type": "count", "value": 0}, {"date": "2019-06-30", "type": "add", "value": 400}]}, {"id": 52, "name": "Jumper 20cm 10pcs", "price": 50, "events": [{"date": "2019-01-19", "type": "add", "value": 50}, {"date": "2019-03-01", "type": "count", "value": 50}]}, {"id": 53, "name": "SSD1306 OLED display", "price": 3500, "events": [{"date": "2019-01-19", "type": "add", "value": 0}, {"date": "2019-03-01", "type": "count", "value": 0}]}, {"id": 54, "name": "6V 12V Cree", "price": 1000, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 55, "name": "WS2812 bar", "price": 1300, "events": [{"date": "2019-01-19", "type": "add", "value": 6}, {"date": "2019-03-01", "type": "count", "value": 6}]}, {"id": 56, "name": "Servo EMAX ES08A", "price": 3500, "events": [{"date": "2019-01-19", "type": "add", "value": 6}, {"date": "2019-03-01", "type": "count", "value": 6}]}, {"id": 57, "name": "Servo Hitec HS-425BB", "price": 10000, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 58, "name": "Geared DC motor", "price": 3500, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 59, "name": "XT60", "price": 500, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}, {"date": "2019-06-30", "type": "count", "value": 1}, {"date": "2019-06-30", "type": "add", "value": 12}]}, {"id": 60, "name": "XT30", "price": 500, "events": [{"date": "2019-01-19", "type": "add", "value": 9}, {"date": "2019-03-01", "type": "count", "value": 9}, {"date": "2019-06-30", "type": "count", "value": 1}, {"date": "2019-06-30", "type": "add", "value": 12}]}, {"id": 61, "name": "Mini USB", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 10}, {"date": "2019-03-01", "type": "count", "value": 10}]}, {"id": 62, "name": "Micro USB", "price": 1500, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}, {"date": "2019-06-30", "type": "add", "value": -1}]}] \ No newline at end of file diff --git a/data.json b/data.json new file mode 100644 index 0000000..33602b4 --- /dev/null +++ b/data.json @@ -0,0 +1 @@ +[{"id": 1, "name": "Arduino Nano", "price": 2500, "events": [{"date": "2019-01-19", "type": "add", "value": 18}, {"date": "2019-03-01", "type": "count", "value": 18}]}, {"id": 2, "name": "Arduino pro micro", "price": 5600, "events": [{"date": "2019-01-19", "type": "add", "value": 17}, {"date": "2019-03-01", "type": "count", "value": 17}]}, {"id": 3, "name": "Arduino Uno", "price": 3000, "events": [{"date": "2019-01-19", "type": "add", "value": 7}, {"date": "2019-03-01", "type": "count", "value": 7}, {"date": "2019-06-30", "type": "count", "value": 2}, {"date": "2019-06-30", "type": "add", "value": 5}, {"date": "2019-06-30", "type": "count", "value": 0}, {"date": "2019-06-30", "type": "add", "value": 5}, {"date": "2019-06-30", "type": "add", "value": -1}]}, {"id": 4, "name": "ESP32", "price": 5000, "events": [{"date": "2019-01-19", "type": "add", "value": 2}, {"date": "2019-03-01", "type": "count", "value": 2}]}, {"id": 5, "name": "ESP8622", "price": 4000, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}, {"date": "2019-06-30", "type": "add", "value": 3}]}, {"id": 6, "name": "ESP12F", "price": 2500, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 7, "name": "STM32 BluePill", "price": 3000, "events": [{"date": "2019-01-19", "type": "add", "value": 7}, {"date": "2019-03-01", "type": "count", "value": 7}, {"date": "2019-06-30", "type": "add", "value": -3}]}, {"id": 8, "name": "STM32 Programmer", "price": 3500, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 9, "name": "CSR8645", "price": 5000, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 10, "name": "FTDI UART", "price": 1700, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 11, "name": "CP2102 UART", "price": 1700, "events": [{"date": "2019-01-19", "type": "add", "value": 7}, {"date": "2019-03-01", "type": "count", "value": 7}]}, {"id": 12, "name": "microSD 4GB", "price": 2300, "events": [{"date": "2019-01-19", "type": "add", "value": 17}, {"date": "2019-03-01", "type": "count", "value": 17}]}, {"id": 13, "name": "microSD 8GB", "price": 2700, "events": [{"date": "2019-01-19", "type": "add", "value": 23}, {"date": "2019-03-01", "type": "count", "value": 23}]}, {"id": 14, "name": "Ultrasonic sensor", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 9}, {"date": "2019-03-01", "type": "count", "value": 9}]}, {"id": 15, "name": "Motion sensor", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 16, "name": "IR tracker", "price": 600, "events": [{"date": "2019-01-19", "type": "add", "value": 7}, {"date": "2019-03-01", "type": "count", "value": 7}]}, {"id": 17, "name": "Acc/gyro/compas MPU950", "price": 3300, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 18, "name": "Laser TOF sensor", "price": 5500, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}, {"date": "2019-06-30", "type": "add", "value": 5}]}, {"id": 19, "name": "Liquid level sensor", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 20, "name": "50A current sensor", "price": 5000, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 21, "name": "3A current/volt sensor", "price": 2500, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 22, "name": "Soil moisture sensor", "price": 2500, "events": [{"date": "2019-01-19", "type": "add", "value": 10}, {"date": "2019-03-01", "type": "count", "value": 10}]}, {"id": 23, "name": "Sound level sensor", "price": 700, "events": [{"date": "2019-01-19", "type": "add", "value": 10}, {"date": "2019-03-01", "type": "count", "value": 10}]}, {"id": 24, "name": "Microphone with amplifier", "price": 1800, "events": [{"date": "2019-01-19", "type": "add", "value": 9}, {"date": "2019-03-01", "type": "count", "value": 9}]}, {"id": 25, "name": "Touch sensor", "price": 300, "events": [{"date": "2019-01-19", "type": "add", "value": 27}, {"date": "2019-03-01", "type": "count", "value": 27}]}, {"id": 26, "name": "Rotary encode", "price": 1000, "events": [{"date": "2019-01-19", "type": "add", "value": 6}, {"date": "2019-03-01", "type": "count", "value": 6}]}, {"id": 27, "name": "Vibration sensor", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 28, "name": "Relay", "price": 1400, "events": [{"date": "2019-01-19", "type": "add", "value": 11}, {"date": "2019-03-01", "type": "count", "value": 11}]}, {"id": 29, "name": "A4988 Stepper motor driver", "price": 1800, "events": [{"date": "2019-01-19", "type": "add", "value": 8}, {"date": "2019-03-01", "type": "count", "value": 8}, {"date": "2019-06-30", "type": "count", "value": 0}, {"date": "2019-06-30", "type": "add", "value": 5}, {"date": "2019-06-30", "type": "count", "value": 0}]}, {"id": 30, "name": "DRV8833 Motor driver", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 12}, {"date": "2019-03-01", "type": "count", "value": 12}]}, {"id": 31, "name": "DFPlayer wav mp3 player", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 32, "name": "XPT8871 Amp", "price": 600, "events": [{"date": "2019-01-19", "type": "add", "value": 2}, {"date": "2019-03-01", "type": "count", "value": 2}]}, {"id": 33, "name": "PAM8403 Amp", "price": 500, "events": [{"date": "2019-01-19", "type": "add", "value": 14}, {"date": "2019-03-01", "type": "count", "value": 14}]}, {"id": 34, "name": "MP3 player", "price": 1500, "events": [{"date": "2019-01-19", "type": "add", "value": 12}, {"date": "2019-03-01", "type": "count", "value": 12}]}, {"id": 35, "name": "Relay x4", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 36, "name": "Relay x8", "price": 4500, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 37, "name": "Buck 5A XL4015", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 8}, {"date": "2019-03-01", "type": "count", "value": 8}]}, {"id": 38, "name": "Buck LM2576HV", "price": 3800, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}, {"date": "2019-06-30", "type": "add", "value": -3}]}, {"id": 39, "name": "Buck 1.5A", "price": 500, "events": [{"date": "2019-01-19", "type": "add", "value": 14}, {"date": "2019-03-01", "type": "count", "value": 14}]}, {"id": 40, "name": "Buck AXH005A0X", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 73}, {"date": "2019-03-01", "type": "count", "value": 73}]}, {"id": 41, "name": "Boost 3A", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 42, "name": "Boost 2A", "price": 600, "events": [{"date": "2019-01-19", "type": "add", "value": 12}, {"date": "2019-03-01", "type": "count", "value": 12}]}, {"id": 43, "name": "USB 5V boost", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 12}, {"date": "2019-03-01", "type": "count", "value": 12}]}, {"id": 44, "name": "USB Li-ion charger", "price": 1200, "events": [{"date": "2019-01-19", "type": "add", "value": 34}, {"date": "2019-03-01", "type": "count", "value": 34}]}, {"id": 45, "name": "181650 holder", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 10}, {"date": "2019-03-01", "type": "count", "value": 10}]}, {"id": 46, "name": "3S Battery BMS", "price": 2000, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}]}, {"id": 47, "name": "2S Battery BMS", "price": 1000, "events": [{"date": "2019-01-19", "type": "add", "value": 5}, {"date": "2019-03-01", "type": "count", "value": 5}]}, {"id": 48, "name": "4X AA battery", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 6}, {"date": "2019-03-01", "type": "count", "value": 6}, {"date": "2019-06-30", "type": "add", "value": -2}]}, {"id": 49, "name": "Breadboard small", "price": 1500, "events": [{"date": "2019-01-19", "type": "add", "value": 34}, {"date": "2019-03-01", "type": "count", "value": 34}]}, {"id": 50, "name": "Breadboard large", "price": 3000, "events": [{"date": "2019-01-19", "type": "add", "value": 19}, {"date": "2019-03-01", "type": "count", "value": 19}]}, {"id": 51, "name": "Jumper 10cm 10pcs", "price": 30, "events": [{"date": "2019-01-19", "type": "add", "value": 200}, {"date": "2019-03-01", "type": "count", "value": 200}, {"date": "2019-06-30", "type": "count", "value": 0}, {"date": "2019-06-30", "type": "add", "value": 400}]}, {"id": 52, "name": "Jumper 20cm 10pcs", "price": 50, "events": [{"date": "2019-01-19", "type": "add", "value": 50}, {"date": "2019-03-01", "type": "count", "value": 50}]}, {"id": 53, "name": "SSD1306 OLED display", "price": 3500, "events": [{"date": "2019-01-19", "type": "add", "value": 0}, {"date": "2019-03-01", "type": "count", "value": 0}]}, {"id": 54, "name": "6V 12V Cree", "price": 1000, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 55, "name": "WS2812 bar", "price": 1300, "events": [{"date": "2019-01-19", "type": "add", "value": 6}, {"date": "2019-03-01", "type": "count", "value": 6}]}, {"id": 56, "name": "Servo EMAX ES08A", "price": 3500, "events": [{"date": "2019-01-19", "type": "add", "value": 6}, {"date": "2019-03-01", "type": "count", "value": 6}]}, {"id": 57, "name": "Servo Hitec HS-425BB", "price": 10000, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 58, "name": "Geared DC motor", "price": 3500, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}]}, {"id": 59, "name": "XT60", "price": 500, "events": [{"date": "2019-01-19", "type": "add", "value": 4}, {"date": "2019-03-01", "type": "count", "value": 4}, {"date": "2019-06-30", "type": "count", "value": 1}, {"date": "2019-06-30", "type": "add", "value": 12}]}, {"id": 60, "name": "XT30", "price": 500, "events": [{"date": "2019-01-19", "type": "add", "value": 9}, {"date": "2019-03-01", "type": "count", "value": 9}, {"date": "2019-06-30", "type": "count", "value": 1}, {"date": "2019-06-30", "type": "add", "value": 12}]}, {"id": 61, "name": "Mini USB", "price": 800, "events": [{"date": "2019-01-19", "type": "add", "value": 10}, {"date": "2019-03-01", "type": "count", "value": 10}]}, {"id": 62, "name": "Micro USB", "price": 1500, "events": [{"date": "2019-01-19", "type": "add", "value": 3}, {"date": "2019-03-01", "type": "count", "value": 3}, {"date": "2019-06-30", "type": "add", "value": -1}]}] \ No newline at end of file diff --git a/inventory.py b/inventory.py new file mode 100644 index 0000000..a63fb12 --- /dev/null +++ b/inventory.py @@ -0,0 +1,178 @@ +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') +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') diff --git a/static/script.js b/static/script.js index 7bf25b0..b3cd321 100644 --- a/static/script.js +++ b/static/script.js @@ -3,24 +3,7 @@ var data_filtered = []; var current_selection = -1; var is_editing = false; -data = [ - { - id : 1, - name : "Arduino", - price : 25, - quantity : 4 - }, { - id : 2, - name : "Buck converter", - price : 30, - quantity : 6 - }, { - id : 3, - name : "Line driver", - price : 10, - quantity : 12 - } -] +data = [] function populate_table(data) { data.forEach(function(d) { @@ -61,10 +44,21 @@ function recount_confirm(id, previous_value) { $('#inventory-item-' + id + ' > #item-recount > div').text('Recount'); $('#inventory-item-' + id + ' > #item-recount > div').attr('onclick', 'recount(' + id + ')') $('#inventory-item-' + id + ' > #item-quantity').empty(); - // TODO: Perform ajax to set new quantity + // If you got an ok: if (quantity.length > 0) { + data = {}; + data['id'] = id; + data['count'] = quantity; $('#inventory-item-' + id + ' > #item-quantity').text(quantity); + $.post( "recount", data, function( data ) { + if(data=="ok"){ + //nothing on success + }else{ + alert("Something went wrong :("); + $('#inventory-item-' + id + ' > #item-quantity').text(previous_value); + } + }); // TODO: Also refresh the 'data' array } else { $('#inventory-item-' + id + ' > #item-quantity').text(previous_value); @@ -100,12 +94,22 @@ function restock_confirm(id) { $('#inventory-item-' + id + ' > #item-restock > div').removeClass('button-confirm'); $('#inventory-item-' + id + ' > #item-restock > div').text('Restock'); $('#inventory-item-' + id + ' > #item-restock > div').attr('onclick', 'restock(' + id + ')'); - // TODO: Perform ajax to send restock info + // If you got an ok: + data = {}; + data['id'] = id; + data['count'] = quantity; var previous_q = parseInt($('#inventory-item-' + id + ' > #item-quantity').text()); if (quantity.length > 0) { $('#inventory-item-' + id + ' > #item-quantity').text(previous_q + parseInt(quantity)); - // TODO: Also refresh the 'data' array + $.post( "restock", data, function( data ) { + if(data=="ok"){ + //nothing on success + }else{ + alert("Something went wrong :("); + $('#inventory-item-' + id + ' > #item-quantity').text(previous_q); + } + }) } else { $('#inventory-item-' + id + ' > #item-quantity').text(previous_q); } @@ -152,10 +156,12 @@ function default_keypress_handler(e) { } $( document ).ready(function(){ - // $.getJSON( "ajax/test.json", function( data ) { - populate_table(data); - data_filtered = data; - // }); + $.getJSON( "getdata", function( result ) { + populate_table(result); + data_filtered = result; + data=result; + }); + $('#filter-textbox').on('keyup', function() { data_filtered = []