Skip to content

Stock

/stock. Needs module.stock.

Consumables: cables, adapters, bags, chargers, cases. The things a school desk sells across the counter all day.

Each product has a name, a description, a price and a stock count, and can have a photo or an icon.

Keep the catalogue small. A list of two hundred items goes stale within a term, and the things that sell are usually under a dozen.

A picture is what lets a student at the kiosk tell the USB-C adapter from the Lightning one without reading. Select a product’s thumbnail in the list, or use Image or icon when adding one, and either:

  • Upload or drop a photo. WebP, PNG or JPEG. The browser shrinks it to 320 pixels before it is sent, so a phone photo is fine as it is.
  • Choose an icon and a colour, from a fixed set of everyday items such as a charger, headphones, a cable or a bag.

Remove image takes it off again. A product with neither shows a plain placeholder. Out-of-stock products show their thumbnail greyed out.

The picture appears wherever the product does: on the desk, on the student portal and the kiosk when choosing what to buy, and against purchases in the parent portal. Photos are stored with the product in Plugboard’s own database rather than in object storage.

The portal’s photo address is public in the same way the portal catalogue already is: anybody who can reach your portal can see the products it offers and their pictures. Do not use a photo you would not put on the kiosk screen.

Changing or removing a picture is recorded in the audit log as a change to that product.

Pick the product, pick the person, confirm. The stock count decrements automatically.

The purchase appears on the person’s page and in the parent portal, and a receipt is emailed to the student’s parents.

Purchase history lists the 100 most recent sales. Each buyer links to their person page.

Students can buy items themselves at the kiosk:

  1. Pick the product and quantity.
  2. Verify it is them by tapping a card or entering a password.
  3. Confirm.

A confirmation is emailed to the student’s parents. That message cannot be switched off, because a parent is owed a receipt for money taken.

The verification step exists for the same reason. Charge a family without proving who is standing at the counter and you will eventually be arguing about it.

Counts decrement on sale. They do not increment on their own, so restocking is a manual edit.

That is not an omission. A school’s actual restocking process is a box arriving from a supplier and somebody putting it on a shelf, and pretending otherwise means a count that is confidently wrong.

Practical advice: check counts when you reorder, not on a schedule. The count matters at the moment you are deciding what to buy, and at no other time.

From 0.21.0, Import CSV (needs stock.manage) loads a stock list from a spreadsheet: name, stock, price and description, where only the name is required and the price is in dollars. A product already here, matched by name ignoring case, is corrected from the file; any other name is added.

The stock column is the count on the shelf now, not an amount to add, so an end-of-term count can be pasted straight in. Review import shows every row’s outcome first, and the import applies exactly that review. If a sale lands between the review and the import, that product’s row is reported rather than overwriting the sale. A name that two products share, or that the file repeats, is refused for that row. Download rows to fix returns skipped rows with an Import problem column. Products are shared by the whole school, so there is no campus to choose. Every import is recorded in the audit log.

Prices are what you charge, and they feed the receipt and the parent portal.

Stock sales are separate from damage charges, which are what a family is asked to pay for a repair. Different processes, different permissions, different conversations.

Permission Allows
stock.view See products, their pictures and purchase history
stock.manage Maintain the catalogue, including pictures, and sell items