== Important == Organize server API by "page" Inventory Decrement immediately upon order placement (or even addtocart), not shipment In placeorder, check that all items are still in stock, because maybe customer added to his cart a few months ago, during which time the item was sold-out Don't present customers with out-of-stock items, or label them as out-of-stock On addtocart or updatequantity, check that quantity is in stock Never delete Set all items to 'deleted=false' Set any new items to 'deleted=false' In itemsbyfilter, only return items where 'deleted=false' In FrameAdmin, make 'delete' column into switch Split into frames and sunglasses 'Enter' in either login textbox triggers attemptlogin Search bar 'Clearance' tab Each item needs a 'clearance' property 'Place order' makes an invoice and sends email to user; maybe a "My Account" page with orders Implement routes, for back-button Progress bar for image upload Hash passwords (implement in already-existing 'hash' function) Elavon Requirements Return/Refund Policy Privacy Policy Delivery Methods and Timing described == Nice for the Future == Make multi-lingual. Multi-currency? Lens Chart Create item entries in DB Load all Lens entries, so UI is smooth (it doesn't have to download the new price every time a small change is made) Implement the entire menu hierarchy as per the spreadsheet Go through 'TODO's in code comments Get price info for lenses, equipment, and accessories; get brand/model info on accessories; get AR/transition options for blue bocker and glass == Notes == To renew certbot SSL certificate (prepend `--dry-run` before `certonly` to test): sudo certbot certonly --webroot -w /home/brian/piazza-website/public/ -d piazzaoptical.com