Nine of the fourteen jobs in the next two weeks need 18mm oak veneered MDF. You have four sheets. The supplier takes six working days, eight if you order after Thursday lunchtime. Nobody worked this out until the Tuesday someone went to cut the first panel.
That is the common pattern. Materials get ordered when a job becomes urgent, which is the most expensive moment to order them. You pay for next day delivery, or you lose two days and ring the customer.
The system runs every night. It takes the jobs in the schedule for the next two or three weeks, reads their materials lists, and adds up what is needed by material and by date. It takes stock from wherever you keep it, a sheet, a stock app, a count typed in on Friday. It takes lead times from a supplier list you fill in once. Then it does the subtraction.
Where need is bigger than stock and the lead time is close to running out, it drafts a purchase order. Supplier, lines, quantities, your account number, delivery address. It sits in your drafts folder with a short note saying order by Thursday for job 2041. You read it, change it if you want, send it.
It also flags the ones it cannot fix. If a job due next Wednesday needs something with a ten day lead time, no purchase order helps. You get told on Monday, with the job number, so you can ring the customer early and move the date or the material.
A bakery version of this looks different on the surface and identical underneath. Flour and butter instead of ply and ironmongery. Orders for the weekend, deliveries on Thursday, the wholesaler's cut-off at 15:00. Same subtraction.
This is the kind of thing we build. It runs in your own accounts, with your supplier list and your stock figures. What did your last next day delivery charge come to?