-
Notifications
You must be signed in to change notification settings - Fork 2
Excess Weight Volume Implementation Guide
This document explains the implementation of the Excess Weight Volume field in the Logistics system. This field helps identify and track volume-heavy cargo that exceeds the volume equivalent of the chargeable weight calculation.
Excess Weight Volume represents the additional volume (in cubic meters) that exists beyond what the chargeable weight calculation accounts for. It helps identify when cargo is taking up more space than the billing weight would suggest.
- Capacity Planning: Identify shipments that require more physical space than their chargeable weight indicates
- Volume Surcharges: Track cargo that may incur additional volume-based fees
- Equipment Selection: Help choose appropriate containers/ULD types for volume-heavy cargo
- Billing Accuracy: Ensure all volume is properly accounted for in pricing
- Reporting & Analytics: Understand cargo density patterns and optimize operations
Excess Weight Volume = Actual Volume - Volume Equivalent of Chargeable Weight
Volume Equivalent of Chargeable Weight = Chargeable Weight × Divisor ÷ 1,000,000
Excess Weight Volume = Actual Volume - (Chargeable Weight × Divisor ÷ 1,000,000)
Where:
- Actual Volume: The total volume of cargo in m³
- Chargeable Weight: The billing weight (higher of actual weight or volume weight) in kg
- Divisor: The volume-to-weight conversion factor (6000 for IATA air freight, 1000 for sea freight)
- If Excess Weight Volume > 0: Cargo is volume-heavy beyond chargeable weight
- If Excess Weight Volume = 0: All volume is accounted for in chargeable weight
- If Excess Weight Volume < 0: This shouldn't happen in normal scenarios (indicates calculation issue)
Scenario:
- Actual Weight: 500 kg
- Actual Volume: 10 m³
- Divisor: 6000 (IATA standard)
Calculations:
- Volume Weight = 10 m³ × (1,000,000 ÷ 6000) = 1,666.67 kg
- Chargeable Weight = max(500 kg, 1,666.67 kg) = 1,666.67 kg
- Volume Equivalent of Chargeable = 1,666.67 × 6000 ÷ 1,000,000 = 10 m³
- Excess Weight Volume = 10 - 10 = 0 m³
Result: No excess volume (all volume is already accounted for in chargeable weight)
Scenario:
- Actual Weight: 2,000 kg
- Actual Volume: 12 m³
- Divisor: 6000 (IATA standard)
Calculations:
- Volume Weight = 12 m³ × (1,000,000 ÷ 6000) = 2,000 kg
- Chargeable Weight = max(2,000 kg, 2,000 kg) = 2,000 kg (actual weight)
- Volume Equivalent of Chargeable = 2,000 × 6000 ÷ 1,000,000 = 12 m³
- Excess Weight Volume = 12 - 12 = 0 m³
Wait, let's reconsider...
Actually, when chargeable weight = actual weight (dense cargo), the volume equivalent calculation shows what volume the chargeable weight represents. If actual volume is higher, there's excess.
Revised Calculation:
- Volume Equivalent of Chargeable = 2,000 × 6000 ÷ 1,000,000 = 12 m³
- Excess Weight Volume = 12 - 12 = 0 m³
But if actual volume was 15 m³:
- Excess Weight Volume = 15 - 12 = 3 m³ (excess volume)
Scenario:
- Actual Weight: 8,000 kg
- Actual Volume: 12 m³
- Volume Factor: 1000 kg/m³ (international sea freight)
Calculations:
- Volume Weight = 12 m³ × 1000 = 12,000 kg
- Chargeable Weight = max(8,000 kg, 12,000 kg) = 12,000 kg
- Volume Equivalent of Chargeable = 12,000 ÷ 1000 = 12 m³
- Excess Weight Volume = 12 - 12 = 0 m³
The excess_weight_volume field is calculated automatically in:
-
Air Booking (
air_booking.py&air_booking.js) -
Air Shipment (
air_shipment.py) -
Sea Booking (
sea_booking.py) -
Sea Shipment (
sea_shipment.py)
The excess weight volume is automatically calculated:
- When volume changes
- When weight changes
- When chargeable weight is recalculated
- During document validation (before save)
def calculate_excess_weight_volume(self):
"""Calculate excess weight volume"""
if not self.volume or not self.chargeable:
self.excess_weight_volume = 0
return
# Get divisor based on freight type
divisor = self.get_volume_to_weight_divisor()
# Calculate volume equivalent of chargeable weight
# Formula: chargeable_weight × divisor ÷ 1,000,000 = volume in m³
volume_equivalent = flt(self.chargeable) * divisor / 1000000.0
# Excess volume = actual volume - volume equivalent
excess = flt(self.volume) - volume_equivalent
# Ensure non-negative (shouldn't be negative in normal cases)
self.excess_weight_volume = max(0, excess)The excess_weight_volume field appears in the Measurements section of:
- Air Booking form
- Air Shipment form
- Sea Booking form
- Sea Shipment form
- Label: "Excess Weight Volume (M³)"
- Type: Float (decimal number)
- Read-Only: Yes (automatically calculated)
- Default: 0.0
Consider adding visual indicators in the UI:
- Green: Excess Weight Volume = 0 (normal)
- Yellow: Excess Weight Volume > 0 but < 10% of total volume (minor excess)
- Orange: Excess Weight Volume > 10% of total volume (significant excess)
- Capacity Planning: Know exactly how much physical space is needed
- Equipment Selection: Choose appropriate containers/ULD types
- Load Optimization: Identify opportunities to consolidate or repackage
- Accurate Billing: Ensure all volume is accounted for
- Volume Surcharges: Identify shipments that may incur additional fees
- Quote Accuracy: Provide more accurate quotes based on actual space requirements
- Reporting: Track volume-heavy vs weight-heavy cargo patterns
- Analytics: Understand cargo density trends
- Optimization: Identify opportunities to improve cargo packing efficiency
The calculation is implemented in the calculate_chargeable_weight() method, which now also calculates excess_weight_volume:
def calculate_chargeable_weight(self):
# ... existing chargeable weight calculation ...
# Calculate excess weight volume
self.calculate_excess_weight_volume()The calculation is implemented in the _calculate_and_set_chargeable_weight() function:
function _calculate_and_set_chargeable_weight(frm, divisor) {
// ... existing chargeable weight calculation ...
// Calculate excess weight volume
_calculate_excess_weight_volume(frm, divisor, chargeable);
}- Non-Negative: Excess weight volume should never be negative (set to 0 if calculated negative)
- Requires Volume: Calculation only runs if volume is provided
- Requires Chargeable: Calculation only runs if chargeable weight is calculated
Potential future improvements:
- Volume Surcharge Calculation: Automatically calculate surcharges based on excess volume
- Capacity Alerts: Warn users when excess volume exceeds container/ULD capacity
- Historical Reporting: Track excess volume trends over time
- Optimization Suggestions: Suggest repackaging when excess volume is high
- Integration with Pricing: Use excess volume in pricing calculations
- Divisor Differences: Air freight uses 6000, sea freight uses 1000 (or 333 for domestic)
- Unit Consistency: All calculations use m³ for volume and kg for weight
- Rounding: Excess volume is rounded to 3 decimal places for display
- Performance: Calculation is lightweight and runs synchronously
Test the following scenarios:
- Volume-heavy cargo (chargeable = volume weight)
- Weight-heavy cargo (chargeable = actual weight)
- Balanced cargo (chargeable = actual weight = volume weight)
- Zero volume or weight
- Very large volumes
- Custom divisors
A: When chargeable weight equals volume weight, all volume is already accounted for in the billing weight, so there's no "excess" volume.
A: No, the calculation ensures it's always 0 or positive. If the calculation would be negative, it's set to 0.
A: Chargeable weight is the billing weight. Excess weight volume shows how much additional physical space is needed beyond what the billing weight accounts for.
A: Currently, it's informational only. Future enhancements may use it for volume surcharge calculations.
A: Currently, it's only calculated at the header level. Package-level calculation could be added in the future.
-
v1.0 (2025-02-10): Initial implementation
- Added calculation to Air Booking
- Added calculation to Air Shipment
- Added calculation to Sea Booking
- Added calculation to Sea Shipment
- Automatic calculation on volume/weight changes
For questions or issues related to Excess Weight Volume calculation, please contact the development team or refer to the technical documentation.
Last Updated: February 10, 2025
Status: ✅ Implemented and Active
Getting Started
- Getting Started
- Recent Platform Updates
- CargoNext v1 — Release Notes
- CargoNext v1 — Astraea Press Release
- Document Management
- Milestone Tracking
- Customer Portal
Setup and Settings
- Logistics Settings
- Credit Management
- Default Details and Relationships
- Sea Freight Settings
- Air Freight Settings
- Transport Settings
- Warehouse Settings
- Customs Settings
Sea Freight
- Sea Freight Module
- Sea Booking
- Sea Shipment
- Sea Consolidation
- Master Bill
- Shipper
- Consignee
- Container Type
- Container Management
Air Freight
Transport
- Transport Module
- Transport Order
- Transport Job
- Transport Consolidation
- Transport Leg
- Transport Plan
- Run Sheet
- Proof of Delivery
- Transport Template
- Load Type
- Transport Order — Inter-module Field Copy
Customs
Warehousing
- Warehousing Module
- Inbound Order
- Release Order
- Transfer Order
- VAS Order
- Stocktake Order
- Warehouse Job
- Warehouse Contract
- Gate Pass
- Periodic Billing
- Storage Location
- Handling Unit Type
Pricing Center
- Sales Quote
- Sales Quote — Separate Billings and Internal Job
- Change Request
- Sales Quote – Calculation Method
Job Management
- Job Management Module
- Revenue Recognition Policy — Accounts, Dates, and Charges
- Proforma GL Entries
- WIP and Accrual Reversal on Invoicing
Sustainability
Intercompany
Special Projects
Pages
Features
Reports
Glossary