-
Notifications
You must be signed in to change notification settings - Fork 2
Sales Quote Separate Billings And Internal Job
This document describes the Separate Billings per Service Type option on Sales Quote and the behaviour of Internal Jobs when a related service has no charges.
On the Sales Quote, in the Routing tab, the field Separate Billings per Service Type controls how charges are applied when creating Bookings and Orders from the quote.
| Checkbox | Behaviour |
|---|---|
| Checked | Each Booking/Order gets only the charges that match its service type. Air Booking gets Air charges only; Sea Booking gets Sea charges only; Transport Order gets Transport charges only; Declaration gets Customs charges only. |
| Unchecked | All charges from the Sales Quote are added to the main service Booking/Order. The main service is the one marked as Main Job in the routing legs (or the quote’s main service). Other service types still get their own Bookings/Orders where applicable, but charge handling follows the Internal Job rules below when they have no charges. |
- When Separate Billings per Service Type is checked: each document’s charges table is populated only with Sales Quote Charge rows where
service_typematches that document (Air, Sea, Transport, Customs, etc.). Existing charge tables support this; ensure filters useservice_typewhen this option is on. - When Separate Billings per Service Type is unchecked: the main service Booking/Order must accept all charge types. Charge tables (e.g. Air Booking Charges, Sea Booking Charges, Transport Order Charges, Declaration Charges) must allow all charges from the quote—i.e. allow rows that may have different
service_typeor an “other service” indicator (e.g.other_service_type) so that the main job can carry Air + Sea + Transport + Customs + Warehousing etc. as needed.
Fields mentioned here (Separate Billings per Service Type, Internal Job, Main Job, routing, charges) are on Sales Quote and on each Booking / Order / Job DocType. Full column lists:
When creating a Booking/Order for a non‑main service type (e.g. Customs, Transport leg) from the same Sales Quote:
- If the quote has no charges for that service type (no rows in Sales Quote Charges for that
service_type), the created document must be treated as an Internal Job.
- Set Internal Job = 1 (or equivalent checkbox) on that Booking/Order/Job.
- Set Main Job reference to the main service job (the one that carries customer billing). This links the internal job to the main job for cost allocation and internal billing.
For an Internal Job:
- Charges: Add applicable charges as internal billing (e.g. internal transfer / intercompany or internal cost allocation, not customer-facing).
- Revenue: Revenue of the Internal Job is set equal to the Cost of the Main Job (the cost allocated to or incurred by the main job for this service).
- Cost: Cost is as per tariff (or cost tariff) for the internal job’s service.
So:
- Revenue (Internal Job) = Cost of Main Job (allocated to this internal service).
- Cost (Internal Job) = As per tariff.
This keeps internal jobs at cost-neutral or at transfer price relative to the main job.
| Scenario | Separate Billings = Yes | Separate Billings = No |
|---|---|---|
| Main service Booking/Order | Only charges for that service type | All charges from the quote (all service types allowed in charges table) |
| Other service Booking/Order (has charges in quote) | Only charges for that service type | Only charges for that service type |
| Other service Booking/Order (no charges in quote) | Create as Internal Job, reference Main Job; charges = internal billing; Revenue = Cost of Main Job; Cost = as per tariff | Same: Internal Job, reference Main Job; internal billing; Revenue = Cost of Main Job; Cost = as per tariff |
-
Sales Quote: Field
separate_billings_per_service_type(Check) is in the Routing section. -
Bookings/Orders (e.g. Air Booking, Sea Booking, Transport Order, Declaration Order / Declaration): Support fields Internal Job (Check) and Main Job (reference: e.g.
main_job_type+main_jobDynamic Link, or single link to the main job document). -
Charge population:
- If
separate_billings_per_service_typeis true: existing behaviour—filter Sales Quote Charges byservice_typeper document. - If false: main service document gets all Sales Quote Charges (no
service_typefilter for main); other documents get only their service type; if a non‑main service has no charges, create as Internal Job and apply internal billing/revenue/cost rules above.
- If
- Internal Job: When creating a job/booking/order for a leg with no charges for that service, set Internal Job and Main Job reference, then create charges as internal billing with Revenue = Cost of Main Job and Cost as per tariff.
Current implementation auto-creates Internal Jobs for no-charge non-main legs, but users cannot confirm assumptions before creation. This update introduces a guided dialog so users can review defaults and provide missing operational details in one step.
Event the dialog when all conditions are true:
- User initiates Create Bookings/Orders from a Sales Quote.
- Leg is non-main.
- Leg service has no quote charges (internal job condition).
- Target document is not already created for that leg.
If multiple legs qualify, show the dialog once per leg in sequence, or as a leg selector within one modal.
- Confirm that this leg will be created as an Internal Job.
- Pre-populate fields from Sales Quote, routing leg, and defaults.
- Collect only details that are still missing and required for the target job type.
- Prevent creating incomplete Internal Jobs.
Suggested modal title:
Create Internal Job - {service_type} ({leg_identifier})
Sections:
-
Context (read-only)
- Sales Quote
- Main Job (type + document)
- Service Type
- Routing leg reference
-
Prefilled defaults (editable)
- Company / Billing Company
- Branch / Cost Center / Department (if applicable)
- Posting date / Expected dates
- Currency and exchange rate policy
-
Required additional details (must fill before submit)
- Operation owner / assignee
- Vendor or partner details (if service-specific)
- Service-specific operational fields (vehicle, vessel, customs office, etc.)
-
Internal billing preview (read-only with override controls where allowed)
is_internal_job = 1-
main_job_typeandmain_job - Revenue basis:
= main job allocated cost - Cost basis:
= tariff / configured costing rule
Use deterministic fallback order:
- Routing leg values (highest priority)
- Sales Quote header values
- Party / company defaults
- System defaults
Examples:
- Company: leg company -> quote company -> user default company.
- Branch/cost center: leg -> quote -> company default.
- Dates: quote transaction date -> today.
- Currency: quote currency -> company currency.
- Main Job reference: always derived from the already-resolved main service document.
Before showing submit action:
- Resolve required fields by target DocType metadata + service-specific rules.
- Mark fields as:
- Required now (must be entered in dialog)
- Can defer (allowed empty at creation, completed later)
- Disable submit until all Required now fields are valid.
Validation messages should be field-level and actionable (for example: Select Transporter for Transport Internal Job).
-
Create Internal Job
- Creates document with defaults + user input.
- Applies internal flags and main-job linkage.
- Runs normal server validations and returns created doc link.
-
Skip this leg
- Does not create current internal job; continue with other legs.
- Log skipped leg in result summary.
-
Cancel all
- Stop creation flow; no further legs processed.
After each successful creation:
- Event toast with created document name and service type.
- Append to a final summary table:
- Created
- Skipped
- Failed (with reason)
If server-side creation fails, keep dialog open with returned error and preserve entered values.
- Keep existing backend rule: no-charge non-main service => internal job semantics.
- Extend create method input contract to accept
internal_job_dialog_payloadper leg. - Server remains source of truth for:
- Internal job flagging
- Main job link integrity
- Revenue/cost basis assignment
- Permission and mandatory validation
- Auditability: store who confirmed dialog and when.
- Idempotency: repeated submit should not duplicate jobs for same quote leg.
- Performance: bulk-create path should still support multi-leg processing with minimal round trips.
- Consistency: same dialog pattern should be reusable across Air, Sea, Transport, and Customs flows.
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