Skip to content

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:

  1. Customer Signature Capture - Odoo Binary or S3 URL storage
  2. Warranty Acknowledgment - HTML warranty display with customer confirmation
  3. Parts Handover Confirmation - Installed and removed parts list
  4. Completion Report - PDF generation with email delivery
  5. 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)

S3 Signature URL Format

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:

  1. Signature - Either x_signature_url or x_signature_binary must be set
  2. Warranty Acknowledgment - x_warranty_ack must be True
  3. Parts Confirmation - x_parts_ack must be True
  4. 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

  1. Check S3 credentials are configured correctly
  2. Verify boto3 is installed: docker compose exec odoo pip list | grep boto3
  3. Check Odoo logs for S3 errors
  4. Verify bucket permissions allow GetObject

Email Not Sending

  1. Verify customer has email address
  2. Check mail server configuration
  3. Ensure signature is marked as complete (x_signature_state = 'signed')

Parts Not Loading

  1. Verify FSM Order is linked to a Sale Order via delivery picking
  2. Check Sale Order has product lines (not just service/section lines)
  3. Run: fsm_order.action_load_parts_from_sale_order()

Warranty Not Loading

  1. Check default warranty template is configured
  2. Navigate to Settings > General Settings > Service Signature
  3. Or set system parameter jdx_service_signature.default_warranty_text