Repository
OCA/account-fiscal-rule · module folder · Try on Runboat
Module version
1.1.1
Category
Accounting
Folder size
5.23 MB
License
AGPL-3
Application
Yes
Auto-installable
No
Website
https://github.com/OCA/account-fiscal-rule
Last tracking update
2026-08-07 08:43:06
Authors
Odoo Community Association (OCA), Sodexis, Open Source Integrators, Fabrice Henrion
Maintainers
Odoo Community Association (OCA), Sodexis, Open Source Integrators, Fabrice Henrion
Committers
Daniel Reis, Don Kendall, kobros-tech, Weblate, OCA-git-bot, oca-ci
Odoo dependencies
Python dependencies
Avalara
System dependencies
None
Required by
account_avatax_exemption, account_avatax_oca_log, account_avatax_sale_oca
Description
**AVALARA CERTIFICATION PENDING!**

Odoo provides integration with AvaTax, a tax solution software by
Avalara which includes sales tax calculation for all US states and
territories and all Canadian provinces and territories (including GST,
PST, and HST).

This module is capable of automatically detecting origin (Output
Warehouse) and destination (Client Address), then calculating and
reporting taxes to the user's Avalara account as well as a recording the
correct sales taxes for the validated addresses within Odoo ERP.

This module is compatible both with the Odoo Enterprise and Odoo
Community editions.

An Avatax account is needed. Account information to access the Avatax
dashboard can be obtained through the Avalara website here:
<https://www.avalara.com/products/calculations.html>

Once configured, the module operates in the background and performs
calculations and reporting seamlessly to the AvaTax server.

This guide includes instructions for the following elements:

- Activating your organization's AvaTax account and downloading the
  product
- Entering the AvaTax credentials into your Odoo database and
  configuring it to use AvaTax services and features within Odoo

Note: Test the module before deploying in live environment. All changes
to the AvaTax settings must be performed by a user with administrative
access rights.

**IMPORTANT - resolving name conflict with Odoo EE**

Avatax support was added to Odoo EE 14 and 15. Unfortunately the module
names used are the same as the OCA ones, and because of this name
collision the OCA modules were forced to change name.

The main module was renamed from `account_avatax` (now used by Odoo EE)
to `account_avatax_oca`.

To apply this change in your odoo database and continue using the OCA
Avalara certified connector:

> 1.  Ensure you have the latest version from the OCA, and you see `account_avatax_oca`  
>     in your Apps list.
>
> 2.  Install the new `account_avatax_oca` module
>
> 3.  Unistall the `account_avatax` module
>
> 4.  Confirm that your configurations were kept safe, in particular:  
>     Avatax API, "Avatax" default Fiscal Position, and "Avatax" default
>     Tax record.

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
exemption_code_tree_view exemption.code.tree.view exemption.code list New
view_avalara_salestax_address_validate Address Validatation avalara.salestax.address.validate form New
view_avalara_salestax_form avalara.salestax.form avalara.salestax form New
view_avalara_salestax_getcompany avalara.salestax.getcompany form New
view_avalara_salestax_ping Test Connection avalara.salestax.ping form New
view_avalara_salestax_tree avalara.salestax.tree avalara.salestax list New
view_fiscal_position_form_avatax account.fiscal.position form add Avatax account.fiscal.position form Inherits account.view_account_position_form
view_move_form_inherit_1 account.move.form.inherit account.move form Inherits account.view_move_form
view_partner_details_form_inherit1 res.partner.details.form.inherit1 res.partner form Inherits base.view_partner_form
view_product_category_form_avatax_inherit product.category.form.avatax.inherit product.category form Inherits product.product_category_form_view
view_product_normal_form_avatax_inherit product.normal.form.avatax product.template form Inherits product.product_template_form_view
view_product_tax_code_form product.tax.code.form product.tax.code form New
view_product_tax_code_tree product.tax.code.tree product.tax.code list New
view_tax_form_avatax account.tax.form.avatax account.tax form Inherits account.view_tax_form
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (14)

New fields (1)
  • is_avatax Boolean
    string='Use Avatax API'
Public methods (0)

No public methods.

New fields (15)
  • avatax_amount Float
    copy=False string='AvaTax'
  • avatax_request_log Text
    copy=False readonly=True args: 'Avatax API Request Log'
  • avatax_response_log Text
    copy=False readonly=True args: 'Avatax API Response Log'
  • calculate_tax_on_save Boolean
  • exemption_code Char
    compute=_compute_onchange_exemption help='It show the customer exemption number' readonly=False store=True args: 'Exemption Number'
  • exemption_code_id Many2one → exemption.code
    compute=_compute_onchange_exemption help='It show the customer exemption code' readonly=False store=True args: 'exemption.code', 'Exemption Code'
  • exemption_locked Boolean
    help="Exemption code won't be automatically changed, for instance, when changing the Customer."
  • hide_exemption Boolean
    compute=_compute_hide_exemption default=<expr> help='Uncheck the this field to show exemption fields on SO/Invoice form view. Also, it will show Tax based on shipping address button' args: 'Hide Exemption & Tax Based on shipping address'
  • invoice_doc_no Char
    help='Reference of the invoice' readonly=True args: 'Source/Ref Invoice No'
  • is_avatax Boolean
    related='fiscal_position_id.is_avatax'
  • location_code Char
  • so_partner_id Many2one → res.partner
    comodel_name='res.partner' string='SO Partner'
  • tax_address_id Many2one → res.partner
    compute='_compute_tax_address_id' args: 'res.partner', 'Tax Shipping Address'
  • tax_on_shipping_address Boolean
    default=True args: 'Tax based on shipping address'
  • warehouse_id Many2one → stock.warehouse
    args: 'stock.warehouse', 'Warehouse'
Public methods (10)
  • avatax_commit_taxes(self)
  • avatax_compute_taxes(self, commit=False)
    Called from Invoice's Action menu. Forces computation of the Invoice taxes
  • button_draft(self)
    Sets invoice to Draft, either from the Posted or Cancelled states
  • create(self, vals_list)
    @api.model_create_multi
  • get_origin_tax_date(self)
  • is_avatax_calculated(self)
    Only apply Avatax for these types of documents. Can be extended to support other types.
  • onchange_avatax_calculation(self)
    @api.onchange('invoice_line_ids', 'warehouse_id', 'tax_address_id', 'tax_on_shipping_address', 'partner_id')
  • onchange_reset_avatax_amount(self)
    @api.onchange('tax_address_id', 'fiscal_position_id')
    When changing quantities or prices, reset the Avatax computed amount. The Odoo computed tax amount will then be shown, as a reference. The Avatax amount will be recomputed upon document validation.
  • onchange_warehouse_id(self)
    @api.onchange('warehouse_id')
  • write(self, vals)

New fields (1)
  • avatax_amt_line Float
    copy=False string='AvaTax Line'
Public methods (1)
  • onchange_reset_tax_amt(self)
    @api.onchange('price_unit', 'discount', 'quantity')
    When changing quantities or prices, reset the Avatax computed amount. The Odoo computed tax amount will then be shown, as a reference. The Avatax amount will be recomputed upon document validation.

New fields (1)
  • is_avatax Boolean
Public methods (2)
  • compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False, handle_price_include=True, include_caba_tags=False, fixed_multiplicator=1)
    Adopted as the central point to inject custom tax computations. Avatax logic is triggered if the "avatax_invoice" is set in the context. To find the Avatax amount, we search an Invoice line with the same quantity, price and product.
  • get_avalara_tax(self, tax_rate, doc_type)
    @api.model

New fields (21)
  • account_number Char
    help='Account Number provided by AvaTax' name='Account ID' required=True
  • active Boolean
    default=True help='Uncheck the active field to hide the record'
  • auto_generate_customer_code Boolean
    default=True help="This will generate customer code for the customer used in the transaction, if it doesn't have one already. Each code is unique per customer. When this is disabled, you will have to manually go to each customer and manually generate their customer code. This is required for Avatax and is only generated one time." args: 'Automatically generate missing customer code'
  • company_code Char
    default='DEFAULT' help='The company code as defined in the Admin Console of AvaTax' required=True
  • company_id Many2one → res.company
    default=<expr> help='Company which has subscribed to the AvaTax service' required=True args: 'res.company', 'Company'
  • company_partner_id Many2one
    related='company_id.partner_id' string='Company Address'
  • country_ids Many2many → res.country
    default=_get_avatax_supported_countries help='Countries where address validation will be used' args: 'res.country', 'avalara_salestax_country_rel', 'avalara_salestax_id', 'country_id', 'Countries'
  • disable_address_validation Boolean
    help='Disables the ability to perform address validation'
  • disable_tax_calculation Boolean
    help='No tax calculation requests will be sent to the AvaTax web service.' args: 'Disable AvaTax Calculation'
  • disable_tax_reporting Boolean
    help='No transactions will be recorded (commited) to the Avatax service.' args: 'Disable Document Recording/Commiting'
  • force_address_validation Boolean
    help='Only compute taxes if addresses were validated by the Avatax service' args: 'Require Validated Addresses'
  • hide_exemption Boolean
    default=False help='Uncheck the this field to show exemption fields on SO/Invoice form view. Also, it will show Tax based on shipping address button' args: 'Hide Exemption & Tax Based on shipping address'
  • invoice_calculate_tax Boolean
    help="Automatically triggers API to calculate tax If changes made onInvoice's warehouse_id, tax_on_shipping_address, Invoice line's price_unit, discount, quantity" args: 'Auto Calculate Tax on Invoice Save'
  • license_key Char
    help='License Key provided by AvaTax' required=True
  • logging Boolean
    help='Enables detailed AvaTax transaction logging within application' args: 'Log API Requests'
  • request_timeout Integer
    default=300 help='Defines AvaTax request time out length, AvaTax best practices prescribes default setting of 300 seconds'
  • result_in_uppercase Boolean
    help='The address validation results are returned in in upper case' args: 'Return validation results in upper case'
  • service_url Selection
    default='https://rest.avatax.com/api/v2' help='The url to connect with' string='Service URL' args: [('https://rest.avatax.com/api/v2', 'Production (REST API)'), ('https://sandbox-rest.avatax.com/api/v2', 'Sandbox (REST API)')]
  • upc_enable Boolean
    help='Allows ean13 to be reported in place of Item Reference as upc identifier.' args: 'Enable UPC Taxability'
  • use_so_partner_id Boolean
    help="Use Sales Order's Customer field to determine Taxable Status on the Customer Invoice. If no Sales Order exists, Customer field on the invoice form view will be used instead" string='Use Sale Customer Code on Invoice'
  • validation_on_save Boolean
    help='Automatically validates addresses when they are created or modified' args: 'Automatic Address Validation'
Public methods (6)
  • commit_transaction(self, doc_code, doc_type)
  • create_transaction(self, doc_date, doc_code, doc_type, partner, ship_from_address, shipping_address, lines, user=None, exemption_number=None, exemption_code_name=None, commit=False, invoice_date=None, reference_code=None, location_code=None, is_override=None, currency_id=None, ignore_error=None, log_to_record=False)
  • get_avatax_rest_service(self)
  • ping(self)
  • unvoid_transaction(self, doc_code, doc_type)
  • void_transaction(self, doc_code, doc_type)

New fields (16)
  • city Char
  • country Char
  • date_validation Date
  • original_city Char
    readonly=True
  • original_country Char
    readonly=True
  • original_state Char
    readonly=True
  • original_street Char
    readonly=True
  • original_street2 Char
    readonly=True
  • original_zip Char
    readonly=True
  • partner_latitude Float
    args: 'Latitude'
  • partner_longitude Float
    args: 'Longitude'
  • state Char
  • street Char
  • street2 Char
  • validation_method Char
  • zip Char
Public methods (2)
  • accept_valid_address(self)
    Updates the existing address with the valid address returned by the service.
  • default_get(self, fields)
    @api.model
    Returns the default values for the fields.

New fields (1)
  • company_code Selection
    selection=_get_company_codes string='Select a Company'
Public methods (1)
  • action_set_code(self)

New fields (1)
  • name Char
Public methods (2)
  • default_get(self, fields)
    @api.model
  • ping(self)
    @api.model
    Call the AvaTax's Ping Service to test the connection.

New fields (2)
  • code Char
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (2)
  • applicable_tax_code_id Many2one → product.tax.code
    compute=_compute_applicable_tax_code args: 'product.tax.code', 'Applicable AvaTax Code'
  • tax_code_id Many2one → product.tax.code
    args: 'product.tax.code', 'AvaTax Code'
Public methods (0)

No public methods.

New fields (3)
  • description Char
  • name Char
    required=True args: 'Code'
  • type Selection
    help='Type of tax code as defined in AvaTax' required=True args: [('product', 'Product'), ('freight', 'Freight'), ('service', 'Service'), ('digital', 'Digital'), ('other', 'Other')]
Public methods (0)

No public methods.

New fields (2)
  • applicable_tax_code_id Many2one → product.tax.code
    compute=_compute_applicable_tax_code args: 'product.tax.code', 'Applicable AvaTax Code'
  • tax_code_id Many2one → product.tax.code
    help='AvaTax Product Tax Code' args: 'product.tax.code', 'Product AvaTax Code'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_avatax_config_company(self)
    Returns the AvaTax configuration for the Company

New fields (11)
  • customer_code Char
    copy=False
  • date_validation Date
    copy=False help='The date the address was last validated by AvaTax and accepted' readonly=True args: 'Last Validation Date'
  • exemption_code_id Many2one → exemption.code
    args: 'exemption.code', 'Exemption Code (Deprecated)'
  • exemption_number Char
    args: 'Exemption Number (Deprecated)'
  • property_exemption_code_id Many2one → exemption.code
    company_dependent=True help='The type of exemption granted' args: 'exemption.code', 'Exemption Code'
  • property_exemption_country_wide Boolean
    help='When enabled, the delivery address State is irrelevant when looking up the exemption status, meaning that the exemption is considered applicable for all states' args: 'Exemption Applies Country Wide'
  • property_exemption_number Char
    company_dependent=True help='The State identification number relevant fot the exemption' args: 'Exemption Number'
  • property_tax_exempt Boolean
    company_dependent=True help='This company or address can claim for tax exemption' args: 'Is Tax Exempt'
  • tax_exempt Boolean
    args: 'Is Tax Exempt (Deprecated))'
  • validated_on_save Boolean
    help='Indicates if the address is already validated on save before calling the wizard'
  • validation_method Selection
    copy=False help='It gets populated when the address is validated by the method' readonly=True args: [('avatax', 'Avalara'), ('other', 'Other')], 'Address Validation Method'
Public methods (10)
  • button_avatax_validate_address(self)
    Method is used to verify of state and country
  • check_exemption_number(self)
    @api.depends('property_tax_exempt', 'property_exemption_code_id', 'property_exemption_number')
    When tax exempt check then at least exemption number or exemption code should be filled
  • create(self, vals_list)
    @api.model_create_multi
  • generate_cust_code(self)
    Auto populate customer code
  • get_country_from_code(self, code)
    Returns the country from the code.
  • get_state_from_code(self, state_code, country_code)
    Returns the state from the code.
  • get_valid_address_vals(self, validation_on_save=False)
  • multi_address_validation(self, validation_on_save=False)
  • onchange_tax_exemption(self)
    @api.onchange('tax_exempt')
  • write(self, vals)

Loading…

Loading…

Loading…

Loading…

Status
Open migration PR — not merged yet for this version
CI status
checks failing
Open since
88 days ago
Last activity
59 days ago
Repository
OCA/account-fiscal-rule
Pull request
[19.0][MIG] account_avatax_oca: Migration to 19.0 (#591)