Skip to content

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:

  1. Validates the order (configuration active, disposition type set, compliance items present).
  2. Ensures the customer contact is synced to FastBound (creates the contact if needed).
  3. Creates a pending disposition via the appropriate API endpoint.
  4. Attaches the contact to the disposition.
  5. Adds all compliance items with their FastBound item IDs and sale prices.
  6. 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:

  1. Sets is4473 = True on the sale order.
  2. Records the NTN number.
  3. Downloads the 4473 PDF and attaches it to the order.
  4. 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:

  1. The module validates that either the 4473 is completed or an NTN number is present.
  2. Calls POST /Dispositions/{id}/Commit in FastBound.
  3. Marks each compliance lot as disposed with the current date and disposition type.
  4. Posts a chatter message on each lot with the disposition details.
  5. Locks the sale order to prevent further changes.
  6. 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:

  1. Set the disposition type to Theft/Loss.
  2. Select the theft/loss sub-type from the SmartList (e.g., Stolen, Lost).
  3. No contact or 4473 is required.
  4. Click Sync to FastBound to create the disposition.
  5. Click Commit Disposition to finalize.

Destruction

For destroyed firearms:

  1. Set the disposition type to Destroyed.
  2. No contact, 4473, or sub-type is required.
  3. Click Sync to FastBound to create the disposition.
  4. 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:

  1. Creates a draft sale order behind the scenes with the compliance items.
  2. Creates a pending FastBound disposition.
  3. Adds the compliance items to the disposition.
  4. Locks the disposition, which generates a Form 4473.
  5. Returns the Buyer Certification PIN that the customer uses to complete the 4473 on the FastBound kiosk or tablet.
  6. 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:

  1. Verifies the 4473 is completed (or NTN is present).
  2. Commits the disposition in FastBound.
  3. Marks all compliance lots as disposed.
  4. 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.configuration records into the POS session.
  • requires_compliance field 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:

  1. Click Apply Trade Credit.
  2. The wizard shows the available credit balance.
  3. Enter the amount to apply.
  4. 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