Sales Extensions
Custom sales order enhancements for window treatment business operations.
Module Overview
| Module |
Technical Name |
Version |
Description |
| Product Dimensions |
bi_product_dimension |
15.0.1.0.0 |
Core dimension-based pricing (Width x Height) |
| Product Configurator |
jdx_product_configurator |
15.0.4.0.0 |
Blinds, Shutters, Outdoor configuration wizards |
| Sale Order Photos |
jdx_sale_order_photos |
15.0.1.0.0 |
S3 photo gallery on sale orders |
| Copy Sale/Purchase Lines |
bi_copy_sale_purchase_line |
15.0.1.0.0 |
Duplicate order lines quickly |
| Customer Payment Method |
customer_payment_method |
15.0.1.0.0 |
Payment selection and auto-invoicing |
Product Configurator (jdx_product_configurator)
The core module for window treatment sales, providing dynamic configuration wizards for three product categories.
Product Categories
| Category |
Wizard |
Vendor Type |
Key Features |
| Blinds/Shades |
Blinds Config Wizard |
blinds |
Fabric, color, motorization |
| Shutters |
Shutter Config Wizard |
shutter |
Panel layout, louver size, frame type |
| Outdoor Screens |
Outdoor Config Wizard |
outdoor |
Wind rating, motor, track system |
Implementation Status
| Version |
Feature |
Status |
| V3 |
Blinds/Shutters/Outdoor Wizards |
✅ Complete |
| V3 |
Batch Entry & SO Line Creation |
✅ Complete |
| V3 |
Vendor-specific PO Reports |
✅ Complete |
| V4 Phase 1 |
Window Shapes (Arch, Rake, Fan) |
✅ Complete |
| V4 Phase 2 |
Enhanced Cutouts (Half-circle, Rectangular) |
✅ Complete |
| V4 Phase 3 |
Multi-page PO Reports |
⚠️ Partial (cutout diagrams pending) |
| V4 Phase 4 |
AI Draft Generation (OpenAI, Claude, Gemini) |
✅ Complete |
System Architecture
┌─────────────────────────────────────────────────────────────────────────┐
│ SALE ORDER │
│ (Source of Truth) │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Blinds Wizard │ │ Shutter Wizard │ │ Outdoor Wizard │ │
│ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │ Common │ │ │ │ Common │ │ │ │ Common │ │ │
│ │ │ Settings │ │ │ │ Settings │ │ │ │ Settings │ │ │
│ │ ├─────────────┤ │ │ ├─────────────┤ │ │ ├─────────────┤ │ │
│ │ │ Window 1 │ │ │ │ Window 1 │ │ │ │ Unit 1 │ │ │
│ │ │ Window 2 │ │ │ │ Window 2 │ │ │ │ Unit 2 │ │ │
│ │ │ Window 3 │ │ │ │ ... │ │ │ │ ... │ │ │
│ │ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │
│ └────────────────────┼────────────────────┘ │
│ ▼ │
│ SALE ORDER LINES │
└─────────────────────────────────────────────────────────────────────────┘
│
SO Confirmed ───┼─── Auto-Generate POs
│
┌──────────────────────────┼──────────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ PO: Blinds │ │ PO: Shutter │ │ PO: Outdoor │
│ Vendor │ │ Vendor │ │ Vendor │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ • Fabric codes │ │ • Panel layout │ │ • Drop specs │
│ • Color codes │ │ • Frame type │ │ • Motor specs │
│ • Motor specs │ │ • Louver size │ │ • Wind rating │
│ • Dimensions mm │ │ • Hinge diagram │ │ • Track type │
└─────────────────┘ └─────────────────┘ └─────────────────┘
Blinds/Shades Configuration
Settings that apply to all windows in a batch:
| Field |
Type |
Required |
Description |
product_id |
Many2one |
Yes |
Product (Zebra LF, Zebra BO, Roller, etc.) |
fabric_id |
Many2one |
Yes |
Fabric selection |
color_id |
Many2one |
Yes |
Supply color |
head_rail_color |
Selection |
No |
White / Black / Custom |
valance_type |
Selection |
No |
Open / Standard / Compact 25 |
high_top |
Selection |
No |
High top option (+pricing) |
fabric_on_head |
Boolean |
No |
Fabric wrap on head rail (+$20) |
fabric_on_bottom |
Boolean |
No |
Fabric wrap on bottom (+$20) |
Per-Window Fields (Wizard Lines)
Unique settings per window:
| Field |
Type |
Required |
Description |
room_name |
Char |
Yes |
Room/Location name |
width |
Integer |
Yes |
Width in mm |
height |
Integer |
Yes |
Height in mm |
mount_type |
Selection |
Yes |
Inside / Outside |
motorized |
Boolean |
No |
Has motor |
string_side |
Selection |
Yes |
L / R / Cordless |
Why Per-Window for Mount/Motor/String?
| Field |
Reason |
| Mount |
Some windows fit inside frame, others need outside mount |
| Motor |
Customer may only want certain windows motorized (cost) |
| String |
Left/Right varies by window position, Cordless for child safety |
Dimension Flow
Salesman enters: width = 893 mm, height = 1197 mm
↓
Customer Quote: customer_width = 900 mm (ceil to 10mm)
customer_height = 1200 mm
↓
Purchase Order: purchase_width = 893 mm (raw for vendor)
purchase_height = 1197 mm
↓
PO Report (inches): width_inch = 35.16" (÷ 25.4)
height_inch = 47.13"
Shutters Configuration
Material & Grade
| Field |
Type |
Options |
Description |
shutter_material |
Selection |
polycore, lexwood |
PolyCORE® or LexWOOD® |
shutter_grade |
Selection |
standard, premium, advantage, plus, preferred |
Material grade |
material_origin |
Selection |
domestic, imported |
PolyCORE: Made in USA or Imported |
Window Shape Types
| Code |
Name |
Extra Dimensions |
standard |
Standard Rectangle |
Width × Height only |
arch |
Arch (AR) |
Width(A), Middle(B), Left(C), Right(D) |
rake |
Rake (RK) |
Width(A), Height(B), Left(C), Right(D) |
half_arch_left |
½ Arch Left |
Width(A), Middle(B), Left(C), Right(D) |
half_arch_right |
½ Arch Right |
Width(A), Middle(B), Left(C), Right(D) |
half_circle_fan |
½ Circle Fan Top |
Width(A), Height(B) |
eyebrow_fan |
Eyebrow Fan Top |
Width(A), Height(B), Left(C), Right(D) |
ARCH (AR) RAKE (RK)
┌───────┐ /│
/ \ / │
│ │ / │
│ B │ / │D
C│ │D / B │
│ │ / │
└───────────┘ └──────┘
A A
1/2 ARCH-LEFT 1/2 ARCH-RIGHT
┌────┐ ┌────┐
/ │ │ \
│ B │D C│ B │
└──────┘ └──────┘
A A
1/2 CIRCLE FAN TOP EYEBROW FAN TOP
╭───────╮ ╭─────╮
╱ B ╲ C╱ B ╲D
└───────────┘ └─────────┘
A A
Configuration Options
| Field |
Type |
Options |
Description |
louver_size |
Selection |
2.5", 3.5", 4.5" |
Louver blade size |
tilt_type |
Selection |
tilt_rod, hidden_tilt |
Control mechanism |
frame_type |
Char |
L-frame, Z-frame, Deco |
Frame configuration |
hinging |
Selection |
L, R, LR, RL |
Hinge side |
panel_count |
Integer |
1-8 |
Number of panels |
has_divider_rail |
Boolean |
Y/N |
Horizontal divider rail |
divider_position |
Float |
mm |
Position from bottom |
Shutter Colors
PolyCORE Colors:
| Code |
Color |
| BRI |
Bright White |
| DUL |
Dull White |
| OFF |
Off White |
| PRL |
Pearl |
| ULT |
Ultra White |
Cut Out Options (Door Handles)
For shutters with door handle cutouts:
| Field |
Type |
Description |
has_cutout |
Boolean |
Has cut out |
cutout_type |
Selection |
half_circle, rectangular, custom |
cutout_side |
Selection |
left, right |
cutout_position_c |
Float |
Position from bottom (inches) |
cutout_radius_e |
Selection |
4¼", 5¼", 6¼" (half circle) |
cutout_height_c |
Float |
Cut out height (rectangular) |
cutout_width_e |
Float |
Cut out width (rectangular) |
cutout_recessed_plate |
Float |
Recessed plate dimension |
HALF CIRCLE CUT OUT RECTANGULAR CUT OUT
┌─────────────────────────┐ ┌─────────────────────────┐
│ ╭───────╮ │ │ ┌───────────┐ │
│ ╱ E ╲ │ │ │ E │← C │
│ ( radius ) │ │ │ (width) │ │
│ ╲ ╱ │ │ └───────────┘ │
│ ╰───┬───╯ │ │ │ D │
│ │ C │ │ ↓ │
│ ↓ │ │ ┌────┴────┐ │
│ ┌────┴────┐ │ │ │ F │ │
│ │ D │ │ │ └─────────┘ │
└─────────────────────────┘ └─────────────────────────┘
Cutout Pricing:
| Type |
PolyCORE |
LexWOOD |
| Standard |
$150 |
$120 |
| Custom |
+$50 surcharge |
+$50 surcharge |
Fan Top Specific
| Field |
Options |
Description |
fan_bottom_type |
with_frame, with_base |
Bottom configuration |
Outdoor Screens Configuration
Location & Dimensions
| Field |
Type |
Description |
location_name |
Char |
Patio, Lanai, Pool Area |
width |
Float |
Opening width (max 20-22 ft) |
height |
Float |
Opening height (max 13-16 ft) |
drop_length |
Float |
Fabric drop length |
mount_type |
Selection |
Inside / Outside / Ceiling |
mount_surface |
Selection |
Wood / Concrete / Stucco / Aluminum |
Screen Fabric Types
| Code |
Type |
Best For |
solar |
Solar Screen |
UV protection, heat reduction |
insect |
Insect Screen |
Bug protection, max airflow |
privacy |
Privacy Screen |
Daytime privacy |
blackout |
Blackout Screen |
Total light blocking |
clear_vinyl |
Clear Vinyl |
Weather protection |
Openness Factor
| Openness |
UV Block |
View |
Best Use |
| 1% |
99% block |
Minimal |
Maximum privacy |
| 3% |
97% block |
Limited |
High privacy |
| 5% |
95% block |
Moderate |
Balance |
| 10% |
90% block |
Good |
Popular choice |
| 14% |
86% block |
Excellent |
Maximum view |
Operation & Motor
| Field |
Type |
Options |
operation_type |
Selection |
manual_crank, manual_gear, motorized, solar_motor, battery_motor |
motor_brand |
Selection |
Somfy (5yr), Helios (3yr), XQ5 (5yr) |
motor_side |
Selection |
Left / Right |
power_source |
Selection |
Hardwired / Solar / Battery |
remote_channels |
Selection |
1 / 5 / 15 channel |
Wind Protection
| Field |
Type |
Description |
has_wind_sensor |
Boolean |
Auto-retract in high winds |
wind_sensor_level |
Selection |
1-5 (3mph to 32mph trigger) |
wind_rating |
Selection |
Standard (25mph), High (50mph), Extreme (130mph) |
Side Track System
| Code |
Type |
Wind Resistance |
cable |
Cable Guide |
Low |
channel |
Side Channel |
Medium |
zipper |
Zipper Track |
High |
magnetic |
MagnaTrack |
Very High |
Housing & Bottom Bar
Housing Styles:
| Code |
Style |
Description |
open_roll |
Open Roll |
No housing, exposed roller |
small_cassette |
Small Cassette |
Compact enclosed |
large_cassette |
Large Cassette |
Full enclosed |
square_fascia |
Square Fascia |
Architectural square |
round_fascia |
Round Fascia |
Rounded profile |
Bottom Bar Types:
| Code |
Type |
Description |
heat_sealed |
Heat Sealed Pocket |
Slim fabric pocket |
fabric_wrapped |
Fabric Wrapped |
Heavier wrap |
aluminum_trim |
Aluminum Trim |
Exposed aluminum |
weighted |
Weighted Bar |
Extra heavy for wind |
locking |
Locking Bar |
Locks into bottom track |
Warranty Considerations
| Component |
Standard |
Saltwater (<3 miles) |
| Motor (Somfy/XQ5) |
5 years |
5 years |
| Motor (Helios) |
3 years |
3 years |
| Housing/Tracks |
10 years |
1 year |
| Fabric |
10 years |
10 years |
Multi-Page PO Reports
Purchase Order reports generate vendor-specific pages based on line content:
┌─────────────────────────────────────────────────────────────┐
│ PURCHASE ORDER REPORT │
├─────────────────────────────────────────────────────────────┤
│ PAGE 1: Standard Order Form │
│ - Standard shutter/blinds lines │
│ - Checkboxes: Material, Louver, Tilt, Color │
├─────────────────────────────────────────────────────────────┤
│ PAGE 2: Special Shapes Form (if any) │
│ - Arch/Rake/Fan lines with B, C, D dimensions │
│ - Shape diagrams │
├─────────────────────────────────────────────────────────────┤
│ PAGE 3: Cut Out Form (if any cutout lines) │
│ - Per-line cutout details with A-F measurements │
│ - Half circle / Rectangular diagrams │
├─────────────────────────────────────────────────────────────┤
│ PAGE 4+: Technical Drafts (if generated) │
│ - AI-generated CAD-style blueprints │
└─────────────────────────────────────────────────────────────┘
Inch Conversion (Vendor Reports)
Dimensions convert from mm to inches with quarter-inch rounding down:
# Round down to nearest quarter inch
rounded_inch = int(value_mm / 25.4 * 4) / 4.0
# Examples:
# 890mm → 35.04" → 35.00"
# 1600mm → 62.99" → 62.75"
# 1800mm → 70.87" → 70.75"
AI Draft Generation (Phase 4)
OpenAI integration for CAD-style shutter drafts.
Two-Step Process
- Step A - Spec Builder (GPT): Normalize specs, compute panel widths, generate prompt
- Step B - Image Render (gpt-image): Generate CAD-style PNG blueprint
Draft Fields (sale.order.line)
| Field |
Type |
Description |
draft_spec_json |
Text |
Normalized spec JSON |
draft_warnings |
Text |
Validation warnings |
draft_revision |
Integer |
Version number (v1, v2...) |
draft_image_attachment_id |
Many2one |
PNG attachment |
draft_status |
Selection |
none/draft/sent/approved/production |
Draft Status Workflow
NONE → DRAFT → SENT → APPROVED → PRODUCTION
│ │ │ │
└───────┴───────┴────────┘ (regenerate loops back to DRAFT)
Product Dimensions (Core Module)
See Product Dimensions for complete documentation.
The bi_product_dimension module provides the foundation:
- Dimension-based pricing (m2 calculation)
- Premium add-on cost calculation
- Configurable order sequence prefixes
- 1 SO = 1 PO enforcement
- PO line split for individual tracking
Customer Payment Method
| Field |
Value |
| Technical Name |
customer_payment_method |
| Version |
15.0.1.0.0 |
| Dependencies |
sale, account |
Payment Options
| Option |
Description |
| Cash |
Pay with cash |
| Check |
Pay by check |
| Wire Transfer |
Bank wire transfer |
| Zelle |
Zelle payment |
| Credit Card |
Credit card payment |
| Online Payment |
Online payment gateway |
Portal Flow
flowchart TD
A[Customer Opens Portal] --> B[Reviews Quotation]
B --> C[Clicks Accept & Sign]
C --> D[Payment Method Modal]
D --> E[Selects Payment Method]
E --> F[Signs Quotation]
F --> G[Order Confirmed]
G --> H[50% Deposit Invoice Created]
Auto-Invoice Logic
When customer signs via portal:
1. Validates signature present
2. Creates 50% deposit invoice
3. Invoice kept in draft for adjustment
Copy Sale/Purchase Lines
| Field |
Value |
| Technical Name |
bi_copy_sale_purchase_line |
| Version |
15.0.1.0.0 |
Features
- Copy Button on each sale order line
- Duplicates line with same product/settings
- Resets dimension fields:
item_location_id → empty
width → 0
height → 0
JDX Sale Order Photos
| Field |
Value |
| Technical Name |
jdx_sale_order_photos |
| Version |
15.0.1.0.0 |
| Python Dependencies |
boto3 |
Features
- Photo Count Smart Button
- Photo Gallery View with S3 pre-signed URLs
- Shared S3 Credentials with
jdx_service_signature
S3 Configuration
| System Parameter |
Description |
jdx_service_signature.s3_access_key |
AWS Access Key ID |
jdx_service_signature.s3_secret_key |
AWS Secret Access Key |
jdx_service_signature.s3_bucket |
S3 bucket name |
jdx_service_signature.s3_region |
AWS region |
Complete Sales Workflow
AUSTINJDX SALES FLOW
1. QUOTATION
├── Open Configuration Wizard (Blinds/Shutters/Outdoor)
├── Enter common settings (product, fabric, color)
├── Add multiple windows with dimensions
├── System calculates: m2, net_price, additional costs
└── Send quotation to customer (portal)
2. CUSTOMER PORTAL
├── Review quotation
├── Select payment method (popup modal)
└── Sign & Accept
3. ORDER CONFIRMATION
├── Validate signature
├── Calculate additional costs (premium options)
├── Auto-create 50% deposit invoice
└── Generate purchase orders (per vendor)
4. PURCHASE ORDER
├── Confirm PO to vendor
├── Print vendor-specific PDF form
├── Receive products (validate receipt)
└── Products now in stock
5. DELIVERY
├── Prepare shipment
├── Validate delivery
└── Auto-create FSM Order (Install type)
6. FIELD SERVICE
├── Schedule installation
├── Customer signature on completion
├── Load warranty template
└── Send completion report
7. FINAL INVOICE
└── Invoice remaining 50% balance
Installation
# Install all sales extensions
docker compose exec odoo odoo \
-i bi_product_dimension,jdx_product_configurator,customer_payment_method,bi_copy_sale_purchase_line,jdx_sale_order_photos \
--stop-after-init -d odoo
# Install boto3 if not present (for photos)
docker compose exec odoo pip install boto3
Troubleshooting
Wizard Not Opening
- Verify product has
category_type set (blinds/shutter/outdoor)
- Check module is installed and upgraded
- Verify user has sales permissions
PO Not Auto-Generated
- Check product has MTO + Buy routes enabled
- Verify vendor is set on product
- Check procurement rules exist
Photos Not Displaying
- Verify S3 credentials configured
- Check boto3 installed
- Verify bucket permissions allow GetObject
50% Invoice Not Created
- Verify customer signed via portal
- Check order was confirmed after signing
- Review Odoo logs for errors