Service Signature Module
Digital signature capture for Field Service orders with warranty acknowledgment and completion reports.
| Field |
Value |
| Technical Name |
jdx_service_signature |
| Version |
15.0.1.2.0 |
| Category |
Field Service |
| Dependencies |
base, mail, fieldservice, jdx_field_service_automation, sale |
Overview
The jdx_service_signature module enables:
- Customer Signature Capture - Odoo Binary or S3 URL storage
- Warranty Acknowledgment - HTML warranty display with customer confirmation
- Parts Handover Confirmation - Installed and removed parts list
- Completion Report - PDF generation with email delivery
- Flask PWA Integration - REST API endpoints for mobile app
Data Model
FSM Order Extension (fsm.order)
Relationship Fields
| Field |
Type |
Description |
sale_id |
Many2one |
Linked Sale Order (computed from picking.origin) |
Signature Fields
| Field |
Type |
Description |
x_signature_url |
Char(512) |
S3 signature image path (bucket/key format) |
x_signature_binary |
Binary |
Odoo internal signature (attachment) |
x_signed_name |
Char(128) |
Name of the person who signed |
x_signed_datetime |
Datetime |
Timestamp when signature was captured |
x_signature_state |
Selection |
none / pending / signed |
x_signer_relationship |
Selection |
customer / spouse / representative / other |
x_signature_image_html |
Html (computed) |
Rendered signature image for display |
Warranty Fields
| Field |
Type |
Description |
x_warranty_text |
Html |
Warranty terms presented to customer |
x_warranty_ack |
Boolean |
Customer has acknowledged warranty |
x_warranty_ack_datetime |
Datetime |
Acknowledgment timestamp |
Parts Fields
| Field |
Type |
Description |
x_parts_summary |
Text |
Installed items summary |
x_removed_items_summary |
Text |
Removed items summary |
x_parts_ack |
Boolean |
Parts handover confirmed |
x_parts_ack_datetime |
Datetime |
Confirmation timestamp |
Completion Fields
| Field |
Type |
Description |
x_completion_notes |
Text |
Completion memo |
x_completion_report_sent |
Boolean |
Report sent flag |
x_completion_report_sent_datetime |
Datetime |
Send timestamp |
x_can_complete |
Boolean (computed) |
All requirements met for completion |
Workflow
flowchart TD
A[View Today's Jobs] --> B[Select Job]
B --> C[Load Parts from Sale Order]
C --> D[Show Warranty Terms]
D --> E[Customer Acknowledges]
E --> F[Capture Signature]
F --> G{Storage Type}
G -->|Binary| H[Save to Odoo]
G -->|S3| I[Upload to S3]
I --> H
H --> J[Mark Signature Complete]
J --> K[Send Completion Report]
K --> L[Email with PDF]
Actions
Available Actions on FSM Order
| Method |
Button |
Description |
action_mark_signature_complete |
Mark Complete |
Validate and mark signature as complete |
action_send_completion_report |
Send Report |
Open email composer with PDF |
action_send_completion_report_auto |
(API) |
Send email automatically (for REST API) |
action_load_parts_from_sale_order |
Load Parts |
Pull parts from linked Sale Order |
action_load_warranty_template |
Load Warranty |
Load default warranty text |
action_view_sale_order |
Sale Order |
Smart button to view linked SO |
Flask PWA API Aliases
For Flask PWA integration, these alias methods are available:
| Alias |
Delegates To |
action_signature_complete |
action_mark_signature_complete |
action_load_parts_summary |
action_load_parts_from_sale_order |
REST API Integration
Authentication (JWT)
POST /restapi/1.0/common/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&token_format=jwt
Endpoints
| Operation |
Method |
Endpoint |
| Get Token |
POST |
/restapi/1.0/common/oauth2/token |
| List Jobs |
GET |
/restapi/1.0/object/fsm.order?domain=... |
| Get Job |
GET |
/restapi/1.0/object/fsm.order/{id} |
| Update Job |
PUT |
/restapi/1.0/object/fsm.order/{id} |
| Mark Signed |
POST |
/restapi/1.0/object/fsm.order/{id}/action_mark_signature_complete |
| Send Email |
POST |
/restapi/1.0/object/fsm.order/{id}/action_send_completion_report_auto |
| Load Parts |
POST |
/restapi/1.0/object/fsm.order/{id}/action_load_parts_from_sale_order |
Python Client Example
from services.odoo_api import OdooAPI
api = OdooAPI(
base_url=os.environ['ODOO_URL'],
client_id=os.environ['ODOO_CLIENT_ID'],
client_secret=os.environ['ODOO_CLIENT_SECRET']
)
# Get today's jobs
jobs = api.get_today_jobs(person_id=5, date_str='2025-12-01')
# Update signature data
api.update_fsm_order(123, {
'x_signature_url': 'mybucket/signatures/123.png',
'x_signed_name': 'John Customer',
'x_signer_relationship': 'customer',
'x_warranty_ack': True,
'x_parts_ack': True
})
# Complete signature process
api.mark_signature_complete(123)
# Send completion email (returns success/error dict)
result = api.send_completion_report(123)
# {'success': True, 'message': 'Completion report sent to john@example.com'}
Configuration
Settings UI
Navigate to Settings > General Settings > Service Signature:
| Setting |
Description |
| Default Warranty Template |
HTML warranty text auto-loaded on new FSM Orders |
| Auto-send Completion Report |
Automatically send email when signature complete |
| Auto-complete FSM Order |
Automatically mark FSM Order as done |
AWS S3 Configuration
For signature image storage in S3:
| Setting |
Description |
Example |
| AWS Access Key ID |
IAM access key |
AKIAIOSFODNN7EXAMPLE |
| AWS Secret Access Key |
IAM secret key |
wJalrXUtnFEMI/K7MDENG/... |
| S3 Bucket Name |
Bucket for signatures |
my-signatures-bucket |
| AWS Region |
S3 region |
us-east-1 |
System Parameters
| Key |
Type |
Description |
jdx_service_signature.default_warranty_text |
HTML |
Default warranty template |
jdx_service_signature.auto_send_completion_report |
Boolean |
Auto-send email |
jdx_service_signature.auto_complete_order |
Boolean |
Auto-complete FSM order |
jdx_service_signature.s3_access_key |
Char |
AWS access key |
jdx_service_signature.s3_secret_key |
Char |
AWS secret key |
jdx_service_signature.s3_bucket |
Char |
S3 bucket name |
jdx_service_signature.s3_region |
Char |
AWS region (default: us-east-1) |
Signatures are stored with the path format bucket/key:
mybucket/signatures/fsm_123_20251201_143022.png
The module generates pre-signed URLs for display with 1-hour expiration.
Python Dependencies
# Install boto3 for S3 integration
docker compose exec odoo pip install boto3
Email Template
The completion email template (email_template_service_completion) includes:
- Service details (order number, date, technician)
- Warranty information summary
- Signature confirmation
- PDF attachment with full report
Template Variables
{{ object.name }} # FSM Order number
{{ object.partner_id.name }} # Customer name
{{ object.scheduled_date_start }} # Service date
{{ object.sale_id.name }} # Sale Order number
{{ object.person_id.name }} # Technician name
{{ object.x_signed_name }} # Signer name
{{ object.x_signed_datetime }} # Signature datetime
{{ object.x_parts_summary }} # Installed items
{{ object.x_removed_items_summary }} # Removed items
PDF Report
The completion report PDF (action_report_service_completion) contains:
- Order information (FSM order number, dates)
- Service location (customer address)
- Installed items list
- Removed items list
- Warranty terms (full text)
- Acknowledgment checkboxes (warranty + parts)
- Customer signature image
- Signer name and relationship
- Technician information
Security Groups
| Group |
Access |
| Signature User |
Read, Write, Create on signature fields |
| Signature Manager |
Full CRUD + Delete + Configuration |
Module Structure
jdx_service_signature/
├── __manifest__.py
├── __init__.py
├── models/
│ ├── __init__.py
│ ├── fsm_order.py # FSM Order extension with signature fields
│ ├── sale_order.py # Sale Order extensions
│ └── res_config_settings.py # Settings configuration
├── security/
│ ├── security_groups.xml
│ └── ir.model.access.csv
├── data/
│ ├── warranty_template_data.xml # Default warranty text
│ └── mail_template_data.xml # Email template
├── reports/
│ ├── service_completion_report.xml # Report action
│ └── service_completion_template.xml # QWeb template
└── views/
├── fsm_order_views.xml
├── sale_order_views.xml
└── res_config_settings_views.xml
Validation Requirements
Before marking signature complete, the following are required:
- Signature - Either
x_signature_url or x_signature_binary must be set
- Warranty Acknowledgment -
x_warranty_ack must be True
- Parts Confirmation -
x_parts_ack must be True
- Signer Name -
x_signed_name must be filled
If any requirement is missing, a ValidationError is raised with specific messages.
Troubleshooting
Signature Image Not Displaying
- Check S3 credentials are configured correctly
- Verify boto3 is installed:
docker compose exec odoo pip list | grep boto3
- Check Odoo logs for S3 errors
- Verify bucket permissions allow GetObject
Email Not Sending
- Verify customer has email address
- Check mail server configuration
- Ensure signature is marked as complete (
x_signature_state = 'signed')
Parts Not Loading
- Verify FSM Order is linked to a Sale Order via delivery picking
- Check Sale Order has product lines (not just service/section lines)
- Run:
fsm_order.action_load_parts_from_sale_order()
Warranty Not Loading
- Check default warranty template is configured
- Navigate to Settings > General Settings > Service Signature
- Or set system parameter
jdx_service_signature.default_warranty_text