FastBound Disposition Module¶
Technical name: fastbound_disposition
Version: 18.0.1.0.0
Category: Sales / Compliance
Dependencies: fastbound_core, fastbound_acquisition, sale_stock, point_of_sale, pos_sale
The Disposition module handles all outbound firearm workflows -- every scenario where a serialized item leaves your inventory and must be recorded in your FastBound A&D book.
Disposition Types¶
The module supports four categories of disposition, each with its own compliance requirements:
| Type | 4473 Required | Contact Required | Use Case |
|---|---|---|---|
| Regular Sale | Yes | Yes | Standard over-the-counter sale to a customer |
| NFA Transfer | Yes | Yes | National Firearms Act items (suppressors, SBRs, etc.) |
| Theft/Loss | No | No | Reporting stolen or lost firearms |
| Destroyed | No | No | Reporting destroyed firearms |
Sale Order Disposition Workflow¶
The primary disposition workflow operates through Odoo sale orders.
Step-by-Step Process¶
flowchart LR
A[Sale Order] --> B[Add Compliance Items]
B --> C[Sync to FastBound]
C --> D[4473 Processing]
D --> E[Commit Disposition]
E --> F[Items Disposed]
1. Create the Sale Order¶
Create a standard sale order. Add products that are flagged as compliance items. Assign serial numbers (lots) to each line.
The module automatically:
- Sets the FastBound Account from the active configuration for the company.
- Computes Requires Compliance based on whether any order line has compliance products.
- Checks and displays an FFL Warning if the customer's FFL is expired.
2. Set the Disposition Type¶
| Field | Options | Description |
|---|---|---|
| Disposition Type | Regular Sale, NFA Transfer, Theft/Loss, Destroyed | Primary classification |
| Sale Type | From SmartList (e.g., Sale, Transfer) | Sub-classification from FastBound |
| NFA Form Type | Form 3, Form 4, Form 5 | Required for NFA transfers only |
| Theft/Loss Type | From SmartList (e.g., Stolen, Lost) | Required for theft/loss only |
3. Sync to FastBound¶
Click Sync to FastBound to create the disposition. The module:
- Validates the order (configuration active, disposition type set, compliance items present).
- Ensures the customer contact is synced to FastBound (creates the contact if needed).
- Creates a pending disposition via the appropriate API endpoint.
- Attaches the contact to the disposition.
- Adds all compliance items with their FastBound item IDs and sale prices.
- Checks the initial 4473 form status.
Pending vs. Committed
The disposition is created in a pending state. It is not committed (finalized) until the 4473 is completed and you explicitly commit it. This allows the 4473 process to run while the order is being prepared.
4. Form 4473 Processing¶
For Regular Sale and NFA Transfer dispositions, the ATF Form 4473 must be completed before the disposition can be committed.
4473 Fields on Sale Order¶
| Field | Description |
|---|---|
| 4473 Completed | Boolean flag set when form processing is complete |
| Form Status | Current status text (e.g., "Awaiting Form 4473 Completion") |
| NTN Number | National Transaction Number from the NICS background check |
| 4473 PDF | Downloaded copy of the completed form |
Checking 4473 Status¶
Click Check 4473 Status to fetch the latest status from FastBound. The button queries the disposition and updates the form status, NTN number, and completion flag.
Automatic 4473 Completion via Webhook¶
When FastBound fires a form4473.completed webhook event, the module automatically:
- Sets
is4473 = Trueon the sale order. - Records the NTN number.
- Downloads the 4473 PDF and attaches it to the order.
- Posts a chatter message confirming completion.
Viewing the 4473 PDF¶
Click Open 4473 PDF to view or download the completed form directly from Odoo.
5. Commit Disposition¶
Once the 4473 is complete (or for Theft/Loss and Destroyed types that do not require a 4473), click Commit Disposition to finalize:
- The module validates that either the 4473 is completed or an NTN number is present.
- Calls
POST /Dispositions/{id}/Commitin FastBound. - Marks each compliance lot as disposed with the current date and disposition type.
- Posts a chatter message on each lot with the disposition details.
- Locks the sale order to prevent further changes.
- Updates related delivery pickings with the disposed flag.
Committed Dispositions Cannot Be Undone
Once a disposition is committed in FastBound, it is permanent. If you need to reverse a sale, use the Undispose action on the individual lot (see Acquisition Module).
Deleting a Pending Disposition¶
If a disposition was created in error, click Delete from FastBound to remove the pending disposition. This clears the FastBound ID and external ID from the sale order, allowing you to start over.
NFA Transfer Workflows¶
NFA (National Firearms Act) items require special transfer forms:
| Form | API Type | Description |
|---|---|---|
| Form 3 | NFA/Form 3 |
Dealer-to-dealer transfer (tax-exempt) |
| Form 4 | NFA/Form 4 |
Transfer to an individual (requires $200 tax stamp) |
| Form 5 | NFA/Form 5 |
Tax-exempt transfer (government, law enforcement) |
When the disposition type is set to NFA Transfer, you must also select the NFA Form Type. The module calls POST /Dispositions/NFA instead of the standard disposition endpoint.
Theft/Loss and Destruction Reporting¶
Theft/Loss¶
For stolen or lost firearms:
- Set the disposition type to Theft/Loss.
- Select the theft/loss sub-type from the SmartList (e.g., Stolen, Lost).
- No contact or 4473 is required.
- Click Sync to FastBound to create the disposition.
- Click Commit Disposition to finalize.
Destruction¶
For destroyed firearms:
- Set the disposition type to Destroyed.
- No contact, 4473, or sub-type is required.
- Click Sync to FastBound to create the disposition.
- Click Commit Disposition to finalize.
POS Integration¶
The Disposition module extends Odoo's Point of Sale to support firearm sales at the counter.
POS Configuration¶
Navigate to Point of Sale > Configuration > Point of Sale and enable FastBound integration:
| Field | Description |
|---|---|
| FastBound Account | The FastBound configuration to use for this POS |
| Auto Dispose on Payment | Automatically commit the disposition when the POS payment is processed |
POS Workflow¶
flowchart LR
A[POS Session] --> B[Scan/Select Items]
B --> C[Start 4473]
C --> D[Customer Completes 4473]
D --> E[Process Payment]
E --> F[Dispose Order]
Start 4473 from POS¶
When a cashier adds compliance items to a POS order, the Start 4473 button:
- Creates a draft sale order behind the scenes with the compliance items.
- Creates a pending FastBound disposition.
- Adds the compliance items to the disposition.
- Locks the disposition, which generates a Form 4473.
- Returns the Buyer Certification PIN that the customer uses to complete the 4473 on the FastBound kiosk or tablet.
- Returns the external 4473 URL for the customer-facing device.
The cashier gives the PIN to the customer, who completes the 4473 electronically. Once the 4473 is done, the webhook fires and updates the sale order.
NTN Support¶
The POS displays the NTN (National Transaction Number) status on the order. The cashier can see whether the NICS check has been completed and approved before processing payment.
Dispose Order from POS¶
After the 4473 is complete and payment is processed, the Dispose Order button:
- Verifies the 4473 is completed (or NTN is present).
- Commits the disposition in FastBound.
- Marks all compliance lots as disposed.
- Validates the delivery picking.
If Auto Dispose on Payment is enabled in the POS configuration, step 2 happens automatically when the customer pays.
Pull FastBound Order¶
The Pull FastBound Order button allows pulling existing FastBound 4473 orders into the POS, useful when a customer started the 4473 process online or at a different terminal.
POS Data Loading¶
The module extends the POS data layer to load:
fastbound.configurationrecords into the POS session.requires_compliancefield on products for UI display.- Compliance-aware stock move handling for auto-validation of FastBound pickings.
Trade Credit System¶
The Disposition module includes a trade credit tracking system for customer trade-in transactions.
Trade History¶
Each customer has a trade.history record that tracks their trade credit balance:
| Field | Description |
|---|---|
| Customer | The partner this credit belongs to |
| Total Credit | Net credit balance (positive = available) |
| Total Earned | Sum of all credits from trade-ins |
| Total Used | Sum of all credits applied to orders |
| Last Activity | Date of the most recent transaction |
| Transactions | Number of credit/debit entries |
Credit Transactions¶
Individual transactions are stored as trade.history.line records:
| Field | Description |
|---|---|
| Amount | Positive for credits earned, negative for credits used |
| Origin | Source document reference |
| Trade Date | Date of the transaction |
| Note | Optional description |
Applying Trade Credit¶
On a sale order with a customer who has available trade credit:
- Click Apply Trade Credit.
- The wizard shows the available credit balance.
- Enter the amount to apply.
- The credit is deducted from the customer's balance and applied as a discount on the order.
One Record Per Customer
A SQL constraint enforces that each customer has only one trade history record per company. The get_or_create_for_partner method automatically finds or creates the record as needed.
Sale Order Extensions¶
The Disposition module adds the following fields and actions to sale.order:
Fields¶
| Field | Description |
|---|---|
| FastBound ID | Disposition UUID in FastBound |
| External ID | Odoo SO reference sent to FastBound |
| FastBound Account | Configuration used for this disposition |
| Disposition Type | Regular Sale, NFA, Theft/Loss, or Destroyed |
| Sale Type | Sub-type from SmartList |
| NFA Form Type | Form 3, 4, or 5 (NFA only) |
| Theft/Loss Type | Sub-type from SmartList (Theft/Loss only) |
| 4473 Completed | Whether Form 4473 is done |
| Form Status | Current 4473 processing status |
| NTN Number | National Transaction Number |
| 4473 PDF | Binary attachment of completed form |
| Disposed | Whether disposition has been committed |
| Requires Compliance | Computed -- whether order has compliance items |
| FFL Warning | Computed -- warning if customer FFL is expired |
| Can Sync | Computed -- whether order can be synced to FastBound |
| Can Commit | Computed -- whether disposition can be committed |
| Trade Credit Applied | Whether trade credit has been applied |
| Invoice Number | Optional invoice reference for FastBound |
Smart Buttons and Actions¶
| Button | Visible When | Action |
|---|---|---|
| Sync to FastBound | Has compliance items, not yet synced | Creates pending disposition |
| Check 4473 Status | Synced to FastBound | Fetches latest form status |
| Commit Disposition | 4473 complete or Theft/Loss/Destroyed | Finalizes the disposition |
| Open 4473 PDF | PDF is available | Opens form in new tab |
| Delete from FastBound | Synced but not committed | Removes pending disposition |
| Apply Trade Credit | Customer has available credit | Opens trade credit wizard |
Disposition API Details¶
The module extends the FastBound API service with disposition-specific methods:
CreateAndCommit Pattern¶
Like acquisitions, dispositions support the optimized CreateAndCommit pattern:
POST /Dispositions/CreateAndCommit
{
"type": "Sale",
"date": "2026-01-16T10:00:00.000Z",
"contactId": "abc-123-def",
"externalId": "SO/00001",
"items": [
{
"id": "fastbound-item-id-123",
"price": 599.99
}
]
}
Disposition Lock (4473 Creation)¶
The PUT /Dispositions/Lock/{id} endpoint transitions a disposition to Locked state and generates a 4473 form. The response includes the buyerCertificationPIN for the customer.
Available Endpoints¶
| Method | Endpoint | Description |
|---|---|---|
POST |
/Dispositions |
Create pending disposition |
POST |
/Dispositions/NFA |
Create NFA disposition |
POST |
/Dispositions/TheftLoss |
Create theft/loss disposition |
POST |
/Dispositions/Destroyed |
Create destruction disposition |
POST |
/Dispositions/CreateAndCommit |
Create and commit in one call |
GET |
/Dispositions/{id} |
Get disposition details |
GET |
/Dispositions/GetByExternalId/{id} |
Get by Odoo reference |
GET |
/Dispositions/Only4473s |
Get 4473-related dispositions |
PUT |
/Dispositions/{id} |
Update pending disposition |
PUT |
/Dispositions/{id}/AttachContact/{contactId} |
Attach contact |
PUT |
/Dispositions/{id}/DetachContact |
Detach contact |
PUT |
/Dispositions/Lock/{id} |
Lock and create 4473 |
POST |
/Dispositions/{id}/Items |
Add items |
DELETE |
/Dispositions/{id}/Items/{itemId} |
Remove item |
POST |
/Dispositions/{id}/Commit |
Commit disposition |
DELETE |
/Dispositions/{id} |
Delete pending disposition |