export async function createInvoice(order) {
const items = order.lines.map(toLineItem);
const total = items.reduce((sum, i) => sum + i.amount, 0);
await db.invoices.insert({ ...order, items, total });
return notify(order.customer, "invoice.created");
}
router.post("/api/payments/mpesa", async (req, res) => {
const receipt = await mpesa.confirm(req.body);
await Payment.record(receipt);
res.json({ ok: true, ref: receipt.TransID });
});
const schedule = cron("0 8 * * 1-6", () => {
reports.sendDaily({ to: "ops@client.co.ke" });
});
export const useInventory = (branch) => {
const [stock, setStock] = useState([]);
useEffect(() => { api.stock(branch).then(setStock); }, [branch]);
return stock;
};
def sync_attendance(device, since):
for log in device.pull_logs(since=since):
Attendance.upsert(log.user_id, log.timestamp)
device.ack()
return device.last_sync
class Camera(models.Model):
site = models.ForeignKey(Site, on_delete=CASCADE)
ip = models.GenericIPAddressField()
online = models.BooleanField(default=True)
def heartbeat(self):
self.online = ping(self.ip, timeout=2)
self.save(update_fields=["online"])
@app.route("/api/tickets", methods=["POST"])
def create_ticket():
ticket = Ticket.from_request(request.json)
queue.enqueue(assign_technician, ticket.id)
return jsonify(ticket.to_dict()), 201
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
SELECT c.name, SUM(p.amount) AS paid
FROM customers c
JOIN payments p ON p.customer_id = c.id
WHERE p.paid_at >= date_trunc('month', now())
GROUP BY c.name
ORDER BY paid DESC;
services:
api:
image: modotech/pos-api:2.4.0
ports: ["8000:8000"]
env_file: .env.production
db:
image: postgres:16
volumes: ["pgdata:/var/lib/postgresql/data"]
CREATE INDEX idx_attendance_user_day
ON attendance (user_id, date(timestamp));
#!/usr/bin/env bash
set -euo pipefail
npm ci && npm run build
rsync -az dist/ deploy@server:/var/www/app/