Skip to content

Delivery Term Documentation

Overview

The Delivery Term module (delivery.term) manages International Commercial Terms (Incoterms) and delivery conditions for sales transactions. This master data model enables companies to standardize shipping terms, clarify buyer-seller responsibilities, and ensure consistent application of delivery conditions across sales orders.

Note: There are two source files (delivery_term.py and deliver_term.py) with identical content - likely a duplicate. Both define the same delivery.term model.


Model Information

Model Name: delivery.term Display Name: Delivery Term Key Fields: None (no unique constraints)

Features

  • Simple delivery term master data
  • Incoterms support
  • Search-enabled fields
  • Standard ordering by name

Common Delivery Terms (Incoterms 2020)

Incoterm Code Description Seller Responsibility
EXW EXW Ex Works Minimal - goods available at seller's premises
FCA FCA Free Carrier Deliver to carrier at named place
CPT CPT Carriage Paid To Pay transport to destination
CIP CIP Carriage and Insurance Paid Pay transport and insurance
DAP DAP Delivered at Place Deliver to named destination
DPU DPU Delivered at Place Unloaded Deliver and unload at destination
DDP DDP Delivered Duty Paid Maximum - deliver with all duties paid
FAS FAS Free Alongside Ship Deliver alongside vessel
FOB FOB Free On Board Load goods on vessel
CFR CFR Cost and Freight Pay ocean freight
CIF CIF Cost, Insurance and Freight Pay ocean freight and insurance

Field Reference

Basic Fields

Field Type Required Description
name Char Yes Delivery term name (e.g., "FOB - Free On Board")
code Char No Short code (e.g., "FOB", "CIF")

API Methods

1. Create Delivery Term

Method: create(vals, context)

Example:

# Create a delivery term
term_id = get_model("delivery.term").create({
    "name": "FOB - Free On Board",
    "code": "FOB"
})

2. Search Delivery Terms

# Find term by code
term_ids = get_model("delivery.term").search([["code", "=", "FOB"]])

# Find all terms
all_terms = get_model("delivery.term").search([], order="name")

Model Relationship Description
sale.order Referenced by Orders may specify delivery terms
sale.quot Referenced by Quotations may specify delivery terms
purchase.order Referenced by Purchase orders use delivery terms

Common Use Cases

Use Case 1: Setup Standard Incoterms

# Create all Incoterms 2020
incoterms = [
    {"name": "EXW - Ex Works", "code": "EXW"},
    {"name": "FCA - Free Carrier", "code": "FCA"},
    {"name": "CPT - Carriage Paid To", "code": "CPT"},
    {"name": "CIP - Carriage and Insurance Paid To", "code": "CIP"},
    {"name": "DAP - Delivered at Place", "code": "DAP"},
    {"name": "DPU - Delivered at Place Unloaded", "code": "DPU"},
    {"name": "DDP - Delivered Duty Paid", "code": "DDP"},
    {"name": "FAS - Free Alongside Ship", "code": "FAS"},
    {"name": "FOB - Free On Board", "code": "FOB"},
    {"name": "CFR - Cost and Freight", "code": "CFR"},
    {"name": "CIF - Cost, Insurance and Freight", "code": "CIF"}
]

for term in incoterms:
    get_model("delivery.term").create(term)

Use Case 2: Apply Delivery Term to Sales Order

# Set delivery term on order
def set_delivery_term(order_id, incoterm_code):
    # Find delivery term
    term_ids = get_model("delivery.term").search([["code", "=", incoterm_code]])

    if not term_ids:
        raise Exception(f"Delivery term {incoterm_code} not found")

    # Update order
    get_model("sale.order").write([order_id], {
        "delivery_term_id": term_ids[0]
    })

# Usage
set_delivery_term(order_id, "FOB")

Use Case 3: Country-Specific Default Terms

# Set default delivery terms by customer country
def get_default_delivery_term(country_code):
    # Define defaults by region
    defaults = {
        "US": "DDP",      # Domestic US: Delivered Duty Paid
        "CA": "DAP",      # Canada: Delivered at Place
        "MX": "DAP",      # Mexico: Delivered at Place
        "DEFAULT_EXPORT": "FOB",  # International: Free On Board
        "DEFAULT_DOMESTIC": "DDP"  # Domestic: Delivered Duty Paid
    }

    incoterm = defaults.get(country_code, defaults["DEFAULT_EXPORT"])

    # Find term
    term_ids = get_model("delivery.term").search([["code", "=", incoterm]])
    return term_ids[0] if term_ids else None

# Apply to new order
default_term_id = get_default_delivery_term(customer.country.code)

Use Case 4: Delivery Term by Customer Type

# Different terms for different customer segments
def get_delivery_term_for_customer(customer_id):
    customer = get_model("contact").browse(customer_id)

    # Business rules
    if customer.is_vip:
        # VIP customers get best terms
        term_code = "DDP"
    elif customer.customer_type == "wholesale":
        # Wholesale gets FOB
        term_code = "FOB"
    else:
        # Standard retail
        term_code = "DAP"

    term_ids = get_model("delivery.term").search([["code", "=", term_code]])
    return term_ids[0] if term_ids else None

Use Case 5: Delivery Term Reporting

# Analyze orders by delivery term
def analyze_by_delivery_term(date_from, date_to):
    results = []

    # Get all delivery terms
    term_ids = get_model("delivery.term").search([])
    terms = get_model("delivery.term").browse(term_ids)

    for term in terms:
        # Find orders with this term
        order_ids = get_model("sale.order").search([
            ["delivery_term_id", "=", term.id],
            ["date", ">=", date_from],
            ["date", "<=", date_to],
            ["state", "in", ["confirmed", "done"]]
        ])

        orders = get_model("sale.order").browse(order_ids)
        total_value = sum(o.amount_total for o in orders)

        results.append({
            "term": term.name,
            "code": term.code,
            "orders": len(orders),
            "value": total_value
        })

    return results

Best Practices

1. Naming Conventions

# Good: Include full name and abbreviation
{"name": "FOB - Free On Board", "code": "FOB"}
{"name": "CIF - Cost, Insurance and Freight", "code": "CIF"}
{"name": "DDP - Delivered Duty Paid", "code": "DDP"}

# Bad: Abbreviation only or unclear
{"name": "FOB", "code": "FOB"}           # No full description
{"name": "Free shipping", "code": "FS"}  # Not a standard Incoterm

2. Use Standard Incoterms

  • Stick to official Incoterms 2020 (or latest version)
  • Don't create custom terms that confuse international trade
  • Document any non-standard terms clearly
  • Train team on Incoterm responsibilities

3. Documentation

# Add detailed descriptions for each term
term_id = get_model("delivery.term").create({
    "name": "FOB - Free On Board (named port of shipment)",
    "code": "FOB"
})

# Consider adding description field with:
# - Seller responsibilities
# - Buyer responsibilities
# - When to use
# - Risk transfer point

4. Regular Review

Annual review checklist: - Update to latest Incoterms version when released - Remove unused custom terms - Verify team understanding - Update sales contracts and templates


Performance Tips

1. Cache Delivery Terms

_delivery_term_cache = {}

def get_delivery_term_by_code(code):
    if code not in _delivery_term_cache:
        ids = get_model("delivery.term").search([["code", "=", code]])
        if ids:
            _delivery_term_cache[code] = ids[0]
    return _delivery_term_cache.get(code)

2. Limit to Essential Terms

  • Most companies only use 3-5 Incoterms regularly
  • Focus training on commonly used terms
  • Archive rarely used terms

Troubleshooting

"Duplicate file warning"

Cause: Two source files (delivery_term.py and deliver_term.py) exist Note: Both files are identical and define the same model. This is likely a typo/duplicate. System will work correctly as both register the same model definition.

"Incorrect term applied to order"

Cause: Wrong delivery term selected for customer location/type Solution:

# Implement validation
def validate_delivery_term(order_id):
    order = get_model("sale.order").browse(order_id)

    # Check if term is appropriate for destination
    if order.ship_address_id:
        country = order.ship_address_id.country_id.code

        # International shipments should use international terms
        if country != "US" and order.delivery_term_id.code in ["DDP", "DAP"]:
            print(f"Warning: {order.delivery_term_id.code} may have high duty costs for {country}")


Security Considerations

Permission Model

  • All users need read access for order creation
  • Only logistics/operations should create/modify terms
  • Terms are reference data - changes affect existing orders

Data Access

  • Delivery terms are company-wide master data
  • No security restrictions needed

Integration Points

Internal Modules

  • sale.order: Orders specify delivery terms
  • sale.quot: Quotations include delivery terms
  • purchase.order: Purchase orders use delivery terms
  • shipping: Delivery terms affect shipping calculations

External Integration

  • Customs documentation
  • Freight forwarder systems
  • International trade compliance

Version History

Last Updated: 2026-01-05 Model Version: delivery_term.py / deliver_term.py (duplicate files) Framework: Netforce

Note: Two source files exist with identical content. Consider removing deliver_term.py duplicate.


Additional Resources

  • Incoterms 2020 Official Guide
  • International Chamber of Commerce (ICC)
  • Sales Order Documentation: sale.order
  • International Trade Compliance

This documentation is generated for developer onboarding and reference purposes.