Complete System Reference

Arwa Hub

Full User Guide — Product Lifecycle, Inventory & Operations

01
Master Data Setup
02
Color Codes
03
Product Creation
04
SKU & Barcode
05
Variations
06
AI Images & Copy
07
Approval Flows
08
Pricing
09
Lifecycle States
10
Inventory
11
Stock Transfer
12
Tasks & Roles
Arwa Hub • Directus-based Product Management System • 2025
01

Master Data Setup

Master data forms the foundation of every product. Before creating any product, these records must be configured in the system. Admins maintain these — they rarely change once set up.

🏷️

Product Type

  • PAB — Abaya
  • PSH — Shawl
  • PKH — Kurdha
  • SCF — Scarf
  • CLH — Clutches
  • KFN — Kaftan
🧵

Material Code

  • CTN — Cotton
  • CHF — Chiffon
  • SLK — Silk
  • SUL — Sula
  • HDS — Huda Shimmer
  • PSK — Paris Silk
  • + 30 more materials
✏️

Design Code

  • Unique design identifier
  • Has reference photo
  • Auto-fills design name
  • Status: Active / Retired / Draft
  • Only Active codes usable
💎

Value Addition

  • BW1 — Basic Work
  • TW1 — Thread Work
  • PR1 — Print
  • CW1 — Cut Work
  • RW1 — Ring Work
  • BWG1, BWS1, etc.

How to Add / Edit Master Data

💡

Navigate to Master Data in the left sidebar. You will see 4 sub-sections: Product Types, Material Codes, Design Codes, and Value Addition.

  1. 1

    Open the relevant master data collection

    Go to Master Data → select Product Type, Material Code, or Design Code.

  2. 2

    Click "+ Create Item"

    Fill in the required fields — the code (short identifier), name, and status.

  3. 3

    Set Status to "Active"

    Only Active records appear as options in Product forms. Draft = not ready, Retired = discontinued.

  4. 4

    Save the record

    It immediately becomes available for product creation.

ProductType Fields

nameShort code e.g. PSH, PABrequired
categoryABAYA, SHAWLS, KURDHArequired
requiresPrimaryMaterialIf true, material becomes mandatory on productbool
statusActive / Draft / Retiredrequired

DesignCode Fields

codeUnique design identifierrequired
design_nameAuto-filled from code prefixauto
photoReference image for this designoptional
descriptionRich text descriptionoptional
statusActive / Draft / Retiredrequired

Presets & Female Models (for AI Generation)

⚙️

Presets

Each Preset is a saved configuration for AI image generation. It stores a parameter set (JSON) defining how the AI model renders the image — lighting, background, style, angles. Admins create presets once; product owners select them when requesting AI generation.

  • Has a name and thumbnail preview
  • Contains JSON parameter_set for AI engine
  • Selectable from Product form
👩

Female Models

Female model references used in AI image generation. Each model has a name, thumbnail photo, and JSON file_data for the AI engine. Product owners select a model when requesting AI images — this determines the model appearance in generated photos.

  • Has female_name and thumbnail
  • Contains file_data JSON for AI engine
  • Selectable from Product form
02

Color Codes

Each material has its own color code table. Colors are linked to products via material-specific M2M junction tables. The system has over 40 material-specific color collections.

ℹ️

Color codes are organized by material type (e.g., SLK colors for Silk, CTN colors for Cotton). Each material collection has its own list of available color codes. You select colors per material — not from a single global list.

How Colors Are Organized

📋 Color Code Structure

Each color record contains:

  • code — Short identifier (e.g., BLK, RED, NVY)
  • name — Full color name (Black, Red, Navy)
  • hex / swatch — Visual reference (where available)
  • Organized per material type

🔗 Material Color Examples

  • SLK Silk colors → slk_colors
  • CTN Cotton colors → ctn_colors
  • CHF Chiffon colors → chf_colors
  • PSK Paris Silk → psk_colors
  • HDS Huda Shimmer → hds_colors
  • FRC French Crepe → frc_colors

⚡ How Colors Appear on Product

When you select a Primary Material on a product, the system shows only that material's color panel. You then select which colors this product comes in.

  • Select material first
  • Color panel appears
  • Select applicable colors
  • Variations auto-created

How to Add New Colors to a Material

  1. 1

    Navigate to Color Codes

    In the left sidebar, open Color Codes folder → find the specific material collection (e.g., "SLK Colors" for Silk).

  2. 2

    Create a new color record

    Click "+ Create Item". Enter the color code (e.g., "OLV" for Olive) and the full name ("Olive Green").

  3. 3

    Save — it's immediately selectable

    The new color now appears in the material's color panel on any product form that has that material selected.

How to Select Colors for a Product

STEP 1
Select Material
Pick primaryMaterial on product
STEP 2
Color Panel
Material-specific colors appear
STEP 3
Select Colors
Check all applicable colors
STEP 4
Save Product
Variations auto-generate
⚠️

The color panel is conditional: it only shows when you have selected a Primary Material. Different materials have different color sets — selecting "Cotton" shows cotton colors, "Silk" shows silk colors, etc.

03

Creating a Product

The Product is the master record. Fill in the mandatory fields first — the system auto-generates codes and creates variations automatically when you save.

Critical Fields — Fill These First

⚠️

These fields are mandatory and drive everything else — the SKU generation, variation creation, image slots, and AI generation all depend on these being set correctly from the start.

Field What It Is Why It Matters Status
productType Relation to ProductType (PAB, PSH, PKH…) Determines which image slots are shown, product category, and whether material is required required
designCode Relation to DesignCode master Part of SKU formula — determines the design segment of the product code required
primaryMaterial Relation to MaterialCode (if type requires it) Unlocks the correct color panel. Required when ProductType.requiresPrimaryMaterial = true conditional
valueAddition Embellishment code (BW1, TW1, PR1…) Last segment of SKU formula. Identifies the type of work on the garment optional
productOwnerUser The accountable user for this product All tasks and approvals route to this user. Cannot be left empty required
productCategory ABAYA, SHAWL, or KURDHA Used for channel publishing, POS export, and reporting important
sellingPrice Proposed price (decimal) Required for pricing approval workflow. Must be set before lifecycle advances important
preset AI generation preset configuration Controls how AI images look. Select the right style/background preset for AI
femaleModel Model reference for AI image The AI will use this model's appearance in generated images for AI

Step-by-Step: Create a New Product

  1. 1

    Navigate to PLM → Product

    Click "+ Create Item" in the top right corner of the Product list.

  2. 2

    Select Product Type first

    Pick from the dropdown (e.g., PAB for Abaya). This immediately changes which image upload slots appear below.

  3. 3

    Select Design Code

    Search for and select the design from master data. The design_name auto-fills based on the code.

  4. 4

    Select Primary Material (if required)

    If your ProductType requires a material, select it now. This also unlocks the color selection panel for that material.

  5. 5

    Select Value Addition code

    Choose the embellishment type from the dropdown (BW1, TW1, PR1, etc.).

  6. 6

    Select colors for the product

    The material-specific color panel is now visible. Check all colors this product comes in.

  7. 7

    Set Product Owner and Price

    Assign the product owner user and enter the proposed selling price.

  8. 8

    Select Preset and Female Model

    Choose the AI image preset style and the female model for AI generation.

  9. 9

    Upload product images (per product type)

    Upload the physical product images in the appropriate image slots (see Section 6 for details).

  10. 10

    Save — SKU and variations auto-generate

    On save: the SKU code is generated automatically, and one product variation is created for each selected color.

04

SKU Generation & Barcodes

SKU codes are auto-generated by the system using a formula. Each product has a Product Code (SKU), and each color variation has its own unique Variation SKU and EAN-13 barcode.

Product Code (SKU) Formula

Product Code = auto-generated on product creation

CATEGORY
e.g. PAB
-
DESIGN
Design Code
-
MATERIAL
Material Code
-
VALUE
Value Addition
-
RANDOM
Unique suffix
EXAMPLE PRODUCT CODE PAB-D001-CTN-BW1-X4K2
ℹ️

The Product Code is stored in skuCode on the Product record and also registered in the SKU registry collection (admin-only, for governance and duplicate prevention).

Variation SKU Formula

Each color variation gets its own unique Product SKU

COLOR
Color Code
-
DESIGN
Design Code
-
MATERIAL
Material Code
-
TYPE
Product Type
-
VALUE
Value Addition
EXAMPLE VARIATION SKU BLK-D001-CTN-PAB-BW1

Barcode Generation

📊

EAN-13 Barcode

Each product variation automatically gets an EAN-13 barcode generated from the variation SKU. The barcode image (SVG) is stored in the barcode_image field of the variation record.

  • Auto-generated on variation save
  • EAN-13 format (13-digit)
  • Stored as image in Directus Files
  • Can be bulk generated via flow
🖨️

Printing Barcodes

The system supports bulk barcode label printing via the Print Barcode PDF flow.

  • Select a product → run "Print Barcode PDF" flow
  • Generates PDF with 16 barcodes per page
  • Auto-prints on XP-DT426B label printer
  • Use "Bulk Generate Barcode Images" for batch
💡

The barcode_generated_at timestamp on the Product tracks when barcodes were last generated. If you add new color variations after creation, run the "Bulk Generate Barcode Images" flow on the new variations.

05

Product Variations

A Product Variation is one color-specific version of a product. Every color the product comes in gets its own variation record with a unique SKU and barcode.

How Variations Are Created

AUTO
Select Colors
On Product form, select colors
TRIGGER
Product Saved
Event flow triggers on create
AUTO
Variations Created
One per selected color
AUTO
SKU + Barcode
Auto-generated per variation
ℹ️

You can also manually add variations at any time using the "Create Color Variations" manual flow (flow #14). Select the product, run the flow, and it creates variations for all currently selected colors that don't already have variations.

Variation Fields

FieldDescriptionStatus
product_idParent product this variation belongs torequired
color_codeColor code prefix (BLK, RED, NVY)required
color_nameFull color name (Black, Red, Navy)required
productSkuAuto-generated: COLOR-DESIGN-MATERIAL-TYPE-VALUEauto
barcodeEAN-13 barcode number (auto-generated)auto
barcode_imageBarcode SVG image fileauto
imageColor-specific product image (manual upload)optional
ai_variation_imageAI-generated image for this specific color variationauto/AI
is_defaultMark as the default/hero variation for the productoptional
statusactive / archivedimportant

Adding Variation Images

  1. 1

    Open the product → scroll to Variations tab

    In the Product record, find the "Variations" section (list of all color variations).

  2. 2

    Click on a specific variation

    Open the variation record by clicking the row. You'll see the variation detail form.

  3. 3

    Upload to the "image" field

    This is the color-specific product photo for this variation (e.g., the product photographed in Black).

  4. 4

    Check ai_variation_image

    If AI variation generation was run, the AI image for this color appears here. Review and approve.

  5. 5

    Save the variation

    Changes save immediately. WooCommerce sync (if enabled) will pick up the new image.

🖼️

Image Types per Variation

  • image — Real product photo in this color
  • ai_variation_image — AI-generated model photo for this color
  • barcode_image — Auto-generated EAN-13 label
💡

Always upload the real color photo to image first. The AI variation image is generated automatically based on the parent product's preset and model selection.

06

Product Images by Product Type

The system uses conditional image slots — different image fields appear based on which Product Type you selected. Each type has 5 standard photo angles.

👗

PAB — Abaya (image6–10)

  • image6 — Front view
  • image7 — Back view
  • image8 — Side view
  • image9 — Close-up detail
  • image10 — Posed / lifestyle shot
🧣

PSH — Shawl (image11–15)

  • image11 — Front view
  • image12 — Back view
  • image13 — Flat view
  • image14 — Close-up detail
  • image15 — Posed / lifestyle
👘

PKH — Kurdha (image1–5)

  • image1 — Front view
  • image2 — Back view
  • image3 — Side view
  • image4 — Close-up detail
  • image5 — Posed / lifestyle
🌸

SCF — Scarf (image16–20)

  • image16 — Front view
  • image17 — Back view
  • image18 — Side view
  • image19 — Close-up detail
  • image20 — Lifestyle shot
👜

CLH — Clutches (image21–25)

  • image21 — Front view
  • image22 — Back view
  • image23 — Side view
  • image24 — Close-up detail
  • image25 — Lifestyle shot
🥻

KFN / AWS (image26–35)

  • Kaftan: image26–30
  • AWS: image31–35
  • Same 5-angle pattern
ℹ️

Image slots are conditionally shown — when you select ProductType = PAB, only the Abaya image slots (image6–10) are visible. The other slots are hidden to avoid confusion. Always ensure you select the Product Type before uploading images.

Special Image Fields

representativeImageFile

The primary display image for this product. Shown in listings, thumbnails, and as the hero image across all channels.

bestAiImageFile

The selected best AI-generated image. Set during the AI approval process. Gates the lifecycle transition to Publishing.

thumbnailFile

Small preview image for catalog lists. Auto-derived or manually set.

ai_image_1 to ai_image_5

Five AI-generated model images. Each has a corresponding approval checkbox. All must be individually approved before final AI approval is possible.

ai_images_final_approved

Final approval checkbox. Can only be checked after all individual AI images are approved. Triggers lifecycle transition to PricingReview.

Variation ai_variation_image

Each color variation gets its own AI image (the AI renders the product in that specific color). Stored on the variation record.

07

AI Image & Copy Generation

The system integrates with an AI engine (via n8n) to auto-generate professional product images and marketing copy. The workflow is tightly controlled with approvals at each step.

AI Generation Flow

1. REQUEST
Trigger AI Flow
Manual flow on product
2. SEND
n8n Imagent
Product data + preset + model
3. RECEIVE
AI Returns Images
5 images + copy via webhook
4. SAVE
Stored in ai_image_1–5
Product lifecycle → AIApproval
5. APPROVE
Review & Approve
Task created for approval

What the AI Generates

🖼️

AI Images (ai_image_1 to ai_image_5)

5 professional product images with a model, per the selected Preset and FemaleModel. The AI renders the uploaded product images on the model in the selected style/background.

  • Uses uploaded product photos as base
  • Applies the selected Preset style
  • Uses the selected FemaleModel
  • Returns 5 angle/composition variants
✍️

AI Copy

Marketing copy fields auto-filled by the AI engine:

  • productName — Human-readable name
  • shortTitle — Channel-friendly short title
  • descriptionLong — Full product description
  • careInstructions — Care guide text
  • keywords — SEO keywords

AI Feedback & Regeneration

🔄

If you're not satisfied with AI results

Use the feedback flow to regenerate:

  1. 1

    Enter feedback in aiFeedbackText

    Describe what should be different. Be specific (e.g., "More natural lighting, model should smile more").

  2. 2

    Run "AI Product Image Retry" flow

    This triggers a new AI generation request with your feedback included.

  3. 3

    New images overwrite ai_image_1–5

    Review the regenerated images and approve.

🤖

AI Variation Images

For each color variation, the AI can also generate a variation-specific image — the product rendered in that specific color on the model.

  • Triggered automatically or manually
  • Stored in ai_variation_image on variation
  • Used for WooCommerce variation thumbnails
  • Can be re-triggered per variation
⚠️

The aiRequested field is read-only and set by the Flow only. Do not edit it manually. It signals that an AI request is in progress.

08

Tasks — Automatic Creation & Management

Tasks are work items automatically created by the system at key lifecycle transition points. They route to the right user and track what needs to be done before the product can advance.

Task Types & When They're Created

FinalAIApproval

Auto-created

Created when AI images are delivered back to the system. Assigned to the Product Owner. Requires reviewing and approving all 5 AI images before the product can advance to Pricing Review.

PricingApproval

Auto-created

Created when the product reaches PricingReview lifecycle status. Routed to the Global Approver role. Must be completed before ReadyForChannelInit.

MasterDataValidation

Auto-created

Created if there are issues with master data linkage (invalid design code, missing material, etc.). Blocks progression until resolved.

IntegrationFailure / PublishingFailure

Auto-created

Created when a WooCommerce push, POS export, or other integration fails. Status = "Blocked". Requires investigation and re-trigger.

CopyApproval

Auto-created

Created after AI copy (product name, description, care instructions) is generated. Routes to the Product Owner or designated reviewer for content sign-off.

SkuReservationIssue

Auto-created

Created if there's a conflict or error in the SKU registry. Admin must resolve the conflict before the product code is finalized.

Task Fields & Status Flow

FieldDescription
titleShort description of what needs to be done
typeTask classification for routing
statusOpen → InProgress → Completed/Cancelled
priorityLow / Medium / High / Urgent
assignedToUserPrimary person responsible
ownerUserAccountability owner (usually Product Owner)
linkedProductThe product this task is about
dueDateSLA deadline for completion
resolutionNotesWhat was done to resolve it

Task Status Flow

Open
Task created by system. Assignee notified.
InProgress
Assignee has started working on it.
Waiting / Blocked
Waiting = pending input. Blocked = system failure.
Completed
Task resolved. Product lifecycle can advance.
ℹ️

The Product record shows openTasksCount and hasOpenPricingApprovalTask flags — these are maintained automatically by flows and give you a quick view of whether a product is blocked without opening each task.

09

Approval Flows — Who Approves What

Multiple approval gates exist in the product lifecycle. Each approval is handled by a specific role. The system enforces these — a product cannot advance without required approvals.

Complete Approval Chain

1. AI Images Approval — Individual
👤 Who: Product Owner
Review each of the 5 AI images (ai_image_1 to ai_image_5). Check the approval checkbox for each image individually. All 5 must be individually approved before the final approval becomes available.
2. AI Images Final Approval
👤 Who: Product Owner
Check the ai_images_final_approved checkbox. This is only enabled after all 5 individual approvals are checked. On save: timestamp and user are auto-recorded, lifecycle transitions to PricingReview.
3. AI Copy Approval
👤 Who: Product Owner / Content Reviewer
Review the auto-generated copy: productName, shortTitle, descriptionLong, careInstructions. Edit directly if needed. A CopyApproval task tracks this step.
4. Pricing Approval
👤 Who: Global Approver (special role)
The Global Approver reviews the proposed sellingPrice. They set pricingApproved = true. The system auto-records pricingApprovedBy (user) and pricingApprovedAt (timestamp). Only the Global Approver can do this — regular users cannot check this box.
5. Ready for Channel Init
🤖 Who: System (automatic)
After pricing is approved, lifecycle automatically transitions to ReadyForChannelInit. Inventory records are initialized across all locations. Product is ready for POS export and WooCommerce publishing.

Approval Quick Reference

Product Owner
assigned per product
  • Approve individual AI images (1–5)
  • Final AI images approval
  • Review AI copy
  • Receives all product tasks
Global Approver
special system role
  • Pricing approval only
  • Sets pricingApproved = true
  • Auto-stamped with user + timestamp
  • No other role can approve pricing
System / Flows
automated
  • Creates all approval tasks
  • Transitions lifecycle states
  • Records timestamps and users
  • Cannot be overridden manually
🚨

Important: The lifecycleStatus field is read-only for regular users. Only Flows can transition this status. Do not attempt to manually change lifecycle states — this will bypass required approval steps and corrupt the audit trail.

10

Pricing Approval

Pricing has a dedicated approval gate. A product must have an approved price before it can be published to any channel. The approval is strictly controlled — only the Global Approver role can approve prices.

How Pricing Approval Works

  1. 1

    Product Owner enters sellingPrice

    Enter the proposed price in the sellingPrice decimal field. Also set the currency.

  2. 2

    Lifecycle reaches PricingReview

    After AI approval, the system automatically transitions the product to PricingReview status.

  3. 3

    PricingApproval task is auto-created

    A task is automatically created and assigned to the Global Approver role. The hasOpenPricingApprovalTask flag becomes true on the product.

  4. 4

    Global Approver reviews and approves

    The approver opens the product, reviews the price, and checks pricingApproved = true. The system records who approved and when.

  5. 5

    Lifecycle advances to ReadyForChannelInit

    Once approved, the product automatically advances. The PricingApproval task is marked Completed, and the hasOpenPricingApprovalTask flag resets to false.

📋 Pricing Fields

sellingPriceProposed price (decimal)
currencyCurrency code (e.g., LKR, USD)
pricingApprovedApproval flag — Global Approver only
pricingApprovedByAuto-filled: user who approved (readonly)
pricingApprovedAtAuto-filled: timestamp of approval (readonly)
hasOpenPricingApprovalTaskSystem flag: true if pending
⚠️

If the price needs to change after approval, the pricingApproved flag must be reset (by an admin) and a new PricingApproval task will be created. This ensures all price changes are traceable.

11

Product Lifecycle

Every product moves through a defined lifecycle. The lifecycleStatus field controls what actions are possible. Transitions are fully automated by Flows — you trigger them by completing tasks and approvals.

DRAFT
Initial state. Data entry in progress
AI APPROVAL
AI images generated, awaiting review
PRICING REVIEW
Price set, awaiting Global Approver
READY FOR CHANNEL
Approved. Inventory initialized
PUBLISHING
Being pushed to channels
LIVE
Active on all channels
ARCHIVED
Discontinued / retired

What Triggers Each Transition

Draft → AIApproval
Trigger: AI images are generated and delivered by the AI engine. The system auto-transitions the product when ai_image fields are populated. A FinalAIApproval task is created.
AIApproval → PricingReview
Trigger: Product Owner checks ai_images_final_approved = true. All 5 individual approvals must be checked first. System auto-transitions and creates PricingApproval task.
PricingReview → ReadyForChannelInit
Trigger: Global Approver checks pricingApproved = true. System records who approved and when. Inventory items are auto-created at all active locations for each color variation.
ReadyForChannelInit → Publishing
Trigger: User initiates WooCommerce publish or POS export. The readyForChannelInitAt timestamp is set. Product is ready for batch export to POS.
Publishing → Live
Trigger: WooCommerce push completes successfully. wooPublishStatus = Pushed and wooProductId is populated. POS export also marks the product.
Any → Archived
Trigger: Manual action by admin. Product is discontinued. All inventory items should be zeroed out first.
💡

The readyForChannelInitAt timestamp is the key signal for batch POS export flows. Products with this timestamp set and lifecycle = ReadyForChannelInit are eligible for the POS Batch Export flow.

12

Inventory Management

Inventory is tracked per color variation per location. Each variation gets its own inventory record at each active location. Quantities are maintained via an append-only movements ledger.

Inventory Initialization (S1 → S2 Handoff)

ℹ️

When a product reaches ReadyForChannelInit, the system automatically creates inventory records for every color variation at every active location with qty_on_hand = 0. This "blank slate" ledger ensures complete coverage before any stock movements begin.

TRIGGER
ReadyForChannelInit
Lifecycle status change
SYSTEM
Find All Variations
All color variations for product
SYSTEM
Find All Locations
All active locations
CREATE
inventory_items
1 per variation × location

Inventory Item Fields

FieldDescription
product_variation_idLink to specific color SKU variation
product_idLink to parent product
location_idWhich store/branch/location
qty_on_handPhysical count — READ ONLY, calculated from movements
qty_reservedReserved for orders (set manually)
qty_availableCalculated: on_hand − reserved (read only)
low_stock_thresholdAlert when qty falls below this
notesOperational notes

⚠️ Critical Rule

qty_on_hand is READ ONLY — it is calculated automatically from the sum of all stock_movements for this item. Never try to edit it directly.

To change stock quantity, you must:

  • Create a stock_movement (Receipt, Transfer, Adjustment)
  • The Calculation Engine recalculates qty_on_hand automatically

How to Add Variations to Inventory Manually

💡

Use the "Add Variations to Inventory" manual flow to add product variations to inventory at all active locations. This is useful when new color variations are added to an already-live product.

  1. 1

    Navigate to product_variations collection

    Find the variations you want to add to inventory (filter by product if needed).

  2. 2

    Select the variations

    Check the checkbox next to each variation you want to initialize inventory for.

  3. 3

    Run the "Add Variations to Inventory" flow

    From the action menu (or flows button), select this flow. Confirm the action.

  4. 4

    Inventory records created at all locations

    One inventory_item record is created per variation per active location, all starting at qty_on_hand = 0.

Locations

🏪

Store

Physical retail stores. Have their own inventory. Customers buy directly here.

🏢

Branch

Branch offices. Can hold stock. Stock transfers happen to/from branches.

🏭

Head Office

Main warehouse/HQ. Primary receiving location. Stock is distributed from here.

Stock Movements — The Ledger

Movement Types

  • Receipt — Stock coming in (supplier, production)
  • Transfer — Movement between locations
  • Adjustment — Correction (damage, audit, theft)
  • Return — Customer return

How Movements Work

  • Quantity can be positive (in) or negative (out)
  • Every movement is append-only — never deleted
  • qty_on_hand = sum of all movements
  • Full audit trail preserved forever
⚠️

Inventory Exceptions (shortage, mismatch, damage) are tracked in the inventory_exceptions collection. When an adjustment is made due to damage or theft, an exception record is also created automatically for governance.

13

Stock Transfer

Stock Transfers move inventory from one location to another. The transfer process creates a full audit trail — from planning through execution. Each transfer has a unique auto-generated code.

Transfer Flow

1. CREATE
New Transfer
Select from/to locations
2. ADD LINES
Transfer Lines
Product + quantity per line
3. EXPORT
Generate Excel
Status → ReadyToExport
4. POS
Execute in POS
Physical stock moved
5. CONFIRM
Mark Executed
Stock movements created

Transfer Status Flow

Draft

Transfer created. Lines being added. Not yet submitted.

ReadyToExport

All lines confirmed. Ready to generate POS export file.

Exported

Excel export generated. Send to POS team for execution.

Executed

Stock physically moved. Movements created. Inventory updated.

How to Create a Stock Transfer

  1. 1

    Navigate to Inventory → Stock Transfers

    Click "+ Create Item" to start a new transfer.

  2. 2

    Select From Location and To Location

    Pick the source (from_location_id) and destination (to_location_id) from the dropdowns.

  3. 3

    Transfer Code auto-generates on save

    Format: TRF-{FROM}-{TO}-{YYYYMMDD-HHMMSS} (e.g., TRF-STORE-NUG-20250615-143022)

  4. 4

    Add transfer lines

    In the Lines section, add each product variation with the quantity to transfer.

  5. 5

    Use the "Stock Transfer Between Locations" flow

    Select the product variations and run this manual flow. It creates the transfer record, lines, and stock_movements automatically.

  6. 6

    Generate Export and Execute

    When ready, set status to ReadyToExport, generate the Excel file, then confirm execution after POS team completes it.

📋 Stock Transfer Fields

transfer_codeAuto-generated (readonly)
from_location_idSource location
to_location_idDestination location
statusDraft → ReadyToExport → Exported → Executed
requested_byUser who initiated
required_byOptional deadline
notesTransfer notes
export_file_idGenerated Excel file
transfer_dateWhen executed
linesLine items (product + qty)

Transfer Line Fields

transfer_idParent transfer
product_idWhich product
quantityNumber of units to transfer

Visual: Stock Transfer Between Locations

🏭
Head Office
HQ / OGF
50
qty_on_hand (before)
Transfer
20 units
🏪
Store
STORE
0
qty_on_hand (before)
WHAT HAPPENS IN THE SYSTEM stock_movement (HQ, quantity=-20, type=Transfer)
stock_movement (STORE, quantity=+20, type=Transfer)
HQ: qty_on_hand recalculates to 30
STORE: qty_on_hand recalculates to 20
14

Quick Reference — Flows & Automations

All available manual flows you can trigger from within the system, organized by category.

Product Flows

🤖 Request AI Generation

Manual — on Product

Triggers AI image + copy generation via n8n. Requires preset and female model to be selected on product first.

🔄 AI Product Image Retry

Manual — on Product

Re-triggers AI generation with feedback text. Fill aiFeedbackText before running.

🎨 Create Color Variations

Manual — on Product

Creates variations for all selected colors that don't already have variation records.

🖨️ Print Barcode PDF

Manual — on Product

Generates a PDF with all variation barcode images (16 per page). Auto-prints on label printer.

Inventory Flows

➕ Add Variations to Inventory

Manual — on Variations

Select product variations → creates inventory_items at all active locations (qty=0).

🔁 Stock Transfer Between Locations

Manual — on Variations

Select variations, choose from/to location. Creates transfer, lines, and movements automatically.

📊 Bulk Generate Barcode Images

Manual — on Variations

Select multiple variations and generate all barcode images in one batch operation.

📍 Create Location Bookmarks

Manual — on Inventory

Auto-creates personal bookmarks for inventory filtered by each active location.

Export Flows

📤 POS Batch Export

Select ReadyForChannelInit products → generates XLSX export → marks products as exported.

🌐 Publish to WooCommerce

Select product → pushes to WooCommerce via n8n → sets wooProductId on success.

🔄 Woo Bulk Update

Update existing WooCommerce products with latest data (price, stock, images).

Automated System Flows (Always Running)

FlowTriggerWhat It Does
Auto-Generate ProductCodeOn product createGenerates the skuCode in format CATEGORY-DESIGN-MATERIAL-VALUE-RANDOM
Auto-Create Color VariationsOn product createCreates variation records for every selected color
Generate Barcode ImageOn variation saveCreates EAN-13 barcode SVG and stores as barcode_image
Auto-Print BarcodeOn barcode_image saveAutomatically prints to XP-DT426B label printer
Product Variation Inventory InitOn ReadyForChannelInitCreates inventory_items at all locations for all variations
Auto-Transition to AIApprovalWhen AI images arriveChanges lifecycle Draft → AIApproval
Set AI Images Approval MetadataOn ai_images_final_approvedRecords approvedBy user and approvedAt timestamp
Update AI Feedback TimestampOn aiFeedbackText changeSets aiFeedbackLastUpdatedAt
Mark Overdue TasksSchedule (hourly)Marks tasks past overdue threshold as overdue
Generate Variation AI ImageOn variation create/updateTriggers AI to generate color-specific variation image
Inventory Woo Availability SyncOn inventory_item changeUpdates WooCommerce stock availability in real-time
💡

End-to-End Product Journey Summary:

Setup master data → Create product (fill key fields) → Select colors → Save (SKU + variations auto-generated) → Upload physical images → Select AI preset + model → Trigger AI generation → Review & approve 5 AI images → Final AI approval → System transitions to PricingReview → Global Approver approves price → System transitions to ReadyForChannelInit + inventory initialized → POS Batch Export or WooCommerce Publish → Product goes Live

ARWA HUB USER GUIDE — ALL RIGHTS RESERVED — 2025
15

Customer Management

The Customer module is a central repository of all customer information — contact details, measurements, order history, and bespoke order tracking, all tied to a unique phone-number-based ID.

Overview

👤

Customer Repository

A single source of truth for all customer data. Each customer record holds contact details, delivery addresses, body measurements, and social handles.

📏

Abaya Measurements

Store precise abaya measurements per customer, enabling accurate bespoke order fulfillment without needing to re-measure on every visit.

🧵

Bespoke Order Tracking

View the live status of all bespoke (custom-made) orders linked to a customer directly from their profile — no separate lookup needed.

Customer ID — Phone Number as Identifier

📱

The customer's phone number IS their Customer ID. This design ensures every customer has a naturally unique, universally known identifier that staff can look up instantly at the counter or during a call — no need to search by name or generate a separate ID.

Format

  • Stored in international format: +94XXXXXXXXX
  • Used as the primary key in the customers collection
  • Displayed as Customer ID everywhere in the system
  • Must be unique — duplicate numbers are rejected

Why Phone Number?

  • Staff already know the customer's number
  • Enables fast lookup at POS counter
  • WhatsApp notifications sent to same number
  • No risk of duplicate accounts for same person

Contact Details

📞 Communication Channels

FieldNotes
phone_numberPrimary ID — international format (+94...)
whatsapp_numberCan differ from phone — used for order updates
emailOptional — for receipts and promotions
instagram_handlee.g. @username — for social follow-ups

📍 Delivery Address

FieldNotes
address_line_1Street / house number
address_line_2Apartment / building (optional)
cityCity or town
districtDistrict for courier routing
postal_codeOptional

Abaya Measurements

Measurements are stored per customer and referenced automatically when creating bespoke orders. Staff update these whenever a new measurement is taken.

📐 Measurement Fields

FieldUnit
heightcm
shoulder_widthcm
chestcm
waistcm
hipcm
sleeve_lengthcm
abaya_lengthcm — full garment length
measurement_notesFree text — special fitting notes

📋 How Measurements Are Used

  • Auto-populated when creating a new bespoke order for the customer
  • Staff can override per-order if the customer requests changes
  • Updated in-place — always reflects the most recent measurement
  • Measurement history can be viewed via the audit log
  • Printed on the bespoke order production sheet for tailors
💡

Always re-measure and update if the customer hasn't visited in more than 6 months.

Bespoke Order Status

From the customer profile you can see a live list of all bespoke orders and their current status — no need to navigate to the orders module separately.

01
Order Placed
Measurements confirmed
02
In Production
Tailor working on it
03
QC Check
Quality review
04
Ready
Customer notified
05
Delivered
Order complete

🧾 Order Summary Fields (Visible on Profile)

  • Order reference number
  • Date placed
  • Items ordered (product + qty)
  • Current status
  • Expected delivery date
  • Total amount

🔔 Customer Notifications

  • WhatsApp message sent when status → Ready
  • WhatsApp message sent when status → Delivered
  • All notifications sent to whatsapp_number
  • Notification log visible on order record

⚠️ Statuses That Need Action

  • QC Failed — returned to tailor for rework
  • On Hold — customer requested pause
  • Cancelled — refund or credit note issued

Data Model — customers Collection

Core Fields

FieldTypeNotes
phone_numberstring (PK)Primary ID — e.g. +94771234567
full_namestringCustomer's full name
whatsapp_numberstringFor order notifications
emailstringOptional
instagram_handlestringe.g. @username
date_createdtimestampAuto
date_updatedtimestampAuto

Address & Measurement Fields

FieldType
address_line_1string
address_line_2string (nullable)
citystring
districtstring
postal_codestring (nullable)
heightdecimal (cm)
shoulder_widthdecimal (cm)
chestdecimal (cm)
waistdecimal (cm)
hipdecimal (cm)
sleeve_lengthdecimal (cm)
abaya_lengthdecimal (cm)
measurement_notestext (nullable)
bespoke_ordersO2M → bespoke_orders

Staff Guidelines

✅ Best Practices

  • Always search by phone number before creating a new customer — avoid duplicates
  • Record the WhatsApp number even if same as phone — it enables automated notifications
  • Update measurements every visit for bespoke customers
  • Add the Instagram handle if the customer mentioned they found us through Instagram
  • Always fill delivery address before confirming a delivery order

🚫 Common Mistakes

  • Creating a new record for an existing customer with a different number format (e.g. 0771234567 vs +94771234567)
  • Leaving WhatsApp number blank — customer won't receive status updates
  • Not updating measurements after a fitting session
  • Using the email field as the primary lookup — always use phone number
16

Work Order System

The Work Order system manages the full production lifecycle of garments — from design initiation through artisan assignment, quality control, and payment closure. It supports both readymade and bespoke orders.

Overview

📋

Work Order Types

Two types exist — Readymade (linked to a production ID from the production system) and Bespoke (linked to a bespoke order ID from the bespoke system).

👥

Key Roles

Each work order has a Fashion Designer (owner & creator) and a Worker (artisan or tailor). The Head of Design acts as approver before the order proceeds to production.

🔗

System Integrations

Work orders integrate with the Inventory System (goods issuance), Product Management (finishing queue), and Bespoke Order System (fit-on state).

Work Order Lifecycle — States

Every work order progresses through the following states in sequence. Bespoke orders have an additional intermediary state for sampling and fit-on.

01
Initiation
Details incomplete, designer may not be assigned
02
Pending Approval
Designer owns & submits to Head Designer
03
Approved
Ready to assign to worker
04
Assigned
Worker (artisan/tailor) assigned
05
Completed
Received & QC passed by designer
06
Payment Processing
Pending payment to worker
07
Closed
Payment order sent to finance
🧵

Bespoke only — Sampling: Bespoke work orders have an additional intermediary state between Assigned and Completed. In this state the designer obtains approvals from both the Head Designer and the customer before proceeding.

Approval Process

✅ Standard Approval Flow

  • Fashion Designer creates the work order and takes ownership
  • Designer fills all required details and changes status to Pending Approval
  • Head of Design reviews and approves → status moves to Approved
  • Designer assigns a worker (artisan or tailor) → status moves to Assigned
  • Designer changes status to Work Order Issued once handed to worker

🧵 Bespoke Sampling Approval

  • After assignment, bespoke orders enter Sampling state
  • Designer creates a sample garment
  • Head Designer must approve the sample before proceeding
  • Once both approvals are received, the order moves to Completed

Work Order Acceptance & QC

When the worker returns the completed garment, the fashion designer performs a quality check. Based on the outcome, the designer selects the next status.

🟡 Status → Intermediary

  • Garment needs further work (partially complete)
  • An Intermediary Return transaction is automatically created in the Inventory System
  • If it is a bespoke order, it enters the Fit-on state in the Bespoke Order System
  • Inventory materials are tracked back via the intermediary return

🟢 Status → Finishing

  • Garment passes QC and is ready for finishing/packaging
  • An entry is automatically created in the Product Management System queue, tagged with this work order ID
  • Once any product order is completed it enters the Product Management System queue
  • Payment Processing state is triggered next

Goods Issuance & Inventory Link

📦

Automatic Goods Issuance Task: When a fashion designer creates a work order, the Inventory System is automatically triggered and a pending goods issuance task is created, tagged to the respective designer. The inventory team sees this task in their queue and issues the required materials to the designer before work begins.

📤 Goods Issuance Process

  • Work order creation → triggers pending issuance task in Inventory System
  • Task is tagged to the designer who created the work order
  • Inventory team issues materials from stock room
  • Each issuance is linked back to the work order ID
  • Materials issued appear on the Artisan Handover Sheet

🔄 Intermediary Returns

  • If QC status = Intermediary, leftover or unused materials are returned
  • Return transaction type: Intermediary Return in Inventory System
  • Return is linked to the originating work order
  • Stock quantities are updated accordingly

Work Order Form — Fields (Artisan Handover Sheet)

Based on the Arwa Abaya/Shawls Artisan Handover Sheet. These are the fields recorded in every work order.

🧾 Header & Assignment Fields

FieldNotes
work_order_idAuto-generated unique ID
artisan_nameWorker assigned to this order
contact_numberArtisan's contact number
order_descriptionBrief description of work required
order_dateDate work order was created
delivery_dateExpected completion date
fashion_designerOwner of the work order (M2O → users)
work_order_typeReadymade | Bespoke
production_idLinked production ID (readymade only)
bespoke_idLinked bespoke order ID (bespoke only)
statusCurrent workflow state

🎨 Garment & Design Details

FieldNotes
garment_typeAbaya | Shawl | Clutch | Other
design_codeDesign reference code or number
reference_sketch_providedYes / No
design_placement_instructionsFree text — where to place embellishments
techniques_requiredEmbroidery techniques to be used
special_notesAny special instructions for artisan

🧵 Materials Issued to Artisan

Multiple material lines per work order. Each line contains:

Material TypeFields
FabricDescription (Color/Type), Quantity, Unit, Remarks
Needles / FramesDescription, Quantity, Unit, Remarks
Mirrors / SequinsDescription, Quantity, Unit, Remarks
Beads / StonesDescription, Quantity, Unit, Remarks
ThreadsDescription, Quantity, Unit, Remarks
Other (Specify)Custom material type + details

✅ Completion Section (Filled at Return)

FieldNotes
date_of_returnWhen artisan returned the work
work_quality_check_byDesigner who performed QC
observations_issuesFree text — QC notes and issues found
signature_checkerQC checker's signature
issued_by_nameDesigner/Coordinator who issued
issued_by_signatureIssuer signature
issued_by_dateDate of issuance
received_by_nameArtisan name at receipt
received_by_signatureArtisan signature
received_by_dateDate artisan received work order

Work Order Queue

📬

The Work Order Queue is a view of all active work orders grouped by status. Designers can see their own queue, and the Head Designer can see the full queue across all designers. Orders pending approval are highlighted for Head Designer action. The queue is also where goods issuance tasks appear for the inventory team.

👁️ Designer View

  • See all work orders owned by me
  • Filter by status (Pending / Assigned / Completed)
  • Quick-action to change status
  • View goods issuance status for each order

👁️ Head Designer View

  • See all work orders across all designers
  • Pending Approval orders highlighted for action
  • Approve or reject with comments
  • Monitor production pipeline at a glance

👁️ Inventory Team View

  • See pending goods issuance tasks tagged to designers
  • Process issuances and mark as fulfilled
  • Process intermediary returns when triggered
  • All tasks linked to work order IDs

Data Model — work_orders Collection

Core Fields

FieldTypeNotes
iduuid (PK)Auto-generated
work_order_typestringReadymade | Bespoke
statusstringWorkflow state (see lifecycle)
fashion_designer_iduuid (M2O)→ directus_users
artisan_iduuid (M2O)→ workers
garment_typestringAbaya | Shawl | Clutch | Other
design_codestringReference to design system
order_datedateCreation date
delivery_datedateExpected completion
production_iduuid (nullable)Readymade only
bespoke_iduuid (nullable)Bespoke only

Detail & Completion Fields

FieldType
reference_sketch_providedboolean
design_placement_instructionstext
techniques_requiredtext
special_notestext
materials_issuedO2M → work_order_materials
date_of_returndate (nullable)
qc_checked_byuuid → directus_users
observations_issuestext (nullable)
issued_byuuid → directus_users
issued_datedate
goods_issuance_iduuid → inventory issuance
date_createdtimestamp (auto)
date_updatedtimestamp (auto)

Staff Guidelines

✅ Best Practices

  • Always complete all garment and design fields before submitting for approval — incomplete orders will be rejected
  • Attach or reference the design sketch before issuing to artisan
  • Change status to Work Order Issued immediately after handing over to the artisan
  • Complete the QC section fully at the time of return — do not leave observations blank even if there are no issues
  • For bespoke orders, confirm the customer fit-on date before moving to the Sampling state

🚫 Common Mistakes

  • Forgetting to change status to Work Order Issued after physical handover — inventory tasks stay pending
  • Not linking the correct bespoke or production ID before approval
  • Skipping the QC section and moving directly to Payment Processing
  • Creating a work order without checking that materials are available in inventory first
  • Assigning a worker before the Head Designer has approved
17

Bespoke Order System

The Bespoke Order system manages custom-made garment orders from initial customer enquiry through design, production, fit-on, pricing, invoicing, and delivery. Each order is one item — if a customer orders five abayas, five separate orders are created.

Overview

🧵

One Order Per Item

Each bespoke order represents a single garment. If a customer orders multiple items, a separate order record is created for each — enabling individual tracking, production, and delivery per piece.

🔗

System Integrations

Bespoke orders link to the Customer System (contact details & measurements), the Work Order System (production queue), and the Costing System (price approval & invoice generation).

📋

Order Categories

Four garment types are supported: Abaya, Shawl, Kurta, and Clutch. Each type has its own specific design fields and form layout.

Customer Lookup at Order Creation

📱

Phone-number auto-fill: When creating a bespoke order, the user enters the customer's phone number in the Customer ID field. If the customer already exists in the Customer System, all their details — name, contact info, delivery address, and abaya measurements — are automatically populated into the order form. The designer can override or update any measurement directly on the order without affecting the master customer record unless they choose to save it back.

✅ Existing Customer

  • Enter phone number → all fields auto-populate
  • Measurements pulled from customer profile
  • Designer can adjust measurements for this specific order
  • Updated measurements can optionally be saved back to the customer profile

🆕 New Customer

  • Phone number not found → new customer record is created on save
  • All fields entered manually by designer
  • Customer record is saved to the Customer System automatically
  • Measurements saved to the new customer profile

Work Order Integration

🔄

Bespoke orders enter the Work Order queue automatically. When a bespoke order is confirmed, it is pushed into the Work Order System and appears in the work order queue. The work order is linked back to the bespoke order via the bespoke_id field. During production, the bespoke order enters the Fit-on state when the work order QC status is set to Intermediary.

Costing Workflow & Invoice Generation

💰 Costing Approval Flow

  • Designer proposes a final price for the bespoke order
  • Costing workflow is triggered for approval
  • Designer (or Head Designer) reviews and approves the final price
  • Once approved, the price is locked on the order
  • System records: Advance Paid, Balance Due, Payment Mode, Final Payment Date

🧾 Invoice Generation

  • Invoice is generated automatically once the price is approved
  • Invoice includes all order details, measurements, fabric & material summary
  • Payment terms are included on the invoice
  • Customer signature and designer/staff signature are recorded
  • Invoice is linked to the bespoke order record

Abaya Bespoke Order — Form Fields

Based on the Arwa Abaya Customer Order Detail Sheet. These fields are recorded for every Abaya bespoke order.

🧾 Order Header

FieldNotes
order_idAuto-generated unique order ID
order_descriptionBrief description of the order
customer_nameAuto-filled from Customer System
phone_numberCustomer ID — used for lookup
designer_nameAssigned fashion designer
order_dateDate order was placed
delivery_dateExpected delivery date
urgency_levelNormal | Urgent | Rush
delivery_shipping_addressAuto-filled or entered manually
pick_up_placeCollection point if not delivered

🎨 Design Details

FieldNotes
occasionWedding, casual, formal, etc.
design_styleStyle description or code
inspiration_moodMood board reference or notes
sleeve_designSleeve style details
neckline_typeNeckline style
abaya_lengthFull length specification
closure_typeButton, zip, hook, etc.
pocketsYes / No / Placement details
embellishmentBeadwork / Stones / Lace details
hijab_scarf_includedYes / No
fabric_typeFabric material type
color_refColor reference code or description
fabric_swatchAttached swatch image or file

📐 Measurements (Abaya)

Measurement AreaUnit
heightinches
shoulder_widthinches
chest_bustinches
waistinches
hipinches
arm_lengthinches
bicepinches
abaya_length_shoulder_to_floorinches
cuff_lengthinches

🧶 Fabric & Material Summary

ItemFields
Main FabricDescription, Quantity, Remarks
LiningDescription, Quantity, Remarks
EmbellishmentsDescription, Quantity, Remarks
Thread ColorDescription, Quantity, Remarks
OthersCustom item + Description

💳 Payment Fields

advance_paidDeposit amount collected upfront
balance_dueRemaining balance (auto-calculated)
payment_modeCash | Card | Transfer
final_payment_dateDate full payment is due

Shawl Bespoke Order — Additional Fields

Shawl orders share most fields with Abaya orders but replace body measurements with shawl-specific dimensions and have a different materials breakdown.

📐 Shawl Dimensions (replaces body measurements)

FieldNotes
lengthShawl length in inches
widthShawl width in inches

🧶 Shawl Materials Breakdown

Two separate material tables for shawls:

SectionFields
Materials — Embroidery / EmbellishmentsItem, Description, Quantity, Remarks
FabricItem, Description, Quantity, Remarks
artwork_embellishmentBeadwork / Stones / Lace placement details
placementWhere embellishments are placed on the shawl

Supported Order Categories

👘

Abaya

Full garment with complete body measurements, design details, sleeve/neckline/closure specs, and fabric summary.

🧣

Shawl

Length and width dimensions, embroidery/embellishment materials, separate fabric table, placement details.

👗

Kurta

Similar field structure to Abaya — garment-specific measurements and design details adapted for Kurta style.

👜

Clutch

Dimensions, material and embellishment details, design style, and finishing specifications for clutch bags.

Terms & Conditions (Recorded on Every Order)

📜 Standard Terms Applied to All Bespoke Orders

  • Final design changes are not accepted after confirmation
  • Advance payment is non-refundable
  • Delays due to unforeseen material issues will be communicated to the customer
  • Alterations after delivery may incur additional cost

Both the Customer Signature and Designer/Staff Signature with date are captured on the order form at confirmation.

Data Model — bespoke_orders Collection

Core & Header Fields

FieldTypeNotes
iduuid (PK)Auto-generated
order_categorystringAbaya | Shawl | Kurta | Clutch
customer_idstring (M2O)→ customers (phone_number)
designer_iduuid (M2O)→ directus_users
work_order_iduuid (M2O)→ work_orders
statusstringEnquiry → Confirmed → In Production → Fit-on → Ready → Delivered
urgency_levelstringNormal | Urgent | Rush
order_datedateDate placed
delivery_datedateExpected delivery
delivery_addresstextShipping address
pick_up_placestring (nullable)Collection point

Design, Payment & Signature Fields

FieldType
occasionstring
design_stylestring
inspiration_moodtext
fabric_typestring
color_refstring
fabric_swatchuuid → directus_files
measurementsjson — garment-specific fields
materialsO2M → bespoke_order_materials
advance_paiddecimal
balance_duedecimal (calculated)
payment_modestring
final_payment_datedate
final_pricedecimal — approved by costing flow
invoice_iduuid → invoices (nullable)
customer_signatureuuid → directus_files
designer_signatureuuid → directus_files
signed_datedate
date_createdtimestamp (auto)
date_updatedtimestamp (auto)

Bespoke Order Lifecycle

01
Enquiry
Customer details & requirements captured
02
Confirmed
Price agreed, advance paid, signed
03
In Production
Work order created & in queue
04
Fit-on
Sample approval by customer & head designer
05
Ready
QC passed, customer notified
06
Delivered
Collected or shipped, balance settled

Staff Guidelines

✅ Best Practices

  • Always look up the customer by phone number before creating a new order — existing measurements will auto-fill
  • Create one order per item — do not group multiple garments in one order record
  • Collect and record the advance payment before confirming the order
  • Ensure both customer and designer signatures are captured at order confirmation
  • Update measurements on the order form if the customer requests changes — do not alter master measurements unless the customer specifically wants them updated
  • Attach a fabric swatch image or file to every order where physical samples are provided

🚫 Common Mistakes

  • Creating a bespoke order without first confirming the price — orders must go through the costing approval before confirmation
  • Grouping multiple items in one order — this breaks individual production tracking
  • Skipping the fit-on stage for complex garments — fit-on is mandatory for Abayas
  • Not filling the delivery date — this is required for the work order queue prioritisation
  • Forgetting to generate the invoice after price approval — the customer should always receive a signed invoice
19

Design & Pattern System (DP)

The Design & Pattern System is a centralised repository of Arwa's fashion design assets — including embellishment pattern drawings, sewing patterns, and sewing drawings. It acts as a reference library linked directly to the Work Order System, enabling designers and artisans to reference exact design IDs and pattern IDs when creating and executing work orders.

System Objective

🎨

Design Asset Repository

A single source of truth for all fashion design assets. Every drawing, embellishment pattern, and sewing pattern created at Arwa is catalogued here with a unique design ID for reference across systems.

🔗

Work Order Integration

The DP System is linked to the Work Order System. When creating a work order, the designer or artisan selects a specific Design ID or Pattern ID from this system to specify exactly what is to be made.

📸

Photo & Drawing Pairing

Each asset entry pairs a technical drawing with its corresponding real-world photograph (where available), providing artisans with both the construction reference and the finished look.

Asset Types

💎

Embellishment Patterns

Technical drawings of embellishment designs (beadwork, stone placement, lace arrangements, embroidery layouts) paired with corresponding photographs of the finished embellishment. Used to instruct artisans on exact placement and technique.

✂️

Sewing Patterns

Flat sewing patterns with corresponding photographs where available. These are the construction templates used by tailors and seamstresses. Patterns are stored digitally and linked to the garment type and sizing.

📐

Sewing Drawings

Technical sewing drawings — flat lay sketches, construction views, and detail drawings that guide garment construction. These may or may not have accompanying photographs depending on whether the design has been produced.

Integration with Work Order System

🔄

Design IDs and Pattern IDs are referenced directly in work orders. When a work order is created for a bespoke or production garment, the designer selects the relevant design and/or pattern from the DP System. This ensures the artisan working on the order has a clear, unambiguous reference for what they are constructing — eliminating verbal or paper-based instruction handoffs.

📋 On Work Order Creation

  • Designer searches the DP System for the relevant design or pattern
  • Selected design_id or pattern_id is linked to the work order
  • Artisan can view the full drawing and photo from within the work order
  • Changes to the design after work order creation must be communicated separately — the linked asset is a reference, not a live document

🔍 Finding Designs & Patterns

  • Search by design name, garment type, embellishment type, or pattern code
  • Filter by asset type: Embellishment Pattern | Sewing Pattern | Sewing Drawing
  • Browse by collection or season
  • View drawing + photo side-by-side before selecting

Asset Record — Form Fields

📄 Embellishment Pattern Fields

FieldNotes
pattern_idAuto-generated unique pattern code
pattern_nameDescriptive name for the embellishment pattern
pattern_typeBeadwork | Stonework | Lace | Embroidery | Mixed
garment_typeAbaya | Shawl | Kurta | Clutch | Universal
placement_areaWhere the embellishment is placed on the garment
drawingTechnical drawing file (image or PDF)
photoCorresponding real-world photo (nullable)
notesConstruction notes or technique instructions
statusDraft | Active | Archived

✂️ Sewing Pattern & Drawing Fields

FieldNotes
design_idAuto-generated unique design code
design_nameDescriptive name for the sewing pattern or drawing
asset_typeSewing Pattern | Sewing Drawing
garment_typeAbaya | Shawl | Kurta | Clutch
size_rangeSize range this pattern covers (XS–XL, custom, etc.)
drawingTechnical sewing drawing or pattern file
photoCorresponding finished garment photo (nullable)
notesConstruction notes, seam allowances, technique guidance
statusDraft | Active | Archived

Data Model

🗄️ embellishment_patterns Collection

FieldTypeNotes
iduuid (PK)Auto-generated
pattern_idstring (unique)Human-readable code e.g. EP-001
pattern_namestringDisplay name
pattern_typestringEnum: Beadwork, Stonework, Lace, Embroidery, Mixed
garment_typestringTarget garment
placement_areatextWhere applied on the garment
drawinguuid → directus_filesTechnical drawing
photouuid → directus_files (nullable)Real-world photo
notestext (nullable)Construction notes
statusstringDraft | Active | Archived
date_createdtimestamp (auto)
date_updatedtimestamp (auto)

🗄️ sewing_designs Collection

FieldTypeNotes
iduuid (PK)Auto-generated
design_idstring (unique)Human-readable code e.g. SD-001
design_namestringDisplay name
asset_typestringSewing Pattern | Sewing Drawing
garment_typestringTarget garment
size_rangestring (nullable)Size range
drawinguuid → directus_filesSewing drawing or pattern file
photouuid → directus_files (nullable)Finished garment photo
notestext (nullable)Construction guidance
statusstringDraft | Active | Archived
date_createdtimestamp (auto)
date_updatedtimestamp (auto)

Staff Guidelines

✅ Best Practices

  • Always upload both the technical drawing and the photo when a finished reference is available — pairing them makes the asset far more useful for artisans
  • Use consistent naming conventions for pattern_id and design_id codes so assets are easy to search (e.g. EP-001 for embellishment patterns, SD-001 for sewing designs)
  • Add detailed placement notes for embellishment patterns — artisans should not need to guess where on the garment a pattern is applied
  • Archive old patterns and designs rather than deleting them — they may be referenced by historical work orders
  • Link the correct design/pattern ID to work orders at the time of creation, not after

🚫 Common Mistakes

  • Creating a work order without linking a design or pattern ID — artisans then rely on verbal instruction which leads to inconsistency
  • Uploading only a photo without a technical drawing — photos alone are insufficient for construction
  • Deleting patterns that are referenced by existing work orders — always archive, never delete active assets
  • Duplicate entries for the same design — check before adding a new record to avoid fragmentation of the library
20

Material Inventory System

The Material Inventory System tracks all raw materials and supplies used in production — fabrics, beads, sewing supplies, marketing materials, and stationery. It manages incoming stock via GRN (Goods Received Note), outgoing stock via issuance to work orders, and returns from production, giving a real-time view of available quantities and average unit prices across all storeroom locations.

Overview

📦

Transaction-Based Tracking

Every stock movement — incoming or outgoing — is recorded as a transaction. Available quantity is calculated from the running total of all GRNs, issuances, and returns, giving a complete audit trail.

🔗

Work Order Integration

All stock issuances and material returns are linked to a specific work order. This ties material consumption directly to production, enabling cost-per-order analysis and preventing untracked stock movement.

📍

Storeroom Location Tracking

Every incoming item is assigned a storeroom rack and position. This makes physical stock retrieval fast and accurate, and ensures the system reflects real shelf locations.

Transaction Types

📥 Incoming Inventory

TypeDescription
GRN (Goods Received Note)Standard incoming stock from a vendor purchase. Requires vendor, receipt date, invoice/receipt attachment, quantity, and unit rate per material.
Intermediary ReturnsMaterials returned from an intermediary work order stage (e.g., partially used fabric returned after a fit-on). Linked to the source work order.

📤 Outgoing Inventory

TypeDescription
Stock IssuanceMaterials issued from the storeroom to a work order. Must reference a specific work order ID. Quantity issued is deducted from available stock.
Material ReturnsUnused materials returned from a work order back to the storeroom. Linked to the originating work order. Quantity is added back to available stock.

Material Categories

Every material in the system is assigned a category code. The material code is derived from its category and a sequential number (e.g., FAB-001 for fabrics). The five supported categories are:

🧵

Fabric

All woven, knit, and non-woven textile materials used in garment construction.

💎

Beads

Beadwork, stones, crystals, and all embellishment materials used for decorative work.

📣

Marketing Material

Packaging, tags, tissue paper, branded bags, and any materials used in customer presentation.

🪡

Sewing Supplies

Thread, needles, zips, buttons, hooks, interfacing, and all sewing notions and hardware.

✏️

Stationery & Design

Tracing paper, pattern paper, markers, design tools, and stationery used in the design process.

GRN Process

📋

A GRN (Goods Received Note) is the primary record of incoming stock. Each GRN can include multiple materials in a single entry — you do not need to create a separate GRN per material. The GRN is linked to the vendor and includes a receipt date and an optional invoice/receipt attachment for financial records.

📝 GRN Header Fields

FieldNotes
grn_idAuto-generated GRN reference number
vendorSupplier name or vendor record
receipt_dateDate goods were physically received
invoice_receiptAttached invoice or receipt file (image/PDF)
notesOptional remarks about the delivery
received_byStaff member who received the goods

📦 GRN Line Item Fields (per material)

FieldNotes
material_codeSelected from material catalogue (category-based code)
material_nameAuto-filled from material catalogue on selection
categoryFabric | Beads | Marketing Material | Sewing Supplies | Stationery & Design
quantityQuantity received (in the material's unit of measure)
unit_ratePrice per unit for this delivery
total_priceAuto-calculated: quantity × unit_rate
storeroom_rackPhysical rack identifier in the storeroom
storeroom_positionPosition on the rack (shelf, bin, slot)

Stock Issuance & Returns

📤 Stock Issuance Fields

FieldNotes
issuance_idAuto-generated reference
work_order_idRequired — must link to an active work order
material_codeMaterial being issued
quantity_issuedQuantity taken from storeroom
issued_byStaff member issuing the material
issue_dateDate of issuance
notesOptional remarks

🔄 Material Return Fields

FieldNotes
return_idAuto-generated reference
work_order_idRequired — links return to the originating work order
return_typeIntermediary Return | Material Return
material_codeMaterial being returned
quantity_returnedQuantity returned to storeroom
storeroom_rackRack where returned material is placed
storeroom_positionPosition where returned material is placed
return_dateDate of return
notesCondition of returned material, if relevant

Inventory View & Search

🔍

The inventory view provides a real-time snapshot of all materials. It shows available quantity (GRN total minus issuances plus returns) and the average unit price (calculated across all GRN entries for the same material code). Staff can search and filter by material code, name, category, and location.

📊 Inventory View — Displayed Information

FieldHow Calculated
material_codeDirect field
material_nameDirect field
categoryDirect field
available_quantitySum of all GRN + returns − issuances
average_unit_priceWeighted average across all GRN entries
storeroom_rackMost recent location record
storeroom_positionMost recent position record
last_received_dateDate of most recent GRN for this material

🔎 Search & Filter Options

  • Search by material code or material name (partial match supported)
  • Filter by category: Fabric | Beads | Marketing Material | Sewing Supplies | Stationery & Design
  • Filter by storeroom rack to see all materials in a specific location
  • View materials with low or zero stock to identify reorder needs
  • Filter by vendor to see all materials sourced from a specific supplier

Data Model

🗄️ materials Collection (Catalogue)

FieldTypeNotes
iduuid (PK)Auto-generated
material_codestring (unique)e.g. FAB-001, BEA-012
material_namestringDescriptive name
categorystringFabric | Beads | Marketing Material | Sewing Supplies | Stationery & Design
unit_of_measurestringmetres, kg, pcs, rolls, etc.
descriptiontext (nullable)Additional details
statusstringActive | Inactive
date_createdtimestamp (auto)

🗄️ grns Collection

FieldTypeNotes
iduuid (PK)Auto-generated
grn_idstring (unique)Auto-generated reference e.g. GRN-001
vendorstringSupplier name
receipt_datedateDate goods received
invoice_receiptuuid → directus_files (nullable)Attached invoice scan
received_byuuid → directus_usersStaff who received
notestext (nullable)
line_itemsO2M → grn_itemsOne or more material lines
date_createdtimestamp (auto)

🗄️ grn_items Collection (GRN Line Items)

FieldTypeNotes
iduuid (PK)Auto-generated
grn_iduuid (M2O → grns)Parent GRN
material_iduuid (M2O → materials)Selected material
quantitydecimalQuantity received
unit_ratedecimalPrice per unit
total_pricedecimal (calculated)qty × unit_rate
storeroom_rackstringPhysical rack identifier
storeroom_positionstringShelf/bin/slot

🗄️ inventory_transactions Collection

FieldTypeNotes
iduuid (PK)Auto-generated
transaction_typestringGRN | Intermediary Return | Stock Issuance | Material Return
material_iduuid (M2O → materials)Material involved
work_order_iduuid (M2O → work_orders, nullable)Required for issuances and returns
quantitydecimalPositive = in, Negative = out
unit_ratedecimal (nullable)Applicable for GRN
storeroom_rackstring (nullable)For incoming / returns
storeroom_positionstring (nullable)For incoming / returns
transaction_datedateDate of transaction
created_byuuid → directus_usersStaff who recorded
notestext (nullable)
date_createdtimestamp (auto)

Staff Guidelines

✅ Best Practices

  • Always record the storeroom rack and position during GRN — this is what the team uses to physically locate materials later
  • Attach the vendor invoice or receipt scan to every GRN — this is required for financial reconciliation
  • When creating a GRN for multiple materials in one delivery, use the multi-line GRN form — do not create separate GRN records per material
  • Always link stock issuances and returns to the correct work order ID — unlinked transactions break cost tracking
  • Record material returns promptly — delay causes the available quantity in the system to show lower than actual
  • When returning materials, update the rack/position if they are stored in a different location than originally

🚫 Common Mistakes

  • Creating a GRN without attaching the invoice — this causes issues during financial audit
  • Issuing stock without linking to a work order — this creates untraceable stock movements
  • Entering the wrong quantity or unit rate during GRN — this distorts the average unit price calculation across all future transactions
  • Not recording material returns — available quantity in the system will be understated, causing unnecessary reorder triggers
  • Using a material code from the wrong category — always check the category before selecting a code
ARWA HUB USER GUIDE — ALL RIGHTS RESERVED — 2025