01The challenge
A growing solar company sells systems, installs them and then maintains them for years. Each of those stages lived somewhere different. Complaints came in by phone, engineer visits were arranged by message, maintenance contracts sat in a spreadsheet, and every proposal was rebuilt by hand from a cost sheet, which meant prices and layouts drifted from one customer to the next.
02What I built
A single Django application with two parts: customer operations and quotations.
- Customer service portal. Customers can register a complaint as a guest or through an account, and track its status without calling the office. A verified customer sees only their own complaints and contract, with a notice when the contract is close to expiry.
- Service desk with approvals. Complaints and service activities move through a defined workflow that management approves.
- Field operations. An engineer scheduler that respects leave and public holidays, engineer profiles, and an operations view of who is where.
- Maintenance contracts. A contract register with renewal workflow, contract value and payments, plan management, and an email digest of renewals coming due.
- Quotation engine. Proposals are built from bill-of-quantities templates for each system size, with pricing, payment schedule and a project timeline, and print as a multi-page A4 proposal ready to send as a PDF.
- Controls where they matter. Sales engineers see only their own quotations. A quotation moves from draft through negotiation to pending approval, and only the designated approver can mark it final, after which it is locked against re-pricing.
03How it is run
A live system with real customers and real prices changes carefully:
- Every change to quotation logic is validated offline against the full set of real quotations from the latest backup before it reaches production, so a pricing rule never surprises a customer.
- Each deployment keeps a rollback copy on the server and is verified by file hash after upload, then checked live.
- Backups are scripted, and hosting credentials are stored encrypted on the administrator's workstation rather than in scripts.
04Outcome
05What I would tell another business
The single most valuable control in this system is also the simplest: nobody except the approver can finalise a price, and a final price cannot be edited. It removed a whole category of disagreement between sales and management.