Case Study · France · 2024

Djiminy
Enterprise Platform

Device lifecycle and inventory management system for enterprise operations. Bulk + serialized stock, RBAC, boarding workflows, and complete audit trails.

Full
Stack — Figma to Prod
RBAC
Role-Based Access
Stock Architectures
100%
Audit Coverage
Bubble.ioEnterprise SaaSLifecycle ManagementRBACSerialized InventoryBoarding WorkflowsAudit TrailsFigma Design
Project Overview

What Djiminy solves

Djiminy is an enterprise device and inventory lifecycle management system built for a French organization managing hardware assets across multiple departments. Before the platform, asset tracking lived in disconnected spreadsheets — no lifecycle visibility, no audit history, no structured workflows for assigning or reclaiming devices.

Designed from Figma mockups to production delivery, covering two inventory paradigms (bulk and serialized), multi-level user hierarchies, and automated boarding workflows that handle the full device lifecycle from intake to retirement.

📦

Dual-Architecture Inventory

Bulk items tracked by quantity with threshold alerts. Serialized devices tracked individually by unique ID through every lifecycle state and user assignment.

🔄

Device Lifecycle Engine

Every device moves through defined states: Intake → Active → In-Use → Maintenance → Retired. State transitions trigger automated workflows and audit events.

👥

Boarding Workflows

Onboarding provisions devices to new users automatically. Offboarding triggers reassignment, return, or retirement flows. No manual steps required.

🔐

Role-Based Access Control

Multi-level hierarchy: Super Admin, Department Admin, Manager, and User. Each role scoped to precise data and action permissions — enforced at query level.

📋

Operational Audit Trails

Every state change, assignment, and admin action logged immutably. Full audit history accessible to admins with time-stamped, actor-tagged records.

🛡

Warranty Management

Per-device warranty tracking with expiry monitoring, alert thresholds, and maintenance scheduling tied to warranty status. Pre-computed nightly.

Inventory Architecture

Bulk vs. serialized stock

Enterprise inventory requires two fundamentally different tracking paradigms. Djiminy uses separate type architectures — bulk and serialized — with a shared query interface that abstracts the difference from the frontend.

Bulk Inventory

Quantity-Based Tracking

For consumables and non-unique items: cables, accessories, standard peripherals. Tracked by stock level with threshold alerts and reorder triggers.

  • Stock level stored as aggregate quantity field
  • In/out transactions update stock atomically via backend workflow
  • Low-stock threshold triggers automated admin alert
  • No individual item identity — category + location + quantity
  • Bulk assignment distributes from pool without individual tracking
Serialized Inventory

Unit-Level Tracking

For unique, high-value devices: laptops, phones, tablets. Each item has a unique serial record with its own lifecycle state and assignment history.

  • Each device = one record with serial number as unique key
  • Lifecycle state field: Intake / Active / In-Use / Maintenance / Retired
  • Full assignment history: who held it, when, returned when
  • Warranty fields: purchase date, end date, provider, coverage type
  • Every state transition immutably logged in audit table
Lifecycle System

Device lifecycle engine

Every serialized device moves through a defined set of states. Transitions are controlled — not all state changes are valid from all starting states — and every transition triggers a backend workflow that logs the change, updates related records, and notifies relevant parties.

Device State Machine
INTAKE

Device enters the system. Serial number recorded, specs entered, warranty captured. Verified and ready for provisioning.

Assign to UserMove to StorageLog to Audit
ACTIVE

Device available and unassigned — in inventory, ready for provisioning. Dashboard shows available count and device list.

Provision to UserSend to MaintenanceRetire
IN-USE

Assigned to a specific user. Assignment record created with start date. Manager and admin see assignment on user profile.

Reclaim DeviceTransfer to UserFlag for Maintenance
MAINTENANCE

Flagged for repair or service. Maintenance record opened with description, return date, and responsible party. Removed from available pool.

Return to ActiveLog ResolutionRetire
RETIRED

Device end-of-life. Removed from active inventory. Historical record preserved for audit. Reason, date, and authorizing admin logged permanently.

Final Audit LogArchived — Read Only
Access Control

Role-based permissions

Djiminy operates across organizational levels with distinct permission scopes per role. Access control is enforced at the data query level — not just the UI — meaning lower-permission roles cannot read records outside their scope regardless of URL manipulation.

Role
View All
Assign
Admin
Audit
Config
Super Admin
Dept. Admin
Manager
User

✓ Full access  ·  ◑ Scoped to own department  ·  — No access

Boarding Workflows

Onboarding & offboarding

Boarding flows are the most operationally critical workflows in a device management system. Djiminy's are fully automated backend chains — zero manual steps required from operators.

Onboarding Flow

New User Device Provisioning

  • Admin initiates onboarding for new user record
  • System checks available device pool by type and department
  • Admin selects device(s) from filtered available list
  • Assignment record created: device ↔ user with start date
  • Device state updated: Active → In-Use (atomic write)
  • User profile updated with assigned devices list
  • Audit event logged: assigned_by, device_id, user_id, timestamp
  • Email notification sent to user with device details
Offboarding Flow

User Exit Device Reclamation

  • Admin triggers offboarding for departing user
  • System fetches all active assignments for that user
  • Admin selects disposition per device: Return / Transfer / Retire
  • Return: Assignment closed, device → Active state
  • Transfer: New assignment created for receiving user
  • Retire: Device → Retired with reason and authorization logged
  • User account deactivated after all devices resolved
  • Audit trail: all transitions logged with offboarding reference ID
Engineering Challenges

The hard problems

01

Unified Query Interface Across Two Stock Types

Bulk and serialized inventory live in different data types. But the admin needs to search across both simultaneously. Built a stock_query abstraction layer: backend workflow running parallel constrained searches on both types and merging results into a unified display list with a type flag distinguishing rendering logic.

02

Atomic State Transitions

Device state changes must be atomic — if the audit log write fails, the state change shouldn't persist. All transitions are single backend workflow steps where the state update and audit write happen in the same operation. Rollback logic handles API errors, keeping state and audit in sync at all times.

03

RBAC at the Data Layer

Every query includes a :department = current_user.department constraint for scoped roles — records outside the user's scope are never returned, regardless of URL or state manipulation. Super Admin queries omit the constraint entirely.

04

Offboarding Race Condition

If two admins initiate offboarding for the same user simultaneously, the same devices could be processed twice. Implemented an offboarding_in_progress lock field — set to true at workflow start and released on completion. A guard check at step 1 aborts the second flow if the lock is held.

05

Warranty Expiry Monitoring at Scale

A scheduled nightly backend workflow scans all active serialized devices, compares warranty end dates against today, and writes a warranty_status field (Valid / Expiring Soon / Expired). Dashboard reads this pre-computed status — zero runtime warranty calculation per page load.

06

Immutable Audit Log Design

Audit table uses a locked boolean set to true on record creation. Backend guard rejects any modification to locked records. No role — including Super Admin — can modify an audit entry through the UI or API.

Architecture

System architecture

Data Model
Inventory Data Architecture
View Image

Inventory Data Architecture

Separate types for bulk and serialized. Shared assignment and audit tables. RBAC via query-level constraints.

Lifecycle Flow
🔄
State Transition Map
View Image

State Transition Map

Valid transitions defined per state. Backend guard prevents invalid jumps. Every transition triggers audit write atomically.

Boarding System
On/Offboarding Workflow
View Image

On/Offboarding Workflow

Lock-protected boarding chains. All device dispositions handled server-side. User account state synchronized automatically.

Admin Dashboard
Operator View
View Image

Operator View

Pre-filtered by role. Inventory summary reads from aggregated fields. Warranty status pre-computed nightly.

Audit System
📋
Immutable Audit Logs
View Image

Immutable Audit Logs

Locked records on creation. Searchable by actor, device, action, date range. Full operational accountability.

Figma → Prod
Design-to-Production
View Image

Design-to-Production

Full Figma system — components, states, admin screens — signed off before build. Consistent, fast delivery.

Outcomes

Results & impact

100%
Lifecycle Coverage
Every serialized device tracked from intake to retirement with no gaps
Zero
Orphaned Assignments
Lock-protected boarding eliminates unresolved device-user relationships
Full
Audit Immutability
Every state change, assignment, and admin action permanently logged
4+
Permission Levels
RBAC enforced at data-query level — not just UI visibility

Operational shift: Device tracking moved from disconnected spreadsheets to a single live system with full lifecycle visibility. Boarding workflows that previously required emails and manual tracking now complete automatically with a single admin action.

Design philosophy: This project was designed in Figma before a single workflow was built. Full design system — components, states, admin screens — signed off before development began. More consistent product, faster build.

Back to
All Engineering Case Studies
View All Work