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")
Related Models¶
| 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.