== 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
