diff --git a/account_avatax_oca/README.rst b/account_avatax_oca/README.rst new file mode 100644 index 000000000..95b753e6c --- /dev/null +++ b/account_avatax_oca/README.rst @@ -0,0 +1,531 @@ +================================== +Avalara Avatax Certified Connector +================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f10e5df6dbd20f081048703034a1a6a8a23e83abee5e6ba9b174bb90dca4c95e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--fiscal--rule-lightgray.png?logo=github + :target: https://github.com/OCA/account-fiscal-rule/tree/18.0/account_avatax_oca + :alt: OCA/account-fiscal-rule +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-fiscal-rule-18-0/account-fiscal-rule-18-0-account_avatax_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/account-fiscal-rule&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +**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. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +Before installing the Avatax app, the Avalara Python client must be +installed in your system. It is available at +https://pypi.org/project/Avalara. + +Typically it can be installed in your system usin ``pip``: + +:: + + pip3 install Avalara + +The base app, ``account_Avatax``, adds Avatax support to Customer +Invoices. Inthe official app store: +https://apps.odoo.com/apps/modules/15.0/account_avatax/ + +The ``account_avatax_sale`` extension adds support to Quotations / Sales +Orders. Inthe official app store: +https://apps.odoo.com/apps/modules/15.0/account_avatax_sale/ + +In most cases you will want to download and install both modules. + +To install the Avatax app: + +- Download the AvaTax modules +- Extract the downloaded files +- Upload the extracted directories into your Odoo module/addons + directory +- Log into Odoo as an Administrator and enable the Developer Mode, in + 'Settings' +- Navigate to 'Apps', select the 'Update Apps List' menu, to have the + new apps listed. +- In the Apps list, search for 'AvaTax' +- Click on the Install button. If available, the ``account_avatax_sale`` + module will also be installed automatically. + +Configuration +============= + +To configure an Odoo company to use Avatax, follow these steps. Note tha +tsome of them might be configured out of the box for the Odoo default +company. + +1. Configure AvaTax API Connection +2. Configure Company Taxes +3. Configure Customers +4. Configure Products + +Configure Avatax API Connection +------------------------------- + +Before you can configure the Odoo Avatax connector, you will need some +connection details ready: + +- Login to https://home.avalara.com/ +- Navigate to Settings >> All AvaTax Settings. There you will see the + company details. +- Take note of the Account ID and Company Code +- Navigate to Settings >> License and API Keys. In the "Reset License + Key" tab, click on the "Generate License Key" button, and take note of + it. + +To configure AvaTax connector in Odoo: + +- Navigate to: Accounting/Invoicing App >> Configuration >> AvaTax >> + AvaTax API +- Click on the Create button +- Fill out the form with the elements collected from the AvaTax website: + + - Account ID + - License Key + - Service URL: usually Production, or Sandox if you have that + available. + - Company Code + +- Click the Test Connection button +- Click the Save button + +Other Avatax API advanced configurations: + +- Tax Calculation tab: + + - Disable Document Recording/Commiting: invoices will not be stored in + Avalara + - Enable UPC Taxability: this will transmit Odoo's product ean13 + number instead of its Internal Reference. If there is no ean13 then + the Internal Reference will be sent automatically. + - Hide Exemption & Tax Based on shipping address -- this will give + user ability to hide or show Tax Exemption and Tax Based on shipping + address fields at the invoice level. + +- Address Validation tab: + + - Automatic Address Validation: automatically attempts to validate on + creation and update of customer record, last validation date will be + visible and stored + - Require Validated Addresses: if validation for customer is required + but not valid, the validation will be forced + - Return validation results in upper case: validation results will + return in upper case form + +- Advanced tab: + + - Automatically generate missing customer code: generates a customer + code on creation and update of customer profile + - Log API requests: enables detailed AvaTax transaction logging within + application + - Request Timeout: default is 300ms + - Countries: countries where AvaTax can be used. + +Configure Company Taxes +----------------------- + +Each company linked to AvaTax and their associated warehouses should be +configured to ensure the correct tax is calculated and applied for all +transactions. + +Validate Company Address: + +- On the AvTax API configuration form, click on the "Company Address" + link +- On the company address form, click on the "validate" button in the + "AvaTax" tab + +Validate Warehouse Address: + +- Navigate to: Inventory >> Configuration >> Warehouse Management >> + Warehouses +- For each warehouse, open the correspoding from view +- On the Warehouse form, click on the "Address" link +- On the warehouse address form, click on the "validate" button in the + "AvaTax" tab + +Fiscal Positions is what tells the AvaTax connector if the AvaTax +service should be used for a particular Sales Order or Invoice. + +Configure Fiscal Position: + +- Navigate to: Accounting/Invoicing App >> Configuration >> Accounting + >> Fiscal Positions +- Ensure there is a Fiscal Position record for the Company, with the + "Use Avatax API" flag checked + +When the appropriate Fiscal Position is being used, and a tax rate is +retrieved form AvaTax, then the corresponding Tax is automatically +created in Odoo using a template tax record, that should have the +appropriate accounting configurations. + +Configure Taxes: + +- Navigate to: Accounting/Invoicing App >> Configuration >> Accounting + >> Taxes +- Ensure there is a Tax record for the Company, with the "Is Avatax" + flag checked (visible in the "Advanced Options" tab). This Tax should + have: + + - Tax Type: Sales + - Tax Computation: Percentage of Price + - Amount: 0.0% + - Distribution for Invoices: ensure correct account configuration + - Distribution for Credit Notes: ensure correct account configuration + +Configure Customers +------------------- + +| Exemption codes are allowed for users where they may apply (ex. + Government entities). +| Navigate to: Accounting or Invoicing App >> Configuration >> AvaTax >> + Exemption Code + +| The module is installed with 16 predefined exemption codes. +| You can add, remove, and modify exemption codes. + +Properly configuring each customer ensures the correct tax is calculated +and applied for all transactions. + +Create New Customer + +- Navigate to Contacts +- Click Create button + +Configure and Validate Customer Address + +- Enter Customer Address +- Under AvaTax >> Validation, click Validate button +- AvaTax Module will attempt to match the address you entered with a + valid address in its database. Click the Accept button if the address + is valid. + +Tax Exemption Status + +- If the customer is tax exempt, check the box under AvaTax >> Tax + Exemption >> Is Tax Exempt and +- Select the desired Tax Exempt Code from the dropdown menu. + +Configure Products +------------------ + +Create product tax codes to assign to products and/or product +categories. Navigate to: Accounting or Invoicing App >> Configuration >> +AvaTax >> Product Tax Codes. + +From here you can add, remove, and modify the product tax codes. + +Products in Odoo are typically assigned to product categories. AvaTax +settings can also be assigned to the product category when a product +category is created. + +- Create New Product Category + + - Navigate to: Inventory >> Configuration >> Products >> Product + Categories + - Click Create button + +- Configure Product Category Tax Code + + - Under AvaTax Properties >> Tax Code + - Select the desired Tax Code + +Usage +===== + +Customer Invoices +----------------- + +The AvaTax module is integrated into Sales Invoices and is applied to +each transaction. The transaction log in the AvaTax dashboard shows the +invoice details and displays whether the transaction is in an +uncommitted or committed status. + +A validated invoice will have a Committed status and a cancelled invoice +will have a Voided status. + +The module will check if there is a selected warehouse and will +automatically determine the address of the warehouse and the origin +location. If no address is assigned to the warehouse, the company +address is used. + +Discounts are handled when they are enabled in Odoo's settings. They are +calculated as a net deduction on the line item cost before the total is +sent to AvaTax. + +Create New Customer Invoice +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Navigate to: Accounting or Invoicing >> Customers >> Invoices. +- Click Create button. + +Validate Invoice +~~~~~~~~~~~~~~~~ + +- Ensure that Tax based on shipping address is checked. +- Line items should have AVATAX selected under Taxes for internal + records. +- To complete the invoice, click the Validate button. +- The sale order will now appear in the AvaTax dashboard. + +Register Payment +~~~~~~~~~~~~~~~~ + +- Click the Register Payment button to finalize the invoice. + +Customer Refunds +~~~~~~~~~~~~~~~~ + +Odoo applies refunds as opposed to voids in its accounting module. As +with customer invoices, the AvaTax module is integrated with customer +refunds and is applied to each transaction. + +| Refunded invoice transactions will be indicated +| with a negative total in the AvaTax interface. + +Initiate Customer Refund + +- Navigate to: Accounting or Invoicing >> Customers >> Invoices +- Select the invoice you wish to refund +- Click Add Credit Note button + +Create Credit Note + +- Under Credit Method, select Create a draft credit note. +- Enter a reason. +- Click Add Credit Note button. + +Note: You will be taken to the Credit Notes list view + +Validate Refund + +- Select the Credit Note you wish to validate, review and then click + Validate button. + +Register Refund Payment + +- Click Register Payment button to complete a refund + +Sales Orders +------------ + +The AvaTax module is integrated into Sales Orders and allows computation +of taxes. Sales order transactions do not appear in the in the AvaTax +interface. + +| The information placed in the sales order will automatically pass to + the invoice +| on the Avalara server and can be viewed in the AvaTax control panel. + +Discounts are handled when they are enabled in Odoo's settings. They +will be reported as a net deduction on the line item cost. + +Create New Sales Order + +- Navigate to: Sales >> Orders >> Orders +- Click Create button + +Compute Taxes with AvaTax + +- The module will calculate tax when the sales order is confirmed, or by + navigating to Action >> Update taxes with Avatax. At this step, the + sales order will retrieve the tax amount from Avalara but will not + report the transaction to the AvaTax dashboard. Only invoice, refund, + and payment activity are reported to the dashboard. +- The module will check if there is a selected warehouse and will + automatically determine the address of the warehouse and the origin + location. If no address is assigned to the warehouse the module will + automatically use the address of the company as its origin. Location + code will automatically populate with the warehouse code but can be + modified if needed. + +Known issues / Roadmap +====================== + +The development of this module was driven by US companies to compute +Sales Tax. + +However the Avatax service supports more use cases, that could be added: + +- Add support to EU VAT +- Add support to US Use Tax on Purchases / vendor Bills + +Other improvements that could be added: + +- Detect and warn if customers State is not a nexus available for the + current account + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Open Source Integrators +* Fabrice Henrion +* Sodexis + +Contributors +------------ + +- Odoo SA + + - Fabrice Henrion + +- Open Source Integrators (https://opensourceintegrators.com) + + - Daniel Reis + - Bhavesh Odedra + - Sandip Mangukiya + - Nikul Chaudhary + +- Serpent CS + + - Murtuza Saleh + +- Sodexis + + - Atchuthan Ubendran + +- Kencove (https://kencove.com) + + - Don Kendall + - Mohamed Alkobrosli + - Wai-Lun Lin + +Other credits +------------- + +This module was originally developed by Fabrice Henrion at Odoo SA, and +maintained up to version 11. + +For version 12, Fabrice invited partners to migrate this modules to +later version, and maintain it. + +Open Source Integrators performed the migration to Odoo 12 , and later +added support for the more up to date REST API , alongside with the +legacy SOAP API. + +With the addition of the REST API, a deep refactor was introduced, +changing the tax calculation approach, from just setting the total tax +amount, to instead adding the tax rates to each document line and then +having Odoo do all the other computations. + +For Odoo 13, the legacy SOAP support was supported, and additional +refactoring was done to contribute the module to the Odoo Community +Association. + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-dreispt| image:: https://github.com/dreispt.png?size=40px + :target: https://github.com/dreispt + :alt: dreispt + +Current `maintainer `__: + +|maintainer-dreispt| + +This module is part of the `OCA/account-fiscal-rule `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_avatax_oca/__init__.py b/account_avatax_oca/__init__.py new file mode 100644 index 000000000..0759f9486 --- /dev/null +++ b/account_avatax_oca/__init__.py @@ -0,0 +1,3 @@ +from . import models +from . import wizard +from .hooks import pre_init_hook diff --git a/account_avatax_oca/__manifest__.py b/account_avatax_oca/__manifest__.py new file mode 100644 index 000000000..b30379759 --- /dev/null +++ b/account_avatax_oca/__manifest__.py @@ -0,0 +1,35 @@ +{ + "name": "Avalara Avatax Certified Connector", + "version": "18.0.1.0.0", + "author": "Open Source Integrators, Fabrice Henrion," + "Sodexis, Odoo Community Association (OCA)", + "summary": "Compute Sales Tax using the Avalara Avatax Service", + "license": "AGPL-3", + "category": "Accounting", + "website": "https://github.com/OCA/account-fiscal-rule", + "depends": ["sale_stock", "base_geolocalize"], + "pre_init_hook": "pre_init_hook", + "data": [ + "security/avalara_salestax_security.xml", + "security/ir.model.access.csv", + "data/avalara_salestax_data.xml", + "data/avalara_salestax_exemptions.xml", + "wizard/avalara_get_company_code_view.xml", + "wizard/avalara_salestax_address_validate_view.xml", + "wizard/avalara_salestax_ping_view.xml", + "views/avalara_salestax_view.xml", + "views/partner_view.xml", + "views/product_view.xml", + "views/account_move_action.xml", + "views/account_move_view.xml", + "views/account_tax_view.xml", + "views/account_fiscal_position_view.xml", + ], + "demo": ["demo/avatax_demo.xml"], + "images": ["static/description/avatax_icon.png"], + "installable": True, + "application": True, + "external_dependencies": {"python": ["Avalara"]}, + "development_status": "Production/Stable", + "maintainers": ["dreispt"], +} diff --git a/account_avatax_oca/data/avalara_salestax_data.xml b/account_avatax_oca/data/avalara_salestax_data.xml new file mode 100644 index 000000000..8645f89ea --- /dev/null +++ b/account_avatax_oca/data/avalara_salestax_data.xml @@ -0,0 +1,22 @@ + + + Avatax Tax Mapping (US) + + + + + + AvaTax + + + + AVATAX + Sales Tax + + percent + + sale + True + + + diff --git a/account_avatax_oca/data/avalara_salestax_exemptions.xml b/account_avatax_oca/data/avalara_salestax_exemptions.xml new file mode 100644 index 000000000..2532f1b69 --- /dev/null +++ b/account_avatax_oca/data/avalara_salestax_exemptions.xml @@ -0,0 +1,69 @@ + + + + Federal Government + A + + + State Government + B + + + Tribe / Status Indian / Indian Band + C + + + Foreign Diplomat + D + + + Charitable or Benevolent Org + E + + + Religious or Educational Org + F + + + Resale + G + + + Commercial Agricultural Production + H + + + Industrial Production / Manufacturer + I + + + Direct Pay Permit + J + + + Direct Mail + K + + + Other + L + + + Local Government + N + + + Commercial Aquaculture + P + + + Commercial Fishery + Q + + + Non-Resident + R + + diff --git a/account_avatax_oca/demo/avatax_demo.xml b/account_avatax_oca/demo/avatax_demo.xml new file mode 100644 index 000000000..1890e4cff --- /dev/null +++ b/account_avatax_oca/demo/avatax_demo.xml @@ -0,0 +1,49 @@ + + + + + 123456789 + avatax_key + + + + Washington Customer + 100 Ravine Ln Ne + Bainbridge Island + + + 98110-2687 + + + + P0000000 + product + + + NT + product + + + FR020100 + freight + + + + Test Item P0000000 + consu + 100.0 + + + + Test Item NT + consu + 100.0 + + + + Common Carrier FR020100 + service + 50.0 + + + diff --git a/account_avatax_oca/hooks.py b/account_avatax_oca/hooks.py new file mode 100644 index 000000000..1e91ba21a --- /dev/null +++ b/account_avatax_oca/hooks.py @@ -0,0 +1,15 @@ +# Copyright (C) 2022 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +def pre_init_hook(env): + # Preserve key data when moving from account_avatax to account_avatax_oca + # The process is to first install account_avatax_oca + # and then uninstall account_avatax + env.cr.execute( + """ + UPDATE ir_model_data + SET module = 'account_avatax_oca' + WHERE name in ('avatax_fiscal_position_us', 'account_avatax') + """ + ) diff --git a/account_avatax_oca/i18n/account_avatax.pot b/account_avatax_oca/i18n/account_avatax.pot new file mode 100644 index 000000000..77ad94b19 --- /dev/null +++ b/account_avatax_oca/i18n/account_avatax.pot @@ -0,0 +1,1139 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_avatax +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__res_partner__validation_method__avatax +msgid "AVALARA" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_address_validate +msgid "Accept" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__account_number +msgid "Account Number" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__account_number +msgid "Account Number provided by AvaTax" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__active +msgid "Active" +msgstr "" + +#. module: account_avatax +#: model:ir.actions.act_window,name:account_avatax.action_avalara_salestax_address_validate +#: model:ir.actions.server,name:account_avatax.action_call_address_validation_method +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_address_validate +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_form +msgid "Address Validation" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__validation_method +#: model:ir.model.fields,field_description:account_avatax.field_res_users__validation_method +msgid "Address Validation Method" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_avalara_salestax_address_validate +msgid "Address Validation using AvaTax" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_form +msgid "Advanced" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__upc_enable +msgid "" +"Allows ean13 to be reported in place of Item Reference as upc identifier." +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_product_category__applicable_tax_code_id +#: model:ir.model.fields,field_description:account_avatax.field_product_product__applicable_tax_code_id +#: model:ir.model.fields,field_description:account_avatax.field_product_template__applicable_tax_code_id +msgid "Applicable AvaTax Code" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__invoice_calculate_tax +msgid "Auto Calculate Tax on Invoice Save" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__validation_on_save +msgid "Automatic Address Validation" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__auto_generate_customer_code +msgid "Automatically generate missing customer code" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__invoice_calculate_tax +msgid "" +"Automatically triggers API to calculate tax If changes made onInvoice's " +"warehouse_id, tax_on_shipping_address, Invoice line's price_unit, discount, " +"quantity" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__validation_on_save +msgid "Automatically validates addresses when they are created or modified" +msgstr "" + +#. module: account_avatax +#: model:account.tax.group,name:account_avatax.avatax_tax_group +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__avatax_amount +#: model:ir.model.fields,field_description:account_avatax.field_account_move__avatax_amount +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__avatax_amount +#: model:ir.ui.menu,name:account_avatax.menu_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_partner_details_form_inherit1 +#: model_terms:ir.ui.view,arch_db:account_avatax.view_product_normal_form_avatax_inherit +msgid "AvaTax" +msgstr "" + +#. module: account_avatax +#: model:ir.actions.act_window,name:account_avatax.action_avalara_salestax +#: model:ir.ui.menu,name:account_avatax.menu_avatax_api +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_form +msgid "AvaTax API" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_product_tax_code +#: model:ir.model.fields,field_description:account_avatax.field_product_category__tax_code_id +msgid "AvaTax Code" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_avalara_salestax +msgid "AvaTax Configuration" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_move_line__avatax_amt_line +msgid "AvaTax Line" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_product_product__tax_code_id +#: model:ir.model.fields,help:account_avatax.field_product_template__tax_code_id +msgid "AvaTax Product Tax Code" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_product_category_form_avatax_inherit +#: model_terms:ir.ui.view,arch_db:account_avatax.view_product_normal_form_avatax_inherit +msgid "AvaTax Properties" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvaTax: Notice\n" +"\n" +" Address Validation for this country not supported. But, Avalara will still calculate global tax rules." +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvaTax: Warning AvaTax could not validate the address:\n" +"%s\n" +"\n" +"You can save the address and AvaTax will make an attempt to compute taxes based on the zip code if \"Force Address Validation\" is disabled in the Avatax connector configuration. \n" +"\n" +" Also please ensure that the company address is set and Validated. You can get there by going to Sales->Customers and removing \"Customers\" filter from the search at the top. Then go to your company contact info and validate your address in the Avatax Tab" +msgstr "" + +#. module: account_avatax +#: model:ir.model.constraint,message:account_avatax.constraint_avalara_salestax_code_company_uniq +msgid "Avalara setting is already available for this company code" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__avatax_request_log +#: model:ir.model.fields,field_description:account_avatax.field_account_move__avatax_request_log +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__avatax_request_log +msgid "Avatax API Request Log" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__avatax_response_log +#: model:ir.model.fields,field_description:account_avatax.field_account_move__avatax_response_log +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__avatax_response_log +msgid "Avatax API Response Log" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_avalara_salestax_getcompany +msgid "Avatax Get Company Code" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_move_form_inherit_1 +msgid "Avatax Log" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/account_move.py:0 +#, python-format +msgid "Avatax address is not validated!" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avalara_salestax.py:0 +#, python-format +msgid "Avatax commiting document %s, but it tax reporting is disabled." +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvataxClient is not available in your system. Please contact your system " +"administrator to 'pip3 install Avalara'" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__calculate_tax_on_save +#: model:ir.model.fields,field_description:account_avatax.field_account_move__calculate_tax_on_save +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__calculate_tax_on_save +msgid "Calculate Tax On Save" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_address_validate +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_getcompany +msgid "Cancel" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__city +msgid "City" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code__code +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__name +msgid "Code" +msgstr "" + +#. module: account_avatax +#: model:product.product,name:account_avatax.avatax_product_freight +#: model:product.template,name:account_avatax.avatax_product_freight_product_template +msgid "Common Carrier FR020100" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__company_id +msgid "Company" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/res_company.py:0 +#, python-format +msgid "Company %s has no Avatax configuration." +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/res_company.py:0 +#, python-format +msgid "Company %s has too many Avatax configurations!" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__company_partner_id +msgid "Company Address" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__company_code +msgid "Company Code" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__company_id +msgid "Company which has subscribed to the AvaTax service" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_move_form_inherit_1 +msgid "Compute Taxes" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.actions.act_window,help:account_avatax.action_avalara_salestax +msgid "Configuration of AvaTax in odoo" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_form +msgid "Connection" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_ping +msgid "Connection test successful" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_res_partner +msgid "Contact" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__country_ids +msgid "Countries" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__country_ids +msgid "Countries where address validation will be used" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__country +msgid "Country" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__create_uid +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__create_uid +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_getcompany__create_uid +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_ping__create_uid +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code__create_uid +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__create_uid +msgid "Created by" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__create_date +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__create_date +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_getcompany__create_date +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_ping__create_date +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code__create_date +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__create_date +msgid "Created on" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__customer_code +#: model:ir.model.fields,field_description:account_avatax.field_res_users__customer_code +#: model_terms:ir.ui.view,arch_db:account_avatax.view_partner_details_form_inherit1 +msgid "Customer Code" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avalara_salestax.py:0 +#, python-format +msgid "" +"Customer Code for customer %(partner.name)s not defined.\n" +"\n" +" You can edit the Customer Code in customer profile. You can fix by clicking \"Generate Customer Code\" button in the customer contact information" +msgstr "" + +#. module: account_avatax +#: model:ir.model.constraint,message:account_avatax.constraint_res_partner_name_uniq +msgid "Customer Code must be unique!" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__date_validation +msgid "Date Validation" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__request_timeout +msgid "" +"Defines AvaTax request time out length, AvaTax best practices prescribes " +"default setting of 300 seconds" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__description +msgid "Description" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__product_tax_code__type__digital +msgid "Digital" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__disable_address_validation +msgid "Disable Address Validation" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__disable_tax_calculation +msgid "Disable AvaTax Calculation" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__disable_tax_reporting +msgid "Disable Document Recording/Commiting" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__disable_address_validation +msgid "Disables the ability to perform address validation" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__display_name +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__display_name +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_getcompany__display_name +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_ping__display_name +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code__display_name +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__display_name +msgid "Display Name" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__upc_enable +msgid "Enable UPC Taxability" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__logging +msgid "Enables detailed AvaTax transaction logging within application" +msgstr "" + +#. module: account_avatax +#: model:ir.actions.act_window,name:account_avatax.action_exemption_code_details +#: model:ir.model,name:account_avatax.model_exemption_code +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax.field_account_move__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__property_exemption_code_id +#: model:ir.model.fields,field_description:account_avatax.field_res_users__property_exemption_code_id +#: model:ir.ui.menu,name:account_avatax.menu_action_exemption_code_details +msgid "Exemption Code" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax.field_res_users__exemption_code_id +msgid "Exemption Code (Deprecated)" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__exemption_locked +#: model:ir.model.fields,field_description:account_avatax.field_account_move__exemption_locked +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__exemption_locked +msgid "Exemption Locked" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__exemption_code +#: model:ir.model.fields,field_description:account_avatax.field_account_move__exemption_code +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__exemption_code +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__property_exemption_number +#: model:ir.model.fields,field_description:account_avatax.field_res_users__property_exemption_number +msgid "Exemption Number" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__exemption_number +#: model:ir.model.fields,field_description:account_avatax.field_res_users__exemption_number +msgid "Exemption Number (Deprecated)" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_account_bank_statement_line__exemption_locked +#: model:ir.model.fields,help:account_avatax.field_account_move__exemption_locked +#: model:ir.model.fields,help:account_avatax.field_account_payment__exemption_locked +msgid "" +"Exemption code won't be automatically changed, for instance, when changing " +"the Customer." +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_account_fiscal_position +msgid "Fiscal Position" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__product_tax_code__type__freight +msgid "Freight" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_partner_details_form_inherit1 +msgid "Generate" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__hide_exemption +#: model:ir.model.fields,field_description:account_avatax.field_account_move__hide_exemption +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__hide_exemption +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__hide_exemption +msgid "Hide Exemption & Tax Based on shipping address" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__id +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__id +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_getcompany__id +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_ping__id +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code__id +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__id +msgid "ID" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/account_tax.py:0 +#, python-format +msgid "" +"Incorrect retrieval of Avatax amount for Invoice %(avatax_invoice)s: product" +" %(product.display_name)s, price_unit %(-price_unit)f , quantity " +"%(quantity)f" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_res_partner__validated_on_save +#: model:ir.model.fields,help:account_avatax.field_res_users__validated_on_save +msgid "" +"Indicates if the address is already validated on save before calling the " +"wizard" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_tax__is_avatax +msgid "Is Avatax" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__property_tax_exempt +#: model:ir.model.fields,field_description:account_avatax.field_res_users__property_tax_exempt +msgid "Is Tax Exempt" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__tax_exempt +#: model:ir.model.fields,field_description:account_avatax.field_res_users__tax_exempt +msgid "Is Tax Exempt (Deprecated))" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_res_partner__validation_method +#: model:ir.model.fields,help:account_avatax.field_res_users__validation_method +msgid "It gets populated when the address is validated by the method" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_account_bank_statement_line__exemption_code_id +#: model:ir.model.fields,help:account_avatax.field_account_move__exemption_code_id +#: model:ir.model.fields,help:account_avatax.field_account_payment__exemption_code_id +msgid "It show the customer exemption code" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_account_bank_statement_line__exemption_code +#: model:ir.model.fields,help:account_avatax.field_account_move__exemption_code +#: model:ir.model.fields,help:account_avatax.field_account_payment__exemption_code +msgid "It show the customer exemption number" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax____last_update +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate____last_update +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_getcompany____last_update +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_ping____last_update +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code____last_update +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__write_uid +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__write_uid +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_getcompany__write_uid +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_ping__write_uid +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code__write_uid +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__write_date +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__write_date +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_getcompany__write_date +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_ping__write_date +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code__write_date +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__date_validation +#: model:ir.model.fields,field_description:account_avatax.field_res_users__date_validation +msgid "Last Validation Date" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__partner_latitude +msgid "Latitude" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__license_key +msgid "License Key" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__license_key +msgid "License Key provided by AvaTax" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__location_code +#: model:ir.model.fields,field_description:account_avatax.field_account_move__location_code +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__location_code +msgid "Location Code" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__logging +msgid "Log API Requests" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__partner_longitude +msgid "Longitude" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_ping__name +#: model:ir.model.fields,field_description:account_avatax.field_exemption_code__name +msgid "Name" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__disable_tax_calculation +msgid "No tax calculation requests will be sent to the AvaTax web service." +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__disable_tax_reporting +msgid "No transactions will be recorded (commited) to the Avatax service." +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_ping +msgid "OK" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__force_address_validation +msgid "Only compute taxes if addresses were validated by the Avatax service" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_address_validate +msgid "Original Address" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__original_city +msgid "Original City" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__original_country +msgid "Original Country" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__original_state +msgid "Original State" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__original_street +msgid "Original Street" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__original_street2 +msgid "Original Street2" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__original_zip +msgid "Original Zip" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__product_tax_code__type__other +#: model:ir.model.fields.selection,name:account_avatax.selection__res_partner__validation_method__other +msgid "Other" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_avalara_salestax_ping +msgid "Ping Service" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/account_tax.py:0 +#, python-format +msgid "Please configure Avatax Tax for Company %s:" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/partner.py:0 +#, python-format +msgid "" +"Please enter either Exemption Number or Exemption Code for marking customer " +"as Exempt." +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"Please set the Company Address in the partner information and validate. We are checking against the first line of the address and it's empty. \n" +"\n" +" Typically located in Sales->Customers, you have to clear \"Customers\" from search filter and type in your own company name. Ensure the address is filled out and go to Avatax tab in the partner information and validate the address. Save partner update when done." +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avalara_salestax.py:0 +#, python-format +msgid "Please validate the origin warehouse address." +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avalara_salestax.py:0 +#, python-format +msgid "Please validate the shipping address for the partner %(partner.name)s." +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__product_tax_code__type__product +msgid "Product" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_product_product__tax_code_id +#: model:ir.model.fields,field_description:account_avatax.field_product_template__tax_code_id +msgid "Product AvaTax Code" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_product_category +msgid "Product Category" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_product_normal_form_avatax_inherit +msgid "Product Description" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_product_tax_code_form +msgid "Product Tax Code" +msgstr "" + +#. module: account_avatax +#: model:ir.actions.act_window,name:account_avatax.action_product_tax_code +#: model:ir.ui.menu,name:account_avatax.menu_product_tax_code +msgid "Product Tax Codes" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_product_template +msgid "Product Template" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__avalara_salestax__service_url__https://rest_avatax_com/api/v2 +msgid "Production (REST API)" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_account_bank_statement_line__invoice_doc_no +#: model:ir.model.fields,help:account_avatax.field_account_move__invoice_doc_no +#: model:ir.model.fields,help:account_avatax.field_account_payment__invoice_doc_no +msgid "Reference of the invoice" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__request_timeout +msgid "Request Timeout" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__force_address_validation +msgid "Require Validated Addresses" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__result_in_uppercase +msgid "Return validation results in upper case" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__so_partner_id +#: model:ir.model.fields,field_description:account_avatax.field_account_move__so_partner_id +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__so_partner_id +msgid "SO Partner" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__avalara_salestax__service_url__https://sandbox-rest_avatax_com/api/v2 +msgid "Sandbox (REST API)" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_getcompany +msgid "Select" +msgstr "" + +#. module: account_avatax +#: model:ir.actions.act_window,name:account_avatax.action_avalara_salestax_getcompany +msgid "Select Avatax Company Code" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_form +msgid "Select Company" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_getcompany__company_code +msgid "Select a Company" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__product_tax_code__type__service +msgid "Service" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__service_url +msgid "Service URL" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__invoice_doc_no +#: model:ir.model.fields,field_description:account_avatax.field_account_move__invoice_doc_no +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__invoice_doc_no +msgid "Source/Ref Invoice No" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__state +msgid "State" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__street +msgid "Street" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__street2 +msgid "Street2" +msgstr "" + +#. module: account_avatax +#: model:ir.model,name:account_avatax.model_account_tax +msgid "Tax" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_form +msgid "Tax Calculation" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_partner_details_form_inherit1 +msgid "Tax Exemption" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__tax_address_id +#: model:ir.model.fields,field_description:account_avatax.field_account_move__tax_address_id +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__tax_address_id +msgid "Tax Shipping Address" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__tax_on_shipping_address +#: model:ir.model.fields,field_description:account_avatax.field_account_move__tax_on_shipping_address +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__tax_on_shipping_address +msgid "Tax based on shipping address" +msgstr "" + +#. module: account_avatax +#: model:ir.actions.act_window,name:account_avatax.action_avalara_salestax_ping +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_form +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_ping +msgid "Test Connection" +msgstr "" + +#. module: account_avatax +#: model:product.product,name:account_avatax.avatax_product_sku2 +#: model:product.template,name:account_avatax.avatax_product_sku2_product_template +msgid "Test Item NT" +msgstr "" + +#. module: account_avatax +#: model:product.product,name:account_avatax.avatax_product_sku1 +#: model:product.template,name:account_avatax.avatax_product_sku1_product_template +msgid "Test Item P0000000" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"The AvaTax Address Validation Service does not support this country in the " +"configuration, please continue with your normal process." +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"The AvaTax Address Validation Service is disabled by the administrator. " +"Please make sure it's enabled for the address validation" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_res_partner__property_exemption_number +#: model:ir.model.fields,help:account_avatax.field_res_users__property_exemption_number +msgid "The State identification number relevant fot the exemption" +msgstr "" + +#. module: account_avatax +#: model:ir.model.constraint,message:account_avatax.constraint_avalara_salestax_account_number_company_uniq +msgid "The account number must be unique per company!" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__result_in_uppercase +msgid "The address validation results are returned in in upper case" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__company_code +msgid "The company code as defined in the Admin Console of AvaTax" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_res_partner__date_validation +#: model:ir.model.fields,help:account_avatax.field_res_users__date_validation +msgid "The date the address was last validated by AvaTax and accepted" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_res_partner__property_exemption_code_id +#: model:ir.model.fields,help:account_avatax.field_res_users__property_exemption_code_id +msgid "The type of exemption granted" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__service_url +msgid "The url to connect with" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avatax_rest_api.py:0 +#, python-format +msgid "The user or account could not be authenticated" +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avalara_salestax.py:0 +#, python-format +msgid "There is no Company address defined." +msgstr "" + +#. module: account_avatax +#: code:addons/account_avatax/models/avalara_salestax.py:0 +#, python-format +msgid "There is no source shipping address defined for partner %s." +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_res_partner__property_tax_exempt +#: model:ir.model.fields,help:account_avatax.field_res_users__property_tax_exempt +msgid "This company or address can claim for tax exemption" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__auto_generate_customer_code +msgid "" +"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." +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_product_tax_code__type +msgid "Type" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_product_tax_code__type +msgid "Type of tax code as defined in AvaTax" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields.selection,name:account_avatax.selection__res_partner__validation_method__usps +msgid "USPS" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__active +msgid "Uncheck the active field to hide the record" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_account_bank_statement_line__hide_exemption +#: model:ir.model.fields,help:account_avatax.field_account_move__hide_exemption +#: model:ir.model.fields,help:account_avatax.field_account_payment__hide_exemption +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__hide_exemption +msgid "" +"Uncheck the this field to show exemption fields on SO/Invoice form view. " +"Also, it will show Tax based on shipping address button" +msgstr "" + +#. module: account_avatax +#: model:product.product,uom_name:account_avatax.avatax_product_freight +#: model:product.product,uom_name:account_avatax.avatax_product_sku1 +#: model:product.product,uom_name:account_avatax.avatax_product_sku2 +#: model:product.template,uom_name:account_avatax.avatax_product_freight_product_template +#: model:product.template,uom_name:account_avatax.avatax_product_sku1_product_template +#: model:product.template,uom_name:account_avatax.avatax_product_sku2_product_template +msgid "Units" +msgstr "" + +#. module: account_avatax +#: model:ir.actions.server,name:account_avatax.action_account_invoice_compute_taxes +msgid "Update taxes with AvaTax" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__is_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_fiscal_position__is_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_move__is_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__is_avatax +msgid "Use Avatax API" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax__use_so_partner_id +msgid "Use Sale Customer Code on Invoice" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,help:account_avatax.field_avalara_salestax__use_so_partner_id +msgid "" +"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" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_partner_details_form_inherit1 +msgid "Validate" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_partner_details_form_inherit1 +msgid "Validate Address" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_address_validate +msgid "Validated Address" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_res_partner__validated_on_save +#: model:ir.model.fields,field_description:account_avatax.field_res_users__validated_on_save +msgid "Validated On Save" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_partner_details_form_inherit1 +msgid "Validation" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__validation_method +msgid "Validation Method" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_form +msgid "Visit the AvaTax Admin webpage" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_account_bank_statement_line__warehouse_id +#: model:ir.model.fields,field_description:account_avatax.field_account_move__warehouse_id +#: model:ir.model.fields,field_description:account_avatax.field_account_payment__warehouse_id +msgid "Warehouse" +msgstr "" + +#. module: account_avatax +#: model:ir.model.fields,field_description:account_avatax.field_avalara_salestax_address_validate__zip +msgid "Zip" +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_product_normal_form_avatax_inherit +msgid "describe the product characteristics..." +msgstr "" + +#. module: account_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax.view_avalara_salestax_address_validate +msgid "or" +msgstr "" diff --git a/account_avatax_oca/i18n/account_avatax_oca.pot b/account_avatax_oca/i18n/account_avatax_oca.pot new file mode 100644 index 000000000..11594aae2 --- /dev/null +++ b/account_avatax_oca/i18n/account_avatax_oca.pot @@ -0,0 +1,1175 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_avatax_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_avatax_oca +#: model:account.tax,name:account_avatax_oca.avatax +msgid "AVATAX" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +msgid "Accept" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__account_number +msgid "Account Number" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__account_number +msgid "Account Number provided by AvaTax" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__active +msgid "Active" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_avalara_salestax_address_validate +#: model:ir.actions.server,name:account_avatax_oca.action_call_address_validation_method +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Address Validation" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__validation_method +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__validation_method +msgid "Address Validation Method" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_avalara_salestax_address_validate +msgid "Address Validation using AvaTax" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Advanced" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__upc_enable +msgid "" +"Allows ean13 to be reported in place of Item Reference as upc identifier." +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_category__applicable_tax_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_product__applicable_tax_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_template__applicable_tax_code_id +msgid "Applicable AvaTax Code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__invoice_calculate_tax +msgid "Auto Calculate Tax on Invoice Save" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__validation_on_save +msgid "Automatic Address Validation" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__auto_generate_customer_code +msgid "Automatically generate missing customer code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__invoice_calculate_tax +msgid "" +"Automatically triggers API to calculate tax If changes made onInvoice's " +"warehouse_id, tax_on_shipping_address, Invoice line's price_unit, discount, " +"quantity" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__validation_on_save +msgid "Automatically validates addresses when they are created or modified" +msgstr "" + +#. module: account_avatax_oca +#: model:account.tax.group,name:account_avatax_oca.avatax_tax_group +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__avatax_amount +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__avatax_amount +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__avatax_amount +#: model:ir.ui.menu,name:account_avatax_oca.menu_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_normal_form_avatax_inherit +msgid "AvaTax" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_avalara_salestax +#: model:ir.ui.menu,name:account_avatax_oca.menu_avatax_api +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "AvaTax API" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_product_tax_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_category__tax_code_id +msgid "AvaTax Code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_avalara_salestax +msgid "AvaTax Configuration" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move_line__avatax_amt_line +msgid "AvaTax Line" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_product_product__tax_code_id +#: model:ir.model.fields,help:account_avatax_oca.field_product_template__tax_code_id +msgid "AvaTax Product Tax Code" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_category_form_avatax_inherit +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_normal_form_avatax_inherit +msgid "AvaTax Properties" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvaTax: Notice\n" +"\n" +" Address Validation for this country not supported. But, Avalara will still calculate global tax rules." +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvaTax: Warning AvaTax could not validate the address:\n" +"%s\n" +"\n" +"You can save the address and AvaTax will make an attempt to compute taxes based on the zip code if \"Force Address Validation\" is disabled in the Avatax connector configuration. \n" +"\n" +" Also please ensure that the company address is set and Validated. You can get there by going to Sales->Customers and removing \"Customers\" filter from the search at the top. Then go to your company contact info and validate your address in the Avatax Tab" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__res_partner__validation_method__avatax +msgid "Avalara" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.constraint,message:account_avatax_oca.constraint_avalara_salestax_code_company_uniq +msgid "Avalara setting is already available for this company code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__avatax_request_log +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__avatax_request_log +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__avatax_request_log +msgid "Avatax API Request Log" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__avatax_response_log +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__avatax_response_log +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__avatax_response_log +msgid "Avatax API Response Log" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_avalara_salestax_getcompany +msgid "Avatax Get Company Code" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_move_form_inherit_1 +msgid "Avatax Log" +msgstr "" + +#. module: account_avatax_oca +#: model:account.fiscal.position,name:account_avatax_oca.avatax_fiscal_position_us +msgid "Avatax Tax Mapping (US)" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/account_move.py:0 +#, python-format +msgid "Avatax address is not validated!" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "Avatax commiting document %s, but it tax reporting is disabled." +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvataxClient is not available in your system. Please contact your system " +"administrator to 'pip3 install Avalara'" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__calculate_tax_on_save +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__calculate_tax_on_save +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__calculate_tax_on_save +msgid "Calculate Tax On Save" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_getcompany +msgid "Cancel" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__city +msgid "City" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__code +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__name +msgid "Code" +msgstr "" + +#. module: account_avatax_oca +#: model:product.template,name:account_avatax_oca.avatax_product_freight_product_template +msgid "Common Carrier FR020100" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__company_id +msgid "Company" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/res_company.py:0 +#, python-format +msgid "Company %s has no Avatax configuration." +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/res_company.py:0 +#, python-format +msgid "Company %s has too many Avatax configurations!" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__company_partner_id +msgid "Company Address" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__company_code +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Company Code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__company_id +msgid "Company which has subscribed to the AvaTax service" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_move_form_inherit_1 +msgid "Compute Taxes" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.actions.act_window,help:account_avatax_oca.action_avalara_salestax +msgid "Configuration of AvaTax in odoo" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Connection" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_ping +msgid "Connection test successful" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_res_partner +msgid "Contact" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__country_ids +msgid "Countries" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__country_ids +msgid "Countries where address validation will be used" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__country +msgid "Country" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__create_uid +msgid "Created by" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__create_date +msgid "Created on" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__customer_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__customer_code +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Customer Code" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "" +"Customer Code for customer %(partner.name)s not defined.\n" +"\n" +" You can edit the Customer Code in customer profile. You can fix by clicking \"Generate Customer Code\" button in the customer contact information" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.constraint,message:account_avatax_oca.constraint_res_partner_name_uniq +msgid "Customer Code must be unique!" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__date_validation +msgid "Date Validation" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__request_timeout +msgid "" +"Defines AvaTax request time out length, AvaTax best practices prescribes " +"default setting of 300 seconds" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__description +msgid "Description" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__digital +msgid "Digital" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__disable_address_validation +msgid "Disable Address Validation" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__disable_tax_calculation +msgid "Disable AvaTax Calculation" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__disable_tax_reporting +msgid "Disable Document Recording/Commiting" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__disable_address_validation +msgid "Disables the ability to perform address validation" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__display_name +msgid "Display Name" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__upc_enable +msgid "Enable UPC Taxability" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__logging +msgid "Enables detailed AvaTax transaction logging within application" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/partner.py:0 +#, python-format +msgid "" +"Enabling the exemption status for all states may have tax compliance risks, and should be carefully considered.\n" +"\n" +" Please ensure that your tax advisor was consulted and the necessary tax exemption documentation was obtained for every state this Partner may have transactions." +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__property_exemption_country_wide +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__property_exemption_country_wide +msgid "Exemption Applies Country Wide" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_exemption_code_details +#: model:ir.model,name:account_avatax_oca.model_exemption_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__property_exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__property_exemption_code_id +#: model:ir.ui.menu,name:account_avatax_oca.menu_action_exemption_code_details +msgid "Exemption Code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__exemption_code_id +msgid "Exemption Code (Deprecated)" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__exemption_locked +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__exemption_locked +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__exemption_locked +msgid "Exemption Locked" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__exemption_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__exemption_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__exemption_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__property_exemption_number +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__property_exemption_number +msgid "Exemption Number" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__exemption_number +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__exemption_number +msgid "Exemption Number (Deprecated)" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__exemption_locked +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__exemption_locked +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__exemption_locked +msgid "" +"Exemption code won't be automatically changed, for instance, when changing " +"the Customer." +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_account_fiscal_position +msgid "Fiscal Position" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__freight +msgid "Freight" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Generate" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__hide_exemption +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__hide_exemption +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__hide_exemption +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__hide_exemption +msgid "Hide Exemption & Tax Based on shipping address" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__id +msgid "ID" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/account_tax.py:0 +#, python-format +msgid "" +"Incorrect retrieval of Avatax amount for Invoice %(avatax_invoice)s: product" +" %(product.display_name)s, price_unit %(-price_unit)f , quantity " +"%(quantity)f" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__validated_on_save +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__validated_on_save +msgid "" +"Indicates if the address is already validated on save before calling the " +"wizard" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_tax__is_avatax +msgid "Is Avatax" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__property_tax_exempt +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__property_tax_exempt +msgid "Is Tax Exempt" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__tax_exempt +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__tax_exempt +msgid "Is Tax Exempt (Deprecated))" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__validation_method +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__validation_method +msgid "It gets populated when the address is validated by the method" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__exemption_code_id +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__exemption_code_id +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__exemption_code_id +msgid "It show the customer exemption code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__exemption_code +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__exemption_code +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__exemption_code +msgid "It show the customer exemption number" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__date_validation +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__date_validation +msgid "Last Validation Date" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__partner_latitude +msgid "Latitude" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__license_key +msgid "License Key" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__license_key +msgid "License Key provided by AvaTax" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__location_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__location_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__location_code +msgid "Location Code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__logging +msgid "Log API Requests" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__partner_longitude +msgid "Longitude" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__name +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__name +msgid "Name" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__disable_tax_calculation +msgid "No tax calculation requests will be sent to the AvaTax web service." +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__disable_tax_reporting +msgid "No transactions will be recorded (commited) to the Avatax service." +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_ping +msgid "OK" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__force_address_validation +msgid "Only compute taxes if addresses were validated by the Avatax service" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +msgid "Original Address" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_city +msgid "Original City" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_country +msgid "Original Country" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_state +msgid "Original State" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_street +msgid "Original Street" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_street2 +msgid "Original Street2" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_zip +msgid "Original Zip" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__other +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__res_partner__validation_method__other +msgid "Other" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_avalara_salestax_ping +msgid "Ping Service" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/account_tax.py:0 +#, python-format +msgid "Please configure Avatax Tax for Company %s:" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/partner.py:0 +#, python-format +msgid "" +"Please enter either Exemption Number or Exemption Code for marking customer " +"as Exempt." +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"Please set the Company Address in the partner information and validate. We are checking against the first line of the address and it's empty. \n" +"\n" +" Typically located in Sales->Customers, you have to clear \"Customers\" from search filter and type in your own company name. Ensure the address is filled out and go to Avatax tab in the partner information and validate the address. Save partner update when done." +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "Please validate the origin warehouse address." +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "Please validate the shipping address for the partner %(partner.name)s." +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_product_template +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__product +msgid "Product" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_product__tax_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_template__tax_code_id +msgid "Product AvaTax Code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_product_category +msgid "Product Category" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_normal_form_avatax_inherit +msgid "Product Description" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_tax_code_form +msgid "Product Tax Code" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_product_tax_code +#: model:ir.ui.menu,name:account_avatax_oca.menu_product_tax_code +msgid "Product Tax Codes" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__avalara_salestax__service_url__https://rest_avatax_com/api/v2 +msgid "Production (REST API)" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__invoice_doc_no +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__invoice_doc_no +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__invoice_doc_no +msgid "Reference of the invoice" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__request_timeout +msgid "Request Timeout" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__force_address_validation +msgid "Require Validated Addresses" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__result_in_uppercase +msgid "Return validation results in upper case" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__so_partner_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__so_partner_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__so_partner_id +msgid "SO Partner" +msgstr "" + +#. module: account_avatax_oca +#: model:account.tax,description:account_avatax_oca.avatax +msgid "Sales Tax" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__avalara_salestax__service_url__https://sandbox-rest_avatax_com/api/v2 +msgid "Sandbox (REST API)" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_getcompany +msgid "Select" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_avalara_salestax_getcompany +msgid "Select Avatax Company Code" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Select Company" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__company_code +msgid "Select a Company" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__service +msgid "Service" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__service_url +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Service URL" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__invoice_doc_no +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__invoice_doc_no +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__invoice_doc_no +msgid "Source/Ref Invoice No" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__state +msgid "State" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__street +msgid "Street" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__street2 +msgid "Street2" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_account_tax +msgid "Tax" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Tax Calculation" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/partner.py:0 +#, python-format +msgid "Tax Compliance Risk" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Tax Exemption" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__tax_address_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__tax_address_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__tax_address_id +msgid "Tax Shipping Address" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__tax_on_shipping_address +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__tax_on_shipping_address +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__tax_on_shipping_address +msgid "Tax based on shipping address" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_avalara_salestax_ping +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_ping +msgid "Test Connection" +msgstr "" + +#. module: account_avatax_oca +#: model:product.template,name:account_avatax_oca.avatax_product_sku2_product_template +msgid "Test Item NT" +msgstr "" + +#. module: account_avatax_oca +#: model:product.template,name:account_avatax_oca.avatax_product_sku1_product_template +msgid "Test Item P0000000" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"The AvaTax Address Validation Service does not support this country in the " +"configuration, please continue with your normal process." +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"The AvaTax Address Validation Service is disabled by the administrator. " +"Please make sure it's enabled for the address validation" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__property_exemption_number +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__property_exemption_number +msgid "The State identification number relevant fot the exemption" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.constraint,message:account_avatax_oca.constraint_avalara_salestax_account_number_company_uniq +msgid "The account number must be unique per company!" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__result_in_uppercase +msgid "The address validation results are returned in in upper case" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__company_code +msgid "The company code as defined in the Admin Console of AvaTax" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__date_validation +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__date_validation +msgid "The date the address was last validated by AvaTax and accepted" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__property_exemption_code_id +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__property_exemption_code_id +msgid "The type of exemption granted" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__service_url +msgid "The url to connect with" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "The user or account could not be authenticated" +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "There is no Company address defined." +msgstr "" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "There is no source shipping address defined for partner %s." +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__property_tax_exempt +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__property_tax_exempt +msgid "This company or address can claim for tax exemption" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__auto_generate_customer_code +msgid "" +"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." +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__type +msgid "Type" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_product_tax_code__type +msgid "Type of tax code as defined in AvaTax" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__active +msgid "Uncheck the active field to hide the record" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__hide_exemption +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__hide_exemption +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__hide_exemption +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__hide_exemption +msgid "" +"Uncheck the this field to show exemption fields on SO/Invoice form view. " +"Also, it will show Tax based on shipping address button" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.actions.server,name:account_avatax_oca.action_account_invoice_compute_taxes +msgid "Update taxes with AvaTax" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__is_avatax +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_fiscal_position__is_avatax +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__is_avatax +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__is_avatax +msgid "Use Avatax API" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__use_so_partner_id +msgid "Use Sale Customer Code on Invoice" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__use_so_partner_id +msgid "" +"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" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Validate" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Validate Address" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +msgid "Validated Address" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__validated_on_save +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__validated_on_save +msgid "Validated On Save" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Validation" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__validation_method +msgid "Validation Method" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Visit the AvaTax Admin webpage" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__warehouse_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__warehouse_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__warehouse_id +msgid "Warehouse" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__property_exemption_country_wide +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__property_exemption_country_wide +msgid "" +"When enabled, the delivery address State is irrelevant when looking up the " +"exemption status, meaning that the exemption is considered applicable for " +"all states" +msgstr "" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__zip +msgid "Zip" +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_normal_form_avatax_inherit +msgid "describe the product characteristics..." +msgstr "" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +msgid "or" +msgstr "" diff --git a/account_avatax_oca/i18n/it.po b/account_avatax_oca/i18n/it.po new file mode 100644 index 000000000..f9c3b79ac --- /dev/null +++ b/account_avatax_oca/i18n/it.po @@ -0,0 +1,1271 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_avatax_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-10-17 16:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: account_avatax_oca +#: model:account.tax,name:account_avatax_oca.avatax +msgid "AVATAX" +msgstr "AVATAX" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +msgid "Accept" +msgstr "Accetta" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__account_number +msgid "Account Number" +msgstr "Numero conto" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__account_number +msgid "Account Number provided by AvaTax" +msgstr "Numero conto fornito da AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__active +msgid "Active" +msgstr "Attiva" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_avalara_salestax_address_validate +#: model:ir.actions.server,name:account_avatax_oca.action_call_address_validation_method +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Address Validation" +msgstr "Validazione indirizzo" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__validation_method +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__validation_method +msgid "Address Validation Method" +msgstr "Metodo validazione indirizzo" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_avalara_salestax_address_validate +msgid "Address Validation using AvaTax" +msgstr "Validazione indirizzo utilizzando AvaTax" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Advanced" +msgstr "Avanzato" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__upc_enable +msgid "" +"Allows ean13 to be reported in place of Item Reference as upc identifier." +msgstr "" +"Consente di utilizzare EAN13 al posto del riferimento registrazione come " +"identificatore UPC." + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_category__applicable_tax_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_product__applicable_tax_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_template__applicable_tax_code_id +msgid "Applicable AvaTax Code" +msgstr "Codice AvaTax applicabile" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__invoice_calculate_tax +msgid "Auto Calculate Tax on Invoice Save" +msgstr "Calcola automaticamente imposta al salvataggio fattura" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__validation_on_save +msgid "Automatic Address Validation" +msgstr "Validazione automatica indirizzo" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__auto_generate_customer_code +msgid "Automatically generate missing customer code" +msgstr "Genera automaticamente codice cliente mancante" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__invoice_calculate_tax +msgid "" +"Automatically triggers API to calculate tax If changes made onInvoice's " +"warehouse_id, tax_on_shipping_address, Invoice line's price_unit, discount, " +"quantity" +msgstr "" +"Attiva automaticamente l'API per calcolare l'imposta se ci sono modifiche " +"nel warehouse_id dell afattura, tax_on_shipping_address, price_uni triga " +"fattura, sconto, quantità" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__validation_on_save +msgid "Automatically validates addresses when they are created or modified" +msgstr "Valida automaticamente gli indirizzi quando sono creati o modificati" + +#. module: account_avatax_oca +#: model:account.tax.group,name:account_avatax_oca.avatax_tax_group +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__avatax_amount +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__avatax_amount +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__avatax_amount +#: model:ir.ui.menu,name:account_avatax_oca.menu_avatax +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_normal_form_avatax_inherit +msgid "AvaTax" +msgstr "AvaTax" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_avalara_salestax +#: model:ir.ui.menu,name:account_avatax_oca.menu_avatax_api +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "AvaTax API" +msgstr "API AvaTax" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_product_tax_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_category__tax_code_id +msgid "AvaTax Code" +msgstr "Codice AvaTax" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_avalara_salestax +msgid "AvaTax Configuration" +msgstr "Configurazione AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move_line__avatax_amt_line +msgid "AvaTax Line" +msgstr "Riga AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_product_product__tax_code_id +#: model:ir.model.fields,help:account_avatax_oca.field_product_template__tax_code_id +msgid "AvaTax Product Tax Code" +msgstr "Codice imposta prodotto AvaTax" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_category_form_avatax_inherit +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_normal_form_avatax_inherit +msgid "AvaTax Properties" +msgstr "Proprietà AvaTax" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvaTax: Notice\n" +"\n" +" Address Validation for this country not supported. But, Avalara will still " +"calculate global tax rules." +msgstr "" +"AvaTax: avviso\n" +"\n" +" la validazione indirizzo per questa nazione non è supportata. Ma, Avalara " +"calcolerà comunque le regole imposte globali." + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvaTax: Warning AvaTax could not validate the address:\n" +"%s\n" +"\n" +"You can save the address and AvaTax will make an attempt to compute taxes " +"based on the zip code if \"Force Address Validation\" is disabled in the " +"Avatax connector configuration. \n" +"\n" +" Also please ensure that the company address is set and Validated. You can " +"get there by going to Sales->Customers and removing \"Customers\" filter " +"from the search at the top. Then go to your company contact info and " +"validate your address in the Avatax Tab" +msgstr "" +"AvaTax: atenzione AvaTax non può validare l'indirizzo:\n" +"%s\n" +"\n" +"Si può salvare l'indirizzo e AvaTax cercherà di calcolare le imposte in base " +"al CAP se \"Forza validazione indirizzo\" è disabilitata nella " +"configurazione del connettore AvaTax. \n" +"\n" +" Assicurarsi inoltre che l'indirizzo dell'azienda sia impostato e validato. " +"Si può accedere attraverso Vendite->clienti a rimuovendo il filtro \"Clienti" +"\" dalla ricerca in alto. Quandi accedere alle informazioni del contatto " +"dell'azienda e validare l'indirizzo nella sezione AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__res_partner__validation_method__avatax +msgid "Avalara" +msgstr "Avalara" + +#. module: account_avatax_oca +#: model:ir.model.constraint,message:account_avatax_oca.constraint_avalara_salestax_code_company_uniq +msgid "Avalara setting is already available for this company code" +msgstr "Le impostazioni Avalara sono già presenti per questo codice azienda" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__avatax_request_log +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__avatax_request_log +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__avatax_request_log +msgid "Avatax API Request Log" +msgstr "Registro richiesta API AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__avatax_response_log +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__avatax_response_log +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__avatax_response_log +msgid "Avatax API Response Log" +msgstr "Registro risposta API AvaTax" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_avalara_salestax_getcompany +msgid "Avatax Get Company Code" +msgstr "Recupera il codice azienda AvaTax" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_move_form_inherit_1 +msgid "Avatax Log" +msgstr "Registro AvaTax" + +#. module: account_avatax_oca +#: model:account.fiscal.position,name:account_avatax_oca.avatax_fiscal_position_us +msgid "Avatax Tax Mapping (US)" +msgstr "Mappatura imposta AvaTax (US)" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/account_move.py:0 +#, python-format +msgid "Avatax address is not validated!" +msgstr "L'indirizzo AvaTax non è validato!" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "Avatax commiting document %s, but it tax reporting is disabled." +msgstr "" +"AvaTax sta confermando il documento %s, ma la sua reportistica è " +"disabilitata." + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"AvataxClient is not available in your system. Please contact your system " +"administrator to 'pip3 install Avalara'" +msgstr "" +"AvaTaxClient non è disponibile nel sistema. Contattare l'amministratore di " +"sistema per eseguire 'pip3 install Avalara'" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__calculate_tax_on_save +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__calculate_tax_on_save +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__calculate_tax_on_save +msgid "Calculate Tax On Save" +msgstr "Calcola imposta al salvataggio" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_getcompany +msgid "Cancel" +msgstr "Annulla" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__city +msgid "City" +msgstr "Città" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__code +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__name +msgid "Code" +msgstr "Codice" + +#. module: account_avatax_oca +#: model:product.template,name:account_avatax_oca.avatax_product_freight_product_template +msgid "Common Carrier FR020100" +msgstr "Corriere comune FR020100" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__company_id +msgid "Company" +msgstr "Azienda" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/res_company.py:0 +#, python-format +msgid "Company %s has no Avatax configuration." +msgstr "L'azienda %s non ha configurato AvaTax." + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/res_company.py:0 +#, python-format +msgid "Company %s has too many Avatax configurations!" +msgstr "L'azienda %s ha troppe configurazioni AvaTax!" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__company_partner_id +msgid "Company Address" +msgstr "Indirizzo azienda" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__company_code +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Company Code" +msgstr "Codice azienda" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__company_id +msgid "Company which has subscribed to the AvaTax service" +msgstr "Azienda che ha sottoscritto il servizio AvaTax" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_move_form_inherit_1 +msgid "Compute Taxes" +msgstr "Calcola imposte" + +#. module: account_avatax_oca +#: model_terms:ir.actions.act_window,help:account_avatax_oca.action_avalara_salestax +msgid "Configuration of AvaTax in odoo" +msgstr "Configurazione di avaTax in Odoo" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Connection" +msgstr "Connessione" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_ping +msgid "Connection test successful" +msgstr "Test connessione avvenuto con successo" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__country_ids +msgid "Countries" +msgstr "Nazioni" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__country_ids +msgid "Countries where address validation will be used" +msgstr "Nazioni dove verrà utilizzata la validazione indirizzo" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__country +msgid "Country" +msgstr "Nazione" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__create_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__create_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__customer_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__customer_code +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Customer Code" +msgstr "Codice cliente" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "" +"Customer Code for customer %(partner.name)s not defined.\n" +"\n" +" You can edit the Customer Code in customer profile. You can fix by " +"clicking \"Generate Customer Code\" button in the customer contact " +"information" +msgstr "" +"Codice cliente non definito per il cliente %(partner.name)s.\n" +"\n" +" Si puòmodificare il codice nel profilo cliente. È possibile risolvere " +"facendo clic sul pulsante \"Genera codice cliente\" nelle informazioni " +"contatto cliente" + +#. module: account_avatax_oca +#: model:ir.model.constraint,message:account_avatax_oca.constraint_res_partner_name_uniq +msgid "Customer Code must be unique!" +msgstr "Il codice cliente deve essere univoco!" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__date_validation +msgid "Date Validation" +msgstr "Validazione data" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__request_timeout +msgid "" +"Defines AvaTax request time out length, AvaTax best practices prescribes " +"default setting of 300 seconds" +msgstr "" +"Definisce la lunghezza del time out della richiesta AvaTax, la buona norma " +"AvaTax prescrive l'impostazione predefinita di 300 secondi" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__description +msgid "Description" +msgstr "Descrizione" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__digital +msgid "Digital" +msgstr "Digitale" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__disable_address_validation +msgid "Disable Address Validation" +msgstr "Disabilita validazione indirizzo" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__disable_tax_calculation +msgid "Disable AvaTax Calculation" +msgstr "Disabilita calcolo AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__disable_tax_reporting +msgid "Disable Document Recording/Commiting" +msgstr "Disabilita registrazione/conferma documento" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__disable_address_validation +msgid "Disables the ability to perform address validation" +msgstr "Disabilita la possibilità di effettuare la validazione indirizzo" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__display_name +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__upc_enable +msgid "Enable UPC Taxability" +msgstr "Abilita la tassabilità UPC" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__logging +msgid "Enables detailed AvaTax transaction logging within application" +msgstr "" +"Abilita la registrazione dettagliata della transizione AvaTax all'interno " +"dell'applicazione" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/partner.py:0 +#, python-format +msgid "" +"Enabling the exemption status for all states may have tax compliance risks, " +"and should be carefully considered.\n" +"\n" +" Please ensure that your tax advisor was consulted and the necessary tax " +"exemption documentation was obtained for every state this Partner may have " +"transactions." +msgstr "" +"Abilitare lo stato di esenzione per tutte le nazioni può comportare rischi " +"fiscali, e deve essere considerato con attenzione.\n" +"\n" +"Assicurarsi che il consulente fiscale sia stato interpellato e sia stata " +"ottenuta la necessaria documentazione di esenzione per ogni nazione nella " +"quale questo parnter può avere transizioni." + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__property_exemption_country_wide +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__property_exemption_country_wide +msgid "Exemption Applies Country Wide" +msgstr "Esenzione applicata a tutte le nazioni" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_exemption_code_details +#: model:ir.model,name:account_avatax_oca.model_exemption_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__property_exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__property_exemption_code_id +#: model:ir.ui.menu,name:account_avatax_oca.menu_action_exemption_code_details +msgid "Exemption Code" +msgstr "Codice esenzione" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__exemption_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__exemption_code_id +msgid "Exemption Code (Deprecated)" +msgstr "Codice esenzione (deprecato)" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__exemption_locked +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__exemption_locked +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__exemption_locked +msgid "Exemption Locked" +msgstr "Esenzione bloccata" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__exemption_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__exemption_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__exemption_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__property_exemption_number +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__property_exemption_number +msgid "Exemption Number" +msgstr "Numero esenzione" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__exemption_number +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__exemption_number +msgid "Exemption Number (Deprecated)" +msgstr "Numero esenzione (deprecato)" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__exemption_locked +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__exemption_locked +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__exemption_locked +msgid "" +"Exemption code won't be automatically changed, for instance, when changing " +"the Customer." +msgstr "" +"Il codice esenzione non viene modificato automaticamente, ad esempio, quando " +"si cambia il cliente." + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_account_fiscal_position +msgid "Fiscal Position" +msgstr "Posizione fiscale" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__freight +msgid "Freight" +msgstr "Trasporto" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Generate" +msgstr "Genera" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__hide_exemption +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__hide_exemption +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__hide_exemption +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__hide_exemption +msgid "Hide Exemption & Tax Based on shipping address" +msgstr "Nasconde esenzione e imposta in base all'indirizzo di spedizione" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__id +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__id +msgid "ID" +msgstr "ID" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/account_tax.py:0 +#, python-format +msgid "" +"Incorrect retrieval of Avatax amount for Invoice %(avatax_invoice)s: product " +"%(product.display_name)s, price_unit %(-price_unit)f , quantity %(quantity)f" +msgstr "" +"Recupero errato del valore AvaTax per la fattura %(avatax_invoice)s: " +"prodotto %(product.display_name)s, prezzo unitario %(-price_unit)f , " +"quantità %(quantity)f" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__validated_on_save +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__validated_on_save +msgid "" +"Indicates if the address is already validated on save before calling the " +"wizard" +msgstr "" +"Indica se l'indirizzo è già validato al salvataggio prima di chiamare la " +"procedura guidata" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_tax__is_avatax +msgid "Is Avatax" +msgstr "È AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__property_tax_exempt +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__property_tax_exempt +msgid "Is Tax Exempt" +msgstr "È esenzione imposta" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__tax_exempt +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__tax_exempt +msgid "Is Tax Exempt (Deprecated))" +msgstr "È esenzione imposta (deprecato)" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__validation_method +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__validation_method +msgid "It gets populated when the address is validated by the method" +msgstr "Viene compilato quando l'indirizzo è validato dal metodo" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__exemption_code_id +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__exemption_code_id +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__exemption_code_id +msgid "It show the customer exemption code" +msgstr "Visualizza il codice di esenzione del cliente" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__exemption_code +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__exemption_code +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__exemption_code +msgid "It show the customer exemption number" +msgstr "Visualizza il numero di esenzione del cliente" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_account_move +msgid "Journal Entry" +msgstr "Registrazione contabile" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_account_move_line +msgid "Journal Item" +msgstr "Movimento contabile" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__write_uid +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__write_date +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__date_validation +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__date_validation +msgid "Last Validation Date" +msgstr "Ultima data approvazione" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__partner_latitude +msgid "Latitude" +msgstr "Latitudine" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__license_key +msgid "License Key" +msgstr "Chiave licenza" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__license_key +msgid "License Key provided by AvaTax" +msgstr "Chiave licenza fornita da AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__location_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__location_code +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__location_code +msgid "Location Code" +msgstr "Codice ubicazione" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__logging +msgid "Log API Requests" +msgstr "Registra richieste API" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__partner_longitude +msgid "Longitude" +msgstr "Longitudine" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_ping__name +#: model:ir.model.fields,field_description:account_avatax_oca.field_exemption_code__name +msgid "Name" +msgstr "Nome" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__disable_tax_calculation +msgid "No tax calculation requests will be sent to the AvaTax web service." +msgstr "" +"Nessuna richiesta di calcolo delle imposte verrà inviata al servizio web " +"AvaTax." + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__disable_tax_reporting +msgid "No transactions will be recorded (commited) to the Avatax service." +msgstr "Nessuna transizione verrà registrata (affidata) al servizio AvaTax." + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_ping +msgid "OK" +msgstr "OK" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__force_address_validation +msgid "Only compute taxes if addresses were validated by the Avatax service" +msgstr "" +"Solo imposte calcolate se gli indirizzi sono state validati dal servizio " +"AvaTax" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +msgid "Original Address" +msgstr "Indirizzo originale" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_city +msgid "Original City" +msgstr "Città originale" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_country +msgid "Original Country" +msgstr "Nazione originale" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_state +msgid "Original State" +msgstr "Stato originale" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_street +msgid "Original Street" +msgstr "Indirizzo originale" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_street2 +msgid "Original Street2" +msgstr "Indirizzo2 originale" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__original_zip +msgid "Original Zip" +msgstr "CAP originale" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__other +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__res_partner__validation_method__other +msgid "Other" +msgstr "Altro" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_avalara_salestax_ping +msgid "Ping Service" +msgstr "Serivizio ping" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/account_tax.py:0 +#, python-format +msgid "Please configure Avatax Tax for Company %s:" +msgstr "Configurare il servizio AvaTax per l'azienda %s:" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/partner.py:0 +#, python-format +msgid "" +"Please enter either Exemption Number or Exemption Code for marking customer " +"as Exempt." +msgstr "" +"Inserire il numero di esenzione o il codice esenzione per rendere esente il " +"cliente." + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"Please set the Company Address in the partner information and validate. We " +"are checking against the first line of the address and it's empty. \n" +"\n" +" Typically located in Sales->Customers, you have to clear \"Customers\" from " +"search filter and type in your own company name. Ensure the address is " +"filled out and go to Avatax tab in the partner information and validate the " +"address. Save partner update when done." +msgstr "" +"Impostare e validare l'indirizzo azienda nelle informazioni partner. È stato " +"controllata la prima riga dell'indirizzo ed è vuota.\n" +"\n" +" Normalmente posizionato in Vendite->Clienti, bisogna cancellare \"Clienti\" " +"dal filtro ricerca e scrivere il nome della propria azienda. Assicurarsi che " +"l'indirizzo sia compilato e passare alla linguetta AvaTax nelle informazioni " +"partner e validare l'indirizzo. Salvare l'aggiornamento del partner quando " +"terminato." + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "Please validate the origin warehouse address." +msgstr "Validare l'indirizzo del magazzino origine." + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "Please validate the shipping address for the partner %(partner.name)s." +msgstr "Validare l'indirizzo di spedizione per il partner %(partner.name)s." + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_product_template +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__product +msgid "Product" +msgstr "Prodotto" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_product__tax_code_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_template__tax_code_id +msgid "Product AvaTax Code" +msgstr "Codice AvaTax prodotto" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_product_category +msgid "Product Category" +msgstr "Categoria prodotto" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_normal_form_avatax_inherit +msgid "Product Description" +msgstr "Descrizione prodotto" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_tax_code_form +msgid "Product Tax Code" +msgstr "Codice imposta prodotto" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_product_tax_code +#: model:ir.ui.menu,name:account_avatax_oca.menu_product_tax_code +msgid "Product Tax Codes" +msgstr "Codici imposta prodotto" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__avalara_salestax__service_url__https://rest_avatax_com/api/v2 +msgid "Production (REST API)" +msgstr "Produzione (API REST)" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__invoice_doc_no +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__invoice_doc_no +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__invoice_doc_no +msgid "Reference of the invoice" +msgstr "Riferimento della fattura" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__request_timeout +msgid "Request Timeout" +msgstr "Timeout richiesta" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__force_address_validation +msgid "Require Validated Addresses" +msgstr "Richiede indirizzi validati" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__result_in_uppercase +msgid "Return validation results in upper case" +msgstr "Restituisce risultati validazione in maiuscolo" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__so_partner_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__so_partner_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__so_partner_id +msgid "SO Partner" +msgstr "Partner OV" + +#. module: account_avatax_oca +#: model:account.tax,description:account_avatax_oca.avatax +msgid "Sales Tax" +msgstr "Imposta vendite" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__avalara_salestax__service_url__https://sandbox-rest_avatax_com/api/v2 +msgid "Sandbox (REST API)" +msgstr "Sandbox (API REST)" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_getcompany +msgid "Select" +msgstr "Seleziona" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_avalara_salestax_getcompany +msgid "Select Avatax Company Code" +msgstr "Selezionare codice azienda AvaTax" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Select Company" +msgstr "Seleziona azienda" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_getcompany__company_code +msgid "Select a Company" +msgstr "Selezionare una azienda" + +#. module: account_avatax_oca +#: model:ir.model.fields.selection,name:account_avatax_oca.selection__product_tax_code__type__service +msgid "Service" +msgstr "Servizio" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__service_url +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Service URL" +msgstr "URL servizio" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__invoice_doc_no +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__invoice_doc_no +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__invoice_doc_no +msgid "Source/Ref Invoice No" +msgstr "Nr. fattura origine/riferimento" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__state +msgid "State" +msgstr "Stato" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__street +msgid "Street" +msgstr "Indirizzo" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__street2 +msgid "Street2" +msgstr "Indirizzo2" + +#. module: account_avatax_oca +#: model:ir.model,name:account_avatax_oca.model_account_tax +msgid "Tax" +msgstr "Imposta" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Tax Calculation" +msgstr "Calcolo imposta" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/partner.py:0 +#, python-format +msgid "Tax Compliance Risk" +msgstr "Rischio conformità imposta" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Tax Exemption" +msgstr "Esenzione imposta" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__tax_address_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__tax_address_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__tax_address_id +msgid "Tax Shipping Address" +msgstr "Indirizzo spedizione imposta" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__tax_on_shipping_address +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__tax_on_shipping_address +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__tax_on_shipping_address +msgid "Tax based on shipping address" +msgstr "Imposta in base all'indirizzo di spedizione" + +#. module: account_avatax_oca +#: model:ir.actions.act_window,name:account_avatax_oca.action_avalara_salestax_ping +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_ping +msgid "Test Connection" +msgstr "Prova connessione" + +#. module: account_avatax_oca +#: model:product.template,name:account_avatax_oca.avatax_product_sku2_product_template +msgid "Test Item NT" +msgstr "Prova elemento NT" + +#. module: account_avatax_oca +#: model:product.template,name:account_avatax_oca.avatax_product_sku1_product_template +msgid "Test Item P0000000" +msgstr "Prova elemento P0000000" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"The AvaTax Address Validation Service does not support this country in the " +"configuration, please continue with your normal process." +msgstr "" +"Il servizio di validazione indirizzo AvaTax non supporta questa nazione " +"nella configurazione, proseguire con il processo normale." + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "" +"The AvaTax Address Validation Service is disabled by the administrator. " +"Please make sure it's enabled for the address validation" +msgstr "" +"Il servizio validazione indirizzo è disabilitato dall'amministratore. " +"Assicurarsi che sia abilitato per la validazione indirizzo" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__property_exemption_number +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__property_exemption_number +msgid "The State identification number relevant fot the exemption" +msgstr "Il numero identificazione stato utile per l'esenzione" + +#. module: account_avatax_oca +#: model:ir.model.constraint,message:account_avatax_oca.constraint_avalara_salestax_account_number_company_uniq +msgid "The account number must be unique per company!" +msgstr "Il numero di conto deve essere univoco per azienda!" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__result_in_uppercase +msgid "The address validation results are returned in in upper case" +msgstr "" +"I risultati della validazione indirizzo sono restituiti in lettere maiuscole" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__company_code +msgid "The company code as defined in the Admin Console of AvaTax" +msgstr "" +"Il codice azienda come definito nella console di amministrazione di AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__date_validation +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__date_validation +msgid "The date the address was last validated by AvaTax and accepted" +msgstr "La data dell'ultima validazione e accettazione dell'indirizzo da AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__property_exemption_code_id +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__property_exemption_code_id +msgid "The type of exemption granted" +msgstr "Il tipo di esenzione concessa" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__service_url +msgid "The url to connect with" +msgstr "L'URL a cui connettersi" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avatax_rest_api.py:0 +#, python-format +msgid "The user or account could not be authenticated" +msgstr "L'utente o il conto non possono essere autenticati" + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "There is no Company address defined." +msgstr "Non è definito un indirizzo dell'azienda." + +#. module: account_avatax_oca +#. odoo-python +#: code:addons/account_avatax_oca/models/avalara_salestax.py:0 +#, python-format +msgid "There is no source shipping address defined for partner %s." +msgstr "Non è definito l'indirizzo di spedizione per il partner %s." + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__property_tax_exempt +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__property_tax_exempt +msgid "This company or address can claim for tax exemption" +msgstr "Questa azienda o indirizzo può richiedere l'esenzione imposta" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__auto_generate_customer_code +msgid "" +"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." +msgstr "" +"Questo genererà il codice cliente per l'utente utilizzato nella transizione, " +"se non ne ha già uno. Ogni codice è univoco per cliente. Quando è " +"disabilitato, bisognerà accedere ad ogni cliente e generare manualmente il " +"suo codice. Questo è richiesto da AvaTax ed è generato una sola volta." + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_product_tax_code__type +msgid "Type" +msgstr "Tipo" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_product_tax_code__type +msgid "Type of tax code as defined in AvaTax" +msgstr "Tipo di codice imposta come definito in AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__active +msgid "Uncheck the active field to hide the record" +msgstr "Deselezionare il campo attivo per nascondere il record" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_account_bank_statement_line__hide_exemption +#: model:ir.model.fields,help:account_avatax_oca.field_account_move__hide_exemption +#: model:ir.model.fields,help:account_avatax_oca.field_account_payment__hide_exemption +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__hide_exemption +msgid "" +"Uncheck the this field to show exemption fields on SO/Invoice form view. " +"Also, it will show Tax based on shipping address button" +msgstr "" +"Deselezionare questo campo per visualizzare i campi esenzione in OV/fattura " +"dalla vista. Inoltre, verrà visualizzato il pulsante 'Imposta in base " +"all'indirizzo di spedizione'" + +#. module: account_avatax_oca +#: model:ir.actions.server,name:account_avatax_oca.action_account_invoice_compute_taxes +msgid "Update taxes with AvaTax" +msgstr "Aggiorna imposte con AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__is_avatax +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_fiscal_position__is_avatax +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__is_avatax +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__is_avatax +msgid "Use Avatax API" +msgstr "Utilizza API AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax__use_so_partner_id +msgid "Use Sale Customer Code on Invoice" +msgstr "Utilizzare il codice vendita cliente nella fattura" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_avalara_salestax__use_so_partner_id +msgid "" +"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" +msgstr "" +"Utilizzare il campo cliente dell'ordine di vendita per definire lo stato " +"applicabilità imposta nella fattura cliente. Se non esiste l'ordine di " +"vendita, allora verrà usato il campo cliente nella vista modulo fattura" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Validate" +msgstr "Valida" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Validate Address" +msgstr "Valida indirizzo" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +msgid "Validated Address" +msgstr "Indirizzo validato" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_partner__validated_on_save +#: model:ir.model.fields,field_description:account_avatax_oca.field_res_users__validated_on_save +msgid "Validated On Save" +msgstr "Validato alla vendita" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_partner_details_form_inherit1 +msgid "Validation" +msgstr "Validazione" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__validation_method +msgid "Validation Method" +msgstr "Metodo validazione" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_form +msgid "Visit the AvaTax Admin webpage" +msgstr "Visita la pagina web di AvaTax" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_bank_statement_line__warehouse_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_move__warehouse_id +#: model:ir.model.fields,field_description:account_avatax_oca.field_account_payment__warehouse_id +msgid "Warehouse" +msgstr "Magazzino" + +#. module: account_avatax_oca +#: model:ir.model.fields,help:account_avatax_oca.field_res_partner__property_exemption_country_wide +#: model:ir.model.fields,help:account_avatax_oca.field_res_users__property_exemption_country_wide +msgid "" +"When enabled, the delivery address State is irrelevant when looking up the " +"exemption status, meaning that the exemption is considered applicable for " +"all states" +msgstr "" +"Quando abilitata, la nazione dell'indirizzo di consegna non è rilevante " +"nella verifica dello stato di esenzione, intendendo che l'esenzione si " +"considera applicabile a tutte le nazioni" + +#. module: account_avatax_oca +#: model:ir.model.fields,field_description:account_avatax_oca.field_avalara_salestax_address_validate__zip +msgid "Zip" +msgstr "CAP" + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_product_normal_form_avatax_inherit +msgid "describe the product characteristics..." +msgstr "descrive le caratteristiche prodotto..." + +#. module: account_avatax_oca +#: model_terms:ir.ui.view,arch_db:account_avatax_oca.view_avalara_salestax_address_validate +msgid "or" +msgstr "o" diff --git a/account_avatax_oca/models/__init__.py b/account_avatax_oca/models/__init__.py new file mode 100644 index 000000000..0a4c69bc2 --- /dev/null +++ b/account_avatax_oca/models/__init__.py @@ -0,0 +1,8 @@ +from . import avalara_salestax +from . import product +from . import partner +from . import account_move +from . import account_fiscal_position +from . import account_tax +from . import res_company +from . import avatax_rest_api diff --git a/account_avatax_oca/models/account_fiscal_position.py b/account_avatax_oca/models/account_fiscal_position.py new file mode 100644 index 000000000..4d8162cf1 --- /dev/null +++ b/account_avatax_oca/models/account_fiscal_position.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class FiscalPosition(models.Model): + _inherit = "account.fiscal.position" + + is_avatax = fields.Boolean(string="Use Avatax API") diff --git a/account_avatax_oca/models/account_move.py b/account_avatax_oca/models/account_move.py new file mode 100644 index 000000000..8ce26672d --- /dev/null +++ b/account_avatax_oca/models/account_move.py @@ -0,0 +1,511 @@ +import logging + +from odoo import api, fields, models +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + + +class AccountMove(models.Model): + """Inherit to implement the tax calculation using avatax API""" + + _inherit = "account.move" + + @api.depends("partner_shipping_id", "partner_id", "company_id") + def _compute_onchange_exemption(self): + """ + Set the exemption to use for the Invoice. + An exemption can be applied if + there an exemption for the delivery address Country + State + - Get the delivery address Country & State + - Search the invoiced commercial partner addresses + for an exemption in this Country & State + - In case there is a "country wide" exemption, use it. + + Example: + - ACME company partner, USA CA, has exemption status + - ACME Invoicing address, USA CA, no exemption status + - ACME Delivery address, USA CA, no exemption status + + Invoice to ACME Invoicing, Shipped to ACME Delivery with be exempt. + + For this to work properly, the "exemption_lock" is no longer supported. + """ + for invoice in self.filtered(lambda x: x.state == "draft"): + invoice_partner = invoice.partner_id.commercial_partner_id + ship_to_address = ( + hasattr(invoice, "partner_shipping_id") + and invoice.partner_shipping_id + or invoice_partner + ) + # Find an exemption address matching the Country + State + # of the Delivery address + exemption_addresses = ( + invoice_partner | invoice_partner.child_ids + ).filtered("property_tax_exempt") + + exemption_address_naive = exemption_addresses.filtered( + lambda a, + ship_to_address=ship_to_address, + invoice_partner=invoice_partner: a.country_id + == ship_to_address.country_id + and ( + a.state_id == ship_to_address.state_id + or invoice_partner.property_exemption_country_wide + ) + )[:1] + # Force Company to get the correct values from the Property fields + exemption_address = exemption_address_naive.with_company( + invoice.company_id.id + ) + invoice.exemption_code = exemption_address.property_exemption_number + invoice.exemption_code_id = exemption_address.property_exemption_code_id + + @api.onchange("warehouse_id") + def onchange_warehouse_id(self): + if self.warehouse_id: + if self.warehouse_id.company_id: + self.company_id = self.warehouse_id.company_id + if self.warehouse_id.code: + self.location_code = self.warehouse_id.code + + is_avatax = fields.Boolean(related="fiscal_position_id.is_avatax") + invoice_doc_no = fields.Char( + "Source/Ref Invoice No", + readonly=True, + help="Reference of the invoice", + ) + exemption_code = fields.Char( + "Exemption Number", + compute=_compute_onchange_exemption, + readonly=False, # New computed writeable fields + store=True, + help="It show the customer exemption number", + ) + exemption_code_id = fields.Many2one( + "exemption.code", + "Exemption Code", + compute=_compute_onchange_exemption, + readonly=False, # New computed writeable fields + store=True, + help="It show the customer exemption code", + ) + exemption_locked = fields.Boolean( + help="Exemption code won't be automatically changed, " + "for instance, when changing the Customer." + ) + tax_on_shipping_address = fields.Boolean( + "Tax based on shipping address", default=True + ) + tax_address_id = fields.Many2one( + "res.partner", "Tax Shipping Address", compute="_compute_tax_address_id" + ) + location_code = fields.Char() + warehouse_id = fields.Many2one("stock.warehouse", "Warehouse") + avatax_amount = fields.Float(string="AvaTax", copy=False) + calculate_tax_on_save = fields.Boolean() + so_partner_id = fields.Many2one(comodel_name="res.partner", string="SO Partner") + avatax_request_log = fields.Text( + "Avatax API Request Log", readonly=True, copy=False + ) + avatax_response_log = fields.Text( + "Avatax API Response Log", readonly=True, copy=False + ) + + @api.model + @api.depends("company_id") + def _compute_hide_exemption(self): + avatax_config = self.env.company.get_avatax_config_company() + for inv in self: + inv.hide_exemption = avatax_config.hide_exemption + + hide_exemption = fields.Boolean( + "Hide Exemption & Tax Based on shipping address", + compute=_compute_hide_exemption, # For past transactions visibility + default=lambda self: self.env.company.get_avatax_config_company, + help="Uncheck the this field to show exemption fields on SO/Invoice form view. " + "Also, it will show Tax based on shipping address button", + ) + + @api.depends("tax_on_shipping_address", "partner_id", "partner_shipping_id") + def _compute_tax_address_id(self): + for invoice in self: + invoice.tax_address_id = ( + invoice.partner_shipping_id + if invoice.tax_on_shipping_address + else invoice.partner_id + ) + + @api.onchange("tax_address_id", "fiscal_position_id") + def onchange_reset_avatax_amount(self): + """ + 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. + """ + for inv in self: + inv.avatax_amount = 0 + for line in inv.invoice_line_ids: + line.avatax_amt_line = 0 + + # Same as v12 + def get_origin_tax_date(self): + if self.invoice_doc_no: + orig_invoice = self.search( + [ + ("name", "=", self.invoice_doc_no), + ("partner_id", "=", self.partner_id.id), + ] + ) + return orig_invoice.invoice_date + return False + + # Same as v12 + def _get_avatax_doc_type(self, commit=True): + self.ensure_one() + avatax_config = self.company_id.get_avatax_config_company() + if avatax_config.disable_tax_reporting: + commit = False + if "refund" in self.move_type: + doc_type = "ReturnInvoice" if commit else "ReturnOrder" + else: + doc_type = "SalesInvoice" if commit else "SalesOrder" + return doc_type + + # Same as v12 + def _avatax_prepare_lines(self, doc_type=None): + """ + Prepare the lines to use for Avatax computation. + Returns a list of dicts + """ + sign = 1 if self.move_type.startswith("out") else -1 + lines = [ + line._avatax_prepare_line(sign, doc_type) + for line in self.invoice_line_ids + if line.price_subtotal or line.quantity + ] + return [x for x in lines if x] + + # Same as v12 + def _avatax_compute_tax(self, commit=False): + """Contact REST API and recompute taxes for a Sale Order""" + # Override to handle lines with split taxes (e.g. TN) + self and self.ensure_one() + avatax_config = self.company_id.get_avatax_config_company() + if not avatax_config: + # Skip Avatax computation if no configuration is found + return + doc_type = self._get_avatax_doc_type(commit=commit) + tax_date = self.get_origin_tax_date() or self.invoice_date + taxable_lines = self._avatax_prepare_lines(doc_type) + tax_result = avatax_config.create_transaction( + self.invoice_date or fields.Date.today(), + self.name, + doc_type, + self.so_partner_id + if self.so_partner_id and avatax_config.use_so_partner_id + else self.partner_id, + self.warehouse_id.partner_id or self.company_id.partner_id, + self.tax_address_id or self.partner_id, + taxable_lines, + self.user_id, + self.exemption_code or None, + self.exemption_code_id.code or None, + commit, + tax_date, + # TODO: can we report self.invoice_doc_no? + self.name if self.move_type == "out_refund" else "", + self.location_code or "", + is_override=self.move_type == "out_refund", + currency_id=self.currency_id, + ignore_error=300 if commit else None, + log_to_record=self, + ) + # If commiting, and document exists, try unvoiding it + # Error number 300 = GetTaxError, Expected Saved|Posted + if commit and tax_result.get("number") == 300: + _logger.info( + "Document %s (%s) already exists in Avatax. " + "Should be a voided transaction. " + "Unvoiding and re-commiting.", + self.name, + doc_type, + ) + avatax_config.unvoid_transaction(self.name, doc_type) + avatax_config.commit_transaction(self.name, doc_type) + return tax_result + + if self.state == "draft": + Tax = self.env["account.tax"] + tax_result_lines = {int(x["lineNumber"]): x for x in tax_result["lines"]} + taxes_to_set = [] + lines = self.invoice_line_ids + for index, line in enumerate(lines): + tax_result_line = tax_result_lines.get(line.id) + if tax_result_line: + # rate = tax_result_line.get("rate", 0.0) + tax_calculation = 0.0 + if tax_result_line["taxableAmount"]: + tax_calculation = ( + tax_result_line["taxCalculated"] + / tax_result_line["taxableAmount"] + ) + rate = round(tax_calculation * 100, 4) + tax = Tax.get_avalara_tax(rate, doc_type) + if tax and tax not in line.tax_ids: + line_taxes = line.tax_ids.filtered(lambda x: not x.is_avatax) + taxes_to_set.append((index, line_taxes | tax)) + line.avatax_amt_line = tax_result_line["tax"] + self.with_context(check_move_validity=False).avatax_amount = tax_result[ + "totalTax" + ] + container = {"records": self} + self.with_context( + avatax_invoice=self, check_move_validity=False + )._sync_dynamic_lines(container) + self.line_ids.mapped("move_id")._check_balanced(container) + + # Set Taxes on lines in a way that properly triggers onchanges + # This same approach is also used by the official account_taxcloud connector + for index, taxes in taxes_to_set: + # Access the invoice line by index + line = self.invoice_line_ids[index] + # Update the tax_ids field + line.write({"tax_ids": [(6, 0, [tax.id for tax in taxes])]}) + + return tax_result + + # Same as v13 + def avatax_compute_taxes(self, commit=False): + """ + Called from Invoice's Action menu. + Forces computation of the Invoice taxes + """ + for invoice in self: + if ( + invoice.move_type in ["out_invoice", "out_refund"] + and invoice.fiscal_position_id.is_avatax + and (invoice.state == "draft" or commit) + ): + invoice._avatax_compute_tax(commit=commit) + return True + + def avatax_commit_taxes(self): + for invoice in self: + avatax_config = invoice.company_id.get_avatax_config_company() + if not avatax_config.disable_tax_reporting: + doc_type = invoice._get_avatax_doc_type() + avatax_config.commit_transaction(invoice.name, doc_type) + return True + + def is_avatax_calculated(self): + """ + Only apply Avatax for these types of documents. + Can be extended to support other types. + """ + return self.is_sale_document() + + def _post(self, soft=True): + for invoice in self: + if invoice.is_avatax_calculated(): + avatax_config = self.company_id.get_avatax_config_company() + if avatax_config and avatax_config.force_address_validation: + for addr in [self.partner_id, self.partner_shipping_id]: + if not addr.date_validation: + # The Validate action will be interrupted + # if the address is not validated + raise UserError( + self.env._("Avatax address is not validated!") + ) + # We should compute taxes before validating the invoice + # to ensure correct account moves + # However, we can't save the invoice because it wasn't assigned a + # number yet + invoice.avatax_compute_taxes(commit=False) + res = super()._post(soft=soft) + for invoice in res: + if invoice.is_avatax_calculated(): + # We can only commit to Avatax after validating the invoice + # because we need the generated Invoice number + invoice.avatax_compute_taxes(commit=True) + return res + + # prepare_return in v12 + def _reverse_move_vals(self, default_values, cancel=True): + # OVERRIDE + # Don't keep anglo-saxon lines if not cancelling an existing invoice. + move_vals = super()._reverse_move_vals(default_values, cancel=cancel) + move_vals.update( + { + "invoice_doc_no": self.name, + "invoice_date": default_values + and default_values.get("invoice_date") + or self.invoice_date, + "tax_on_shipping_address": self.tax_on_shipping_address, + "warehouse_id": self.warehouse_id.id, + "location_code": self.location_code, + "exemption_code": self.exemption_code or "", + "exemption_code_id": self.exemption_code_id.id or None, + "tax_address_id": self.tax_address_id.id, + } + ) + return move_vals + + # action_cancel in v12 + def button_draft(self): + """ + Sets invoice to Draft, either from the Posted or Cancelled states + """ + posted_invoices = self.filtered( + lambda invoice: invoice.move_type in ["out_invoice", "out_refund"] + and invoice.fiscal_position_id.is_avatax + and invoice.state == "posted" + ) + res = super().button_draft() + for invoice in posted_invoices: + avatax_config = invoice.company_id.get_avatax_config_company() + if avatax_config: + doc_type = invoice._get_avatax_doc_type() + avatax_config.void_transaction(invoice.name, doc_type) + return res + + @api.onchange( + "invoice_line_ids", + "warehouse_id", + "tax_address_id", + "tax_on_shipping_address", + "partner_id", + ) + def onchange_avatax_calculation(self): + avatax_config = self.env.company.get_avatax_config_company() + self.calculate_tax_on_save = False + if avatax_config.invoice_calculate_tax: + if ( + self._origin.warehouse_id != self.warehouse_id + or self._origin.tax_address_id.street != self.tax_address_id.street + or self._origin.partner_id != self.partner_id + or self._origin.tax_on_shipping_address != self.tax_on_shipping_address + ): + self.calculate_tax_on_save = True + return + for line in self.invoice_line_ids: + if ( + line._origin.price_unit != line.price_unit + or line._origin.discount != line.discount + or line._origin.quantity != line.quantity + ) and line.display_type == "product": + self.calculate_tax_on_save = True + break + + def write(self, vals): + result = super().write(vals) + avatax_config = self.env.company.get_avatax_config_company() + for record in self: + if ( + avatax_config.invoice_calculate_tax + and record.calculate_tax_on_save + and record.state == "draft" + and not self._context.get("skip_second_write", False) + ): + record.with_context(skip_second_write=True).write( + {"calculate_tax_on_save": False} + ) + record.avatax_compute_taxes() + return result + + @api.model_create_multi + def create(self, vals_list): + moves = super().create(vals_list) + avatax_config = self.env.company.get_avatax_config_company() + for move in moves: + if ( + avatax_config.invoice_calculate_tax + and move.calculate_tax_on_save + and not self._context.get("skip_second_write", False) + ): + move.with_context(skip_second_write=True).write( + {"calculate_tax_on_save": False} + ) + move.avatax_compute_taxes() + return moves + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + avatax_amt_line = fields.Float(string="AvaTax Line", copy=False) + + def _get_avatax_amount(self, qty=None): + """ + Return the company currency line amount, after discounts, + to use for Tax calculation. + + Can be used to compute unit price only, using qty=1. + + Code extracted from account/models/account_move.py, + from the compute_base_line_taxes() nested function, + adjusted to compute line amount instead of unit price. + """ + self.ensure_one() + base_line = self + move = base_line.move_id + sign = -1 if move.is_inbound() else 1 + quantity = qty or base_line.quantity + base_amount = base_line.price_unit * quantity + if base_line.currency_id: + price_unit_foreign_curr = ( + sign * base_amount * (1 - (base_line.discount / 100.0)) + ) + price_unit_comp_curr = base_line.currency_id._convert( + price_unit_foreign_curr, + move.company_id.currency_id, + move.company_id, + move.date, + ) + else: + price_unit_comp_curr = ( + sign * base_amount * (1 - (base_line.discount / 100.0)) + ) + return -price_unit_comp_curr + + # Same in v12 + def _avatax_prepare_line(self, sign=1, doc_type=None): + """ + Prepare a line to use for Avatax computation. + Returns a dict + """ + line = self + res = {} + # Add UPC to product item code + avatax_config = line.company_id.get_avatax_config_company() + product = line.product_id + if product.barcode and avatax_config.upc_enable: + item_code = "UPC:%d" % product.barcode + else: + item_code = product.default_code or ("ID:%d" % product.id) + tax_code = line.product_id.applicable_tax_code_id.name + amount = sign * line._get_avatax_amount() + if line.quantity < 0: + amount = -amount + res = { + "qty": line.quantity, + "itemcode": item_code, + "description": line.name, + "amount": amount, + "tax_code": tax_code, + "id": line, + "account_id": line.account_id.id, + "tax_id": line.tax_ids, + } + return res + + @api.onchange("price_unit", "discount", "quantity") + def onchange_reset_tax_amt(self): + """ + 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. + """ + for line in self: + line.avatax_amt_line = 0.0 + line.move_id.avatax_amount = 0.0 diff --git a/account_avatax_oca/models/account_tax.py b/account_avatax_oca/models/account_tax.py new file mode 100644 index 000000000..b43f3f53b --- /dev/null +++ b/account_avatax_oca/models/account_tax.py @@ -0,0 +1,118 @@ +from math import copysign + +from odoo import api, exceptions, fields, models +from odoo.tools.float_utils import float_compare + + +class AccountTax(models.Model): + """Inherit to implement the tax using avatax API""" + + _inherit = "account.tax" + + is_avatax = fields.Boolean() + + @api.model + def _get_avalara_tax_domain(self, tax_rate, doc_type): + return [ + ("amount", "=", tax_rate), + ("is_avatax", "=", True), + ( + "company_id", + "=", + self.env.company.id, + ), + ] + + @api.model + def _get_avalara_tax_name(self, tax_rate, doc_type=None): + return self.env._("{}%*").format(str(tax_rate)) + + @api.model + def get_avalara_tax(self, tax_rate, doc_type): + domain = self._get_avalara_tax_domain(tax_rate, doc_type) + tax = self.with_context(active_test=False).search(domain, limit=1) + if tax and not tax.active: + tax.active = True + if not tax: + domain = self._get_avalara_tax_domain(0, doc_type) + tax_template = self.search(domain, limit=1) + if not tax_template: + raise exceptions.UserError( + self.env._("Please configure Avatax Tax for Company %s:") + % self.env.company.name + ) + # If you get a unique constraint error here, + # check the data for your existing Avatax taxes. + vals = { + "amount": tax_rate, + "name": self._get_avalara_tax_name(tax_rate, doc_type), + } + tax = tax_template.sudo().copy(default=vals) + # Odoo core does not use the name set in default dict + tax.name = vals.get("name") + return tax + + def 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. + """ + res = super().compute_all( + price_unit, + currency, + quantity, + product, + partner, + is_refund, + handle_price_include, + include_caba_tags, + fixed_multiplicator, + ) + avatax_invoice = self.env.context.get("avatax_invoice") + if avatax_invoice: + # Find the Avatax amount in the invoice Lines + # Looks up the line for the current product, price_unit, and quantity + # Note that the price_unit used must consider discount + base = res["total_excluded"] + digits = 6 + avatax_amount = None + for line in avatax_invoice.invoice_line_ids: + price_unit = line.currency_id._convert( + price_unit, + avatax_invoice.company_id.currency_id, + avatax_invoice.company_id, + avatax_invoice.date, + ) + if ( + line.product_id == product + and float_compare(line.quantity, quantity, digits) == 0 + ): + avatax_amount = copysign(line.avatax_amt_line, base) + break + if avatax_amount is None: + avatax_amount = 0.0 + raise exceptions.UserError( + self.env._( + "Incorrect retrieval of Avatax amount for Invoice " + "%(avatax_invoice)s: product %(product.display_name)s, " + "price_unit %(-price_unit)f , quantity %(quantity)f" + ) + ) + for tax_item in res["taxes"]: + if tax_item["amount"] != 0: + tax_item["amount"] = avatax_amount + res["total_included"] = base + avatax_amount + return res diff --git a/account_avatax_oca/models/avalara_salestax.py b/account_avatax_oca/models/avalara_salestax.py new file mode 100644 index 000000000..2b8a00105 --- /dev/null +++ b/account_avatax_oca/models/avalara_salestax.py @@ -0,0 +1,339 @@ +import logging + +from odoo import api, fields, models +from odoo.exceptions import UserError + +from .avatax_rest_api import AvaTaxRESTService + +_logger = logging.getLogger(__name__) + + +class ExemptionCode(models.Model): + _name = "exemption.code" + _description = "Exemption Code" + + name = fields.Char(required=True) + code = fields.Char() + + @api.depends("name", "code") + def _compute_display_name(self): + res = super()._compute_display_name() + for exemption in self: + exemption.display_name = ( + exemption.code + and f"({exemption.code}) {exemption.name}" + or exemption.name + ) + return res + + +class AvalaraSalestax(models.Model): + _name = "avalara.salestax" + _description = "AvaTax Configuration" + _rec_name = "account_number" + + @api.model + def _get_avatax_supported_countries(self): + """Returns the countries supported by AvaTax Address Validation Service.""" + return self.env["res.country"].search([("code", "in", ["US", "CA"])]) + + account_number = fields.Char( + name="Account ID", required=True, help="Account Number provided by AvaTax" + ) + license_key = fields.Char(required=True, help="License Key provided by AvaTax") + service_url = fields.Selection( + [ + ("https://rest.avatax.com/api/v2", "Production (REST API)"), + ("https://sandbox-rest.avatax.com/api/v2", "Sandbox (REST API)"), + ], + string="Service URL", + default="https://rest.avatax.com/api/v2", + help="The url to connect with", + ) + request_timeout = fields.Integer( + default=300, + help="Defines AvaTax request time out length" + ", AvaTax best practices prescribes default setting of 300 seconds", + ) + company_code = fields.Char( + default="DEFAULT", + required=True, + help="The company code as defined in the Admin Console of AvaTax", + ) + logging = fields.Boolean( + "Log API Requests", + help="Enables detailed AvaTax transaction logging within application", + ) + result_in_uppercase = fields.Boolean( + "Return validation results in upper case", + help="The address validation results are returned in in upper case", + ) + disable_address_validation = fields.Boolean( + help="Disables the ability to perform address validation" + ) + validation_on_save = fields.Boolean( + "Automatic Address Validation", + help="Automatically validates addresses when they are created or modified", + ) + force_address_validation = fields.Boolean( + "Require Validated Addresses", + help="Only compute taxes if addresses were validated by the Avatax service", + ) + auto_generate_customer_code = fields.Boolean( + "Automatically generate missing customer code", + 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.", + ) + disable_tax_calculation = fields.Boolean( + "Disable AvaTax Calculation", + help="No tax calculation requests will be sent to the AvaTax web service.", + ) + # TODO: Control - Disable Document Recording + # In order for this connector to be used in conjunction with other integrations to + # AvaTax, the user must be able to control which connector + # is used for recording documents to AvaTax. + # From a technical standpoint, simply use DocType: 'SalesOrder' on all calls + # and suppress any non-getTax calls (i.e. cancelTax, postTax). + disable_tax_reporting = fields.Boolean( + "Disable Document Recording/Commiting", + help="No transactions will be recorded (commited) to the Avatax service.", + ) + country_ids = fields.Many2many( + "res.country", + "avalara_salestax_country_rel", + "avalara_salestax_id", + "country_id", + "Countries", + default=_get_avatax_supported_countries, + help="Countries where address validation will be used", + ) + active = fields.Boolean( + default=True, + help="Uncheck the active field to hide the record", + ) + company_id = fields.Many2one( + "res.company", + "Company", + required=True, + default=lambda self: self.env.company, + help="Company which has subscribed to the AvaTax service", + ) + company_partner_id = fields.Many2one( + string="Company Address", + related="company_id.partner_id", + ) + upc_enable = fields.Boolean( + "Enable UPC Taxability", + help="Allows ean13 to be reported in place of Item Reference" + " as upc identifier.", + ) + invoice_calculate_tax = fields.Boolean( + "Auto Calculate Tax on Invoice Save", + help="Automatically triggers API to calculate tax If changes made on" + "Invoice's warehouse_id, tax_on_shipping_address, " + "Invoice line's price_unit, discount, quantity", + ) + use_so_partner_id = fields.Boolean( + string="Use Sale Customer Code on Invoice", + 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", + ) + hide_exemption = fields.Boolean( + "Hide Exemption & Tax Based on shipping address", + 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", + ) + # TODO: add option to Display Prices with Tax Included + # Enabled the tax inclusive flag in the GetTax Request. + + # constraints on uniq records creation with account_number and company_id + _sql_constraints = [ + ( + "code_company_uniq", + "unique (company_code)", + "Avalara setting is already available for this company code", + ), + ( + "account_number_company_uniq", + "unique (account_number, company_id)", + "The account number must be unique per company!", + ), + ] + + def get_avatax_rest_service(self): + self.ensure_one() + if self.disable_tax_calculation: + _logger.info( + "Avatax tax calculation is disabled, skipping Avatax API contact." + ) + return False + return AvaTaxRESTService( + self.account_number, + self.license_key, + self.service_url, + self.request_timeout, + self.logging, + config=self, + ) + + def 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, + ): + self.ensure_one() + avatax_config = self + + currency_code = self.env.company.currency_id.name + if currency_id: + currency_code = currency_id.name + + if not partner.customer_code: + if not avatax_config.auto_generate_customer_code: + raise UserError( + self.env._( + "Customer Code for customer %(partner.name)s not defined.\n\n " + "You can edit the Customer Code in customer profile. " + 'You can fix by clicking "Generate Customer Code" ' + "button in the customer contact information" + ) + ) + else: + partner.generate_cust_code() + + if not shipping_address: + raise UserError( + self.env._( + "There is no source shipping address defined for partner %s." + ) + % partner.name + ) + + if not ship_from_address: + raise UserError(self.env._("There is no Company address defined.")) + + if avatax_config.validation_on_save: + for address in [partner, shipping_address, ship_from_address]: + if not address.date_validation: + address.multi_address_validation(validation_on_save=True) + + # this condition is required, in case user select force address validation + # on AvaTax API Configuration + if ( + avatax_config.force_address_validation + and not avatax_config.disable_address_validation + ): + if not shipping_address.date_validation: + raise UserError( + self.env._( + "Please validate the shipping address for the partner " + "%(partner.name)s." + ) + ) + + # if not avatax_config.address_validation: + if not ship_from_address.date_validation: + raise UserError( + self.env._("Please validate the origin warehouse address.") + ) + + if avatax_config.disable_tax_calculation: + _logger.info( + self.env._("Avatax tax calculation is disabled. Skipping %s %s."), + doc_code, + doc_type, + ) + return False + + if commit and avatax_config.disable_tax_reporting: + _logger.warning( + self.env._( + "Avatax commiting document %s, but it tax reporting is disabled." + ), + doc_code, + ) + + avatax = self.get_avatax_rest_service() + result = avatax.get_tax( + avatax_config.company_code, + doc_date, + doc_type, + partner.customer_code, + doc_code, + ship_from_address, + shipping_address, + lines, + exemption_number, + exemption_code_name, + user and user.name or None, + commit and not avatax_config.disable_tax_reporting, + invoice_date, + reference_code, + location_code, + currency_code, + partner.vat or None, + is_override, + ignore_error=ignore_error, + log_to_record=log_to_record, + ) + return result + + def commit_transaction(self, doc_code, doc_type): + self.ensure_one() + result = False + if not self.disable_tax_reporting: + avatax = self.get_avatax_rest_service() + result = avatax.call( + "commit_transaction", self.company_code, doc_code, {"commit": True} + ) + return result + + def void_transaction(self, doc_code, doc_type): + if self: + self.ensure_one() + result = False + if not self.disable_tax_reporting: + avatax = self.get_avatax_rest_service() + result = avatax.call( + "void_transaction", + self.company_code, + doc_code, + {"code": "DocVoided"}, + ) + return result + + def unvoid_transaction(self, doc_code, doc_type): + self.ensure_one() + result = False + if not self.disable_tax_reporting: + avatax = self.get_avatax_rest_service() + result = avatax.call("unvoid_transaction", self.company_code, doc_code) + return result + + def ping(self): + client = AvaTaxRESTService(config=self) + client.ping() + return True diff --git a/account_avatax_oca/models/avatax_rest_api.py b/account_avatax_oca/models/avatax_rest_api.py new file mode 100644 index 000000000..d791320ef --- /dev/null +++ b/account_avatax_oca/models/avatax_rest_api.py @@ -0,0 +1,345 @@ +# Copyright (C) 2020 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import logging +import pprint +import socket + +from odoo import _, fields +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + +try: + from avalara import AvataxClient +except Exception: + _logger.info("AvataxClient missing") + + +class AvaTaxRESTService: + def __init__( + self, + username=None, + password=None, + url=None, + timeout=300, + enable_log=False, + config=None, + ): + self.config = config + self.env = config and config.env or None + self.timeout = not config and timeout or config.request_timeout + self.is_log_enabled = enable_log or config and config.logging + # Set elements adapter defaults + self.appname = "Odoo 17 - Open Source Integrators/OCA" + self.version = "a0o5a000007SPdsAAG" + self.hostname = socket.gethostname() + url = url or (config and config.service_url) or "" + self.environment = ( + "sandbox" if "sandbox" in url or "development" in url else "production" + ) + username = username or (config and config.account_number) or False + password = password or (config and config.license_key) or False + if username and password: + try: + self.client = AvataxClient( + self.appname, self.version, self.hostname, self.environment + ) + except NameError as exc: + raise UserError( + _( + "AvataxClient is not available in your system. " + "Please contact your system administrator " + "to 'pip3 install Avalara'" + ) + ) from exc + self.client.add_credentials(username, password) + + def _sanitize_text(self, text): + res = ( + text.replace("/", "_-ava2f-_") + .replace("+", "_-ava2b-_") + .replace("?", "_-ava3f-_") + .replace(" ", "%20") + ) + return res + + def get_result(self, response, ignore_error=None): + # To call from validate address and from compute tax + result = response.json() + if self.is_log_enabled: + _logger.info("Response\n" + pprint.pformat(result, indent=1)) + if result.get("messages") or result.get("error"): + messages = result.get("messages") or result.get("error", {}).get("details") + if ignore_error and messages and messages[0].get("number") == ignore_error: + return messages[0] + for w_message in messages: + if w_message.get("severity") in ("Error", "Exception"): + if w_message.get("refersTo", "").startswith("Address"): + raise UserError( + _( + "AvaTax: Warning AvaTax could not validate the" + " address:\n%s\n\n" + "You can save the address and AvaTax will make an" + " attempt to " + "compute taxes based on the zip code if" + ' "Force Address Validation" is disabled ' + "in the Avatax connector configuration. \n\n " + "Also please ensure that the company address is" + " set and Validated. " + "You can get there by going to Sales->Customers " + 'and removing "Customers" filter from the search' + " at the top. " + "Then go to your company contact info and validate" + " your address in the Avatax Tab" + ) + % str(", ".join(result.get("address", {}).values())) + ) + elif w_message.get("refersTo") == "Country": + raise UserError( + _( + "AvaTax: Notice\n\n Address Validation for this" + " country not supported. " + "But, Avalara will still calculate global tax" + " rules." + ) + ) + else: + message = "AvaTax: Error: " + if w_message.get("refersTo"): + message += str(w_message.get("refersTo")) + "\n\n" + elif w_message.get("code"): + message += str(w_message.get("code")) + "\n\n" + if w_message.get("summary"): + message += "Summary: " + str(w_message.get("summary")) + elif w_message.get("message"): + message += "Message: " + str(w_message.get("message")) + if w_message.get("details"): + message += "\n Details: " + str( + w_message.get("details", "") + ) + elif w_message.get("description"): + message += "\n Description: " + str( + w_message.get("description", "") + ) + message += "\n Severity: " + str(w_message.get("severity")) + raise UserError(_(message)) + return result + + def ping(self): + response = self.client.ping() + res = response.json() + if self.is_log_enabled: + _logger.info(pprint.pformat(res, indent=1)) + if not res.get("authenticated"): + raise UserError(_("The user or account could not be authenticated")) + return res + + def validate_rest_address( + self, street, street2, city, zip_code, state_code, country_code + ): + if self.config.disable_address_validation: + raise UserError( + _( + "The AvaTax Address Validation Service" + " is disabled by the administrator." + " Please make sure it's enabled for the address validation" + ) + ) + supported_countries = [x.code for x in self.config.country_ids] + if country_code and country_code not in supported_countries: + raise UserError( + _( + "The AvaTax Address Validation Service does not support" + " this country in the configuration," + " please continue with your normal process." + ) + ) + textcase = "Upper" if self.config.result_in_uppercase else "Mixed" + partner_data = { + "line1": street or "", + "line2": street2 or "", + "city": city or "", + "postalCode": zip_code or "", + "region": state_code or "", + "country": country_code or "", + "textcase": textcase, + } + response_partner = self.client.resolve_address(partner_data) + partner_dict = self.get_result(response_partner) + valid_address = partner_dict.get("validatedAddresses")[0] + Partner = self.config.env["res.partner"] + country = Partner.get_country_from_code(valid_address.get("country")) + state = Partner.get_state_from_code( + valid_address.get("region"), valid_address.get("country") + ) + address_vals = { + "street": valid_address.get("line1", ""), + "street2": valid_address.get("line2", ""), + "city": valid_address.get("city", ""), + "zip": valid_address.get("postalCode", ""), + "country_id": country.id, + "state_id": state.id, + "date_validation": fields.Date.today(), + "validation_method": "avatax", + "partner_latitude": valid_address.get("latitude"), + "partner_longitude": valid_address.get("longitude"), + } + return address_vals + + def _enrich_result_lines_with_tax_rate(self, avatax_result): + """ + Enrich Avatax result with Odoo tax computation. + Tax details can have a tax rate with zero tax amount. + In this case the tax rate should be ignored. + + result is a dict with a 'createTransactionModel' returned by Avatax + """ + for line in avatax_result.get("lines", []): + line["rate"] = ( + round( + sum(x["rate"] for x in line["details"] if x and x.get("tax")) * 100, + 4, + ) + or 0.0 + ) + return avatax_result + + def get_tax( + self, + company_code, + doc_date, + doc_type, + partner_code, + doc_code, + origin, + destination, + received_lines, + exemption_no=None, + customer_usage_type=None, + salesman_code=None, + commit=False, + invoice_date=None, + reference_code=None, + location_code=None, + currency_code="USD", + vat=None, + is_override=False, + ignore_error=None, + log_to_record=False, + ): + """Create tax request and get tax amount by customer address + @currency_code : 'USD' is the default currency code for avalara, + if user not specify in the own company + return information about how the tax was calculated. Intended + for use only while the SDK is in a development environment. + """ + if not origin.street: + raise UserError( + _( + "Please set the Company Address " + "in the partner information and validate. " + "We are checking against the first line of the address " + "and it's empty. \n\n " + "Typically located in Sales->Customers, " + 'you have to clear "Customers" ' + "from search filter and type in your own company name. " + "Ensure the address is filled out " + "and go to Avatax tab in the partner information " + "and validate the address. Save partner update when done." + ) + ) + lineslist = [ + { + "number": line["id"].id, + "description": str(line.get("description", ""))[:255], + "itemCode": line.get("itemcode"), + "quantity": line.get("qty", 1), + "amount": line.get("amount", 0.0), + "taxCode": line.get("tax_code"), + } + for line in received_lines + ] + + if doc_date and not isinstance(doc_date, str): + doc_date = fields.Date.to_string(doc_date) + create_transaction = { + "addresses": { + "shipFrom": { + "city": origin.city, + "country": origin.country_id.code or None, + "line1": origin.street or None, + "postalCode": origin.zip, + "region": origin.state_id.code or None, + }, + "shipTo": { + "city": destination.city, + "country": destination.country_id.code or None, + "line1": destination.street or None, + "postalCode": destination.zip, + "region": destination.state_id.code or None, + }, + }, + "lines": lineslist, + # 'purchaseOrderNo": "2020-02-05-001" + "companyCode": company_code, + "currencyCode": currency_code, + "customerCode": partner_code, + "businessIdentificationNo": vat, + "referenceCode": reference_code, + "salespersonCode": salesman_code and salesman_code[:25] or None, + "reportingLocationCode": location_code, + "entityUseCode": customer_usage_type, + "exemptionNo": exemption_no, + "description": doc_code or "Draft", + "date": doc_date, + "code": doc_code, + "type": doc_type, + "commit": commit, + } + if is_override and invoice_date: + create_transaction.update( + { + "taxOverride": { + "type": "TaxDate", + "taxAmount": 0, + "taxDate": fields.Date.to_string(invoice_date), + "reason": "Return Items", + } + } + ) + + data = {"createTransactionModel": create_transaction} + if self.is_log_enabled: + _logger.info( + "Request CreateOrAdjustTransaction %s %s (commit %s)\n%s", + doc_type, + doc_code, + commit, + pprint.pformat(data, indent=1), + ) + response = self.client.create_or_adjust_transaction(data) + result = self.get_result(response, ignore_error=ignore_error) + if log_to_record: + log_to_record.avatax_request_log = pprint.pformat(data, indent=1) + log_to_record.avatax_response_log = pprint.pformat(result, indent=1) + return self._enrich_result_lines_with_tax_rate(result) + + def call(self, endpoint, company_code, doc_code, model=None, params=None): + if self.is_log_enabled: + _logger.info( + "Request Call %s(%s, %s, %s, %s)", + endpoint, + company_code, + doc_code, + model, + params, + ) + company_code = self._sanitize_text(company_code) + doc_code = self._sanitize_text(doc_code) + endpoint_method = getattr(self.client, endpoint) + if params: + response = endpoint_method(company_code, doc_code, model, params) + else: + response = endpoint_method(company_code, doc_code, model) + result = self.get_result(response) + return result diff --git a/account_avatax_oca/models/partner.py b/account_avatax_oca/models/partner.py new file mode 100644 index 000000000..7b7d473a5 --- /dev/null +++ b/account_avatax_oca/models/partner.py @@ -0,0 +1,240 @@ +import logging +import time +from random import random + +from odoo import api, fields, models +from odoo.exceptions import UserError + +from .avatax_rest_api import AvaTaxRESTService + +_LOGGER = logging.getLogger(__name__) + + +class ResPartner(models.Model): + """ + Update partner information by adding new fields + according to Avalara partner configuration + """ + + _inherit = "res.partner" + + @api.onchange("property_exemption_country_wide") + def _onchange_property_exemption_contry_wide(self): + if self.property_exemption_country_wide: + message = ( + self.env._( + "Enabling the exemption status for all states" + " may have tax compliance risks," + " and should be carefully considered.\n\n" + " Please ensure that your tax advisor was consulted and the" + " necessary tax exemption documentation was obtained" + " for every state this Partner may have transactions." + ), + ) + return { + "warning": { + "title": self.env._("Tax Compliance Risk"), + "message": message, + } + } + + date_validation = fields.Date( + "Last Validation Date", + readonly=True, + copy=False, + help="The date the address was last validated by AvaTax and accepted", + ) + validation_method = fields.Selection( + [("avatax", "Avalara"), ("other", "Other")], + "Address Validation Method", + readonly=True, + copy=False, + help="It gets populated when the address is validated by the method", + ) + validated_on_save = fields.Boolean( + help="Indicates if the address is already validated on save" + " before calling the wizard", + ) + customer_code = fields.Char(copy=False) + tax_exempt = fields.Boolean( + "Is Tax Exempt (Deprecated))", + ) + exemption_number = fields.Char( + "Exemption Number (Deprecated)", + ) + exemption_code_id = fields.Many2one( + "exemption.code", + "Exemption Code (Deprecated)", + ) + property_exemption_country_wide = fields.Boolean( + "Exemption Applies Country Wide", + 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", + ) + property_tax_exempt = fields.Boolean( + "Is Tax Exempt", + company_dependent=True, + help="This company or address can claim for tax exemption", + ) + property_exemption_number = fields.Char( + "Exemption Number", + company_dependent=True, + help="The State identification number relevant fot the exemption", + ) + property_exemption_code_id = fields.Many2one( + "exemption.code", + "Exemption Code", + company_dependent=True, + help="The type of exemption granted", + ) + + _sql_constraints = [ + ("name_uniq", "unique(customer_code)", "Customer Code must be unique!"), + ] + + @api.depends( + "property_tax_exempt", "property_exemption_code_id", "property_exemption_number" + ) + def check_exemption_number(self): + """ + When tax exempt check then atleast exemption number + or exemption code should be filled + """ + for partner in self: + if partner.property_tax_exempt and not ( + partner.property_exemption_code_id or partner.property_exemption_number + ): + raise UserError( + self.env._( + "Please enter either Exemption Number or Exemption Code" + " for marking customer as Exempt." + ) + ) + + def _get_avatax_customer_code(self): + self.ensure_one() + return "%d-%d-Cust-%d" % ( + int(time.time()), + int(random() * 10), + self.id, + ) + + def generate_cust_code(self): + "Auto populate customer code" + for partner in self: + partner.customer_code = partner._get_avatax_customer_code() + return True + + @api.onchange("tax_exempt") + def onchange_tax_exemption(self): + if not self.property_tax_exempt: + self.property_exemption_number = "" + self.property_exemption_code_id = None + + def get_state_from_code(self, state_code, country_code): + """Returns the state from the code.""" + state = self.env["res.country.state"].search( + [("code", "=", state_code), ("country_id.code", "=", country_code)], + ) + return state + + def get_country_from_code(self, code): + """Returns the country from the code.""" + country = self.env["res.country"].search([("code", "=", code)]) + return country + + def get_valid_address_vals(self, validation_on_save=False): + self.ensure_one() + partner = self + # For automatic validation on save, skip + # if no relevant address details are given + if validation_on_save and not ( + partner.city or partner.zip or partner.country_id + ): + _LOGGER.info( + "Skipping address validation for %d %s, not enough details.", + partner.id, + partner.display_name, + ) + return False + avatax_config = self.env.company.get_avatax_config_company() + # Skip automatic validation for countries not supported by Avatax + supported_countries = [x.code for x in avatax_config.country_ids] + country_code = partner.country_id.code + if validation_on_save and country_code not in supported_countries: + _LOGGER.info( + "Skipping automatic address validation for %d %s" + ", country %s not supported.", + partner.id, + partner.display_name, + country_code, + ) + return False + avatax_restpoint = AvaTaxRESTService(config=avatax_config) + valid_address = avatax_restpoint.validate_rest_address( + partner.street, + partner.street2, + partner.city, + partner.zip, + partner.state_id.code, + partner.country_id.code, + ) + return valid_address + + def multi_address_validation(self, validation_on_save=False): + for partner in self: + if not (partner.parent_id and partner.type == "contact"): + valid_address = partner.get_valid_address_vals( + validation_on_save=validation_on_save + ) + if valid_address: + partner.write(valid_address) + return True + + def button_avatax_validate_address(self): + """Method is used to verify of state and country""" + view_ref = self.env.ref( + "account_avatax_oca.view_avalara_salestax_address_validate" + ) + ctx = self.env.context.copy() + ctx.update({"active_ids": self.ids, "active_id": self.id}) + return { + "type": "ir.actions.act_window", + "name": "Address Validation", + "binding_view_types": "form", + "view_mode": "form", + "view_id": view_ref.id, + "res_model": "avalara.salestax.address.validate", + # "nodestroy": True, TODO: not needed + "res_id": False, + "target": "new", + "context": ctx, + } + + @api.model_create_multi + def create(self, vals_list): + partners = super().create(vals_list) + avatax_config = self.env.company.get_avatax_config_company() + for partner in partners: + # Auto populate customer code, if not provided + if not partner.customer_code: + partner.generate_cust_code() + # Auto validate address, if enabled + if avatax_config.validation_on_save: + partner.multi_address_validation(validation_on_save=True) + partner.validated_on_save = True + return partners + + def write(self, vals): + res = super().write(vals) + address_fields = ["street", "street2", "city", "zip", "state_id", "country_id"] + if not self.env.context.get("avatax_writing") and any( + x in vals for x in address_fields + ): + partner = self.with_context(avatax_writing=True) + avatax_config = self.env.company.get_avatax_config_company() + if avatax_config.validation_on_save: + partner.multi_address_validation(validation_on_save=True) + partner.validated_on_save = True + return res diff --git a/account_avatax_oca/models/product.py b/account_avatax_oca/models/product.py new file mode 100644 index 000000000..09d2f4679 --- /dev/null +++ b/account_avatax_oca/models/product.py @@ -0,0 +1,64 @@ +from odoo import fields, models + + +class ProductTaxCode(models.Model): + """Define type of tax code: + @param type: product is use as product code, + @param type: freight is use for shipping code + @param type: service is use for service type product + """ + + _name = "product.tax.code" + _description = "AvaTax Code" + + name = fields.Char("Code", required=True) + description = fields.Char() + type = fields.Selection( + [ + ("product", "Product"), + ("freight", "Freight"), + ("service", "Service"), + ("digital", "Digital"), + ("other", "Other"), + ], + required=True, + help="Type of tax code as defined in AvaTax", + ) + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + tax_code_id = fields.Many2one( + "product.tax.code", "Product AvaTax Code", help="AvaTax Product Tax Code" + ) + + def _compute_applicable_tax_code(self): + for product in self: + product.applicable_tax_code_id = ( + product.tax_code_id or product.categ_id.applicable_tax_code_id + ) + + applicable_tax_code_id = fields.Many2one( + "product.tax.code", + "Applicable AvaTax Code", + compute=_compute_applicable_tax_code, + ) + + +class ProductCategory(models.Model): + _inherit = "product.category" + + tax_code_id = fields.Many2one("product.tax.code", "AvaTax Code") + + def _compute_applicable_tax_code(self): + for categ in self: + categ.applicable_tax_code_id = categ.tax_code_id + if not categ.applicable_tax_code_id and categ.parent_id: + categ.applicable_tax_code_id = categ.parent_id.applicable_tax_code_id + + applicable_tax_code_id = fields.Many2one( + "product.tax.code", + "Applicable AvaTax Code", + compute=_compute_applicable_tax_code, + ) diff --git a/account_avatax_oca/models/res_company.py b/account_avatax_oca/models/res_company.py new file mode 100644 index 000000000..9127e3ac8 --- /dev/null +++ b/account_avatax_oca/models/res_company.py @@ -0,0 +1,29 @@ +import logging + +from odoo import models + +_LOGGER = logging.getLogger(__name__) + + +class Company(models.Model): + _inherit = "res.company" + + def get_avatax_config_company(self): + """Returns the AvaTax configuration for the Company""" + if self: + self.ensure_one() + AvataxConfig = self.env["avalara.salestax"] + res = AvataxConfig.search( + [("company_id", "=", self.id), ("disable_tax_calculation", "=", False)] + ) + if len(res) > 1: + _LOGGER.warning( + self.env._("Company %s has too many Avatax configurations!"), + self.display_name, + ) + if len(res) < 1: + _LOGGER.warning( + self.env._("Company %s has no Avatax configuration."), + self.display_name, + ) + return res and res[0] diff --git a/account_avatax_oca/pyproject.toml b/account_avatax_oca/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/account_avatax_oca/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/account_avatax_oca/readme/CONFIGURE.md b/account_avatax_oca/readme/CONFIGURE.md new file mode 100644 index 000000000..28caf23b3 --- /dev/null +++ b/account_avatax_oca/readme/CONFIGURE.md @@ -0,0 +1,163 @@ +To configure an Odoo company to use Avatax, follow these steps. Note tha +tsome of them might be configured out of the box for the Odoo default +company. + +1. Configure AvaTax API Connection +2. Configure Company Taxes +3. Configure Customers +4. Configure Products + +## Configure Avatax API Connection + +Before you can configure the Odoo Avatax connector, you will need some +connection details ready: + +- Login to +- Navigate to Settings \>\> All AvaTax Settings. There you will see the + company details. +- Take note of the Account ID and Company Code +- Navigate to Settings \>\> License and API Keys. In the "Reset License + Key" tab, click on the "Generate License Key" button, and take note of + it. + +To configure AvaTax connector in Odoo: + +- Navigate to: Accounting/Invoicing App \>\> Configuration \>\> AvaTax + \>\> AvaTax API +- Click on the Create button +- Fill out the form with the elements collected from the AvaTax website: + - Account ID + - License Key + - Service URL: usually Production, or Sandox if you have that + available. + - Company Code +- Click the Test Connection button +- Click the Save button + +Other Avatax API advanced configurations: + +- Tax Calculation tab: + - Disable Document Recording/Commiting: invoices will not be stored in + Avalara + - Enable UPC Taxability: this will transmit Odoo's product ean13 + number instead of its Internal Reference. If there is no ean13 then + the Internal Reference will be sent automatically. + - Hide Exemption & Tax Based on shipping address -- this will give + user ability to hide or show Tax Exemption and Tax Based on shipping + address fields at the invoice level. +- Address Validation tab: + - Automatic Address Validation: automatically attempts to validate on + creation and update of customer record, last validation date will be + visible and stored + - Require Validated Addresses: if validation for customer is required + but not valid, the validation will be forced + - Return validation results in upper case: validation results will + return in upper case form +- Advanced tab: + - Automatically generate missing customer code: generates a customer + code on creation and update of customer profile + - Log API requests: enables detailed AvaTax transaction logging within + application + - Request Timeout: default is 300ms + - Countries: countries where AvaTax can be used. + +## Configure Company Taxes + +Each company linked to AvaTax and their associated warehouses should be +configured to ensure the correct tax is calculated and applied for all +transactions. + +Validate Company Address: + +- On the AvTax API configuration form, click on the "Company Address" + link +- On the company address form, click on the "validate" button in the + "AvaTax" tab + +Validate Warehouse Address: + +- Navigate to: Inventory \>\> Configuration \>\> Warehouse Management + \>\> Warehouses +- For each warehouse, open the correspoding from view +- On the Warehouse form, click on the "Address" link +- On the warehouse address form, click on the "validate" button in the + "AvaTax" tab + +Fiscal Positions is what tells the AvaTax connector if the AvaTax +service should be used for a particular Sales Order or Invoice. + +Configure Fiscal Position: + +- Navigate to: Accounting/Invoicing App \>\> Configuration \>\> + Accounting \>\> Fiscal Positions +- Ensure there is a Fiscal Position record for the Company, with the + "Use Avatax API" flag checked + +When the appropriate Fiscal Position is being used, and a tax rate is +retrieved form AvaTax, then the corresponding Tax is automatically +created in Odoo using a template tax record, that should have the +appropriate accounting configurations. + +Configure Taxes: + +- Navigate to: Accounting/Invoicing App \>\> Configuration \>\> + Accounting \>\> Taxes +- Ensure there is a Tax record for the Company, with the "Is Avatax" + flag checked (visible in the "Advanced Options" tab). This Tax should + have: + - Tax Type: Sales + - Tax Computation: Percentage of Price + - Amount: 0.0% + - Distribution for Invoices: ensure correct account configuration + - Distribution for Credit Notes: ensure correct account configuration + +## Configure Customers + +Exemption codes are allowed for users where they may apply (ex. Government entities). +Navigate to: Accounting or Invoicing App \>\> Configuration \>\> AvaTax +\>\> Exemption Code + +The module is installed with 16 predefined exemption codes. +You can add, remove, and modify exemption codes. + +Properly configuring each customer ensures the correct tax is calculated +and applied for all transactions. + +Create New Customer + +- Navigate to Contacts +- Click Create button + +Configure and Validate Customer Address + +- Enter Customer Address +- Under AvaTax \>\> Validation, click Validate button +- AvaTax Module will attempt to match the address you entered with a + valid address in its database. Click the Accept button if the address + is valid. + +Tax Exemption Status + +- If the customer is tax exempt, check the box under AvaTax \>\> Tax + Exemption \>\> Is Tax Exempt and +- Select the desired Tax Exempt Code from the dropdown menu. + +## Configure Products + +Create product tax codes to assign to products and/or product +categories. Navigate to: Accounting or Invoicing App \>\> Configuration +\>\> AvaTax \>\> Product Tax Codes. + +From here you can add, remove, and modify the product tax codes. + +Products in Odoo are typically assigned to product categories. AvaTax +settings can also be assigned to the product category when a product +category is created. + +- Create New Product Category + - Navigate to: Inventory \>\> Configuration \>\> Products \>\> Product + Categories + - Click Create button +- Configure Product Category Tax Code + - Under AvaTax Properties \>\> Tax Code + - Select the desired Tax Code diff --git a/account_avatax_oca/readme/CONTRIBUTORS.md b/account_avatax_oca/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..8d0875306 --- /dev/null +++ b/account_avatax_oca/readme/CONTRIBUTORS.md @@ -0,0 +1,15 @@ +- Odoo SA + - Fabrice Henrion +- Open Source Integrators () + - Daniel Reis \<\> + - Bhavesh Odedra \<\> + - Sandip Mangukiya \<\> + - Nikul Chaudhary \<\> +- Serpent CS + - Murtuza Saleh +- Sodexis + - Atchuthan Ubendran +- Kencove () + - Don Kendall \<\> + - Mohamed Alkobrosli \<\> + - Wai-Lun Lin \<\> diff --git a/account_avatax_oca/readme/CREDITS.md b/account_avatax_oca/readme/CREDITS.md new file mode 100644 index 000000000..e3a76ebe4 --- /dev/null +++ b/account_avatax_oca/readme/CREDITS.md @@ -0,0 +1,18 @@ +This module was originally developed by Fabrice Henrion at Odoo SA, and +maintained up to version 11. + +For version 12, Fabrice invited partners to migrate this modules to +later version, and maintain it. + +Open Source Integrators performed the migration to Odoo 12 , and later +added support for the more up to date REST API , alongside with the +legacy SOAP API. + +With the addition of the REST API, a deep refactor was introduced, +changing the tax calculation approach, from just setting the total tax +amount, to instead adding the tax rates to each document line and then +having Odoo do all the other computations. + +For Odoo 13, the legacy SOAP support was supported, and additional +refactoring was done to contribute the module to the Odoo Community +Association. diff --git a/account_avatax_oca/readme/DESCRIPTION.md b/account_avatax_oca/readme/DESCRIPTION.md new file mode 100644 index 000000000..42aa10fcc --- /dev/null +++ b/account_avatax_oca/readme/DESCRIPTION.md @@ -0,0 +1,55 @@ +**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: + + +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. diff --git a/account_avatax_oca/readme/INSTALL.md b/account_avatax_oca/readme/INSTALL.md new file mode 100644 index 000000000..d1fab0add --- /dev/null +++ b/account_avatax_oca/readme/INSTALL.md @@ -0,0 +1,31 @@ +Before installing the Avatax app, the Avalara Python client must be +installed in your system. It is available at +. + +Typically it can be installed in your system usin `pip`: + + pip3 install Avalara + +The base app, `account_Avatax`, adds Avatax support to Customer +Invoices. Inthe official app store: + + +The `account_avatax_sale` extension adds support to Quotations / Sales +Orders. Inthe official app store: + + +In most cases you will want to download and install both modules. + +To install the Avatax app: + +- Download the AvaTax modules +- Extract the downloaded files +- Upload the extracted directories into your Odoo module/addons + directory +- Log into Odoo as an Administrator and enable the Developer Mode, in + 'Settings' +- Navigate to 'Apps', select the 'Update Apps List' menu, to have the + new apps listed. +- In the Apps list, search for 'AvaTax' +- Click on the Install button. If available, the `account_avatax_sale` + module will also be installed automatically. diff --git a/account_avatax_oca/readme/ROADMAP.md b/account_avatax_oca/readme/ROADMAP.md new file mode 100644 index 000000000..006424c3c --- /dev/null +++ b/account_avatax_oca/readme/ROADMAP.md @@ -0,0 +1,12 @@ +The development of this module was driven by US companies to compute +Sales Tax. + +However the Avatax service supports more use cases, that could be added: + +- Add support to EU VAT +- Add support to US Use Tax on Purchases / vendor Bills + +Other improvements that could be added: + +- Detect and warn if customers State is not a nexus available for the + current account diff --git a/account_avatax_oca/readme/USAGE.md b/account_avatax_oca/readme/USAGE.md new file mode 100644 index 000000000..48a2cedea --- /dev/null +++ b/account_avatax_oca/readme/USAGE.md @@ -0,0 +1,98 @@ +## Customer Invoices + +The AvaTax module is integrated into Sales Invoices and is applied to +each transaction. The transaction log in the AvaTax dashboard shows the +invoice details and displays whether the transaction is in an +uncommitted or committed status. + +A validated invoice will have a Committed status and a cancelled invoice +will have a Voided status. + +The module will check if there is a selected warehouse and will +automatically determine the address of the warehouse and the origin +location. If no address is assigned to the warehouse, the company +address is used. + +Discounts are handled when they are enabled in Odoo's settings. They are +calculated as a net deduction on the line item cost before the total is +sent to AvaTax. + +### Create New Customer Invoice + +- Navigate to: Accounting or Invoicing \>\> Customers \>\> Invoices. +- Click Create button. + +### Validate Invoice + +- Ensure that Tax based on shipping address is checked. +- Line items should have AVATAX selected under Taxes for internal + records. +- To complete the invoice, click the Validate button. +- The sale order will now appear in the AvaTax dashboard. + +### Register Payment + +- Click the Register Payment button to finalize the invoice. + +### Customer Refunds + +Odoo applies refunds as opposed to voids in its accounting module. As +with customer invoices, the AvaTax module is integrated with customer +refunds and is applied to each transaction. + +Refunded invoice transactions will be indicated +with a negative total in the AvaTax interface. + +Initiate Customer Refund + +- Navigate to: Accounting or Invoicing \>\> Customers \>\> Invoices +- Select the invoice you wish to refund +- Click Add Credit Note button + +Create Credit Note + +- Under Credit Method, select Create a draft credit note. +- Enter a reason. +- Click Add Credit Note button. + +Note: You will be taken to the Credit Notes list view + +Validate Refund + +- Select the Credit Note you wish to validate, review and then click + Validate button. + +Register Refund Payment + +- Click Register Payment button to complete a refund + +## Sales Orders + +The AvaTax module is integrated into Sales Orders and allows computation +of taxes. Sales order transactions do not appear in the in the AvaTax +interface. + +The information placed in the sales order will automatically pass to the invoice +on the Avalara server and can be viewed in the AvaTax control panel. + +Discounts are handled when they are enabled in Odoo's settings. They +will be reported as a net deduction on the line item cost. + +Create New Sales Order + +- Navigate to: Sales \>\> Orders \>\> Orders +- Click Create button + +Compute Taxes with AvaTax + +- The module will calculate tax when the sales order is confirmed, or by + navigating to Action \>\> Update taxes with Avatax. At this step, the + sales order will retrieve the tax amount from Avalara but will not + report the transaction to the AvaTax dashboard. Only invoice, refund, + and payment activity are reported to the dashboard. +- The module will check if there is a selected warehouse and will + automatically determine the address of the warehouse and the origin + location. If no address is assigned to the warehouse the module will + automatically use the address of the company as its origin. Location + code will automatically populate with the warehouse code but can be + modified if needed. diff --git a/account_avatax_oca/security/avalara_salestax_security.xml b/account_avatax_oca/security/avalara_salestax_security.xml new file mode 100644 index 000000000..63eb0db44 --- /dev/null +++ b/account_avatax_oca/security/avalara_salestax_security.xml @@ -0,0 +1,30 @@ + + + + + + AvaTax multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + diff --git a/account_avatax_oca/security/ir.model.access.csv b/account_avatax_oca/security/ir.model.access.csv new file mode 100644 index 000000000..d500afe49 --- /dev/null +++ b/account_avatax_oca/security/ir.model.access.csv @@ -0,0 +1,10 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_avalara_salestax_manager,avalara.salestax.manager,model_avalara_salestax,account.group_account_manager,1,1,1,1 +access_avalara_salestax_employee,avalara.salestax.employee,model_avalara_salestax,base.group_user,1,0,0,0 +access_product_tax_code_employee,product.tax.code.employee,model_product_tax_code,base.group_user,1,0,0,0 +access_product_tax_code_manager,product.tax.code.manager,model_product_tax_code,account.group_account_manager,1,1,1,1 +access_exemption_code_manager,exemption.code.manager,model_exemption_code,account.group_account_manager,1,1,1,1 +access_exemption_code_employee,exemption.code.employee,model_exemption_code,base.group_user,1,0,0,0 +access_avalara_salestax_ping,avalara_salestax_ping,model_avalara_salestax_ping,account.group_account_manager,1,1,1,1 +access_avalara_salestax_address_validate,avalara_salestax_address_validate,model_avalara_salestax_address_validate,base.group_user,1,1,1,1 +access_avalara_salestax_getcompany,avalara_salestax_getcompany,model_avalara_salestax_getcompany,account.group_account_manager,1,1,1,1 diff --git a/account_avatax_oca/static/description/ATC1.png b/account_avatax_oca/static/description/ATC1.png new file mode 100644 index 000000000..6974b4abe Binary files /dev/null and b/account_avatax_oca/static/description/ATC1.png differ diff --git a/account_avatax_oca/static/description/ATC10.png b/account_avatax_oca/static/description/ATC10.png new file mode 100644 index 000000000..6906b1b14 Binary files /dev/null and b/account_avatax_oca/static/description/ATC10.png differ diff --git a/account_avatax_oca/static/description/ATC11.png b/account_avatax_oca/static/description/ATC11.png new file mode 100644 index 000000000..a23aee372 Binary files /dev/null and b/account_avatax_oca/static/description/ATC11.png differ diff --git a/account_avatax_oca/static/description/ATC12.png b/account_avatax_oca/static/description/ATC12.png new file mode 100644 index 000000000..808185f98 Binary files /dev/null and b/account_avatax_oca/static/description/ATC12.png differ diff --git a/account_avatax_oca/static/description/ATC13.png b/account_avatax_oca/static/description/ATC13.png new file mode 100644 index 000000000..7dd827779 Binary files /dev/null and b/account_avatax_oca/static/description/ATC13.png differ diff --git a/account_avatax_oca/static/description/ATC14.png b/account_avatax_oca/static/description/ATC14.png new file mode 100644 index 000000000..6fa267959 Binary files /dev/null and b/account_avatax_oca/static/description/ATC14.png differ diff --git a/account_avatax_oca/static/description/ATC15.png b/account_avatax_oca/static/description/ATC15.png new file mode 100644 index 000000000..3b2af003d Binary files /dev/null and b/account_avatax_oca/static/description/ATC15.png differ diff --git a/account_avatax_oca/static/description/ATC16.png b/account_avatax_oca/static/description/ATC16.png new file mode 100644 index 000000000..16c75e2e0 Binary files /dev/null and b/account_avatax_oca/static/description/ATC16.png differ diff --git a/account_avatax_oca/static/description/ATC17.png b/account_avatax_oca/static/description/ATC17.png new file mode 100644 index 000000000..595c36ef9 Binary files /dev/null and b/account_avatax_oca/static/description/ATC17.png differ diff --git a/account_avatax_oca/static/description/ATC18.png b/account_avatax_oca/static/description/ATC18.png new file mode 100644 index 000000000..3cb776dd1 Binary files /dev/null and b/account_avatax_oca/static/description/ATC18.png differ diff --git a/account_avatax_oca/static/description/ATC19.png b/account_avatax_oca/static/description/ATC19.png new file mode 100644 index 000000000..34fe36a48 Binary files /dev/null and b/account_avatax_oca/static/description/ATC19.png differ diff --git a/account_avatax_oca/static/description/ATC2.png b/account_avatax_oca/static/description/ATC2.png new file mode 100644 index 000000000..cdbf788e5 Binary files /dev/null and b/account_avatax_oca/static/description/ATC2.png differ diff --git a/account_avatax_oca/static/description/ATC20.png b/account_avatax_oca/static/description/ATC20.png new file mode 100644 index 000000000..58e78667f Binary files /dev/null and b/account_avatax_oca/static/description/ATC20.png differ diff --git a/account_avatax_oca/static/description/ATC21.png b/account_avatax_oca/static/description/ATC21.png new file mode 100644 index 000000000..06e75970c Binary files /dev/null and b/account_avatax_oca/static/description/ATC21.png differ diff --git a/account_avatax_oca/static/description/ATC22.png b/account_avatax_oca/static/description/ATC22.png new file mode 100644 index 000000000..f579855e0 Binary files /dev/null and b/account_avatax_oca/static/description/ATC22.png differ diff --git a/account_avatax_oca/static/description/ATC23.png b/account_avatax_oca/static/description/ATC23.png new file mode 100644 index 000000000..b5bd75651 Binary files /dev/null and b/account_avatax_oca/static/description/ATC23.png differ diff --git a/account_avatax_oca/static/description/ATC24.png b/account_avatax_oca/static/description/ATC24.png new file mode 100644 index 000000000..e2c6b6047 Binary files /dev/null and b/account_avatax_oca/static/description/ATC24.png differ diff --git a/account_avatax_oca/static/description/ATC3.png b/account_avatax_oca/static/description/ATC3.png new file mode 100644 index 000000000..859e6eefb Binary files /dev/null and b/account_avatax_oca/static/description/ATC3.png differ diff --git a/account_avatax_oca/static/description/ATC4.png b/account_avatax_oca/static/description/ATC4.png new file mode 100644 index 000000000..b0ca29e72 Binary files /dev/null and b/account_avatax_oca/static/description/ATC4.png differ diff --git a/account_avatax_oca/static/description/ATC5.png b/account_avatax_oca/static/description/ATC5.png new file mode 100644 index 000000000..50f01e4ac Binary files /dev/null and b/account_avatax_oca/static/description/ATC5.png differ diff --git a/account_avatax_oca/static/description/ATC6.png b/account_avatax_oca/static/description/ATC6.png new file mode 100644 index 000000000..db1908880 Binary files /dev/null and b/account_avatax_oca/static/description/ATC6.png differ diff --git a/account_avatax_oca/static/description/ATC7.png b/account_avatax_oca/static/description/ATC7.png new file mode 100644 index 000000000..dd031e77f Binary files /dev/null and b/account_avatax_oca/static/description/ATC7.png differ diff --git a/account_avatax_oca/static/description/ATC8.png b/account_avatax_oca/static/description/ATC8.png new file mode 100644 index 000000000..91d80b4de Binary files /dev/null and b/account_avatax_oca/static/description/ATC8.png differ diff --git a/account_avatax_oca/static/description/ATC9.png b/account_avatax_oca/static/description/ATC9.png new file mode 100644 index 000000000..b6fa64086 Binary files /dev/null and b/account_avatax_oca/static/description/ATC9.png differ diff --git a/account_avatax_oca/static/description/AddressValidation.png b/account_avatax_oca/static/description/AddressValidation.png new file mode 100644 index 000000000..6a20be9a0 Binary files /dev/null and b/account_avatax_oca/static/description/AddressValidation.png differ diff --git a/account_avatax_oca/static/description/Address_validation.png b/account_avatax_oca/static/description/Address_validation.png new file mode 100644 index 000000000..545b0181d Binary files /dev/null and b/account_avatax_oca/static/description/Address_validation.png differ diff --git a/account_avatax_oca/static/description/Apps_Odoo_image1.png b/account_avatax_oca/static/description/Apps_Odoo_image1.png new file mode 100644 index 000000000..9b0938e59 Binary files /dev/null and b/account_avatax_oca/static/description/Apps_Odoo_image1.png differ diff --git a/account_avatax_oca/static/description/AvaTax_API_1.png b/account_avatax_oca/static/description/AvaTax_API_1.png new file mode 100644 index 000000000..c0811124c Binary files /dev/null and b/account_avatax_oca/static/description/AvaTax_API_1.png differ diff --git a/account_avatax_oca/static/description/AvaTax_API_Odoo_image2.png b/account_avatax_oca/static/description/AvaTax_API_Odoo_image2.png new file mode 100644 index 000000000..c0811124c Binary files /dev/null and b/account_avatax_oca/static/description/AvaTax_API_Odoo_image2.png differ diff --git a/account_avatax_oca/static/description/AvaTax_API_Odoo_image3.png b/account_avatax_oca/static/description/AvaTax_API_Odoo_image3.png new file mode 100644 index 000000000..9d64a9173 Binary files /dev/null and b/account_avatax_oca/static/description/AvaTax_API_Odoo_image3.png differ diff --git a/account_avatax_oca/static/description/AvaTax_Development_Admin_Console.png b/account_avatax_oca/static/description/AvaTax_Development_Admin_Console.png new file mode 100644 index 000000000..83b98d81d Binary files /dev/null and b/account_avatax_oca/static/description/AvaTax_Development_Admin_Console.png differ diff --git a/account_avatax_oca/static/description/Avatax_odoo_taxes.png b/account_avatax_oca/static/description/Avatax_odoo_taxes.png new file mode 100644 index 000000000..7e6fb779c Binary files /dev/null and b/account_avatax_oca/static/description/Avatax_odoo_taxes.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices Odoo20.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices Odoo20.png new file mode 100644 index 000000000..2d2d03842 Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices Odoo20.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices RINV 2016 0004 Damage Odoo22.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices RINV 2016 0004 Damage Odoo22.png new file mode 100644 index 000000000..d4b10eef8 Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices RINV 2016 0004 Damage Odoo22.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices RINV 2016 0004 Damage Odoo23.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices RINV 2016 0004 Damage Odoo23.png new file mode 100644 index 000000000..a7bf9b016 Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices RINV 2016 0004 Damage Odoo23.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices Refund Damage Odoo21.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices Refund Damage Odoo21.png new file mode 100644 index 000000000..e7c416d7e Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Customer Invoices Refund Damage Odoo21.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo15.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo15.png new file mode 100644 index 000000000..09abaac38 Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo15.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo16.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo16.png new file mode 100644 index 000000000..08e44f196 Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo16.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo17.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo17.png new file mode 100644 index 000000000..78ea8cc2d Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo17.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo18.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo18.png new file mode 100644 index 000000000..78ea8cc2d Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo18.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo19.png b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo19.png new file mode 100644 index 000000000..ea33c05e9 Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices INV 2016 0600 Odoo19.png differ diff --git a/account_avatax_oca/static/description/Customer Invoices Invoice Odoo14.png b/account_avatax_oca/static/description/Customer Invoices Invoice Odoo14.png new file mode 100644 index 000000000..2d2d03842 Binary files /dev/null and b/account_avatax_oca/static/description/Customer Invoices Invoice Odoo14.png differ diff --git a/account_avatax_oca/static/description/Customers Lumber Inc Odoo12.png b/account_avatax_oca/static/description/Customers Lumber Inc Odoo12.png new file mode 100644 index 000000000..562faa2e8 Binary files /dev/null and b/account_avatax_oca/static/description/Customers Lumber Inc Odoo12.png differ diff --git a/account_avatax_oca/static/description/Customers Odoo_imahe11.png b/account_avatax_oca/static/description/Customers Odoo_imahe11.png new file mode 100644 index 000000000..7e6370773 Binary files /dev/null and b/account_avatax_oca/static/description/Customers Odoo_imahe11.png differ diff --git a/account_avatax_oca/static/description/Exemption_Code.png b/account_avatax_oca/static/description/Exemption_Code.png new file mode 100644 index 000000000..9ccb6b66e Binary files /dev/null and b/account_avatax_oca/static/description/Exemption_Code.png differ diff --git a/account_avatax_oca/static/description/Exemption_Code_Odoo_image3.png b/account_avatax_oca/static/description/Exemption_Code_Odoo_image3.png new file mode 100644 index 000000000..9ccb6b66e Binary files /dev/null and b/account_avatax_oca/static/description/Exemption_Code_Odoo_image3.png differ diff --git a/account_avatax_oca/static/description/Product Categories All Saleable Odoo_image8.png b/account_avatax_oca/static/description/Product Categories All Saleable Odoo_image8.png new file mode 100644 index 000000000..b7e28ff15 Binary files /dev/null and b/account_avatax_oca/static/description/Product Categories All Saleable Odoo_image8.png differ diff --git a/account_avatax_oca/static/description/Product_Categories_Odoo_image7.png b/account_avatax_oca/static/description/Product_Categories_Odoo_image7.png new file mode 100644 index 000000000..4d2350d3b Binary files /dev/null and b/account_avatax_oca/static/description/Product_Categories_Odoo_image7.png differ diff --git a/account_avatax_oca/static/description/Product_TaxCodes_Odoo_image4.png b/account_avatax_oca/static/description/Product_TaxCodes_Odoo_image4.png new file mode 100644 index 000000000..dc7fb5f51 Binary files /dev/null and b/account_avatax_oca/static/description/Product_TaxCodes_Odoo_image4.png differ diff --git a/account_avatax_oca/static/description/Products FURN_8900_Odoo_image10.png b/account_avatax_oca/static/description/Products FURN_8900_Odoo_image10.png new file mode 100644 index 000000000..4cc630187 Binary files /dev/null and b/account_avatax_oca/static/description/Products FURN_8900_Odoo_image10.png differ diff --git a/account_avatax_oca/static/description/Products Odoo_image9.png b/account_avatax_oca/static/description/Products Odoo_image9.png new file mode 100644 index 000000000..693e55e93 Binary files /dev/null and b/account_avatax_oca/static/description/Products Odoo_image9.png differ diff --git a/account_avatax_oca/static/description/Quotations_AvaTax.png b/account_avatax_oca/static/description/Quotations_AvaTax.png new file mode 100644 index 000000000..0bae4efe1 Binary files /dev/null and b/account_avatax_oca/static/description/Quotations_AvaTax.png differ diff --git a/account_avatax_oca/static/description/Refunds.png b/account_avatax_oca/static/description/Refunds.png new file mode 100644 index 000000000..01558da9e Binary files /dev/null and b/account_avatax_oca/static/description/Refunds.png differ diff --git a/account_avatax_oca/static/description/Sales Orders Odoo24.png b/account_avatax_oca/static/description/Sales Orders Odoo24.png new file mode 100644 index 000000000..19c803243 Binary files /dev/null and b/account_avatax_oca/static/description/Sales Orders Odoo24.png differ diff --git a/account_avatax_oca/static/description/SalesTax.png b/account_avatax_oca/static/description/SalesTax.png new file mode 100644 index 000000000..6dd12541e Binary files /dev/null and b/account_avatax_oca/static/description/SalesTax.png differ diff --git a/account_avatax_oca/static/description/Taxes_AVATAX_Odoo_image6.png b/account_avatax_oca/static/description/Taxes_AVATAX_Odoo_image6.png new file mode 100644 index 000000000..816cc9748 Binary files /dev/null and b/account_avatax_oca/static/description/Taxes_AVATAX_Odoo_image6.png differ diff --git a/account_avatax_oca/static/description/Taxes_Odoo_image5.png b/account_avatax_oca/static/description/Taxes_Odoo_image5.png new file mode 100644 index 000000000..c2ee423c3 Binary files /dev/null and b/account_avatax_oca/static/description/Taxes_Odoo_image5.png differ diff --git a/account_avatax_oca/static/description/avatax.png b/account_avatax_oca/static/description/avatax.png new file mode 100644 index 000000000..443c785b5 Binary files /dev/null and b/account_avatax_oca/static/description/avatax.png differ diff --git a/account_avatax_oca/static/description/avatax_icon.png b/account_avatax_oca/static/description/avatax_icon.png new file mode 100644 index 000000000..0074d62a3 Binary files /dev/null and b/account_avatax_oca/static/description/avatax_icon.png differ diff --git a/account_avatax_oca/static/description/icon.png b/account_avatax_oca/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/account_avatax_oca/static/description/icon.png differ diff --git a/account_avatax_oca/static/description/index.html b/account_avatax_oca/static/description/index.html new file mode 100644 index 000000000..fe8d8c21f --- /dev/null +++ b/account_avatax_oca/static/description/index.html @@ -0,0 +1,876 @@ + + + + + +Avalara Avatax Certified Connector + + + +
+

Avalara Avatax Certified Connector

+ + +

Production/Stable License: AGPL-3 OCA/account-fiscal-rule Translate me on Weblate Try me on Runboat

+

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. +
  3. Install the new account_avatax_oca module

    +
  4. +
  5. Unistall the account_avatax module

    +
  6. +
  7. +
    Confirm that your configurations were kept safe, in particular:
    +
    Avatax API, “Avatax” default Fiscal Position, and “Avatax” +default Tax record.
    +
    +
  8. +
+
+

Table of contents

+ +
+

Installation

+

Before installing the Avatax app, the Avalara Python client must be +installed in your system. It is available at +https://pypi.org/project/Avalara.

+

Typically it can be installed in your system usin pip:

+
+pip3 install Avalara
+
+

The base app, account_Avatax, adds Avatax support to Customer +Invoices. Inthe official app store: +https://apps.odoo.com/apps/modules/15.0/account_avatax/

+

The account_avatax_sale extension adds support to Quotations / Sales +Orders. Inthe official app store: +https://apps.odoo.com/apps/modules/15.0/account_avatax_sale/

+

In most cases you will want to download and install both modules.

+

To install the Avatax app:

+
    +
  • Download the AvaTax modules
  • +
  • Extract the downloaded files
  • +
  • Upload the extracted directories into your Odoo module/addons +directory
  • +
  • Log into Odoo as an Administrator and enable the Developer Mode, in +‘Settings’
  • +
  • Navigate to ‘Apps’, select the ‘Update Apps List’ menu, to have the +new apps listed.
  • +
  • In the Apps list, search for ‘AvaTax’
  • +
  • Click on the Install button. If available, the account_avatax_sale +module will also be installed automatically.
  • +
+
+
+

Configuration

+

To configure an Odoo company to use Avatax, follow these steps. Note tha +tsome of them might be configured out of the box for the Odoo default +company.

+
    +
  1. Configure AvaTax API Connection
  2. +
  3. Configure Company Taxes
  4. +
  5. Configure Customers
  6. +
  7. Configure Products
  8. +
+
+

Configure Avatax API Connection

+

Before you can configure the Odoo Avatax connector, you will need some +connection details ready:

+
    +
  • Login to https://home.avalara.com/
  • +
  • Navigate to Settings >> All AvaTax Settings. There you will see the +company details.
  • +
  • Take note of the Account ID and Company Code
  • +
  • Navigate to Settings >> License and API Keys. In the “Reset License +Key” tab, click on the “Generate License Key” button, and take note of +it.
  • +
+

To configure AvaTax connector in Odoo:

+
    +
  • Navigate to: Accounting/Invoicing App >> Configuration >> AvaTax >> +AvaTax API
  • +
  • Click on the Create button
  • +
  • Fill out the form with the elements collected from the AvaTax website:
      +
    • Account ID
    • +
    • License Key
    • +
    • Service URL: usually Production, or Sandox if you have that +available.
    • +
    • Company Code
    • +
    +
  • +
  • Click the Test Connection button
  • +
  • Click the Save button
  • +
+

Other Avatax API advanced configurations:

+
    +
  • Tax Calculation tab:
      +
    • Disable Document Recording/Commiting: invoices will not be stored in +Avalara
    • +
    • Enable UPC Taxability: this will transmit Odoo’s product ean13 +number instead of its Internal Reference. If there is no ean13 then +the Internal Reference will be sent automatically.
    • +
    • Hide Exemption & Tax Based on shipping address – this will give +user ability to hide or show Tax Exemption and Tax Based on shipping +address fields at the invoice level.
    • +
    +
  • +
  • Address Validation tab:
      +
    • Automatic Address Validation: automatically attempts to validate on +creation and update of customer record, last validation date will be +visible and stored
    • +
    • Require Validated Addresses: if validation for customer is required +but not valid, the validation will be forced
    • +
    • Return validation results in upper case: validation results will +return in upper case form
    • +
    +
  • +
  • Advanced tab:
      +
    • Automatically generate missing customer code: generates a customer +code on creation and update of customer profile
    • +
    • Log API requests: enables detailed AvaTax transaction logging within +application
    • +
    • Request Timeout: default is 300ms
    • +
    • Countries: countries where AvaTax can be used.
    • +
    +
  • +
+
+
+

Configure Company Taxes

+

Each company linked to AvaTax and their associated warehouses should be +configured to ensure the correct tax is calculated and applied for all +transactions.

+

Validate Company Address:

+
    +
  • On the AvTax API configuration form, click on the “Company Address” +link
  • +
  • On the company address form, click on the “validate” button in the +“AvaTax” tab
  • +
+

Validate Warehouse Address:

+
    +
  • Navigate to: Inventory >> Configuration >> Warehouse Management >> +Warehouses
  • +
  • For each warehouse, open the correspoding from view
  • +
  • On the Warehouse form, click on the “Address” link
  • +
  • On the warehouse address form, click on the “validate” button in the +“AvaTax” tab
  • +
+

Fiscal Positions is what tells the AvaTax connector if the AvaTax +service should be used for a particular Sales Order or Invoice.

+

Configure Fiscal Position:

+
    +
  • Navigate to: Accounting/Invoicing App >> Configuration >> Accounting +>> Fiscal Positions
  • +
  • Ensure there is a Fiscal Position record for the Company, with the +“Use Avatax API” flag checked
  • +
+

When the appropriate Fiscal Position is being used, and a tax rate is +retrieved form AvaTax, then the corresponding Tax is automatically +created in Odoo using a template tax record, that should have the +appropriate accounting configurations.

+

Configure Taxes:

+
    +
  • Navigate to: Accounting/Invoicing App >> Configuration >> Accounting +>> Taxes
  • +
  • Ensure there is a Tax record for the Company, with the “Is Avatax” +flag checked (visible in the “Advanced Options” tab). This Tax should +have:
      +
    • Tax Type: Sales
    • +
    • Tax Computation: Percentage of Price
    • +
    • Amount: 0.0%
    • +
    • Distribution for Invoices: ensure correct account configuration
    • +
    • Distribution for Credit Notes: ensure correct account configuration
    • +
    +
  • +
+
+
+

Configure Customers

+
+
Exemption codes are allowed for users where they may apply (ex. +Government entities).
+
Navigate to: Accounting or Invoicing App >> Configuration >> AvaTax >> +Exemption Code
+
+
+
The module is installed with 16 predefined exemption codes.
+
You can add, remove, and modify exemption codes.
+
+

Properly configuring each customer ensures the correct tax is calculated +and applied for all transactions.

+

Create New Customer

+
    +
  • Navigate to Contacts
  • +
  • Click Create button
  • +
+

Configure and Validate Customer Address

+
    +
  • Enter Customer Address
  • +
  • Under AvaTax >> Validation, click Validate button
  • +
  • AvaTax Module will attempt to match the address you entered with a +valid address in its database. Click the Accept button if the address +is valid.
  • +
+

Tax Exemption Status

+
    +
  • If the customer is tax exempt, check the box under AvaTax >> Tax +Exemption >> Is Tax Exempt and
  • +
  • Select the desired Tax Exempt Code from the dropdown menu.
  • +
+
+
+

Configure Products

+

Create product tax codes to assign to products and/or product +categories. Navigate to: Accounting or Invoicing App >> Configuration >> +AvaTax >> Product Tax Codes.

+

From here you can add, remove, and modify the product tax codes.

+

Products in Odoo are typically assigned to product categories. AvaTax +settings can also be assigned to the product category when a product +category is created.

+
    +
  • Create New Product Category
      +
    • Navigate to: Inventory >> Configuration >> Products >> Product +Categories
    • +
    • Click Create button
    • +
    +
  • +
  • Configure Product Category Tax Code
      +
    • Under AvaTax Properties >> Tax Code
    • +
    • Select the desired Tax Code
    • +
    +
  • +
+
+
+
+

Usage

+
+

Customer Invoices

+

The AvaTax module is integrated into Sales Invoices and is applied to +each transaction. The transaction log in the AvaTax dashboard shows the +invoice details and displays whether the transaction is in an +uncommitted or committed status.

+

A validated invoice will have a Committed status and a cancelled invoice +will have a Voided status.

+

The module will check if there is a selected warehouse and will +automatically determine the address of the warehouse and the origin +location. If no address is assigned to the warehouse, the company +address is used.

+

Discounts are handled when they are enabled in Odoo’s settings. They are +calculated as a net deduction on the line item cost before the total is +sent to AvaTax.

+
+

Create New Customer Invoice

+
    +
  • Navigate to: Accounting or Invoicing >> Customers >> Invoices.
  • +
  • Click Create button.
  • +
+
+
+

Validate Invoice

+
    +
  • Ensure that Tax based on shipping address is checked.
  • +
  • Line items should have AVATAX selected under Taxes for internal +records.
  • +
  • To complete the invoice, click the Validate button.
  • +
  • The sale order will now appear in the AvaTax dashboard.
  • +
+
+
+

Register Payment

+
    +
  • Click the Register Payment button to finalize the invoice.
  • +
+
+
+

Customer Refunds

+

Odoo applies refunds as opposed to voids in its accounting module. As +with customer invoices, the AvaTax module is integrated with customer +refunds and is applied to each transaction.

+
+
Refunded invoice transactions will be indicated
+
with a negative total in the AvaTax interface.
+
+

Initiate Customer Refund

+
    +
  • Navigate to: Accounting or Invoicing >> Customers >> Invoices
  • +
  • Select the invoice you wish to refund
  • +
  • Click Add Credit Note button
  • +
+

Create Credit Note

+
    +
  • Under Credit Method, select Create a draft credit note.
  • +
  • Enter a reason.
  • +
  • Click Add Credit Note button.
  • +
+

Note: You will be taken to the Credit Notes list view

+

Validate Refund

+
    +
  • Select the Credit Note you wish to validate, review and then click +Validate button.
  • +
+

Register Refund Payment

+
    +
  • Click Register Payment button to complete a refund
  • +
+
+
+
+

Sales Orders

+

The AvaTax module is integrated into Sales Orders and allows computation +of taxes. Sales order transactions do not appear in the in the AvaTax +interface.

+
+
The information placed in the sales order will automatically pass to +the invoice
+
on the Avalara server and can be viewed in the AvaTax control panel.
+
+

Discounts are handled when they are enabled in Odoo’s settings. They +will be reported as a net deduction on the line item cost.

+

Create New Sales Order

+
    +
  • Navigate to: Sales >> Orders >> Orders
  • +
  • Click Create button
  • +
+

Compute Taxes with AvaTax

+
    +
  • The module will calculate tax when the sales order is confirmed, or by +navigating to Action >> Update taxes with Avatax. At this step, the +sales order will retrieve the tax amount from Avalara but will not +report the transaction to the AvaTax dashboard. Only invoice, refund, +and payment activity are reported to the dashboard.
  • +
  • The module will check if there is a selected warehouse and will +automatically determine the address of the warehouse and the origin +location. If no address is assigned to the warehouse the module will +automatically use the address of the company as its origin. Location +code will automatically populate with the warehouse code but can be +modified if needed.
  • +
+
+
+
+

Known issues / Roadmap

+

The development of this module was driven by US companies to compute +Sales Tax.

+

However the Avatax service supports more use cases, that could be added:

+
    +
  • Add support to EU VAT
  • +
  • Add support to US Use Tax on Purchases / vendor Bills
  • +
+

Other improvements that could be added:

+
    +
  • Detect and warn if customers State is not a nexus available for the +current account
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Open Source Integrators
  • +
  • Fabrice Henrion
  • +
  • Sodexis
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

This module was originally developed by Fabrice Henrion at Odoo SA, and +maintained up to version 11.

+

For version 12, Fabrice invited partners to migrate this modules to +later version, and maintain it.

+

Open Source Integrators performed the migration to Odoo 12 , and later +added support for the more up to date REST API , alongside with the +legacy SOAP API.

+

With the addition of the REST API, a deep refactor was introduced, +changing the tax calculation approach, from just setting the total tax +amount, to instead adding the tax rates to each document line and then +having Odoo do all the other computations.

+

For Odoo 13, the legacy SOAP support was supported, and additional +refactoring was done to contribute the module to the Odoo Community +Association.

+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

dreispt

+

This module is part of the OCA/account-fiscal-rule project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/account_avatax_oca/static/src/img/icon.png b/account_avatax_oca/static/src/img/icon.png new file mode 100644 index 000000000..443c785b5 Binary files /dev/null and b/account_avatax_oca/static/src/img/icon.png differ diff --git a/account_avatax_oca/tests/__init__.py b/account_avatax_oca/tests/__init__.py new file mode 100644 index 000000000..378899979 --- /dev/null +++ b/account_avatax_oca/tests/__init__.py @@ -0,0 +1,5 @@ +from . import test_account_tax +from . import test_avatax +from . import test_parter +from . import test_rest_api +from . import test_avatax_api diff --git a/account_avatax_oca/tests/common.py b/account_avatax_oca/tests/common.py new file mode 100644 index 000000000..538f3035b --- /dev/null +++ b/account_avatax_oca/tests/common.py @@ -0,0 +1,169 @@ +import socket +from contextlib import contextmanager +from unittest.mock import Mock, patch + +from avalara import AvataxClient + +from odoo.exceptions import UserError +from odoo.tests.common import TransactionCase + +from .mocked_invoice_1_response import generate_response as generate_response_invoice_1 + +NOTHING = object() + + +class TestAvataxCommon(TransactionCase): + @classmethod + def setUpClass(cls): + res = super().setUpClass() + cls.appname = "Odoo 17 - Open Source Integrators/OCA" + cls.version = "a0o5a000007SPdsAAG" + cls.hostname = socket.gethostname() + url = "" + cls.environment = ( + "sandbox" if "sandbox" in url or "development" in url else "production" + ) + try: + cls.client = AvataxClient( + cls.appname, cls.version, cls.hostname, cls.environment + ) + except NameError as exc: + raise UserError( + cls.env._( + "AvataxClient is not available in your system. " + "Please contact your system administrator " + "to 'pip3 install Avalara'" + ) + ) from exc + + # Update address of company + company = cls.env.user.company_id + company.write( + { + "street": "255 Executive Park Blvd", + "city": "San Francisco", + "state_id": cls.env.ref("base.state_us_5").id, + "country_id": cls.env.ref("base.us").id, + "zip": "94134", + } + ) + + cls.fp_avatax = cls.env["account.fiscal.position"].create( + { + "name": "Avatax", + "is_avatax": True, + } + ) + + # Create partner with correct US address + cls.partner = cls.env["res.partner"].create( + { + "name": "Demo Sale Partner", + "street": "2288 Market St", + "city": "San Francisco", + "state_id": cls.env.ref("base.state_us_5").id, + "country_id": cls.env.ref("base.us").id, + "zip": "94114", + "property_account_position_id": cls.fp_avatax.id, + } + ) + + cls.invoice = cls.env["account.move"].create( + { + "move_type": "out_invoice", + "partner_id": cls.partner.id, + "invoice_line_ids": [ + ( + 0, + 0, + {"name": "Demo Invoice Line", "price_unit": 10, "quantity": 20}, + ) + ], + } + ) + cls.avatax = cls.env.ref("account_avatax_oca.avatax_api_configuraation") + cls.invoice_1_response = dict( + generate_response_invoice_1(cls.invoice.invoice_line_ids) + ) + + return res + + @classmethod + @contextmanager + def _capture_create_or_adjust_transaction( + cls, return_value=NOTHING, return_func=NOTHING, apply_args=False + ): + class Capture: + mock_response = Mock() + val = None + + def _capture_create_or_adjust_transaction(cls, model, include=None): + cls.val = model + if return_value is NOTHING: + cls.mock_response.json.return_value = return_func(model) + else: + cls.mock_response.json.return_value = return_value + if apply_args: + # Apply the real passed args and return them in the mocked response + cls.mock_response.json()["description"] = model[ + "createTransactionModel" + ]["description"] + cls.mock_response.json()["type"] = model["createTransactionModel"][ + "type" + ] + cls.mock_response.json()["code"] = model["createTransactionModel"][ + "code" + ] + cls.mock_response.json()["date"] = model["createTransactionModel"][ + "date" + ] + cls.mock_response.json()["salespersonCode"] = model[ + "createTransactionModel" + ]["salespersonCode"] + cls.mock_response.json()["customerCode"] = model[ + "createTransactionModel" + ]["customerCode"] + cls.mock_response.json()["lines"][0]["itemCode"] = model[ + "createTransactionModel" + ]["lines"][0]["itemCode"] + cls.mock_response.json()["lines"][0]["taxCode"] = model[ + "createTransactionModel" + ]["lines"][0]["taxCode"] + cls.mock_response.json()["lines"][0]["lineNumber"] = model[ + "createTransactionModel" + ]["lines"][0]["number"] + cls.mock_response.json()["lines"][0]["description"] = model[ + "createTransactionModel" + ]["lines"][0]["description"] + cls.mock_response.json()["lines"][0]["quantity"] = model[ + "createTransactionModel" + ]["lines"][0]["quantity"] + cls.mock_response.json()["lines"][0]["lineAmount"] = model[ + "createTransactionModel" + ]["lines"][0]["amount"] + return cls.mock_response + + capture = Capture() + with patch( + "avalara.client_methods.Mixin.create_or_adjust_transaction", + capture._capture_create_or_adjust_transaction, + ): + yield capture + + @classmethod + @contextmanager + def _capture_ping(cls, return_value=NOTHING): + class Capture: + mock_response = Mock() + + def _capture_ping(cls): + if return_value is NOTHING: + default_response = {"key": "value"} + cls.mock_response.json.return_value = default_response + else: + cls.mock_response.json.return_value = return_value + return cls.mock_response + + capture = Capture() + with patch("avalara.client_methods.Mixin.ping", capture._capture_ping): + yield capture diff --git a/account_avatax_oca/tests/mocked_invoice_1_response.py b/account_avatax_oca/tests/mocked_invoice_1_response.py new file mode 100644 index 000000000..69bf5db02 --- /dev/null +++ b/account_avatax_oca/tests/mocked_invoice_1_response.py @@ -0,0 +1,377 @@ +def generate_response(invoice_line_ids=None): + assert len(invoice_line_ids) == 1, "the mocked response is for 1 line" + for i, line in enumerate(response["lines"]): + line["lineNumber"] = f"{invoice_line_ids[i].id}" + return response + + +response = { + "addresses": [ + { + "boundaryLevel": "Address", + "city": "San Francisco", + "country": "US", + "id": 5000304937315, + "latitude": "37.764754", + "line1": "2280 Market St", + "line2": "", + "line3": "", + "longitude": "-122.432634", + "postalCode": "94114-1506", + "region": "CA", + "taxRegionId": 4016940, + "transactionId": 6000182165320, + }, + { + "boundaryLevel": "Address", + "city": "San Francisco", + "country": "US", + "id": 6000304937315, + "latitude": "37.71116", + "line1": "250 Executive Park Blvd", + "line2": "", + "line3": "", + "longitude": "-122.391717", + "postalCode": "94134-3394", + "region": "CA", + "taxRegionId": 4016940, + "transactionId": 6000182165320, + }, + ], + "adjustmentDescription": "", + "adjustmentReason": "NotAdjusted", + "batchCode": "", + "businessIdentificationNo": "", + "code": "Journal Entry 67", + "companyId": 281741, + "country": "US", + "currencyCode": "USD", + "customerCode": "CUST123456", + "customerUsageType": "", + "customerVendorCode": "CUST123456", + "date": "2021-01-01", + "description": "", + "destinationAddressId": 5000304937315, + "email": "", + "entityUseCode": "", + "exchangeRate": 1.0, + "exchangeRateCurrencyCode": "USD", + "exchangeRateEffectiveDate": "2021-01-01", + "exemptNo": "", + "id": 6000182165320, + "lines": [ + { + "boundaryOverrideId": 0, + "businessIdentificationNo": "", + "costInsuranceFreight": 0.0, + "customerUsageType": "", + "description": "Odoo User", + "destinationAddressId": 5000304937315, + "details": [ + { + "addressId": 6000304937315, + "country": "US", + "countyFIPS": "", + "exemptAmount": 0.0, + "exemptReasonId": 4, + "exemptUnits": 0.0, + "id": 9000401706101, + "inState": True, + "isFee": False, + "isNonPassThru": False, + "jurisCode": "06", + "jurisName": "CALIFORNIA", + "jurisType": "STA", + "jurisdictionId": 5000531, + "jurisdictionType": "State", + "liabilityType": "Seller", + "nonTaxableAmount": 0.0, + "nonTaxableRuleId": 0, + "nonTaxableType": "RateRule", + "nonTaxableUnits": 0.0, + "rate": 0.06, + "rateRuleId": 1525706, + "rateSourceId": 3, + "rateType": "General", + "rateTypeCode": "G", + "region": "CA", + "reportingExemptUnits": 0.0, + "reportingNonTaxableUnits": 0.0, + "reportingTax": 2.1, + "reportingTaxCalculated": 2.1, + "reportingTaxableUnits": 35.0, + "serCode": "", + "signatureCode": "AGAM", + "sourcing": "Origin", + "stateAssignedNo": "", + "stateFIPS": "", + "tax": 2.1, + "taxAuthorityTypeId": 45, + "taxCalculated": 2.1, + "taxName": "CA STATE TAX", + "taxOverride": 0.0, + "taxRegionId": 4016940, + "taxSubTypeId": "S", + "taxType": "Sales", + "taxTypeGroupId": "SalesAndUse", + "taxableAmount": 35.0, + "taxableUnits": 35.0, + "transactionId": 6000182165320, + "transactionLineId": 10403927888, + "unitOfBasis": "PerCurrencyUnit", + }, + { + "addressId": 6000304937315, + "country": "US", + "countyFIPS": "", + "exemptAmount": 0.0, + "exemptReasonId": 4, + "exemptUnits": 0.0, + "id": 10000401706103, + "inState": True, + "isFee": False, + "isNonPassThru": False, + "jurisCode": "075", + "jurisName": "SAN FRANCISCO", + "jurisType": "CTY", + "jurisdictionId": 275, + "jurisdictionType": "County", + "liabilityType": "Seller", + "nonTaxableAmount": 0.0, + "nonTaxableRuleId": 0, + "nonTaxableType": "RateRule", + "nonTaxableUnits": 0.0, + "rate": 0.0025, + "rateRuleId": 1525710, + "rateSourceId": 3, + "rateType": "General", + "rateTypeCode": "G", + "region": "CA", + "reportingExemptUnits": 0.0, + "reportingNonTaxableUnits": 0.0, + "reportingTax": 0.09, + "reportingTaxCalculated": 0.09, + "reportingTaxableUnits": 35.0, + "serCode": "", + "signatureCode": "AIUQ", + "sourcing": "Origin", + "stateAssignedNo": "", + "stateFIPS": "", + "tax": 0.09, + "taxAuthorityTypeId": 45, + "taxCalculated": 0.09, + "taxName": "CA COUNTY TAX", + "taxOverride": 0.0, + "taxRegionId": 4016940, + "taxSubTypeId": "S", + "taxType": "Sales", + "taxTypeGroupId": "SalesAndUse", + "taxableAmount": 35.0, + "taxableUnits": 35.0, + "transactionId": 6000182165320, + "transactionLineId": 10403927888, + "unitOfBasis": "PerCurrencyUnit", + }, + { + "addressId": 6000304937315, + "country": "US", + "countyFIPS": "", + "exemptAmount": 0.0, + "exemptReasonId": 4, + "exemptUnits": 0.0, + "id": 11000401706101, + "inState": True, + "isFee": False, + "isNonPassThru": False, + "jurisCode": "EMTV0", + "jurisName": "SAN FRANCISCO CO LOCAL TAX SL", + "jurisType": "STJ", + "jurisdictionId": 2001061792, + "jurisdictionType": "Special", + "liabilityType": "Seller", + "nonTaxableAmount": 0.0, + "nonTaxableRuleId": 0, + "nonTaxableType": "RateRule", + "nonTaxableUnits": 0.0, + "rate": 0.01, + "rateRuleId": 1525730, + "rateSourceId": 3, + "rateType": "General", + "rateTypeCode": "G", + "region": "CA", + "reportingExemptUnits": 0.0, + "reportingNonTaxableUnits": 0.0, + "reportingTax": 0.35, + "reportingTaxCalculated": 0.35, + "reportingTaxableUnits": 35.0, + "serCode": "", + "signatureCode": "EMTV", + "sourcing": "Origin", + "stateAssignedNo": "38", + "stateFIPS": "", + "tax": 0.35, + "taxAuthorityTypeId": 45, + "taxCalculated": 0.35, + "taxName": "CA SPECIAL TAX", + "taxOverride": 0.0, + "taxRegionId": 4016940, + "taxSubTypeId": "S", + "taxType": "Sales", + "taxTypeGroupId": "SalesAndUse", + "taxableAmount": 35.0, + "taxableUnits": 35.0, + "transactionId": 6000182165320, + "transactionLineId": 10403927888, + "unitOfBasis": "PerCurrencyUnit", + }, + ], + "discountAmount": 0.0, + "discountTypeId": 0, + "entityUseCode": "", + "exemptAmount": 0.0, + "exemptCertId": 0, + "exemptNo": "", + "hsCode": "", + "id": 10403927888, + "isItemTaxable": True, + "isSSTP": False, + "itemCode": "false", + "lineAmount": 35.0, + "lineLocationTypes": [ + { + "documentAddressId": 6000304937315, + "documentLineId": 10403927888, + "documentLineLocationTypeId": 11000385345219, + "locationTypeCode": "ShipFrom", + }, + { + "documentAddressId": 5000304937315, + "documentLineId": 10403927888, + "documentLineLocationTypeId": 12000385345218, + "locationTypeCode": "ShipTo", + }, + ], + "lineNumber": "229", + "nonPassthroughDetails": [], + "originAddressId": 6000304937315, + "quantity": 1.0, + "ref1": "", + "ref2": "", + "reportingDate": "2021-01-01", + "revAccount": "", + "sourcing": "Origin", + "tax": 2.54, + "taxCalculated": 2.54, + "taxCode": "DC010000", + "taxCodeId": 8575, + "taxDate": "2021-01-01", + "taxEngine": "", + "taxIncluded": False, + "taxOverrideAmount": 0.0, + "taxOverrideReason": "", + "taxOverrideType": "None", + "taxableAmount": 35.0, + "transactionId": 6000182165320, + "vatCode": "", + "vatNumberTypeId": 0, + }, + ], + "locationCode": "", + "locationTypes": [ + { + "documentAddressId": 6000304937315, + "documentId": 6000182165320, + "documentLocationTypeId": 11254474859, + "locationTypeCode": "ShipFrom", + }, + { + "documentAddressId": 5000304937315, + "documentId": 6000182165320, + "documentLocationTypeId": 5000269681192, + "locationTypeCode": "ShipTo", + }, + ], + "locked": False, + "modifiedDate": "2021-09-24T19:39:27.7013484Z", + "modifiedUserId": 212768, + "originAddressId": 6000304937315, + "purchaseOrderNo": "", + "reconciled": False, + "referenceCode": "INV/2021/01/0001", + "region": "CA", + "reportingLocationCode": "", + "salespersonCode": "", + "softwareVersion": "21.8.1.0", + "status": "Saved", + "summary": [ + { + "country": "US", + "exemption": 0.0, + "jurisCode": "06", + "jurisName": "CALIFORNIA", + "jurisType": "State", + "nonTaxable": 0.0, + "rate": 0.06, + "rateType": "General", + "region": "CA", + "stateAssignedNo": "", + "tax": 5.4, + "taxAuthorityType": 45, + "taxCalculated": 5.4, + "taxName": "CA STATE TAX", + "taxSubType": "S", + "taxType": "Sales", + "taxable": 90.0, + }, + { + "country": "US", + "exemption": 0.0, + "jurisCode": "075", + "jurisName": "SAN FRANCISCO", + "jurisType": "County", + "nonTaxable": 0.0, + "rate": 0.0025, + "rateType": "General", + "region": "CA", + "stateAssignedNo": "", + "tax": 0.24, + "taxAuthorityType": 45, + "taxCalculated": 0.24, + "taxName": "CA COUNTY TAX", + "taxSubType": "S", + "taxType": "Sales", + "taxable": 90.0, + }, + { + "country": "US", + "exemption": 0.0, + "jurisCode": "EMTV0", + "jurisName": "SAN FRANCISCO CO LOCAL TAX SL", + "jurisType": "Special", + "nonTaxable": 0.0, + "rate": 0.01, + "rateType": "General", + "region": "CA", + "stateAssignedNo": "38", + "tax": 0.9, + "taxAuthorityType": 45, + "taxCalculated": 0.9, + "taxName": "CA SPECIAL TAX", + "taxSubType": "S", + "taxType": "Sales", + "taxable": 90.0, + }, + ], + "taxDate": "2021-01-01", + "taxOverrideAmount": 0.0, + "taxOverrideReason": "", + "taxOverrideType": "None", + "totalAmount": 90.0, + "totalDiscount": 0.0, + "totalExempt": 0.0, + "totalTax": 6.54, + "totalTaxCalculated": 6.54, + "totalTaxable": 90.0, + "type": "SalesInvoice", + "version": 1, +} diff --git a/account_avatax_oca/tests/test_account_tax.py b/account_avatax_oca/tests/test_account_tax.py new file mode 100644 index 000000000..61469b980 --- /dev/null +++ b/account_avatax_oca/tests/test_account_tax.py @@ -0,0 +1,27 @@ +# Copyright 2021 Open Source Integrators +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + + +from odoo import exceptions +from odoo.tests import common + + +class TestAvatax(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.Tax = cls.env["account.tax"] + cls.company1 = cls.env.ref("base.main_company") + cls.company2 = cls.env["res.company"].create({"name": "Company Avatax 2"}) + + def test_get_avatax_tax_rate(self): + tax75 = self.Tax.get_avalara_tax(7.5, "out_invoice") + self.assertEqual(tax75.amount, 7.5) + + def test_get_avatax_template(self): + tax = self.Tax.get_avalara_tax(0, "out_invoice") + self.assertEqual(tax.name, "AVATAX") + + def test_get_avatax_template_missing(self): + with self.assertRaises(exceptions.UserError): + self.Tax.with_company(self.company2).get_avalara_tax(0, "out_invoice") diff --git a/account_avatax_oca/tests/test_avatax.py b/account_avatax_oca/tests/test_avatax.py new file mode 100644 index 000000000..8ba38bf2b --- /dev/null +++ b/account_avatax_oca/tests/test_avatax.py @@ -0,0 +1,48 @@ +# Copyright 2021 Open Source Integrators +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + + +import logging + +from odoo.tests import common + + +class TestAvatax(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + logging.getLogger("odoo.addons.account_avatax_oca.models.res_company").setLevel( + logging.ERROR + ) + cls.customer = cls.env["res.partner"].create( + { + "name": "Customer", + "property_tax_exempt": True, + "property_exemption_number": "12321", + "property_exemption_code_id": cls.env.ref( + "account_avatax_oca.resale_type" + ).id, + } + ) + cls.invoice = cls.env["account.move"].create( + { + "move_type": "out_invoice", + "partner_id": cls.customer.id, + "invoice_line_ids": [ + (0, 0, {"name": "Invoice Line", "price_unit": 10, "quantity": 10}) + ], + } + ) + + def test_100_onchange_customer_exempt(self): + self.invoice.partner_id = self.customer + self.assertEqual( + self.invoice.exemption_code, self.customer.property_exemption_number + ) + + def test_101_moves_onchange(self): + self.invoice.onchange_warehouse_id() + self.invoice.onchange_reset_avatax_amount() + self.invoice.onchange_avatax_calculation() + self.invoice.action_post() + self.invoice.button_draft() diff --git a/account_avatax_oca/tests/test_avatax_api.py b/account_avatax_oca/tests/test_avatax_api.py new file mode 100644 index 000000000..b5ee410dc --- /dev/null +++ b/account_avatax_oca/tests/test_avatax_api.py @@ -0,0 +1,124 @@ +import logging + +from odoo.exceptions import UserError +from odoo.tests.common import tagged + +from .common import TestAvataxCommon +from .mocked_invoice_1_response import response as response_invoice_1 + +_logger = logging.getLogger(__name__) + + +@tagged("-at_install", "post_install") +class TestAccountAvalaraInternal(TestAvataxCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + + def test_mocked_response(self): + # mocking response with actual invoice line ids + self.assertNotEqual(response_invoice_1["lines"][0]["lineNumber"], "229") + first_line_id = self.invoice.invoice_line_ids[:1] + + with self._capture_create_or_adjust_transaction( + return_value=self.invoice_1_response + ) as captured: + mock_response = captured._capture_create_or_adjust_transaction( + model={"key": "value"} + ) + self.assertNotEqual( + self.invoice_1_response["lines"][0]["lineNumber"], + "229", + ) + self.assertEqual( + self.invoice_1_response["lines"][0]["lineNumber"], + first_line_id.id, + ) + self.assertEqual( + mock_response.json()["lines"][0]["lineNumber"], + first_line_id.id, + ) + + def test_ping(self): + # test not authenticated user + with self._capture_ping() as captured: + with self.assertRaises(UserError): + self.env.user.lang = "en_US" + res = self.avatax.ping() + + response = { + "key": "connection to avalara is successful!", + "authenticated": True, + } + # test authenticated user + with self._capture_ping(return_value=response) as captured: + # mocked method is not called and no returned vaules + try: + self.assertDictEqual(response, captured.mock_response.json()) + except AssertionError as e: + _logger.info(f"AssertionError: \n===========> {e}") + # mocked method is called and return value + res = self.avatax.ping() + self.assertTrue(res) + # inserted return value is equal to returned value from mocked method + self.assertDictEqual(response, captured.mock_response.json()) + + def test__avatax_compute_tax(self): + first_line_id = self.invoice.invoice_line_ids[:1] + # test no tax records yet for invoice lines + self.assertFalse(first_line_id.tax_ids) + + # Without applying arguments + with self._capture_create_or_adjust_transaction( + return_value=self.invoice_1_response + ) as captured: + tax_result = self.invoice._avatax_compute_tax() + # test tax record is created for invoice lines + self.assertEqual( + captured.mock_response.json()["lines"][0]["lineNumber"], + f"{self.invoice.invoice_line_ids[:1].id}", + ) + self.assertEqual( + captured.mock_response.json()["lines"][0]["itemCode"], "false" + ) + self.assertEqual(captured.mock_response.json()["description"], "") + self.assertEqual(captured.mock_response.json()["type"], "SalesInvoice") + self.assertTrue( + captured.mock_response.json()["customerCode"] == "CUST123456" + ) + self.assertTrue(first_line_id.tax_ids) + self.assertEqual(tax_result["totalTax"], 6.54) + self.assertEqual(self.invoice_1_response["totalTax"], 6.54) + self.assertEqual(tax_result["totalTaxable"], 90.0) + self.assertEqual(self.invoice_1_response["totalTaxable"], 90.0) + + # With applying arguments + with self._capture_create_or_adjust_transaction( + return_value=self.invoice_1_response, apply_args=True + ) as captured: + tax_result = self.invoice._avatax_compute_tax() + # test tax record is created for invoice lines + self.assertEqual( + captured.mock_response.json()["lines"][0]["lineNumber"], + self.invoice.invoice_line_ids[:1].id, + ) + self.assertEqual( + captured.mock_response.json()["lines"][0]["itemCode"], "ID:0" + ) + self.assertEqual(captured.mock_response.json()["description"], "Draft") + self.assertEqual(captured.mock_response.json()["type"], "SalesOrder") + self.assertTrue( + captured.mock_response.json()["customerCode"] != "CUST123456" + ) + self.assertTrue(first_line_id.tax_ids) + self.assertEqual(tax_result["totalTax"], 6.54) + self.assertEqual(self.invoice_1_response["totalTax"], 6.54) + self.assertEqual(tax_result["totalTaxable"], 90.0) + self.assertEqual(self.invoice_1_response["totalTaxable"], 90.0) + + def test_avatax_compute_taxes(self): + with self._capture_create_or_adjust_transaction( + return_value=self.invoice_1_response + ): + returne_true = self.invoice.avatax_compute_taxes() + self.assertTrue(returne_true) diff --git a/account_avatax_oca/tests/test_parter.py b/account_avatax_oca/tests/test_parter.py new file mode 100644 index 000000000..bdccffdd3 --- /dev/null +++ b/account_avatax_oca/tests/test_parter.py @@ -0,0 +1,12 @@ +# Copyright 2021 Open Source Integrators +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo.tests import common + + +class TestAvatax(common.TransactionCase): + def test_customer_existing_code(self): + "Create Customer with an already existing code (data import)" + val_customer = {"name": "New Customer", "customer_code": "ABC"} + new_customer = self.env["res.partner"].create(val_customer) + self.assertEqual(new_customer.customer_code, "ABC") diff --git a/account_avatax_oca/tests/test_rest_api.py b/account_avatax_oca/tests/test_rest_api.py new file mode 100644 index 000000000..01cc42073 --- /dev/null +++ b/account_avatax_oca/tests/test_rest_api.py @@ -0,0 +1,52 @@ +# Copyright 2022 Open Source Integrators +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo.tests import common + +from ..models.avatax_rest_api import AvaTaxRESTService + + +class TestAvatax(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.API = AvaTaxRESTService() + + def test_enrich_result_lines_with_tax_rate(self): + avatax_result = { + "lines": [ + { + "details": [ + { + "rate": 0.056, + "tax": 0.0, + "taxCalculated": 0.0, + "taxName": "AZ STATE TAX", + "taxableAmount": 0.0, + }, + { + "rate": 0.007, + "tax": 0.0, + "taxCalculated": 0.0, + "taxName": "AZ COUNTY TAX", + "taxableAmount": 0.0, + }, + { + "rate": 0.018, + "tax": 0.16, + "taxCalculated": 0.16, + "taxName": "AZ CITY TAX", + "taxableAmount": 9.0, + }, + ], + "isItemTaxable": True, + "lineAmount": 9.0, + "tax": 0.16, + "taxCalculated": 0.16, + "taxableAmount": 9.0, + } + ] + } + result = self.API._enrich_result_lines_with_tax_rate(avatax_result) + rate = result["lines"][0]["rate"] + self.assertEqual(rate, 1.8) diff --git a/account_avatax_oca/views/account_fiscal_position_view.xml b/account_avatax_oca/views/account_fiscal_position_view.xml new file mode 100644 index 000000000..1a8e775f9 --- /dev/null +++ b/account_avatax_oca/views/account_fiscal_position_view.xml @@ -0,0 +1,12 @@ + + + account.fiscal.position form add Avatax + account.fiscal.position + + + + + + + + diff --git a/account_avatax_oca/views/account_move_action.xml b/account_avatax_oca/views/account_move_action.xml new file mode 100644 index 000000000..90b19e4d8 --- /dev/null +++ b/account_avatax_oca/views/account_move_action.xml @@ -0,0 +1,9 @@ + + + Update taxes with AvaTax + + + code + records.avatax_compute_taxes() + + diff --git a/account_avatax_oca/views/account_move_view.xml b/account_avatax_oca/views/account_move_view.xml new file mode 100644 index 000000000..7627b3be5 --- /dev/null +++ b/account_avatax_oca/views/account_move_view.xml @@ -0,0 +1,86 @@ + + + + account.move.form.inherit + account.move + + form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/account_avatax_oca/views/account_tax_view.xml b/account_avatax_oca/views/account_tax_view.xml new file mode 100644 index 000000000..7984d175a --- /dev/null +++ b/account_avatax_oca/views/account_tax_view.xml @@ -0,0 +1,12 @@ + + + account.tax.form.avatax + account.tax + + + + + + + + diff --git a/account_avatax_oca/views/avalara_salestax_view.xml b/account_avatax_oca/views/avalara_salestax_view.xml new file mode 100644 index 000000000..4545f8bc0 --- /dev/null +++ b/account_avatax_oca/views/avalara_salestax_view.xml @@ -0,0 +1,238 @@ + + + + avalara.salestax.form + avalara.salestax + form + +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + + + +
+
+
+
+
+
+ + avalara.salestax.tree + avalara.salestax + list + + + + + + + + + + + AvaTax API + avalara.salestax + list + list,form + Configuration of AvaTax in odoo + + + + + exemption.code.tree.view + exemption.code + list + + + + + + + + + Exemption Code + exemption.code + list + list,form + + +
diff --git a/account_avatax_oca/views/partner_view.xml b/account_avatax_oca/views/partner_view.xml new file mode 100644 index 000000000..0ff767133 --- /dev/null +++ b/account_avatax_oca/views/partner_view.xml @@ -0,0 +1,100 @@ + + + + res.partner.details.form.inherit1 + res.partner + form + + + + + + + + + +