24 KiB
Pelagia Portal — Design Document
Internal purchase-order management system for a maritime company.
This document describes every feature, page, workflow, and user story to guide UI/UX design.
1. Purpose
Pelagia Portal digitises the full purchase-order lifecycle — from a crew member raising a requisition aboard a vessel, through manager approval and payment by accounts, to receipt confirmation on delivery. It replaces paper and email-based processes with a traceable, role-gated workflow.
2. User Roles
Seven roles exist. Each role represents a real job function in the company.
| Role | Who they are | Core capability |
|---|---|---|
| TECHNICAL | Ship technical crew | Create, submit, and track their own POs; confirm delivery |
| MANNING | Manning crew | Same as TECHNICAL |
| ACCOUNTS | Finance / accounts team | Process payments, manage vendor registry |
| MANAGER | Department manager | Review and approve POs, edit line items before approval, view analytics |
| SUPERUSER | Power user / ops lead | All PO actions across the board |
| AUDITOR | Internal auditor | Read-only view of all POs; export reports |
| ADMIN | System administrator | Manage users, vendors, vessels, accounts, products, and sites |
Role Access Matrix
| Feature area | TECH / MANNING | ACCOUNTS | MANAGER | SUPERUSER | AUDITOR | ADMIN |
|---|---|---|---|---|---|---|
| Create / edit own POs | ✓ | ✓ | ✓ | |||
| Approve / reject POs | ✓ | ✓ | ||||
| Process payments | ✓ | ✓ | ||||
| Confirm receipt | ✓ | ✓ | ||||
| View all POs | ✓ | ✓ | ✓ | ✓ | ✓ | |
| View analytics / export | ✓ | ✓ | ✓ | ✓ | ||
| Vendor registry | ✓ | ✓ | ✓ | |||
| Item catalogue | ✓ | ✓ | ||||
| Vessel management | ✓ | ✓ | ||||
| Site management | ✓ | ✓ | ||||
| User management | ✓ | |||||
| Account management | ✓ | ✓ |
3. Navigation Structure
The left sidebar adapts to the signed-in user's role.
Dashboard ← all users
─── Purchase Orders ──────────────────
New PO ← TECH, MANNING, MANAGER, SUPERUSER
My Orders ← TECH, MANNING, MANAGER, SUPERUSER
Approvals ← MANAGER, SUPERUSER
Import PO ← MANAGER, SUPERUSER, ADMIN
Payments ← ACCOUNTS
History / Export ← MANAGER, SUPERUSER, ACCOUNTS, AUDITOR, ADMIN
─── Inventory ───────────────────────
Vendors ← MANAGER, ACCOUNTS, ADMIN
Items ← MANAGER, ADMIN
Vessels ← MANAGER, ADMIN
Sites ← MANAGER, ADMIN
Cart ← TECH, MANNING, MANAGER, SUPERUSER
─── Administration ────────────────── (ADMIN only)
Users
Accounts
4. Authentication
Login Page /login
- Email + password form
- Validates credentials against bcrypt hash
- On success: redirects to
/dashboard(or pre-login destination) - No self-registration; accounts are created by an ADMIN
5. Page Catalogue
5.1 Dashboard /dashboard
Entry point after login. Content varies by role.
Submitter view (TECHNICAL / MANNING / SUPERUSER)
- Stat cards: Open orders count, Pending approval count, Completed orders
- Quick "New PO" call-to-action
- Link to full order list
Manager view
- Stat cards: Awaiting approval (clickable → approval queue), Approved this month, Total approved spend
- Recent approved POs table: PO number, title, vessel, amount, date
- Spend trend chart (monthly bar chart, last 6–12 months)
- Vessel spend breakdown chart (pie or bar)
Accounts view
- Stat cards: Ready for payment count, Total value awaiting payment
- Quick link to payment queue
Auditor / Admin view
- Total PO count with link to history
5.2 My Purchase Orders /my-orders
Personal PO list for submitters.
Open orders table (DRAFT, SUBMITTED, MGR_REVIEW, VENDOR_ID_PENDING, EDITS_REQUESTED)
- Columns: PO Number, Title, Vessel, Status badge, Amount, Last updated
- Manager note displayed inline if status = EDITS_REQUESTED
Past orders table (MGR_APPROVED through CLOSED / REJECTED)
- Same columns
Actions:
- "New PO" button (top right)
- Click any row → PO detail page
5.3 Approval Queue /approvals
All POs awaiting manager decision (status = MGR_REVIEW).
Filter bar:
- Search (PO number, submitter name, title)
- Vessel dropdown
- Date from picker
Table columns: PO Number, Title, Submitter, Vessel, Amount, Submitted date
Actions:
- "Review" link per row → approval detail page
- Pending count shown in heading
5.4 PO Detail /po/[id]
Full read view of a single PO. Accessible to: the submitter (own POs), ACCOUNTS, MANAGER, SUPERUSER, AUDITOR, ADMIN.
Header band
- PO number (monospace)
- Status badge (colour-coded)
- Export PDF button
Body sections
Summary panel
- Title, vessel, account, vendor (if assigned), project code, date required, currency, total amount
Line items table
- Columns: Item name, Description, Qty, Unit, Unit price, GST rate, Total (incl. GST)
- Read-only
Terms & Conditions
- Delivery, Dispatch, Inspection, Transit insurance, Payment terms, Others
Documents
- Uploaded files with download links
Audit trail
- Chronological list of every action on the PO
- Each row: actor name, action type, timestamp, optional note
Timestamps sidebar (or footer)
- Created, Submitted, Approved, Paid, Closed
Contextual action buttons (shown/hidden based on status and role)
| Condition | Button |
|---|---|
| Status = DRAFT or EDITS_REQUESTED + own submitter | Edit |
| Status = DRAFT + own submitter or MANAGER/SUPERUSER | Discard (delete draft) |
| Status = VENDOR_ID_PENDING + can provide vendor | Vendor selection form inline |
| Status = PAID_DELIVERED + own submitter or SUPERUSER | Confirm Receipt |
5.5 Approval Detail /approvals/[id]
Full PO view with approval action panel. MANAGER / SUPERUSER only.
Same content as PO detail, plus:
Manager action panel
- Approve button
- Approve with Note button (opens note textarea, then approves)
- Reject button (requires mandatory note)
- Request Edits button (requires mandatory note)
- Request Vendor ID button (sends back to submitter to supply vendor)
Manager line-item edit form
- Inline form allowing manager to adjust quantities, unit prices, GST rate, add/remove line items and change vessel, account, vendor before approving
5.6 New PO /po/new
Multi-section form to create a purchase order.
Section 1 — Header
- Title (required)
- Description / remarks
- Vessel (required, dropdown)
- Account / Cost Centre (required, dropdown)
- Vendor (optional, dropdown — can be added later)
- Date Required (date picker)
- Project Code
Section 2 — Line Items
- Dynamic table; rows can be added and removed
- Per-row fields: Name (searchable against item catalogue), Description, Qty, Unit, Size, Unit Price, GST Rate
- As-you-type name search shows matching products with per-vendor prices as hints
- Running totals shown below table: Taxable, GST, Grand Total
Section 3 — Terms & Conditions
- Delivery, Dispatch, Inspection, Transit Insurance, Payment Terms, Others (all text, optional)
Section 4 — Documents
- Drag-and-drop or browse file uploader
- Shows list of attached files
Footer actions
- Save as Draft
- Submit for Approval
5.7 Edit PO /po/[id]/edit
Identical form to New PO, pre-filled with existing data.
Available only when status = DRAFT or EDITS_REQUESTED, and the user is the submitter or SUPERUSER.
Footer actions:
- Save as Draft
- Update & Resubmit (only shown when status = EDITS_REQUESTED; transitions back to MGR_REVIEW)
5.8 Import PO /po/import
Upload an Excel file in Pelagia's standard PO template format.
Steps (wizard-style or single page):
- Drop / upload .xlsx file
- System parses line items, vendor, quotation details
- User selects Vessel and Account (not parsed from file)
- Preview of extracted line items in editable table
- Save as Draft
5.9 Confirm Receipt /po/[id]/receipt
Receipt confirmation form. Shown only when status = PAID_DELIVERED.
- PO number and title shown as context
- File upload for delivery receipt document
- Optional notes field
- Submit button → transitions PAID_DELIVERED → CLOSED
5.10 Payment Queue /payments
ACCOUNTS role only.
Card list of POs in MGR_APPROVED and SENT_FOR_PAYMENT statuses.
Per card
- PO number, title
- Vessel, Submitter, Vendor
- Approved date
- Amount (prominent)
- Status badge: "Ready for Payment" or "Processing — awaiting confirmation"
Per card actions
- MGR_APPROVED → "Send for Payment" button
- SENT_FOR_PAYMENT → "Mark as Paid" button
- View PO detail link
5.11 History & Export /history
All POs in all statuses. MANAGER, SUPERUSER, ACCOUNTS, AUDITOR, ADMIN.
Filter bar
- Date range (from / to)
- Vessel dropdown
- Status dropdown
Table columns: PO Number, Title, Vessel, Submitter, Status badge, Amount, Created date
Export buttons (apply current filters to export)
- Export PDF
- Export CSV
5.12 Vendor Registry /admin/vendors
Vendor list. MANAGER, ACCOUNTS, ADMIN.
Table columns: Vendor ID (or "Pending"), Name, Contact (name + email), Item count, Verified badge, Status badge
Actions
- Add Vendor button → modal form (GSTIN lookup, name, address, pincode auto-filled via GST portal captcha; manual contact fields)
- Edit / Delete per row
- Click vendor name → Vendor Detail page
5.13 Vendor Detail /admin/vendors/[id]
Header
- Vendor name, vendor ID, verified / active badges
- Edit button
Info card
- GSTIN, address, pincode, contact name, mobile, email
Items supplied table
- Product code, name, last quoted price, last updated
- Click product name → Item Detail page
Recent POs table
- PO number, status, amount, created date (last 10)
5.14 GSTIN Lookup (modal / inline within vendor form)
Two-step flow embedded in the Add / Edit Vendor form:
- User types a 15-character GSTIN and clicks "Look up"
- System loads GST portal captcha image from the microservice → displays inline
- User types the 6-digit captcha answer
- User clicks "Verify" → microservice submits to GST portal → returns taxpayer data
- Form auto-fills: name, address, pincode (lat/lng geocoded silently from pincode)
Error states: wrong captcha (shows error, resets), session expired (auto-reset), GST portal unavailable.
5.15 Item Catalogue /admin/products
MANAGER, ADMIN.
Table columns: Name, Code, Description, Vendor count, Last price, Last vendor, Updated date, Status badge
Footer note: "Items are added automatically when a PO is marked as paid."
Actions (ADMIN only)
- Add Product → modal form (code, name, description)
- Toggle Active / Inactive per row
- Delete per row
- Click name → Item Detail page
5.16 Item Detail /admin/products/[id]
Header
- Name, code, status badge, description
- Add to Cart button
- Toggle Active button (ADMIN only)
Stat cards
- Vendor count, Lowest price, Highest price, Sites with stock
Price comparison bar chart
- One bar per vendor, Y-axis = unit price
Site distance filter
- Dropdown: "Sort by distance from site" — re-sorts vendor table by proximity
- Uses geocoded pincode of vendor vs site lat/lng for distance
Vendor pricing table
- Columns: Vendor (link to vendor detail), Verified badge, Unit price, Distance (if site selected), Last updated, Add to Cart
- Closest vendor gets a ★ marker when a site is selected
Stock by site
- Chip list: site name + quantity on hand (link to site detail)
5.17 Vessel Management /admin/vessels
MANAGER, ADMIN.
Table columns: Name, IMO Number, Status badge
Actions
- Add / Edit / Delete per row (all modal)
5.18 Account / Cost Centre Management /admin/accounts
MANAGER, ADMIN.
Table columns: Code, Name, Description, Status badge
Actions
- Add / Edit / Delete per row (all modal)
5.19 Sites /admin/sites
MANAGER, ADMIN (ADMIN-only for add/edit/delete).
Ports, depots, and offices that hold inventory.
Table columns: Name, Code, Address, Vessels, Items tracked, Location (lat/lon from pincode), Status badge
Actions
- Add Site → modal form (name, code, address, pincode for auto-geocoding)
- Edit / Delete per row
- Click name → Site Detail page
5.20 Site Detail /admin/sites/[id]
Header
- Name, code, address, geocoded location
- Edit button (ADMIN only)
Stat cards
- Vessels at site, Items tracked, Total inventory value (if calculable)
Inventory bar chart
- X-axis = product name, Y-axis = quantity on hand
Consumption line chart
- Last 30 days of daily consumption, one line per product
Inventory table
- Product name, quantity on hand, last updated; link to item detail
Log consumption form
- Fields: Product (dropdown), Date (date picker), Quantity, Note
- Submits immediately; chart and table refresh
Assigned vessels
- Chip list linking to vessel detail
Recent POs for this site
- Last 8 POs with status, vendor, amount
5.21 User Management /admin/users
ADMIN only.
Table columns: Employee ID, Name, Email, Role badge, Status badge, Created date
Actions
- Add User → modal form (employee ID, name, email, role, initial password)
- Edit → modal form (same fields, password optional)
- Delete per row
5.22 Cart /inventory/cart
Persistent cart collecting items selected from product detail pages. Stored in localStorage.
Cart view
- Item list: product name, description, vendor (if selected), unit price, quantity (editable inline)
- Summary: subtotal, GST, grand total
- Site selector (to indicate delivery site)
Actions
- Remove item
- Clear cart
- Create PO → opens New PO form pre-filled with cart line items and selected site/vendor
6. PO Lifecycle State Machine
┌──────────────────────────┐
▼ │
[DRAFT] ──submit──► [SUBMITTED] ──auto──► [MGR_REVIEW]
│ │ │ │
approve ◄───────┘ │ │ └──── reject ──► [REJECTED]
│ │ │
│ request_edits─┘ └── request_vendor_id ──► [VENDOR_ID_PENDING]
│ │
│ ◄──── provide_vendor_id ──────────────────────┘
│
[MGR_APPROVED]
│
process_payment
│
[SENT_FOR_PAYMENT]
│
mark_paid
│
[PAID_DELIVERED]
│
confirm_receipt
│
[CLOSED]
States that allow re-entry into the flow:
- EDITS_REQUESTED → submitter edits PO → re-submits → MGR_REVIEW
- VENDOR_ID_PENDING → submitter selects vendor → MGR_REVIEW
Terminal states: REJECTED, CLOSED
7. Workflows
7.1 Submit a Purchase Order (TECHNICAL / MANNING)
- Click New PO in sidebar
- Select vessel and account
- Add line items (type name to search item catalogue; previous vendor prices appear as hints)
- Optionally attach documents and fill in T&C fields
- Click Submit for Approval
- Manager receives email notification
- Status shows as "Under Review" on My Orders page
- If manager requests edits: submitter sees EDITS_REQUESTED status with manager note; edits form; resubmits
- If manager requests vendor ID: submitter selects a vendor and submits; returns to manager queue
- On approval: submitter notified by email; accounts team can see PO in payment queue
7.2 Approve a Purchase Order (MANAGER)
- Click Approvals in sidebar; see count of pending POs
- Click Review on a PO
- Read full detail: line items, vendor, documents, submitter notes
- Optionally: click Edit to adjust line items, change vendor, vessel, or account
- Choose action:
- Approve → immediately moves to accounts payment queue
- Approve with Note → same, with a note visible to submitter
- Request Edits → write note explaining required changes; PO returned to submitter
- Request Vendor ID → PO returned to submitter to select vendor; then returns to manager queue
- Reject → write reason; PO is closed permanently
7.3 Process a Payment (ACCOUNTS)
- Click Payments in sidebar
- See cards for all MGR_APPROVED POs
- Click Send for Payment → initiates payment; notifies submitter and manager
- When payment is confirmed by bank/finance: click Mark as Paid → notifies all parties
- Submitter can now upload delivery receipt
7.4 Confirm Receipt (TECHNICAL / MANNING)
- Goods are delivered on site / to vessel
- Navigate to PO detail page (status = PAID_DELIVERED)
- Click Confirm Receipt
- Upload delivery receipt document and optionally add notes
- Submit → PO is CLOSED; accounts and manager notified
7.5 Look Up a Vendor by GSTIN (MANAGER / ADMIN)
- Open Add/Edit Vendor modal
- Type the 15-digit GSTIN
- Click Look up → captcha image loads from GST portal (via microservice)
- Type the 6-digit captcha shown in the image
- Click Verify → form auto-fills with legal name, trade name, registered address, pincode
- Review and save; location is geocoded silently from pincode for distance calculations
7.6 Source Items by Proximity (MANAGER)
- Navigate to Items → click an item name
- See all vendors that supply the item with their last quoted price
- Select a site from the "Sort by distance from" dropdown
- Table re-sorts: vendors nearest to the site appear first; distance shown per row; closest vendor marked ★
- Click Add to Cart on the desired vendor row → item added to cart
7.7 Create a PO from the Cart (MANAGER / TECHNICAL)
- Browse Item catalogue and add items to cart (Add to Cart button per vendor row)
- Click Cart in sidebar
- Review cart: adjust quantities inline; remove items; select delivery site
- Click Create PO → opens New PO form pre-filled with all cart items and vendor
- Fill in title, vessel, account; submit normally
7.8 Track Inventory at a Site (MANAGER / ADMIN)
- Navigate to Sites → click a site
- View bar chart of current stock (quantity per product)
- View consumption line chart (last 30 days)
- Use Log Consumption form to record daily drawdown: select product, pick date, enter quantity
7.9 Auto-sync Catalogue on Payment Confirmation (ACCOUNTS → SYSTEM)
When accounts clicks Mark as Paid:
- System checks each PO line item that has a product link
- For unlinked items: attempts fuzzy-match on name; creates new product record if no match
- Upserts
ProductVendorPrice— if this vendor/product combination is new or the price changed, updates the catalogue - Sets
Product.lastPriceandProduct.lastVendorId - Future POs using that product name will see this vendor's latest price as a hint
7.10 Import a PO from Excel (MANAGER)
- Navigate to Import PO
- Upload an Excel file in Pelagia's standard template format
- System extracts: line items (name, description, qty, unit, price, GST), vendor details, quotation number/date
- User selects vessel and account from dropdowns
- Review and optionally edit extracted line items
- Save as Draft → PO created; submitter can then edit and submit
7.11 Export PO History (AUDITOR / MANAGER)
- Navigate to History
- Apply filters: date range, vessel, status
- Click Export PDF or Export CSV
- File downloaded with all matching POs; up to 200 results per export
8. Data Entities
Purchase Order
Fields: PO number (auto-generated), title, status, total amount, currency, date required, project code, manager note, payment reference, quotation number/date, requisition number/date, place of delivery, all T&C text fields, timestamps.
PO Line Item
Fields: name, description, quantity, unit, size, unit price, GST rate (default 18%), total price (computed), sort order, optional product link.
Vendor
Fields: name, vendor ID (optional, unique), address, pincode, GSTIN, contact name/mobile/email, latitude/longitude (geocoded silently from pincode), verified flag, active flag.
Product (Item)
Fields: code (auto-generated or manual), name, description, last price, last vendor, active flag. Prices tracked per vendor via ProductVendorPrice (one record per product–vendor pair).
Vessel
Fields: name, IMO number (optional), active flag, assigned site (optional).
Site
Fields: name, code, address, pincode, latitude/longitude, active flag.
Account (Cost Centre)
Fields: code, name, description, active flag.
User
Fields: employee ID, email, name, role, active flag, password hash.
Inventory & Consumption
ItemInventory: quantity of a product at a site (one row per product–site pair)ItemConsumption: daily draw-down record (one row per product–site–date)
9. Key UI Patterns
Status Badges
Each PO status has a distinct colour:
- DRAFT — neutral grey
- SUBMITTED / MGR_REVIEW — blue (in-progress)
- VENDOR_ID_PENDING — orange/warning
- EDITS_REQUESTED — yellow/warning
- MGR_APPROVED — teal/success-adjacent
- SENT_FOR_PAYMENT — purple
- PAID_DELIVERED — blue-green
- CLOSED — green/success
- REJECTED — red/danger
Confirmation before Destructive Actions
Delete buttons use a two-step inline confirm: "Delete [name]? Confirm / Cancel". No modal dialog — the confirm state replaces the button in-place.
Inline Editing in Tables
Manager line-item editing in the approval flow happens in an inline form on the same page, not in a modal, so the manager can reference the rest of the PO while editing.
GST Calculation (always visible in PO forms)
Below the line-items table, a live summary shows:
- Taxable amount (sum of qty × unit price)
- GST amount (sum of qty × unit price × GST rate)
- Grand Total (taxable + GST)
Product Autocomplete
In the PO line-item name field, typing triggers a fuzzy search of the item catalogue. Dropdown shows:
- Product name and code
- Price hints per vendor: "Vendor A: ₹1,200 · Vendor B: ₹1,050"
Cart Persistence
Cart is stored in browser localStorage under a fixed key. It survives navigation but is local to the device and user. A cart-updated custom event allows components to react to changes in real time.
Notifications / Emails
Every PO status transition triggers an email to relevant parties:
- Submit → manager
- Approve → submitter + accounts
- Reject → submitter
- Request Edits → submitter
- Request Vendor ID → submitter
- Payment sent → submitter + manager
- Mark paid → submitter + manager
- Receipt confirmed → manager + accounts
10. Non-Goals (Out of Scope)
- Mobile app (web-only, desktop-first)
- Public-facing pages (entirely internal)
- Self-registration / OAuth login
- Vendor portal (vendors do not log in)
- Automated bank/payment-gateway integration (payment is marked manually)