01 / Work

Work

Public products, private enterprise Odoo work, and earlier modules. See architecture for how the stacks connect. Press ⌘K to jump anywhere.

Public products

Apps Store listings, live sites, and public GitHub repos.

  • 01

    Odoo 18 HR module on the Apps Store — transfer, IT hardware & clearance

    Employee transfer, IT hardware, and clearance requests with multi-step approvals, checklist sign-off, PDF reports, and demo data. Packaged for Odoo 18 / LGPL so teams can install without a custom build.

    Outcome Listed on the Odoo Apps Store with installable package and GitHub source.

    Odoo 18 Apps StoreApprovals + PDFsPython / PostgreSQL

    OdooPythonPostgreSQL

  • 02

    Next.js HR portal — role actions, status timelines & reporting

    Employee and manager UI for the same HR flows: dynamic forms, status timeline, checklist progress, and a reporting dashboard.

    Outcome Web UI for the HR workflows instead of only backend forms.

    Next.js 15Role-based UXAnalytics dashboard

    Next.jsAPIs

  • 03

    Lann Pya — Odoo content backend + Next.js Myanmar guides site

    Platform for Myanmar youth in the UAE: official guides, news, and community publishing. Odoo for content, auth, and REST; Next.js front end in Myanmar language.

    Outcome Live public site with editorial workflow and searchable guides.

    Odoo + Next.jsLive productREST APIs

    OdooPythonNext.jsAPIsPostgreSQL

  • 04

    Shiftline — shift-handover landing page and ops desk UI

    Landing page, demo login, and an ops desk for shift handover notes with blockers, follow-ups, priority flags, and acknowledgements.

    Outcome Marketing site plus a small app shell for handover notes.

    Next.jsOps UXProduct UI

    Next.js

Enterprise · private

Production Odoo at work — finance batches, payroll, APIs, HR workflows. Source stays private.

  • 05

    Batch petty-cash & expense ops — multi-approver sheets with project/city rules

    Case studyPrivate · enterprise

    Batch petty-cash flows, holder approval, project/city rules, and tighter expense-sheet behavior for day-to-day finance operations on Odoo.

    Outcome Ops submit and review cash in batches with utilization checks and project/city review — see case study.

    Batch processingOdoo ORMFinance ops

    OdooPythonPostgreSQL

  • 06

    Labor payroll & costing — batch payslips with project cost allocation

    Case studyPrivate · enterprise

    Payslip runs with labor payroll logic, cost attribution, reporting rules, and batch processing on top of Odoo payroll.

    Outcome Finance and HR can allocate labor cost and close payslip runs in Odoo — see case study.

    Batch payslipsCost allocationPostgreSQL

    OdooPythonPostgreSQL

  • 07

    Central REST hub for mobile clients — auth, projects, HR & requests

    Private · enterprise

    REST layer for mobile and hub apps: auth, projects, HR, requests, and related domains with consistent JSON responses.

    Outcome One API layer for apps that need ERP data, instead of many one-off endpoints.

    REST / JSONAuth layerPython / Odoo

    OdooPythonAPIs

  • 08

    HR request & clearance platform — transfers, IT hardware, exit flows

    Private · enterprise

    Request platform for employee transfers, IT hardware, clearance forms, and related HR ops — approvals, status tracking, and structured records.

    Outcome Staff requests and clearance run in Odoo instead of email and paper.

    WorkflowsApprovalsRecord rules

    OdooPythonPostgreSQL

Earlier delivery

Earlier client Odoo modules for fleet and hotel ops.

  • 09

    Early Odoo modules for fleet & hotel ops — models, views, PostgreSQL

    Earlier client Odoo work: workshop fleet tracking and hotel/workshop customizations (Python models, XML views, PostgreSQL).

    Outcome Client ERP customizations that started my Odoo work.

    Odoo modulesXML viewsClient delivery

    OdooPythonPostgreSQL

ORM · query density

Standard loop vs batch-mapped Odoo

From expense / sheet work: do not search or browse inside a for loop. Prefetch with mapped(), then resolve in memory. Toggle to compare.

Many queriesPer-row browseHigh DB load
sheets = env['hr.expense.sheet'].search([
    ('state', '=', 'approve'),
])
# N+1: one search / browse per sheet
for sheet in sheets:
    employee = env['hr.employee'].browse(sheet.employee_id.id)
    projects = sheet.expense_line_ids.mapped('project_id')
    # more per-row work…

Illustrative Odoo ORM pattern (anonymized). Same idea shows up in batch petty-cash and sheet review paths: fewer round-trips, clearer hot paths.