FMCG, Dairy, Bakery & Packaged Beverages
Executive Takeaways & Field Telemetry
- Direct Store Delivery (DSD): Sales reps issue GST-compliant tax invoices on-the-spot using Bluetooth 2-inch thermal printers.
- Live Van Inventory Balancing: Van stock functions as a mobile Odoo warehouse location, tracking morning loading, retail sales, and evening returns.
- Instant Cash & UPI Collection: Dynamic UPI QR codes generated on mobile screen; cash collected is locked to driver shift deposit ledgers.
- Elimination of Driver Shrinkage: Reconciles evening physical stock against cash collected down to the last rupee before shift sign-off.
1. The Leakage Epidemic in Direct Store Delivery (DSD) Operations
Distributors of milk, ice cream, packaged snacks, and bakery items in urban Gujarat operate daily van sales routes. Every morning at 05:00 AM, vans are loaded with inventory. Sales drivers visit 40 to 60 small retail kirana stores, taking orders, unloading goods, and collecting cash.
In manual operations, drivers issue hand-written duplicate receipt slips. At the end of the day, the cashier spends hours trying to balance messy paper slips against cash sacks and leftover stock. Drivers claim goods were damaged or that shopkeepers promised to pay next week. Inventory shrinkage and cash leakage routinely drain 2% to 4% of gross distribution revenue.
2. Mobile Van Accounting Architecture
The Odoo Van Sales architecture treats each delivery vehicle as a dedicated mobile warehouse location (WH/Van-04):
- Morning Gate Check: Driver confirms morning stock load via mobile barcode scan; an internal transfer moves stock from Central Store to Van Location.
- Route Execution: At each retail stop, driver selects customer, picks items, prints tax invoice on portable thermal printer, and scans payment.
- Evening Settlement: Driver returns leftover crates. Odoo reconciles:
Starting Stock - Sold Stock - Returned Stock = 0andTotal Invoice Value - Cash/UPI Deposited = 0.
3. Production Odoo 19 Python ORM Van Settlement Blueprint
Below is the Odoo model enforcing end-of-day van stock and cash reconciliation:
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class VanSalesShiftSettlement(models.Model):
_name = 'van.sales.shift.settlement'
_description = 'End-of-Day Van Sales Cash & Stock Reconciliation'
driver_id = fields.Many2one('res.users', string="Route Sales Driver", required=True)
van_location_id = fields.Many2one('stock.location', string="Mobile Van Warehouse", required=True)
shift_date = fields.Date(string="Shift Date", default=fields.Date.today)
total_invoiced_amount = fields.Monetary(string="Total Sales Value", currency_field='currency_id')
total_cash_collected = fields.Monetary(string="Physical Cash Deposited", currency_field='currency_id')
total_upi_collected = fields.Monetary(string="Digital UPI Collections", currency_field='currency_id')
cash_variance = fields.Monetary(string="Cash Surplus / Deficit", compute="_compute_cash_variance", store=True)
currency_id = fields.Many2one('res.currency', default=lambda self: self.env.company.currency_id)
settlement_state = fields.Selection([
('draft', 'In Progress'),
('balanced', 'Reconciled & Cleared'),
('discrepancy', 'Discrepancy Flagged')
], default='draft')
@api.depends('total_invoiced_amount', 'total_cash_collected', 'total_upi_collected')
def _compute_cash_variance(self):
for rec in self:
total_deposited = (rec.total_cash_collected or 0.0) + (rec.total_upi_collected or 0.0)
rec.cash_variance = total_deposited - (rec.total_invoiced_amount or 0.0)
if abs(rec.cash_variance) < 1.0:
rec.settlement_state = 'balanced'
else:
rec.settlement_state = 'discrepancy'
4. Bluetooth Thermal Receipt Printing
The Flutter mobile application communicates directly with rugged ESC/POS Bluetooth thermal printers, generating clean tax invoices featuring statutory GSTIN, HSN codes, and UPI transaction reference codes.
5. Implementation & Bottom-Line ROI
Digitizing route distribution eliminates inventory theft, closes cash settlement within 15 minutes of vehicle return, and delivers total transparency to FMCG distributors.
Architect Your Enterprise Mobile Solution
Consult with Lead Architect Jay Shah on building custom Flutter mobile ERP apps with offline synchronization. On-site engineering reviews in Ahmedabad and throughout Gujarat.