Initial commit: OCA Financial packages (186 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:04 +02:00
commit 3e0e8473fb
8757 changed files with 947473 additions and 0 deletions

View file

@ -0,0 +1,48 @@
# Avatax Exemptions
Odoo addon: account_avatax_exemption
## Installation
```bash
pip install odoo-bringout-oca-account-fiscal-rule-account_avatax_exemption
```
## Dependencies
This addon depends on:
- website
- product
- queue_job
- account_avatax_sale_oca
- account_avatax_exemption_base
## Manifest Information
- **Name**: Avatax Exemptions
- **Version**: 16.0.1.0.0
- **Category**: Sales
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/account-fiscal-rule](https://github.com/OCA/account-fiscal-rule) branch 16.0, addon `account_avatax_exemption`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,85 @@
=================
Avatax Exemptions
=================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:42d58157035074dba48dc25701a032b7277ab64011e406d17ede521c95a431f4
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |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/16.0/account_avatax_exemption
: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-16-0/account-fiscal-rule-16-0-account_avatax_exemption
: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=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module is a component of the Avatax Exemption Integration with odoo app.
* Export Exemption customer in Avatax
* Export Exemptions for customer based on nexus region
* Export Custom rules based on avatax nexus regions
* Export Product Taxcodes to Avatax
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-fiscal-rule/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 <https://github.com/OCA/account-fiscal-rule/issues/new?body=module:%20account_avatax_exemption%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Sodexis
Contributors
~~~~~~~~~~~~
* Sodexis
* Atchuthan Ubendran <atchuthan@sodexis.com>
* Stephan Keller <skeller@sodexis.com>
* SodexisTeam <dev@sodexis.com>
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.
This module is part of the `OCA/account-fiscal-rule <https://github.com/OCA/account-fiscal-rule/tree/16.0/account_avatax_exemption>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,2 @@
from . import models
from . import controller

View file

@ -0,0 +1,39 @@
{
"name": "Avatax Exemptions",
"version": "16.0.1.0.0",
"category": "Sales",
"summary": """
This application allows you to add exemptions to Avatax
""",
"website": "https://github.com/OCA/account-fiscal-rule",
"author": "Sodexis, Odoo Community Association (OCA)",
"license": "AGPL-3",
"depends": [
"website",
"product",
"queue_job",
"account_avatax_sale_oca",
"account_avatax_exemption_base",
],
"data": [
"security/security.xml",
"security/ir.model.access.csv",
"data/cron.xml",
"data/queue.xml",
"data/ir_sequence_data.xml",
"views/avalara_salestax_view.xml",
"views/avalara_exemption_view.xml",
"views/product_view.xml",
"views/exemption_template_views.xml",
"views/res_country_state_view.xml",
"views/website_layout.xml",
"views/website_exemption_tree.xml",
"views/website_exemption_form.xml",
"views/partner_view.xml",
"views/account_move_view.xml",
"views/sale_view.xml",
],
"external_dependencies": {"python": ["Avalara"]},
"installable": True,
"application": True,
}

View file

@ -0,0 +1,166 @@
import logging
from odoo import _, http
from odoo.http import request, route
from odoo.tools import exception_to_unicode
from odoo.addons.portal.controllers.portal import CustomerPortal
_logger = logging.getLogger(__name__)
class Exemption(http.Controller):
@http.route("/exemption/<int:exemption_id>", website=True, auth="public")
def get_exemption(self, **kw):
exemption_id = kw.get("exemption_id")
try:
message = (
request.env["res.partner.exemption"]
.sudo()
.search_exemption_line(exemption_id)
)
except Exception as e:
message = False, exception_to_unicode(e)
return request.render(
"account_avatax_exemption.exemption_page", {"message": message}
)
class WebsiteExemption(CustomerPortal):
def _exemptions_domain(self, search=""):
"""Get user's exemptions domain."""
avalara_salestax = (
request.env["avalara.salestax"]
.sudo()
.search([("exemption_export", "=", True)], limit=1)
)
domain = [("partner_id", "child_of", request.env.user.partner_id.id)]
if avalara_salestax.use_commercial_entity:
domain = [
(
"partner_id",
"child_of",
request.env.user.partner_id.commercial_partner_id.id,
)
]
return domain
def _prepare_portal_layout_values(self, exemption=None):
values = super(WebsiteExemption, self)._prepare_portal_layout_values()
partner_counts = request.env["res.partner.exemption"].search_count(
self._exemptions_domain()
)
values["exemption_count"] = partner_counts
return values
def _prepare_exemptions_values(
self, page=1, date_begin=None, date_end=None, search="", sortby=None
):
"""Prepare the rendering context for the exemptions list."""
values = self._prepare_portal_layout_values()
Exemption = request.env["res.partner.exemption"]
base_url = "/my/exemptions"
searchbar_sortings = {
"date": {"label": _("Newest"), "order": "create_date desc"},
"expiry_date": {"label": _("Expiry Date"), "order": "expiry_date desc"},
}
if not sortby:
sortby = "date"
order = searchbar_sortings[sortby]["order"]
# Get the required domains
domain = self._exemptions_domain(search)
if date_begin and date_end:
domain += [
("create_date", ">=", date_begin),
("create_date", "<", date_end),
]
# Make pager
pager = request.website.pager(
url=base_url,
url_args={"date_begin": date_begin, "date_end": date_end, "sortby": sortby},
total=Exemption.search_count(domain),
page=page,
step=self._items_per_page,
)
# Current records to display
exemptions = Exemption.search(
domain,
order=order,
limit=self._items_per_page,
offset=pager["offset"],
)
request.session["my_exemptions_history"] = exemptions.ids[:100]
values.update(
{
"date": date_begin,
"date_end": date_end,
"exemptions": exemptions,
"page_name": "exemption",
"pager": pager,
"default_url": base_url,
"search": search,
"searchbar_sortings": searchbar_sortings,
"sortby": sortby,
}
)
return values
def _exemptions_fields(self):
"""Fields to display in the form."""
return [
"partner_id",
"exemption_type",
"exemption_code_id",
"state",
"exemption_number",
"exemption_number_type",
"effective_date",
"expiry_date",
]
@route(
["/my/exemptions", "/my/exemptions/page/<int:page>"],
type="http",
auth="user",
website=True,
)
def portal_my_exemptions(
self, page=1, date_begin=None, date_end=None, sortby=None, search="", **kw
):
"""List all of your exemptions."""
values = self._prepare_exemptions_values(
page, date_begin, date_end, search, sortby
)
return request.render("account_avatax_exemption.portal_my_exemptions", values)
def _exemption_get_page_view_values(self, exemption, access_token, **kwargs):
values = {
"exemption": exemption,
"fields": self._exemptions_fields(),
"page_name": "exemption",
"user": request.env.user,
}
return self._get_page_view_values(
exemption, access_token, values, "my_exemption_history", False, **kwargs
)
@route(
["/my/exemptions/<model('res.partner.exemption'):exemption>"],
type="http",
auth="user",
website=True,
)
def portal_my_exemptions_read(self, exemption, access_token=None, **kw):
"""Read a exemption form."""
values = self._exemption_get_page_view_values(exemption, access_token, **kw)
return request.render("account_avatax_exemption.exemptions_followup", values)

View file

@ -0,0 +1,32 @@
<odoo noupdate="1">
<record id="ir_cron_export_new_tax_item" model="ir.cron">
<field name="name">Avatax TaxItem: Export New Items</field>
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="state">code</field>
<field name="code">model.export_new_tax_items()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="active" eval="False" />
</record>
<record id="ir_cron_export_exemption_rule" model="ir.cron">
<field name="name">Avatax Rules: Export New Rules</field>
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="state">code</field>
<field name="code">model.export_new_exemption_rules()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="active" eval="False" />
</record>
<record id="ir_cron_download_exemption" model="ir.cron">
<field name="name">Avatax Exemption Download</field>
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="state">code</field>
<field name="code">model.download_exemptions()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="active" eval="False" />
</record>
</odoo>

View file

@ -0,0 +1,9 @@
<odoo noupdate="1">
<record id="seq_exemption_code_rule" model="ir.sequence">
<field name="name">Exemption Custom Rule Sequence</field>
<field name="code">exemption.code.rule.sequence</field>
<field name="prefix">RULE</field>
<field name="padding">5</field>
<field name="company_id" eval="False" />
</record>
</odoo>

View file

@ -0,0 +1,102 @@
<odoo>
<record id="channel_avatax" model="queue.job.channel">
<field name="name">avatax</field>
<field name="parent_id" ref="queue_job.channel_root" />
</record>
<!-- Custom Tax rule Job Function -->
<record id="job_function_export_base_rule_based_on_type" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_export_base_rule_based_on_type</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_rule"}'
/>
</record>
<record id="job_function_cancel_custom_rule" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_cancel_custom_rule</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_rule"}'
/>
</record>
<!-- Tax Item Job Function -->
<record id="job_function_export_tax_item" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_export_tax_item</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_tax_item"}'
/>
</record>
<record id="job_function_delete_tax_item" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_delete_tax_item</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_tax_item"}'
/>
</record>
<record id="job_function_update_tax_item" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_update_tax_item</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_tax_item"}'
/>
</record>
<!-- Exemption Job Function -->
<record id="job_function_export_avatax_customer" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_export_avatax_customer</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_customer"}'
/>
</record>
<record id="job_function_export_avatax_exemption_line" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_export_avatax_exemption_line</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_customer"}'
/>
</record>
<record id="job_function_link_certificates_to_customer" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">link_certificates_to_customer</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_customer"}'
/>
</record>
<record
id="job_function_update_avatax_exemption_line_status"
model="queue.job.function"
>
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_update_avatax_exemption_line_status</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_customer"}'
/>
</record>
<record id="job_function_search_create_exemption_line" model="queue.job.function">
<field name="model_id" ref="account_avatax_oca.model_avalara_salestax" />
<field name="method">_search_create_exemption_line</field>
<field name="channel_id" ref="channel_avatax" />
<field
name="related_action"
eval='{"func_name": "_related_action_avatax_customer"}'
/>
</record>
</odoo>

View file

@ -0,0 +1,527 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_avatax_exemption
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.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_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.form_breadcrumb
msgid "/ My Exemptions"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to Cancel the Custom Rule?"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to Enable the Custom Rule?"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Are you sure you want to Enable the Exemptions?"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to cancel the Custom Rules?"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Are you sure you want to cancel the Exemptions?"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_tax_code
msgid "AvaTax Code"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_avalara_salestax
msgid "AvaTax Configuration"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.actions.act_window,name:account_avatax_exemption.exemption_rule_act_window
#: model:ir.model,name:account_avatax_exemption.model_exemption_code_rule
#: model:ir.ui.menu,name:account_avatax_exemption.menu_exemption_rule
msgid "Avatax Custom Rules"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption
msgid "Avatax Exemption"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_download_exemption_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_download_exemption
msgid "Avatax Exemption Download"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax Exemption Rule export is disabled in Avatax configuration"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption_type
msgid "Avatax Exemption Type"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/avalara_salestax.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax Exemption export is disabled in Avatax configuration"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_partner_details_form_inherit1
msgid "Avatax Exemption related settings are managed on"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_rate
msgid "Avatax Rate"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_id
msgid "Avatax Rule ID"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_product_tax_code__rule_ids
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_country_state__rule_ids
msgid "Avatax Rules"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_export_exemption_rule_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_export_exemption_rule
msgid "Avatax Rules: Export New Rules"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_tax_code
msgid "Avatax Tax Code"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_product_product__avatax_item_id
msgid "Avatax TaxItem"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_export_new_tax_item_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_export_new_tax_item
msgid "Avatax TaxItem: Export New Items"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax rate range is from 0 to 100"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Cancel"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Cancel Failed Job"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__cancel
msgid "Cancelled"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__avatax_company_id
msgid "Company ID"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_country_state
msgid "Country state"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
msgid "Create Custom Rules"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__create_uid
msgid "Created by"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__create_date
msgid "Created on"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Custom Rules"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__display_name
msgid "Display Name"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__done
msgid "Done"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__draft
msgid "Draft"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Effective Date"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Enable Custom Rule"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Enable Exemptions"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption_business_type__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption_type__exemption_code_id
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_tree_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Entity Use Code"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption_business_type
msgid "Exemption Activity Type"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_exemption_code
msgid "Exemption Code"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__exemption_export
msgid "Exemption Export"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__exemption_rule_export
msgid "Exemption Rule Export"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
msgid "Exemption Rules"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Exemption status needs to be in Cancel status to enable"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Exemption status needs to be in Done status to cancel"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_layout
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_home_exemptions
msgid "Exemptions"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/controller/main.py:0
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
#, python-format
msgid "Expiry Date"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Export Exemptions"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Export New TaxItems"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Export Rules"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "History"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__id
msgid "ID"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Exemption Activity Type"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Exemptions"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Nexus Fed State Info"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Tax Rules"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import TaxItems"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__progress
msgid "In Progress"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__is_all_juris
msgid "Is All Juris"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule____last_update
msgid "Last Modified on"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__write_uid
msgid "Last Updated by"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__write_date
msgid "Last Updated on"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__name
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "Name"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "New"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/controller/main.py:0
#, python-format
msgid "Newest"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "No Customer code added in Partner"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "No Exemption Lines added"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_exemptions
msgid "No exemptions found."
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_template
msgid "Product"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_category
msgid "Product Category"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_product
msgid "Product Variant"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_queue_job
msgid "Queue Job"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__state_id
msgid "Region"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Reset to Draft"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code__rule_ids
msgid "Rule"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Cancelled state to Re-Export Custom Rule"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Done state to Cancel Custom Rule"
msgstr ""
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Draft state to Export Custom Rule"
msgstr ""
#. module: account_avatax_exemption
#: model:res.groups,name:account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code
msgid "Show Tax Exempt/Exemption number/Exemption code "
msgstr ""
#. module: account_avatax_exemption
#: model:res.groups,comment:account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code
msgid "Show the Exemption fields on SO and Invoice and Contact"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__state
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "State"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Status"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__tax_item_export
msgid "Tax Item Export"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__taxable
msgid "Taxable"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code__flag
msgid "Taxed by default"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,help:account_avatax_exemption.field_avalara_salestax__avatax_company_id
msgid "The company ID as defined in the Admin Console of AvaTax"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__use_commercial_entity
msgid "Use Commercial Entity"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "View Exemption:"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_exemptions
msgid "Your Exemptions"
msgstr ""
#. module: account_avatax_exemption
#: model:ir.model.fields,help:account_avatax_exemption.field_exemption_code__flag
msgid "helps to add custom rules for the nexus Avatax states"
msgstr ""
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_partner_details_form_inherit1
msgid "the parent company"
msgstr ""

View file

@ -0,0 +1,527 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_avatax_exemption
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.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_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.form_breadcrumb
msgid "/ My Exemptions"
msgstr "/ Moja oslobođenja"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to Cancel the Custom Rule?"
msgstr "Jeste li sigurni da želite otkazati prilagođeno pravilo?"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to Enable the Custom Rule?"
msgstr "Jeste li sigurni da želite omogućiti prilagođeno pravilo?"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Are you sure you want to Enable the Exemptions?"
msgstr "Jeste li sigurni da želite omogućiti oslobođenja?"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to cancel the Custom Rules?"
msgstr "Jeste li sigurni da želite otkazati prilagođena pravila?"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Are you sure you want to cancel the Exemptions?"
msgstr "Jeste li sigurni da želite otkazati oslobođenja?"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_tax_code
msgid "AvaTax Code"
msgstr "AvaTax kod"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_avalara_salestax
msgid "AvaTax Configuration"
msgstr "AvaTax konfiguracija"
#. module: account_avatax_exemption
#: model:ir.actions.act_window,name:account_avatax_exemption.exemption_rule_act_window
#: model:ir.model,name:account_avatax_exemption.model_exemption_code_rule
#: model:ir.ui.menu,name:account_avatax_exemption.menu_exemption_rule
msgid "Avatax Custom Rules"
msgstr "Avatax prilagođena pravila"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption
msgid "Avatax Exemption"
msgstr "Avatax oslobođenje"
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_download_exemption_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_download_exemption
msgid "Avatax Exemption Download"
msgstr "Avatax preuzmi oslobođenja"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax Exemption Rule export is disabled in Avatax configuration"
msgstr "Avatax export pravila oslobođenja je onemogućen u Avatax konfiguraciji"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption_type
msgid "Avatax Exemption Type"
msgstr "Avatax tip oslobođenja"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/avalara_salestax.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax Exemption export is disabled in Avatax configuration"
msgstr "Avatax export oslobođenja je onemogućen u Avatax konfiguraciji"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_partner_details_form_inherit1
msgid "Avatax Exemption related settings are managed on"
msgstr "Avatax podešavanja povezana sa oslobođenjima se upravljaju na"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_rate
msgid "Avatax Rate"
msgstr "Avatax stopa"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_id
msgid "Avatax Rule ID"
msgstr "Avatax ID pravila"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_product_tax_code__rule_ids
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_country_state__rule_ids
msgid "Avatax Rules"
msgstr "Avatax pravila"
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_export_exemption_rule_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_export_exemption_rule
msgid "Avatax Rules: Export New Rules"
msgstr "Avatax pravila: Exportuj nova pravila"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_tax_code
msgid "Avatax Tax Code"
msgstr "Avatax poreski kod"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_product_product__avatax_item_id
msgid "Avatax TaxItem"
msgstr "Avatax poreska stavka"
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_export_new_tax_item_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_export_new_tax_item
msgid "Avatax TaxItem: Export New Items"
msgstr "Avatax poreska stavka: Exportuj nove stavke"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax rate range is from 0 to 100"
msgstr "Avatax raspon stope je od 0 do 100"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Cancel"
msgstr "Otkaži"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Cancel Failed Job"
msgstr "Otkaži neuspješan posao"
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__cancel
msgid "Cancelled"
msgstr "Otkazan"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__avatax_company_id
msgid "Company ID"
msgstr "Identifikacijski broj"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_country_state
msgid "Country state"
msgstr "Fed. država/Kanton"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
msgid "Create Custom Rules"
msgstr "Kreiraj prilagođena pravila"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Custom Rules"
msgstr "Prilagođena pravila"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__done
msgid "Done"
msgstr "Gotovo"
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__draft
msgid "Draft"
msgstr "U pripremi"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Effective Date"
msgstr "Datum stupanja na snagu"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Enable Custom Rule"
msgstr "Omogući prilagođeno pravilo"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Enable Exemptions"
msgstr "Omogući oslobođenja"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption_business_type__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption_type__exemption_code_id
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_tree_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Entity Use Code"
msgstr "Kod korišćenja entiteta"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption_business_type
msgid "Exemption Activity Type"
msgstr "Tip aktivnosti oslobođenja"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_exemption_code
msgid "Exemption Code"
msgstr "Kod oslobođenja"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__exemption_export
msgid "Exemption Export"
msgstr "Export oslobođenja"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__exemption_rule_export
msgid "Exemption Rule Export"
msgstr "Export pravila oslobođenja"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
msgid "Exemption Rules"
msgstr "Pravila oslobođenja"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Exemption status needs to be in Cancel status to enable"
msgstr "Status oslobođenja mora biti u Otkaži statusu da se omogući"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Exemption status needs to be in Done status to cancel"
msgstr "Status oslobođenja mora biti u Završeno statusu da se otkaže"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_layout
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_home_exemptions
msgid "Exemptions"
msgstr "Oslobođenja"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/controller/main.py:0
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
#, python-format
msgid "Expiry Date"
msgstr "Datum isteka"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Export Exemptions"
msgstr "Exportuj oslobođenja"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Export New TaxItems"
msgstr "Exportuj nove poreske stavke"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Export Rules"
msgstr "Exportuj pravila"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "History"
msgstr "Istorija"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__id
msgid "ID"
msgstr "ID"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Exemption Activity Type"
msgstr "Importuj tip aktivnosti oslobođenja"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Exemptions"
msgstr "Importuj oslobođenja"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Nexus Fed State Info"
msgstr "Importuj informacije federalnih država Nexus"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Tax Rules"
msgstr "Importuj poreska pravila"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import TaxItems"
msgstr "Importuj poreske stavke"
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__progress
msgid "In Progress"
msgstr "U Toku"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__is_all_juris
msgid "Is All Juris"
msgstr "Je sva jurisdikcija"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__name
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "Name"
msgstr "Naziv:"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "New"
msgstr "Novi"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/controller/main.py:0
#, python-format
msgid "Newest"
msgstr "Najnoviji"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "No Customer code added in Partner"
msgstr "Nema koda kupca dodanog u partneru"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "No Exemption Lines added"
msgstr "Nema dodanih linija oslobođenja"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_exemptions
msgid "No exemptions found."
msgstr "Nema pronađenih oslobođenja."
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_template
msgid "Product"
msgstr "Artikal"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_category
msgid "Product Category"
msgstr "Kategorija proizvoda"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_product
msgid "Product Variant"
msgstr "Varijanta proizvoda"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_queue_job
msgid "Queue Job"
msgstr "Posao u redu"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__state_id
msgid "Region"
msgstr "Region"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Reset to Draft"
msgstr "Vrati u pripremu"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code__rule_ids
msgid "Rule"
msgstr "Pravilo"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Cancelled state to Re-Export Custom Rule"
msgstr "Pravilo nije u Otkazano stanju da ponovo exportuje prilagođeno pravilo"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Done state to Cancel Custom Rule"
msgstr "Pravilo nije u Završeno stanju da otkaže prilagođeno pravilo"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Draft state to Export Custom Rule"
msgstr "Pravilo nije u Nacrt stanju da exportuje prilagođeno pravilo"
#. module: account_avatax_exemption
#: model:res.groups,name:account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code
msgid "Show Tax Exempt/Exemption number/Exemption code "
msgstr "Prikaži oslobođenje od poreza/broj oslobođenja/kod oslobođenja "
#. module: account_avatax_exemption
#: model:res.groups,comment:account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code
msgid "Show the Exemption fields on SO and Invoice and Contact"
msgstr "Prikaži polja oslobođenja na SO i fakturi i kontaktu"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__state
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "State"
msgstr "Status"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Status"
msgstr "Status"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__tax_item_export
msgid "Tax Item Export"
msgstr "Export poreske stavke"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__taxable
msgid "Taxable"
msgstr "Oporeziv"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code__flag
msgid "Taxed by default"
msgstr "Oporezovan po defaultu"
#. module: account_avatax_exemption
#: model:ir.model.fields,help:account_avatax_exemption.field_avalara_salestax__avatax_company_id
msgid "The company ID as defined in the Admin Console of AvaTax"
msgstr "ID kompanije kako je definisan u Admin konzoli AvaTax"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__use_commercial_entity
msgid "Use Commercial Entity"
msgstr "Koristi komercijalni entitet"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "View Exemption:"
msgstr "Prikaži oslobođenje:"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_exemptions
msgid "Your Exemptions"
msgstr "Vaša oslobođenja"
#. module: account_avatax_exemption
#: model:ir.model.fields,help:account_avatax_exemption.field_exemption_code__flag
msgid "helps to add custom rules for the nexus Avatax states"
msgstr "pomaže dodavanju prilagođenih pravila za nexus Avatax države"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_partner_details_form_inherit1
msgid "the parent company"
msgstr "nadređena kompanija"

View file

@ -0,0 +1,535 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_avatax_exemption
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-19 13:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\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.10.2\n"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.form_breadcrumb
msgid "/ My Exemptions"
msgstr "/ Mie esenzioni"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to Cancel the Custom Rule?"
msgstr "Si è sicuri di voler annullare la regola personalizzata?"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to Enable the Custom Rule?"
msgstr "Si è sicuri di voler abilitare la regola personalizzata?"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Are you sure you want to Enable the Exemptions?"
msgstr "Si è sicuri di voler abilitare le esenzioni?"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Are you sure you want to cancel the Custom Rules?"
msgstr "Si è sicuri di voler annullare le regole personalizzate?"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Are you sure you want to cancel the Exemptions?"
msgstr "Si è sicuri di voler annullare le esenzioni?"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_tax_code
msgid "AvaTax Code"
msgstr "Codice AvaTax"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_avalara_salestax
msgid "AvaTax Configuration"
msgstr "Configurazione AvaTax"
#. module: account_avatax_exemption
#: model:ir.actions.act_window,name:account_avatax_exemption.exemption_rule_act_window
#: model:ir.model,name:account_avatax_exemption.model_exemption_code_rule
#: model:ir.ui.menu,name:account_avatax_exemption.menu_exemption_rule
msgid "Avatax Custom Rules"
msgstr "Regole personalizzate AvaTax"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption
msgid "Avatax Exemption"
msgstr "Esenzione AvaTax"
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_download_exemption_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_download_exemption
msgid "Avatax Exemption Download"
msgstr "Scaricamento esenzione AvaTax"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax Exemption Rule export is disabled in Avatax configuration"
msgstr ""
"L'esportazione della regola esenzione AvaTax è disabilitata nella "
"configurazione AvaTax"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption_type
msgid "Avatax Exemption Type"
msgstr "Tipo esenzione AvaTax"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/avalara_salestax.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax Exemption export is disabled in Avatax configuration"
msgstr ""
"L'esportazione dell'esenzione AvaTax è disabilitata nella configurazione "
"AvaTax"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_partner_details_form_inherit1
msgid "Avatax Exemption related settings are managed on"
msgstr "Le impostazioni relative all'esenzione AvaTax sono gestite in"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_rate
msgid "Avatax Rate"
msgstr "Tariffa AvaTax"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_id
msgid "Avatax Rule ID"
msgstr "ID regola AvaTax"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_product_tax_code__rule_ids
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_country_state__rule_ids
msgid "Avatax Rules"
msgstr "Regole AvaTax"
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_export_exemption_rule_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_export_exemption_rule
msgid "Avatax Rules: Export New Rules"
msgstr "Regole AvaTax: esporta nuove regole"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__avatax_tax_code
msgid "Avatax Tax Code"
msgstr "Codice tassa AvaTax"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_product_product__avatax_item_id
msgid "Avatax TaxItem"
msgstr "Elemento imposta AvaTax"
#. module: account_avatax_exemption
#: model:ir.actions.server,name:account_avatax_exemption.ir_cron_export_new_tax_item_ir_actions_server
#: model:ir.cron,cron_name:account_avatax_exemption.ir_cron_export_new_tax_item
msgid "Avatax TaxItem: Export New Items"
msgstr "Elemento imposta AvaTax: esporta nuovi elementi"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Avatax rate range is from 0 to 100"
msgstr "L'intervallo della tariffa AvaTax va da 0 a 100"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Cancel"
msgstr "Annulla"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Cancel Failed Job"
msgstr "Annulla lavoro fallito"
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__cancel
msgid "Cancelled"
msgstr "Annullata"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__avatax_company_id
msgid "Company ID"
msgstr "ID azienda"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_country_state
msgid "Country state"
msgstr "Nazione"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
msgid "Create Custom Rules"
msgstr "Crea regole personalizzate"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__create_date
msgid "Created on"
msgstr "Creato il"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Custom Rules"
msgstr "Regole personalizzate"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__done
msgid "Done"
msgstr "Evasa"
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__draft
msgid "Draft"
msgstr "Bozza"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Effective Date"
msgstr "Data effettiva"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Enable Custom Rule"
msgstr "Abilita regola personalizzata"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Enable Exemptions"
msgstr "Abilita esenzioni"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption_business_type__exemption_code_id
#: model:ir.model.fields,field_description:account_avatax_exemption.field_res_partner_exemption_type__exemption_code_id
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_tree_view
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Entity Use Code"
msgstr "Codice utilizzo entità"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_res_partner_exemption_business_type
msgid "Exemption Activity Type"
msgstr "Tipo attività esenzione"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_exemption_code
msgid "Exemption Code"
msgstr "Codice esenzione"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__exemption_export
msgid "Exemption Export"
msgstr "Esportazione esenzione"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__exemption_rule_export
msgid "Exemption Rule Export"
msgstr "Esportazione regola esenzione"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_code_form_view
msgid "Exemption Rules"
msgstr "Regole esenzione"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Exemption status needs to be in Cancel status to enable"
msgstr "Gli stati esenzione devono essere in stato Annulla per abilitare"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Exemption status needs to be in Done status to cancel"
msgstr "Gli stati esenzione devono essere in stato Eseguita per annullare"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_layout
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_home_exemptions
msgid "Exemptions"
msgstr "Esenzioni"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/controller/main.py:0
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
#, python-format
msgid "Expiry Date"
msgstr "Data scadenza"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_form_view
msgid "Export Exemptions"
msgstr "Esporta esenzioni"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Export New TaxItems"
msgstr "Esporta nuovo elemento imposta"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Export Rules"
msgstr "Esporta regole"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "History"
msgstr "Storico"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__id
msgid "ID"
msgstr "ID"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Exemption Activity Type"
msgstr "Importa tipo attività esenzione"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Exemptions"
msgstr "Importa esenzioni"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Nexus Fed State Info"
msgstr "Importa informazioni stato Nexus Fed"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import Tax Rules"
msgstr "Importa regole imposte"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_avalara_salestax_form
msgid "Import TaxItems"
msgstr "Importa elementi imposte"
#. module: account_avatax_exemption
#: model:ir.model.fields.selection,name:account_avatax_exemption.selection__exemption_code_rule__state__progress
msgid "In Progress"
msgstr "In corso"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__is_all_juris
msgid "Is All Juris"
msgstr "È tutto Juris"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__name
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "Name"
msgstr "Nome"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "New"
msgstr "Nuova"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/controller/main.py:0
#, python-format
msgid "Newest"
msgstr "La più recente"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "No Customer code added in Partner"
msgstr "Nessun codice cliente aggiunto nei partner"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "No Exemption Lines added"
msgstr "Nessuna riga esenzione aggiunta"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_exemptions
msgid "No exemptions found."
msgstr "Nessuna esenzione trovata."
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_template
msgid "Product"
msgstr "Prodotto"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_category
msgid "Product Category"
msgstr "Categoria prodotto"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_product_product
msgid "Product Variant"
msgstr "Variante prodotto"
#. module: account_avatax_exemption
#: model:ir.model,name:account_avatax_exemption.model_queue_job
msgid "Queue Job"
msgstr "Lavoro in coda"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__state_id
msgid "Region"
msgstr "Regione"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemption_rule_form_view
msgid "Reset to Draft"
msgstr "Reimposta a bozza"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code__rule_ids
msgid "Rule"
msgstr "Regola"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Cancelled state to Re-Export Custom Rule"
msgstr ""
"La regola non è in stato annullata per riesportare la regola personalizzata"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Done state to Cancel Custom Rule"
msgstr "La regola non è in stato evasa per annullare la regola personalizzata"
#. module: account_avatax_exemption
#. odoo-python
#: code:addons/account_avatax_exemption/models/exemption.py:0
#, python-format
msgid "Rule is not in Draft state to Export Custom Rule"
msgstr "La regola non p in stato bozza per esportare la regola personalizzata"
#. module: account_avatax_exemption
#: model:res.groups,name:account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code
msgid "Show Tax Exempt/Exemption number/Exemption code "
msgstr "Visualizza esenzione imposta/ numero esenzione/codice esenzione "
#. module: account_avatax_exemption
#: model:res.groups,comment:account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code
msgid "Show the Exemption fields on SO and Invoice and Contact"
msgstr "Visualizza campo esenzione in OV, fattura e contatto"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__state
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "State"
msgstr "Stato"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_table
msgid "Status"
msgstr "Stato"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__tax_item_export
msgid "Tax Item Export"
msgstr "Esportazione elemento imposta"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code_rule__taxable
msgid "Taxable"
msgstr "Imponibile"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_exemption_code__flag
msgid "Taxed by default"
msgstr "Tassato in modo predefinito"
#. module: account_avatax_exemption
#: model:ir.model.fields,help:account_avatax_exemption.field_avalara_salestax__avatax_company_id
msgid "The company ID as defined in the Admin Console of AvaTax"
msgstr "L'ID azienda come definito nella console amministrazione di AvaTax"
#. module: account_avatax_exemption
#: model:ir.model.fields,field_description:account_avatax_exemption.field_avalara_salestax__use_commercial_entity
msgid "Use Commercial Entity"
msgstr "Utilizza entità commerciale"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.exemptions_followup
msgid "View Exemption:"
msgstr "Visualizza esenzioni:"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.portal_my_exemptions
msgid "Your Exemptions"
msgstr "Le vostre esenzioni"
#. module: account_avatax_exemption
#: model:ir.model.fields,help:account_avatax_exemption.field_exemption_code__flag
msgid "helps to add custom rules for the nexus Avatax states"
msgstr "aiuta ad aggiungere le regole personalizzate per gli stati AvaTax Nexus"
#. module: account_avatax_exemption
#: model_terms:ir.ui.view,arch_db:account_avatax_exemption.view_partner_details_form_inherit1
msgid "the parent company"
msgstr "l'azienda madre"

View file

@ -0,0 +1,5 @@
from . import exemption
from . import avalara_salestax
from . import product
from . import queue_job
from . import res_country_state

View file

@ -0,0 +1,938 @@
import requests
from odoo import _, fields, models
from odoo.exceptions import UserError
from odoo.addons.account_avatax_oca.models.avatax_rest_api import AvaTaxRESTService
from odoo.addons.queue_job.exception import FailedJobError
class AvalaraSalestax(models.Model):
_inherit = "avalara.salestax"
avatax_company_id = fields.Char(
"Company ID",
help="The company ID as defined in the Admin Console of AvaTax",
)
tax_item_export = fields.Boolean()
exemption_export = fields.Boolean()
exemption_rule_export = fields.Boolean()
use_commercial_entity = fields.Boolean(default=True)
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,
):
if self.use_commercial_entity and partner.commercial_partner_id:
partner = partner.commercial_partner_id
return super().create_transaction(
doc_date,
doc_code,
doc_type,
partner,
ship_from_address,
shipping_address,
lines,
user=user,
exemption_number=exemption_number,
exemption_code_name=exemption_code_name,
commit=commit,
invoice_date=invoice_date,
reference_code=reference_code,
location_code=location_code,
is_override=is_override,
currency_id=currency_id,
ignore_error=ignore_error,
log_to_record=log_to_record,
)
def set_tax_item_info_to_product(self, record, product):
vals = {}
product_tax_codes = self.env["product.tax.code"].search([])
if product:
tax_code = product_tax_codes.filtered(lambda x: x.name == record["taxCode"])
if not tax_code:
tax_code = product_tax_codes.create(
{
"type": "product",
"name": record["taxCode"],
}
)
vals["tax_code_id"] = tax_code.id
vals["avatax_item_id"] = record["id"]
product.with_context(skip_job_creation=True).write(vals)
def import_exemption_activity_type(self):
self.ensure_one()
business_type_obj = self.env["res.partner.exemption.business.type"]
avatax_restpoint = AvaTaxRESTService(config=self)
r = avatax_restpoint.client.list_certificate_exempt_reasons()
result = r.json()
if "error" in result:
error = result["error"]
error_message = "Code: {}\nMessage: {}\nTarget: {}\nDetails;{}".format(
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
raise FailedJobError(error_message)
for record in result["value"]:
business_type = business_type_obj.search(
["|", ("name", "=", record["name"]), ("avatax_id", "=", record["id"])],
limit=1,
)
if not business_type:
business_type_obj.create(
{
"name": record["name"],
"avatax_id": record["id"],
}
)
def import_exemption_country_state_code(self):
self.ensure_one()
state_obj = self.env["res.country.state"]
avatax_restpoint = AvaTaxRESTService(config=self)
r = avatax_restpoint.client.list_jurisdictions()
result = r.json()
if "error" in result:
error = result["error"]
error_message = "Code: {}\nMessage: {}\nTarget: {}\nDetails;{}".format(
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
raise FailedJobError(error_message)
for record in result["value"]:
if record["type"] != "State":
continue
state = state_obj.search(
[
("code", "=", record["region"]),
("country_id.code", "=", record["country"]),
("avatax_code", "=", False),
],
limit=1,
)
if state:
state.write(
{
"avatax_code": record["code"],
"avatax_name": record["name"],
}
)
r2 = avatax_restpoint.client.list_nexus_by_company(self.avatax_company_id)
result2 = r2.json()
if "error" in result2:
error = result2["error"]
error_message = "Code: {}\nMessage: {}\nTarget: {}\nDetails;{}".format(
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
raise FailedJobError(error_message)
for record in result2["value"]:
if record["jurisdictionTypeId"] != "State":
continue
state = state_obj.search(
[
("code", "=", record["region"]),
("country_id.code", "=", record["country"]),
],
limit=1,
)
if state:
state.write(
{
"avatax_nexus": True,
}
)
exemption_rule_obj = self.env["exemption.code.rule"]
states = state_obj.search([("avatax_nexus", "=", True)])
entity_use_codes = self.env["exemption.code"].search([])
for state in states:
for use_code in entity_use_codes.filtered(lambda x: x.flag):
exemption_rule = exemption_rule_obj.search(
[
("exemption_code_id", "=", use_code.id),
("state_id", "=", state.id),
("taxable", "=", True),
],
limit=1,
)
if exemption_rule:
continue
else:
exemption_rule_obj.create(
{
"exemption_code_id": use_code.id,
"state_id": state.id,
"taxable": True,
"state": "draft",
}
)
def import_tax_items(self):
self.ensure_one()
products = self.env["product.product"].search(
[("default_code", "!=", False), ("avatax_item_id", "=", False)]
)
avatax_restpoint = AvaTaxRESTService(config=self)
client = avatax_restpoint.client
result_vals = []
main_url = url = "{}/api/v2/companies/{}/items".format(
client.base_url, self.avatax_company_id
)
count = 0
while True:
r = requests.get(
url,
auth=client.auth,
headers=client.client_header,
timeout=client.timeout_limit if client.timeout_limit else 1200,
)
result = r.json()
count += 1000
if "error" in result:
error = result["error"]
error_message = "Code: {}\nMessage: {}\nTarget: {}\nDetails;{}".format(
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
raise FailedJobError(error_message)
result_vals += result["value"]
if result["@recordsetCount"] <= count:
break
else:
url = main_url + "?%24skip=" + str(count)
for product in products:
for record in result_vals:
if product.default_code == record["itemCode"]:
self.set_tax_item_info_to_product(record, product)
break
def export_new_tax_items(self):
if not self.ids:
self = self.search([("tax_item_export", "=", True)], limit=1)
if not self.tax_item_export:
return
products = self.env["product.product"].search(
[
("default_code", "!=", False),
("avatax_item_id", "=", False),
"|",
("tax_code_id", "!=", False),
("categ_id.tax_code_id", "!=", False),
],
)
for product in products:
self.with_delay(
description="Export Tax Item %s" % (product.display_name)
)._export_tax_item(product)
def export_new_exemption_rules(self, rules=None):
if not self.ids:
self = self.search([("exemption_rule_export", "=", True)], limit=1)
if not self.exemption_rule_export:
return
if not rules:
rules = self.env["exemption.code.rule"].search(
[("avatax_id", "=", False), ("state", "=", "progress")],
)
queue_job_sudo = self.env["queue.job"].sudo()
for rule in rules:
job = queue_job_sudo.search(
[
("method_name", "=", "_export_base_rule_based_on_type"),
("state", "!=", "done"),
("args", "ilike", "%[" + str(rule.id) + "]%"),
],
limit=1,
)
if not job:
self.with_delay(
priority=5,
max_retries=2,
description="Export Rule %s" % (rule.name),
)._export_base_rule_based_on_type(rule)
def map_rule_vals_to_fields(self, json_data):
avatax_rule_data = {
"avatax_id": json_data["id"],
"avatax_rate": json_data.get("value", ""),
"exemption_code_id": json_data.get("customerUsageType", ""),
"is_all_juris": json_data.get("isAllJuris", False),
"state": "done",
}
# Search for tax code and exemption code in Odoo models
tax_code_id = (
self.env["product.tax.code"].search(
[("name", "=", json_data.get("taxCode", "") or "")], limit=1
)
or None
)
if tax_code_id:
avatax_rule_data["avatax_tax_code"] = tax_code_id.id
exemption_code_id = (
self.env["exemption.code"].search(
[("code", "=", json_data.get("customerUsageType", "") or "")], limit=1
)
or None
)
if exemption_code_id:
avatax_rule_data["exemption_code_id"] = exemption_code_id.id
# Search for country and state in Odoo models
state_id = (
self.env["res.country.state"].search(
[
("country_id.code", "=", json_data.get("country", "") or ""),
("code", "=", json_data.get("region", "") or ""),
],
limit=1,
)
or None
)
if state_id:
avatax_rule_data["state_id"] = state_id.id
avatax_rule_data["taxable"] = state_id.avatax_nexus
return avatax_rule_data
def import_tax_rules(self):
avatax_custom_rule_model = self.env["exemption.code.rule"]
avatax_restpoint = AvaTaxRESTService(config=self)
rules = avatax_custom_rule_model.search(
[("avatax_id", "!=", False), ("state", "=", "done")],
)
include_option = None
if rules:
filter_rules = "id not in ("
filter_rules += ", ".join(map(str, rules.mapped("avatax_id")))
filter_rules += ")"
include_option = "$filter=" + filter_rules
r = avatax_restpoint.client.list_tax_rules(
self.avatax_company_id, include_option
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = "Code: {}\nMessage: {}\nTarget: {}\nDetails;{}".format(
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
raise UserError(error_message)
mapped_data = []
for rule_vals in result["value"]:
if rule_vals.get("customerUsageType", "") and rule_vals.get("region", ""):
mapped_data.append(self.map_rule_vals_to_fields(rule_vals))
avatax_custom_rule_model.create(mapped_data)
def download_exemptions(self):
if not self.ids:
self = self.search([("exemption_export", "=", True)], limit=1)
if not self.exemption_export:
raise UserError(
_("Avatax Exemption export is disabled in Avatax configuration")
)
avatax_restpoint = AvaTaxRESTService(config=self)
count = 0
result_vals = []
include_option = None
while True:
r = avatax_restpoint.client.query_certificates(
self.avatax_company_id, include_option
)
result = r.json()
count += 100
if "error" in result:
error = result["error"]
error_message = "Code: {}\nMessage: {}\nTarget: {}\nDetails;{}".format(
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
raise UserError(error_message)
result_vals += result["value"]
if result["@recordsetCount"] <= count:
break
else:
include_option = "$skip=" + str(count)
exemptions = (
self.env["res.partner.exemption.line"]
.sudo()
.search([("avatax_id", "!=", False)])
)
for exemption in result_vals:
avatax_id = exemption["id"]
if avatax_id not in exemptions.mapped("avatax_id"):
self.with_delay(
description="Download Exemption: %s" % (avatax_id)
)._search_create_exemption_line(avatax_id)
def _export_base_rule_based_on_type(self, rule):
error_message = False
if not rule.state_id.avatax_code:
raise FailedJobError("Avatax code for State not setup")
if not rule.exemption_code_id.flag:
raise FailedJobError("Taxed by Default is disabled in Exemption Code")
avatax_restpoint = AvaTaxRESTService(config=self)
avatax_value = 0
rule_type = "ExemptEntityRule"
if rule.taxable:
avatax_value = 1
elif rule.avatax_rate == 100.0:
avatax_value = 1
elif rule.avatax_rate:
rule_type = "RateOverrideRule"
avatax_value = rule.avatax_rate / 100
tax_rule_info = {
"companyId": self.avatax_company_id,
"taxCode": rule.avatax_tax_code.name or None,
"taxTypeId": "BothSalesAndUseTax",
"taxRuleTypeId": rule_type,
"jurisCode": rule.state_id.avatax_code,
"jurisName": rule.state_id.avatax_name,
"jurisTypeId": "STA",
"jurisdictionTypeId": "State",
"isAllJuris": rule.is_all_juris,
"value": avatax_value,
"cap": 0,
"threshold": 0,
"effectiveDate": fields.Datetime.to_string(fields.Date.today()),
"description": "%s - %s - %s"
% (rule.state_id.avatax_name, rule.exemption_code_id.code, rule.name),
"country": rule.state_id.country_id.code,
"region": rule.state_id.code,
"stateFIPS": rule.state_id.avatax_code,
"taxTypeGroup": "SalesAndUse",
"customerUsageType": rule.exemption_code_id.code,
"taxSubType": "ALL",
}
r = avatax_restpoint.client.create_tax_rules(
self.avatax_company_id, [tax_rule_info]
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = (
"Rule: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
rule.name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
rule.write(
{
"avatax_id": result[0]["id"],
"state": "done",
}
)
return result
def _cancel_custom_rule(self, rule):
error_message = False
if not rule.avatax_id:
raise FailedJobError("Avatax Custom Rule ID not available")
avatax_restpoint = AvaTaxRESTService(config=self)
r = avatax_restpoint.client.delete_tax_rule(
self.avatax_company_id, rule.avatax_id
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = (
"Rule: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
rule.name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
rule.write(
{
"avatax_id": False,
"state": "cancel",
}
)
return result
def _export_tax_item(self, product):
error_message = False
if not self.tax_item_export:
raise FailedJobError("Tax Item Export is disabled in Avatax configuration")
if product.avatax_item_id:
return "Product exported with Avatax ID: %s" % (product.avatax_item_id)
avatax_restpoint = AvaTaxRESTService(config=self)
item_info = {
"itemCode": product.default_code,
"taxCode": product.tax_code_id.name or product.categ_id.tax_code_id.name,
"description": product.name,
}
r = avatax_restpoint.client.create_items(self.avatax_company_id, item_info)
result = r.json()
if "error" in result:
error = result["error"]
error_message = (
"Product: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
product.display_name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
product.with_context(skip_job_creation=True).write(
{
"avatax_item_id": result[0]["id"],
}
)
return result
def _delete_tax_item(self, product):
error_message = False
if not self.tax_item_export:
raise FailedJobError("Tax Item Export is disabled in Avatax configuration")
if not product.avatax_item_id:
return "Avatax ID not available in Product: %s" % (product.display_name)
avatax_restpoint = AvaTaxRESTService(config=self)
r = avatax_restpoint.client.delete_item(
self.avatax_company_id, product.avatax_item_id
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = (
"Product: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
product.display_name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
product.with_context(skip_job_creation=True).write(
{
"avatax_item_id": False,
}
)
return result
def _update_tax_item(self, tax_item_id, product):
if not self.tax_item_export:
raise FailedJobError("Tax Item Export is disabled in Avatax configuration")
error_message = False
avatax_restpoint = AvaTaxRESTService(config=self)
item_info = {
"itemCode": product.default_code,
"taxCode": product.tax_code_id.name or product.categ_id.tax_code_id.name,
"description": product.name,
}
r = avatax_restpoint.client.update_item(
self.avatax_company_id, tax_item_id, item_info
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = (
"Product: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
product.display_name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
return result
def _export_avatax_customer(self, partner):
error_message = False
if not self.exemption_export:
raise FailedJobError(
"Avatax Exemption export is disabled in Avatax configuration"
)
avatax_restpoint = AvaTaxRESTService(config=self)
if partner.avatax_id:
return "Avatax Customer ID: %s" % (partner.avatax_id)
customer_info = [
{
"customerCode": partner.customer_code,
"alternateId": partner.id,
"name": partner.name,
"line1": partner.street,
"city": partner.city,
"postalCode": partner.zip,
"phoneNumber": partner.phone,
"emailAddress": partner.email,
"contactName": partner.name,
"country": partner.country_id.code,
"region": partner.state_id.code,
}
]
r = avatax_restpoint.client.create_customers(
self.avatax_company_id, customer_info
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = (
"Partner: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
partner.display_name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
partner.with_context(skip_job_creation=True).write(
{
"avatax_id": result[0]["id"],
}
)
return result
def _export_avatax_exemption_line(self, exemption_line):
error_message = False
if not self.exemption_export:
raise FailedJobError(
"Avatax Exemption export is disabled in Avatax configuration"
)
avatax_restpoint = AvaTaxRESTService(config=self)
if exemption_line.avatax_id:
return "Avatax Customer ID: %s" % (exemption_line.avatax_id)
exemption_line_info = [
{
"signedDate": fields.Datetime.to_string(
exemption_line.exemption_id.effective_date
),
"expirationDate": fields.Datetime.to_string(
exemption_line.exemption_id.expiry_date
),
"filename": exemption_line.name,
"valid": True,
"exemptionNumber": exemption_line.exemption_number
if exemption_line.add_exemption_number
else exemption_line.exemption_id.exemption_number,
"exemptPercentage": 100.0,
"validatedExemptionReason": {
"name": exemption_line.exemption_id.business_type.name,
},
"exemptionReason": {
"name": exemption_line.exemption_id.business_type.name,
},
"exposureZone": {
"name": exemption_line.state_id.name,
},
"pages": [None],
}
]
r = avatax_restpoint.client.create_certificates(
self.avatax_company_id, exemption_line_info
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = (
"Exemption: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
exemption_line.display_name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
exemption_line.write(
{
"avatax_id": result[0]["id"],
}
)
self.with_delay(
priority=6,
max_retries=2,
description="Link Customer %s with Exemption %s"
% (exemption_line.partner_id.display_name, exemption_line.name),
).link_certificates_to_customer(exemption_line)
return result
def link_certificates_to_customer(self, exemption_line):
error_message = False
if not self.exemption_export:
raise FailedJobError(
"Avatax Exemption export is disabled in Avatax configuration"
)
if not exemption_line.exemption_id.partner_id.avatax_id:
raise FailedJobError("Avatax Customer export has failed")
avatax_restpoint = AvaTaxRESTService(config=self)
r = avatax_restpoint.client.link_certificates_to_customer(
self.avatax_company_id,
exemption_line.exemption_id.partner_id.customer_code,
{"certificates": [exemption_line.avatax_id]},
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = (
"Exemption: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
exemption_line.display_name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
exemption_line.write(
{
"linked_to_customer": True,
}
)
if all(
exemption_line.exemption_id.exemption_line_ids.mapped("linked_to_customer")
):
exemption_line.exemption_id.write(
{
"state": "done",
}
)
return result
def _update_avatax_exemption_line_status(self, exemption_line, exemption_status):
error_message = False
if not self.exemption_export:
raise FailedJobError(
"Avatax Exemption export is disabled in Avatax configuration"
)
avatax_restpoint = AvaTaxRESTService(config=self)
if not exemption_line.avatax_id:
raise FailedJobError("Avatax Exemption ID is not found")
r1 = avatax_restpoint.client.get_certificate(
self.avatax_company_id, exemption_line.avatax_id
)
result1 = r1.json()
if "error" in result1:
error = result1["error"]
error_message = (
"Exemption: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
exemption_line.display_name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
exemption_line_info = dict(result1)
exemption_line_info["valid"] = exemption_status
r2 = avatax_restpoint.client.update_certificate(
self.avatax_company_id, exemption_line.avatax_id, exemption_line_info
)
result2 = r2.json()
if "error" in result2:
error = result2["error"]
error_message = (
"Exemption: %s\nCode: %s\nMessage: %s\nTarget: %s\nDetails;%s"
% (
exemption_line.display_name,
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
)
raise FailedJobError(error_message)
exemption_line.write(
{
"avatax_status": exemption_status,
}
)
exemption_line.exemption_id.write(
{
"state": "done" if exemption_status else "cancel",
}
)
return result2
def _search_create_exemption_line(self, avatax_id):
exemption_sudo = self.env["res.partner.exemption"].sudo()
partner_sudo = self.env["res.partner"].sudo()
error_message = False
if not self.exemption_export:
raise FailedJobError(
"Avatax Exemption export is disabled in Avatax configuration"
)
avatax_restpoint = AvaTaxRESTService(config=self)
r = avatax_restpoint.client.get_certificate(
self.avatax_company_id, avatax_id, "$include=customers"
)
result = r.json()
if "error" in result:
error = result["error"]
error_message = "Code: {}\nMessage: {}\nTarget: {}\nDetails;{}".format(
error.get("code", False),
error.get("message", False),
error.get("target", False),
error.get("details", False),
)
raise FailedJobError(error_message)
if result.get("customers", []):
customer_info = result["customers"][0]
partner = partner_sudo.search(
[("avatax_id", "=", customer_info["id"])], limit=1
)
if partner:
partner.customer_code = customer_info["customerCode"]
if not partner:
partner = partner_sudo.search(
[("customer_code", "=", customer_info["customerCode"])], limit=1
)
if not partner:
partner = partner_sudo.search(
[("customer_code", "=", "%s:0" % (customer_info["customerCode"]))],
limit=1,
)
if not partner:
state = self.env["res.country.state"]
if "region" in customer_info:
state = (
self.env["res.country.state"]
.sudo()
.search(
[
("code", "=", customer_info["region"]),
("country_id.code", "=", customer_info["country"]),
],
limit=1,
)
)
partner_vals = {
"name": customer_info["name"],
"street": customer_info["line1"],
"city": customer_info["city"],
"zip": customer_info["postalCode"],
"state_id": state.id,
"country_id": state.country_id.id,
"email": customer_info.get("emailAddress", False),
"phone": customer_info.get("phoneNumber", False),
"avatax_id": customer_info["id"],
"customer_code": customer_info["customerCode"],
}
partner = partner_sudo.create(partner_vals)
# Check if exemption is already available in system
exemption_line = (
self.env["res.partner.exemption.line"]
.sudo()
.search([("avatax_id", "=", result["id"])], limit=1)
)
if exemption_line:
return "Exemption Already Downloaded\nSearch Response: %s" % (result)
exposure_zone_info = result["exposureZone"]
exposure_state = (
self.env["res.country.state"]
.sudo()
.search(
[
("code", "=", exposure_zone_info["region"]),
("country_id.code", "=", exposure_zone_info["country"]),
],
limit=1,
)
)
business_type = (
self.env["res.partner.exemption.business.type"]
.sudo()
.search([("avatax_id", "=", result["exemptionReason"]["id"])], limit=1)
)
exemption_line_vals = {
"state_id": exposure_state.id,
"avatax_id": result["id"],
"avatax_status": result["valid"],
"linked_to_customer": True,
}
exemption_sudo.create(
{
"partner_id": partner.id,
"business_type": business_type.id,
"exemption_code_id": business_type.exemption_code_id.id,
"state_ids": [(6, 0, [exposure_state.id])],
"exemption_number": result["exemptionNumber"],
"effective_date": result["signedDate"],
"expiry_date": result["expirationDate"],
"state": "done" if result["valid"] else "cancel",
"exemption_line_ids": [(0, 0, exemption_line_vals)],
}
)
return result
else:
raise FailedJobError("Exemption ID is not linked with a customer in Avatax")

View file

@ -0,0 +1,308 @@
from odoo import _, api, fields, models
from odoo.exceptions import UserError, ValidationError
class ExemptionRule(models.Model):
_name = "exemption.code.rule"
_description = "Avatax Custom Rules"
name = fields.Char(index=True, default=lambda self: _("New"))
state = fields.Selection(
[
("draft", "Draft"),
("progress", "In Progress"),
("done", "Done"),
("cancel", "Cancelled"),
],
default="draft",
)
exemption_code_id = fields.Many2one(
"exemption.code",
string="Entity Use Code",
required=True,
readonly=True,
states={"draft": [("readonly", False)]},
)
state_id = fields.Many2one(
"res.country.state",
readonly=True,
states={"draft": [("readonly", False)]},
string="Region",
)
avatax_id = fields.Char("Avatax Rule ID", readonly=True, copy=False)
avatax_tax_code = fields.Many2one(
"product.tax.code", readonly=True, states={"draft": [("readonly", False)]}
)
is_all_juris = fields.Boolean(
default=True, readonly=True, states={"draft": [("readonly", False)]}
)
avatax_rate = fields.Float(readonly=True, states={"draft": [("readonly", False)]})
taxable = fields.Boolean()
@api.constrains("avatax_rate")
def _check_avatax_rate(self):
"""
Prevent the Avatax rate with range 0 to 100
"""
for record in self:
if record.avatax_rate < 0 or record.avatax_rate > 100:
raise ValidationError(_("Avatax rate range is from 0 to 100"))
@api.model
def create(self, vals):
if vals.get("name", _("New")) == _("New"):
vals["name"] = self.env["ir.sequence"].next_by_code(
"exemption.code.rule.sequence"
) or _("New")
return super().create(vals)
def export_exemption_rule(self):
if self.filtered(lambda x: x.state != "draft"):
raise UserError(_("Rule is not in Draft state to Export Custom Rule"))
self.write({"state": "progress"})
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_rule_export", "=", True)], limit=1)
)
if not avalara_salestax:
raise UserError(
_("Avatax Exemption Rule export is disabled in Avatax configuration")
)
avalara_salestax.export_new_exemption_rules(
rules=self.filtered(lambda x: not x.avatax_id)
)
return True
def cancel_exemption_rule(self):
self.ensure_one()
if self.state != "done":
raise UserError(_("Rule is not in Done state to Cancel Custom Rule"))
self.write({"state": "progress"})
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_rule_export", "=", True)], limit=1)
)
if not avalara_salestax:
raise UserError(
_("Avatax Exemption Rule export is disabled in Avatax configuration")
)
avalara_salestax.with_delay(
priority=5, max_retries=2, description="Cancel Custom Rule %s" % (self.name)
)._cancel_custom_rule(self)
return True
def enable_exemption_rule(self):
if self.filtered(lambda x: x.state != "cancel"):
raise UserError(
_("Rule is not in Cancelled state to Re-Export Custom Rule")
)
self.write({"state": "progress"})
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_rule_export", "=", True)], limit=1)
)
if not avalara_salestax:
raise UserError(
_("Avatax Exemption Rule export is disabled in Avatax configuration")
)
avalara_salestax.export_new_exemption_rules(
rules=self.filtered(lambda x: not x.avatax_id)
)
return True
def reset_to_draft(self):
self.write(
{
"state": "draft",
}
)
def cancel_exemption_rule_failed(self):
self.ensure_one()
queue_job_sudo = self.env["queue.job"].sudo()
queue_job = queue_job_sudo.search(
[
("method_name", "=", "_export_base_rule_based_on_type"),
("state", "!=", "done"),
("args", "ilike", "%[" + str(self.id) + "]%"),
],
limit=1,
)
if queue_job:
queue_job.write(
{
"state": "done",
}
)
self.write(
{
"state": "cancel",
}
)
class ExemptionCode(models.Model):
_inherit = "exemption.code"
flag = fields.Boolean(
"Taxed by default",
copy=False,
help="helps to add custom rules for the nexus Avatax states",
)
rule_ids = fields.One2many("exemption.code.rule", "exemption_code_id")
def create_rules(self):
self.ensure_one()
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_rule_export", "=", True)], limit=1)
)
if not avalara_salestax:
raise UserError(
_("Avatax Exemption Rule export is disabled in Avatax configuration")
)
for rule in self.rule_ids.filtered(lambda x: x.state == "draft"):
rule.export_exemption_rule()
return True
class ResPartnerExemption(models.Model):
_inherit = "res.partner.exemption"
exemption_code_id = fields.Many2one(
related="business_type.exemption_code_id",
string="Entity Use Code",
readonly=True,
)
@api.onchange("partner_id")
def onchange_partner_id(self):
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_export", "=", True)], limit=1)
)
if avalara_salestax.use_commercial_entity:
self.partner_id = self.partner_id.commercial_partner_id.id
return {"domain": {"partner_id": [("parent_id", "=", False)]}}
def search_exemption_line(self, avatax_id):
exemption_line = (
self.env["res.partner.exemption.line"]
.sudo()
.search([("avatax_id", "=", avatax_id)], limit=1)
)
if exemption_line:
return "It is already Downloaded"
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_export", "=", True)], limit=1)
)
if avalara_salestax:
job = avalara_salestax.with_delay(
description="Download Exemption: %s" % (avatax_id)
)._search_create_exemption_line(avatax_id)
return "Success" if job else "Failed"
else:
return "Exemption Export is disabled in Avatax configuration!"
def export_exemption(self):
self.ensure_one()
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_export", "=", True)], limit=1)
)
if not avalara_salestax:
raise UserError(
_("Avatax Exemption export is disabled in Avatax configuration")
)
if not self.partner_id.customer_code:
raise UserError(_("No Customer code added in Partner"))
if not self.exemption_line_ids:
raise UserError(_("No Exemption Lines added"))
if self.partner_id and not self.partner_id.avatax_id:
avalara_salestax.with_delay(
priority=0,
max_retries=2,
description="Export Customer %s" % (self.partner_id.display_name),
)._export_avatax_customer(self.partner_id)
for exemption_line in self.exemption_line_ids:
if not exemption_line.avatax_id:
avalara_salestax.with_delay(
priority=5,
max_retries=2,
description="Export Exemption Line %s" % (exemption_line.name),
)._export_avatax_exemption_line(exemption_line)
self.write({"state": "progress"})
return True
def cancel_exemption(self):
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_export", "=", True)], limit=1)
)
if not avalara_salestax:
raise UserError(
_("Avatax Exemption export is disabled in Avatax configuration")
)
if self.state == "done":
for exemption_line in self.exemption_line_ids:
avalara_salestax.with_delay(
priority=5,
max_retries=2,
description="Disable Exemption Line %s" % (exemption_line.name),
)._update_avatax_exemption_line_status(exemption_line, False)
self.write({"state": "progress"})
elif self.state == "progress":
self.write({"state": "cancel"})
else:
raise UserError(_("Exemption status needs to be in Done status to cancel"))
return True
def enable_exemption(self):
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("exemption_export", "=", True)], limit=1)
)
if not avalara_salestax:
raise UserError(
_("Avatax Exemption export is disabled in Avatax configuration")
)
if self.state == "cancel":
for exemption_line in self.exemption_line_ids:
avalara_salestax.with_delay(
priority=5,
max_retries=2,
description="Enable Exemption Line %s" % (exemption_line.name),
)._update_avatax_exemption_line_status(exemption_line, True)
self.write({"state": "progress"})
else:
raise UserError(
_("Exemption status needs to be in Cancel status to enable")
)
return True
class ResPartnerExemptionBusinessType(models.Model):
_inherit = "res.partner.exemption.business.type"
exemption_code_id = fields.Many2one("exemption.code", string="Entity Use Code")
class ResPartnerExemptionType(models.Model):
_inherit = "res.partner.exemption.type"
exemption_code_id = fields.Many2one(
related="business_type.exemption_code_id",
string="Entity Use Code",
readonly=True,
)

View file

@ -0,0 +1,108 @@
from odoo import fields, models
class ProductTaxCode(models.Model):
_inherit = "product.tax.code"
rule_ids = fields.One2many(
"exemption.code.rule",
"avatax_tax_code",
"Avatax Rules",
)
class ProductCategory(models.Model):
_inherit = "product.category"
def write(self, vals):
res = super().write(vals)
if "tax_code_id" in vals:
products = self.env["product.product"].search(
[("categ_id", "in", self.ids)]
)
if products:
products.create_job_taxitem()
return res
class ProductTemplate(models.Model):
_inherit = "product.template"
def write(self, vals):
res = super().write(vals)
if "tax_code_id" in vals or "categ_id" in vals:
for template in self:
template.product_variant_ids.create_job_taxitem()
return res
class ProductProduct(models.Model):
_inherit = "product.product"
avatax_item_id = fields.Char(
"Avatax TaxItem",
copy=False,
readonly=True,
)
def create_job_taxitem(self):
avalara_salestax = (
self.env["avalara.salestax"]
.sudo()
.search([("tax_item_export", "=", True)], limit=1)
)
queue_job_sudo = self.env["queue.job"].sudo()
if not avalara_salestax or self._context.get("skip_job_creation", False):
return
self = self.with_context(skip_job_creation=True)
for product in self.filtered(lambda p: p.default_code):
if product.categ_id.tax_code_id or product.tax_code_id:
if product.avatax_item_id:
job = queue_job_sudo.search(
[
("method_name", "=", "_update_tax_item"),
("state", "!=", "done"),
("args", "ilike", "%[" + str(product.id) + "]%"),
],
limit=1,
)
if not job:
avalara_salestax.with_delay(
description="Update Tax Item %s" % (product.display_name)
)._update_tax_item(product.avatax_item_id, product)
else:
job = queue_job_sudo.search(
[
("method_name", "=", "_export_tax_item"),
("state", "!=", "done"),
("args", "ilike", "%[" + str(product.id) + "]%"),
],
limit=1,
)
if not job:
avalara_salestax.with_delay(
description="Export Tax Item %s" % (product.display_name)
)._export_tax_item(product)
elif (
product.avatax_item_id
and not product.categ_id.tax_code_id
and not product.tax_code_id
):
job = queue_job_sudo.search(
[
("method_name", "=", "_delete_tax_item"),
("state", "!=", "done"),
("args", "ilike", "%[" + str(product.id) + "]%"),
],
limit=1,
)
if not job:
avalara_salestax.with_delay(
description="Delete Tax Item %s" % (product.display_name)
)._delete_tax_item(product)
def write(self, vals):
res = super().write(vals)
if "tax_code_id" in vals or "categ_id" in vals:
self.create_job_taxitem()
return res

View file

@ -0,0 +1,43 @@
from odoo import models
class QueueJob(models.Model):
_inherit = "queue.job"
def _related_action_avatax_rule(self):
rule = self.args[0]
action = self.env.ref(
"account_avatax_exemption.exemption_rule_act_window"
).read([])[0]
action.update(
{
"view_mode": "form",
"res_id": rule.id,
"domain": [("id", "=", rule.id)],
}
)
return action
def _related_action_avatax_tax_item(self):
product = self.args[0]
action = self.env.ref("product.product_normal_action_sell").read([])[0]
action.update(
{
"view_mode": "form",
"res_id": product.id,
"domain": [("id", "=", product.id)],
}
)
return action
def _related_action_avatax_customer(self):
partner = self.args[0]
action = self.env.ref("account.res_partner_action_customer").read([])[0]
action.update(
{
"view_mode": "form",
"res_id": partner.id,
"domain": [("id", "=", partner.id)],
}
)
return action

View file

@ -0,0 +1,7 @@
from odoo import fields, models
class CountryState(models.Model):
_inherit = "res.country.state"
rule_ids = fields.One2many("exemption.code.rule", "state_id", "Avatax Rules")

View file

@ -0,0 +1,5 @@
* Sodexis
* Atchuthan Ubendran <atchuthan@sodexis.com>
* Stephan Keller <skeller@sodexis.com>
* SodexisTeam <dev@sodexis.com>

View file

@ -0,0 +1,6 @@
This module is a component of the Avatax Exemption Integration with odoo app.
* Export Exemption customer in Avatax
* Export Exemptions for customer based on nexus region
* Export Custom rules based on avatax nexus regions
* Export Product Taxcodes to Avatax

View file

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_exemption_code_rule,access_exemption_code_rule,model_exemption_code_rule,base.group_user,1,1,1,1
access_portal_exemption_code,access_portal_exemption_code,account_avatax_oca.model_exemption_code,,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_exemption_code_rule access_exemption_code_rule model_exemption_code_rule base.group_user 1 1 1 1
3 access_portal_exemption_code access_portal_exemption_code account_avatax_oca.model_exemption_code 1 0 0 0

View file

@ -0,0 +1,14 @@
<odoo noupdate="1">
<record id="group_show_tax_exempt_exempt_number_exempt_code" model="res.groups">
<field name="name">Show Tax Exempt/Exemption number/Exemption code </field>
<field
name="comment"
>Show the Exemption fields on SO and Invoice and Contact</field>
<field
name="users"
eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"
/>
</record>
</odoo>

View file

@ -0,0 +1,436 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Avatax Exemptions</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="avatax-exemptions">
<h1 class="title">Avatax Exemptions</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:42d58157035074dba48dc25701a032b7277ab64011e406d17ede521c95a431f4
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-fiscal-rule/tree/16.0/account_avatax_exemption"><img alt="OCA/account-fiscal-rule" src="https://img.shields.io/badge/github-OCA%2Faccount--fiscal--rule-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-fiscal-rule-16-0/account-fiscal-rule-16-0-account_avatax_exemption"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/account-fiscal-rule&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module is a component of the Avatax Exemption Integration with odoo app.</p>
<blockquote>
<ul class="simple">
<li>Export Exemption customer in Avatax</li>
<li>Export Exemptions for customer based on nexus region</li>
<li>Export Custom rules based on avatax nexus regions</li>
<li>Export Product Taxcodes to Avatax</li>
</ul>
</blockquote>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-fiscal-rule/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/account-fiscal-rule/issues/new?body=module:%20account_avatax_exemption%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-2">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
<ul class="simple">
<li>Sodexis</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Sodexis<ul>
<li>Atchuthan Ubendran &lt;<a class="reference external" href="mailto:atchuthan&#64;sodexis.com">atchuthan&#64;sodexis.com</a>&gt;</li>
<li>Stephan Keller &lt;<a class="reference external" href="mailto:skeller&#64;sodexis.com">skeller&#64;sodexis.com</a>&gt;</li>
<li>SodexisTeam &lt;<a class="reference external" href="mailto:dev&#64;sodexis.com">dev&#64;sodexis.com</a>&gt;</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-fiscal-rule/tree/16.0/account_avatax_exemption">OCA/account-fiscal-rule</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,33 @@
<odoo>
<record id="exemption_hide_view_move_form_inherit_1" model="ir.ui.view">
<field name="name">account.move.form.view.exemption.hide</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account_avatax_oca.view_move_form_inherit_1" />
<field name="arch" type="xml">
<field name='exemption_code' position="attributes">
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</field>
<field name='exemption_code_id' position="attributes">
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</field>
<field name='exemption_code' position="before">
<field
name="exemption_code"
groups="!account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code"
/>
</field>
<field name='exemption_code_id' position="before">
<field
name="exemption_code_id"
groups="!account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code"
/>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,197 @@
<odoo>
<record id="exemption_form_view" model="ir.ui.view">
<field name="name">res.partner.exemption.form.view</field>
<field name="model">res.partner.exemption</field>
<field name="type">form</field>
<field
name="inherit_id"
ref="account_avatax_exemption_base.exemption_form_view"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='state']" position="before">
<button
string="Export Exemptions"
states="draft"
name="export_exemption"
type="object"
class="oe_highlight"
/>
<button
name="cancel_exemption"
states="progress,done"
string="Cancel"
class="oe_highlight"
type="object"
confirm="Are you sure you want to cancel the Exemptions?"
/>
<button
name="enable_exemption"
states="cancel"
string="Enable Exemptions"
class="oe_highlight"
type="object"
confirm="Are you sure you want to Enable the Exemptions?"
/>
</xpath>
<xpath expr="//field[@name='business_type']" position="after">
<field
name="exemption_code_id"
options="{'no_create': True}"
required="1"
/>
</xpath>
</field>
</record>
<!-- Exemption Rules -->
<record id="exemption_rule_form_view" model="ir.ui.view">
<field name="name">exemption.code.rule.form.view</field>
<field name="model">exemption.code.rule</field>
<field name="arch" type="xml">
<form string="Custom Rules">
<header>
<button
string="Export Rules"
states="draft"
name="export_exemption_rule"
type="object"
class="oe_highlight"
/>
<button
name="cancel_exemption_rule"
states="done"
string="Cancel"
class="oe_highlight"
type="object"
confirm="Are you sure you want to cancel the Custom Rules?"
/>
<button
name="enable_exemption_rule"
states="cancel"
string="Enable Custom Rule"
class="oe_highlight"
type="object"
confirm="Are you sure you want to Enable the Custom Rule?"
/>
<button
name="reset_to_draft"
string="Reset to Draft"
type="object"
states="cancel"
/>
<button
name="cancel_exemption_rule_failed"
string="Cancel Failed Job"
type="object"
states="progress"
class="oe_highlight"
confirm="Are you sure you want to Cancel the Custom Rule?"
/>
<field
name="state"
widget="statusbar"
statusbar_visible="draft,progress,done,cancel"
/>
</header>
<sheet>
<group>
<field name="name" readonly="1" />
<field
name="exemption_code_id"
options="{'no_create': True}"
domain="[('flag','=',True)]"
/>
<field
name="state_id"
domain="[('avatax_nexus', '=', True)]"
required="1"
options="{'no_create': True}"
/>
<field name="avatax_tax_code" />
<field name="is_all_juris" />
<field name="taxable" />
<field
name="avatax_rate"
attrs="{'invisible': [('taxable','=',True)]}"
/>
<field name="avatax_id" readonly="1" />
</group>
</sheet>
</form>
</field>
</record>
<record id="exemption_rule_tree_view" model="ir.ui.view">
<field name="name">exemption.code.rule.tree.view</field>
<field name="model">exemption.code.rule</field>
<field name="arch" type="xml">
<tree name="Custom Rules">
<field name="name" readonly="1" />
<field name="state" />
<field name="state_id" domain="[('avatax_nexus', '=', True)]" />
<field name="exemption_code_id" domain="[('flag','=',True)]" />
<field name="avatax_id" />
</tree>
</field>
</record>
<record id="exemption_reason_type_form_view" model="ir.ui.view">
<field name="name">res.partner.exemption.business.type.form.view</field>
<field name="model">res.partner.exemption.business.type</field>
<field name="type">form</field>
<field
name="inherit_id"
ref="account_avatax_exemption_base.exemption_reason_type_form_view"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="after">
<field
name="exemption_code_id"
options="{'no_create': True}"
required="1"
/>
</xpath>
</field>
</record>
<record id="exemption_reason_type_tree_view" model="ir.ui.view">
<field name="name">res.partner.exemption.business.type.tree.view</field>
<field name="model">res.partner.exemption.business.type</field>
<field name="type">form</field>
<field
name="inherit_id"
ref="account_avatax_exemption_base.exemption_reason_type_tree_view"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="after">
<field name="exemption_code_id" />
</xpath>
</field>
</record>
<record id="exemption_type_form_view" model="ir.ui.view">
<field name="name">res.partner.exemption.type.form.view</field>
<field name="model">res.partner.exemption.type</field>
<field name="type">form</field>
<field
name="inherit_id"
ref="account_avatax_exemption_base.exemption_type_form_view"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='business_type']" position="after">
<field
name="exemption_code_id"
options="{'no_create': True}"
required="1"
/>
</xpath>
</field>
</record>
<record id="exemption_rule_act_window" model="ir.actions.act_window">
<field name="name">Avatax Custom Rules</field>
<field name="res_model">exemption.code.rule</field>
<field name="binding_view_types">tree</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="menu_exemption_rule"
action="exemption_rule_act_window"
parent="account_avatax_oca.menu_avatax"
sequence="31"
/>
</odoo>

View file

@ -0,0 +1,126 @@
<odoo>
<record id="view_avalara_salestax_form" model="ir.ui.view">
<field name="name">avalara.salestax.inherit</field>
<field name="model">avalara.salestax</field>
<field name="inherit_id" ref="account_avatax_oca.view_avalara_salestax_form" />
<field name="arch" type="xml">
<xpath expr="//sheet" position="before">
<header>
<button
type="object"
name="import_tax_items"
string="Import TaxItems"
/>
<button
type="object"
name="import_exemption_activity_type"
string="Import Exemption Activity Type"
/>
<button
type="object"
name="import_exemption_country_state_code"
string="Import Nexus Fed State Info"
/>
<button
type="object"
name="download_exemptions"
string="Import Exemptions"
/>
<button
type="object"
name="import_tax_rules"
string="Import Tax Rules"
/>
<button
type="object"
name="export_new_tax_items"
string="Export New TaxItems"
/>
</header>
</xpath>
<xpath
expr="//page[@name='connection_page']/group/group/a"
position="before"
>
<label for="avatax_company_id" />
<div>
<field name="avatax_company_id" class="oe_inline" />
</div>
</xpath>
<div position="inside" id="calculation_page_container">
<div class="col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="use_commercial_entity" />
</div>
<div class="o_setting_right_pane">
<label for="use_commercial_entity" />
</div>
</div>
</div>
<xpath expr="//field[@name='request_timeout']" position="after">
<field name="tax_item_export" />
<field name="exemption_export" />
<field name="exemption_rule_export" />
</xpath>
</field>
</record>
<record id="exemption_code_tree_view" model="ir.ui.view">
<field name="name">exemption.code.tree.view</field>
<field name="model">exemption.code</field>
<field name="type">tree</field>
<field name="inherit_id" ref="account_avatax_oca.exemption_code_tree_view" />
<field name="arch" type="xml">
<xpath expr="//tree" position="attributes">
<attribute name="string">Entity Use Code</attribute>
</xpath>
</field>
</record>
<record
id="account_avatax_oca.action_exemption_code_details"
model="ir.actions.act_window"
>
<field name="name">Entity Use Code</field>
</record>
<record
id="account_avatax_oca.menu_action_exemption_code_details"
model="ir.ui.menu"
>
<field name="name">Entity Use Code</field>
</record>
<record id="exemption_code_form_view" model="ir.ui.view">
<field name="name">exemption.code.form.view</field>
<field name="model">exemption.code</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Entity Use Code">
<header>
<button
name="create_rules"
string="Create Custom Rules"
type="object"
/>
</header>
<sheet>
<group>
<field name="name" />
<field name="code" />
<field name="flag" />
<field name="id" invisible="1" />
</group>
<notebook>
<page string="Exemption Rules" name="exemption_rules">
<field
name="rule_ids"
context="{'default_exemption_code_id': id}"
/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
</odoo>

View file

@ -0,0 +1,84 @@
<odoo>
<template id="exemption_page" name=" Exemptions">
<t t-call="website.layout">
<div class="container">
<!-- <t t-if="exemption_line">
<table class="table table-bordered">
<tbody>
<tr>
<td>
CUSTOMER NAME
</td>
<td>
<t t-esc="exemption_line.partner_id.display_name"/>
</td>
</tr>
<tr>
<td>
CUSTOMER CODE
</td>
<td>
<t t-esc="exemption_line.partner_id.get_customer_code()"/>
</td>
</tr>
<tr>
<td>
EXEMPTION REASON
</td>
<td>
<t t-esc="exemption_line.exemption_id.business_type.display_name"/>
</td>
</tr>
<tr>
<td>
AVATAX EXEMPTION ID
</td>
<td>
<t t-esc="exemption_line.avatax_id"/>
</td>
</tr>
<tr>
<td>
EXEMPTION NUMBER
</td>
<td>
<t t-esc="exemption_line.exemption_id.exemption_number"/>
</td>
</tr>
<tr>
<td>
EXEMPTION EFFECTIVE
</td>
<td>
<t t-esc="exemption_line.exemption_id.effective_date"/>
</td>
</tr>
<tr>
<td>
EXEMPTION EXPIRATION
</td>
<td>
<t t-esc="exemption_line.exemption_id.expiry_date"/>
</td>
</tr>
<tr>
<td>
EXEMPTION STATUS
</td>
<td>
<t t-if="exemption_line.avatax_status">
<t t-esc="'ENABLED'" />
</t>
<t t-else="">
<t t-esc="'DISABLED'" />
</t>
</td>
</tr>
</tbody>
</table>
</t> -->
<t t-esc="message" />
</div>
</t>
</template>
</odoo>

View file

@ -0,0 +1,114 @@
<odoo>
<record id="view_partner_details_form_inherit1" model="ir.ui.view">
<field name="name">res.partner.details.form.inherit1</field>
<field name="model">res.partner</field>
<field
name="inherit_id"
ref="account_avatax_oca.view_partner_details_form_inherit1"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='customer_code']/.." position="after">
<group
col="2"
colspan="4"
attrs="{'invisible': [('is_company','=',False),('parent_id','!=',False)]}"
>
<field name="avatax_id" />
<field name="id" invisible="1" />
<field name="is_company" invisible="1" />
<label for="exemption_ids" />
</group>
<field name="exemption_ids" context="{'hide_partner':id}" nolabel="1" />
<div
attrs="{'invisible': ['|',('is_company','=',True),('parent_id','=',False)]}"
>
<p>
Avatax Exemption related settings are managed on
<button
name="open_commercial_entity"
type="object"
string="the parent company"
class="oe_link"
/>
</p>
</div>
</xpath>
<xpath
expr="//field[@name='property_tax_exempt']/../separator[1]"
position="attributes"
>
<attribute name="invisible">1</attribute>
</xpath>
<xpath
expr="//page[last()]//field[@name='property_tax_exempt']"
position="attributes"
>
<attribute name="invisible">1</attribute>
</xpath>
<xpath
expr="//page[last()]//field[@name='property_exemption_code_id']"
position="attributes"
>
<attribute name="invisible">1</attribute>
</xpath>
<xpath
expr="//page[last()]//field[@name='property_exemption_number']"
position="attributes"
>
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//group[@name='avatax_exemption']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="view_partner_exempt_form_inherit1">
<field name="name">res.partner.field.show.with.group.form.inherit</field>
<field name="model">res.partner</field>
<field
name="inherit_id"
ref="account_avatax_exemption.view_partner_details_form_inherit1"
/>
<field name="arch" type="xml">
<xpath
expr="//field[@name='property_tax_exempt']/../separator[1]"
position="attributes"
>
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</xpath>
<xpath
expr="//page[last()]//field[@name='property_tax_exempt']"
position="attributes"
>
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</xpath>
<xpath
expr="//page[last()]//field[@name='property_exemption_code_id']"
position="attributes"
>
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</xpath>
<xpath
expr="//page[last()]//field[@name='property_exemption_number']"
position="attributes"
>
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</xpath>
<xpath expr="//group[@name='avatax_exemption']" position="attributes">
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,40 @@
<odoo>
<record id="view_product_category_form_avatax_inherit" model="ir.ui.view">
<field name="name">product.category.form.avatax.inherit</field>
<field name="model">product.category</field>
<field name="type">form</field>
<field
name="inherit_id"
ref="account_avatax_oca.view_product_category_form_avatax_inherit"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='tax_code_id']" position="attributes">
<attribute name="attrs">{}</attribute>
</xpath>
</field>
</record>
<record id="product_product_normal_form_view_inherit" model="ir.ui.view">
<field name="name">product.product.normal.form.view.inherit</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view" />
<field name="priority">99</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='tax_code_id']" position="after">
<field name="avatax_item_id" />
</xpath>
</field>
</record>
<record id="view_product_tax_code_form_inherit" model="ir.ui.view">
<field name="name">product.tax.code.form.inherit</field>
<field name="model">product.tax.code</field>
<field name="inherit_id" ref="account_avatax_oca.view_product_tax_code_form" />
<field name="arch" type="xml">
<xpath expr="//group[@name='taxcode']" position="after">
<group>
<field name="id" invisible="1" />
<field name="rule_ids" context="{'default_avatax_tax_code': id}" />
</group>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,16 @@
<odoo>
<record id="view_country_state_tree" model="ir.ui.view">
<field name="name">res.country.state.inherit</field>
<field name="model">res.country.state</field>
<field
name="inherit_id"
ref="account_avatax_exemption_base.view_country_state_tree"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='avatax_nexus']" position="after">
<field name="id" invisible="1" />
<field name="rule_ids" context="{'default_state_id': id}" />
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,38 @@
<odoo>
<record
id="account_avatax_sale_oca_order_form_view_editable_field"
model="ir.ui.view"
>
<field name="name">account_avatax_oca.oca.sale.order.form.view.editable</field>
<field name="model">sale.order</field>
<field
name="inherit_id"
ref="account_avatax_sale_oca.sale_order_update_form_view"
/>
<field name="arch" type="xml">
<field name='exemption_code' position="attributes">
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</field>
<field name='exemption_code_id' position="attributes">
<attribute
name="groups"
>account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code</attribute>
</field>
<field name='exemption_code' position="before">
<field
name="exemption_code"
groups="!account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code"
/>
</field>
<field name='exemption_code_id' position="before">
<field
name="exemption_code_id"
groups="!account_avatax_exemption.group_show_tax_exempt_exempt_number_exempt_code"
/>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,168 @@
<odoo>
<template id="exemptions_followup" name="Portal Exemption Form">
<t t-call="portal.portal_layout">
<t t-call="account_avatax_exemption.form_breadcrumb" />
<div class="container mt16">
<div id="wrap" t-attf-class="pb-2 pt-3 #{'card-header bg-white'}">
<t t-set="breadcrumbs_searchbar" t-value="True" />
<t name="placeholder1" />
<section id="exemption_title" class="row card-header bg-white">
<div class="col-12">
<h1>
View Exemption:
<span t-esc="exemption.display_name" />
</h1>
</div>
</section>
<t name="placeholder2" />
<t name="placeholder3" />
<form id="portal_exemption" class="mt16">
<input
type="hidden"
name="csrf_token"
t-att-value="request.csrf_token()"
/>
<t t-call="account_avatax_exemption.form_field" />
<table
class="table table-hover table-striped mt32"
t-if="exemption.exemption_line_ids"
>
<thead>
<tr>
<th>Name</th>
<th>State</th>
<th>Status</th>
</tr>
</thead>
<tr
t-foreach="exemption.exemption_line_ids"
t-as="exemption_line"
>
<td>
<t t-esc="exemption_line.name" />
</td>
<td>
<t t-esc="exemption_line.state_id.display_name" />
</td>
<td>
<t
t-if="exemption_line.avatax_id and exemption_line.avatax_status == True"
>
<span class="fa fa-check text-success" />
</t>
<t t-else="">
<span class="fa fa-times text-danger" />
</t>
</td>
</tr>
</table>
</form>
<t name="placeholder4" />
</div>
</div>
<div id="exemption_communication" class="mt-4">
<h2>History</h2>
<t t-call="portal.message_thread">
<t t-set="object" t-value="exemption" />
</t>
</div>
</t>
</template>
<template id="form_breadcrumb" name="Portal Exemption Breadcrumb">
<div class="o_portal container mt-3">
<div class="row align-items-center bg-white no-gutters border rounded">
<div class="col ">
<ol class="o_portal_submenu breadcrumb mb-0 py-2 flex-grow-1">
<li>
<a href="/my/home">
<div class="fa fa-home" />
</a>
</li>
<li>
<a t-attf-href="/my/exemptions?#{keep_query()}">
/ My Exemptions
</a>
</li>
<li>
<t t-if="exemption.id">
/
<t t-esc="exemption.display_name" />
</t>
</li>
</ol>
</div>
</div>
</div>
</template>
<template id="form_field" name="Portal Exemption Form Field">
<div class="form-group">
<div class="row">
<div class="col-3">
<span class="font-weight-bold" t-esc="'Business Type:'" />
</div>
<div class="col-9 text-left">
<span t-field="exemption.business_type" />
</div>
</div>
<div class="row mt16">
<div class="col-3">
<span class="font-weight-bold" t-esc="'Entity Use Code:'" />
</div>
<div class="col-9 text-left">
<span t-field="exemption.exemption_code_id" />
</div>
</div>
<div class="row mt16">
<div class="col-3">
<span class="font-weight-bold" t-esc="'Exemption Number:'" />
</div>
<div class="col-9 text-left">
<span t-field="exemption.exemption_number" />
</div>
</div>
<div class="row mt16">
<div class="col-3">
<span class="font-weight-bold" t-esc="'Exemption Number Type:'" />
</div>
<div class="col-9 text-left">
<span t-field="exemption.exemption_number_type" />
</div>
</div>
<div class="row mt16">
<div class="col-3">
<span class="font-weight-bold" t-esc="'Effective Date:'" />
</div>
<div class="col-9 text-left">
<span t-field="exemption.effective_date" />
</div>
</div>
<div class="row mt16">
<div class="col-3">
<span class="font-weight-bold" t-esc="'Expiry Date:'" />
</div>
<div class="col-9 text-left">
<span t-field="exemption.expiry_date" />
</div>
</div>
</div>
</template>
<!-- Store customizations in separate template to avoid breaking updates -->
<template
id="form_custom"
inherit_id="exemptions_followup"
name="Portal Exemption Form Customizations"
>
<xpath expr="//t[@name='placeholder1']">
<div class="oe_structure oe_empty" />
</xpath>
<xpath expr="//t[@name='placeholder2']">
<div class="oe_structure oe_empty" />
</xpath>
<xpath expr="//t[@name='placeholder3']">
<div class="oe_structure oe_empty" />
</xpath>
<xpath expr="//t[@name='placeholder4']">
<div class="oe_structure oe_empty" />
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,80 @@
<odoo>
<template id="portal_my_exemptions" name="My Exemptions">
<t t-call="portal.portal_layout">
<t t-set="breadcrumbs_searchbar" t-value="True" />
<t name="placeholder1" />
<h3 class="page-header">
Your Exemptions
<t t-call="portal.portal_searchbar" />
</h3>
<t name="placeholder2" />
<t t-if="not exemptions">
<p>No exemptions found.</p>
</t>
<div class="row mt16 mb16">
<t t-if="exemptions">
<div class="col-xs-12 table-responsive mt8">
<t t-call="account_avatax_exemption.exemptions_table" />
</div>
</t>
</div>
<t name="placeholder3" />
</t>
</template>
<template id="exemptions_table" name="Exemptions table">
<table class="table table-hover table-striped">
<thead>
<tr class="active">
<th>Entity Use Code</th>
<th>Effective Date</th>
<th>Expiry Date</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<t t-foreach="exemptions" t-as="exemption">
<tr>
<td>
<span t-field="exemption.exemption_code_id" />
</td>
<td>
<span t-field="exemption.effective_date" />
</td>
<td>
<span t-field="exemption.expiry_date" />
</td>
<td>
<span t-field="exemption.state" />
</td>
<td>
<a
t-attf-href="/my/exemptions/#{slug(exemption)}?#{keep_query()}"
>
<span t-esc="'View'" />
</a>
</td>
</tr>
</t>
</tbody>
</table>
<div t-if="pager" class="o_portal_pager text-center">
<t t-call="website.pager" />
</div>
</template>
<!-- Store customizations in separate template to avoid breaking updates -->
<template
id="tree_custom"
inherit_id="portal_my_exemptions"
name="Portal Exemption List Customizations"
>
<xpath expr="//t[@name='placeholder1']">
<div class="oe_structure oe_empty" />
</xpath>
<xpath expr="//t[@name='placeholder2']">
<div class="oe_structure oe_empty" />
</xpath>
<xpath expr="//t[@name='placeholder3']">
<div class="oe_structure oe_empty" />
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,36 @@
<odoo>
<template
id="portal_layout"
name="Portal layout: exemption menu entry"
inherit_id="portal.portal_breadcrumbs"
priority="50"
>
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
<li
t-if="page_name == 'exemption' or exemption"
t-attf-class="breadcrumb-item #{'active ' if not exemption else ''}"
>
<a t-if="exemption" t-attf-href="/my/exemptions?{{ keep_query() }}">
Exemptions
</a>
<t t-else="">Exemptions</t>
</li>
<li t-if="exemption" class="breadcrumb-item active">
<t t-esc="exemption.display_name" />
</li>
</xpath>
</template>
<template
id="portal_my_home_exemptions"
name="Portal My Home: exemptions entries"
inherit_id="portal.portal_my_home"
>
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
<t t-call="portal.portal_docs_entry">
<t t-set="title">Exemptions</t>
<t t-set="url" t-value="'/my/exemptions'" />
<t t-set="count" t-value="exemption_count" />
</t>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Account_avatax_exemption Module - account_avatax_exemption
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for account_avatax_exemption. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,9 @@
# Dependencies
This addon depends on:
- [website](../../odoo-bringout-oca-ocb-website)
- [product](../../odoo-bringout-oca-ocb-product)
- [queue_job](../../odoo-bringout-oca-queue-queue_job)
- [account_avatax_sale_oca](../../odoo-bringout-oca-account-fiscal-rule-account_avatax_sale_oca)
- [account_avatax_exemption_base](../../odoo-bringout-oca-account-fiscal-rule-account_avatax_exemption_base)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon account_avatax_exemption or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-account-fiscal-rule-account_avatax_exemption"
# or
uv pip install odoo-bringout-oca-account-fiscal-rule-account_avatax_exemption"
```

View file

@ -0,0 +1,23 @@
# Models
Detected core models and extensions in account_avatax_exemption.
```mermaid
classDiagram
class exemption_code_rule
class avalara_salestax
class exemption_code
class product_category
class product_product
class product_tax_code
class product_template
class queue_job
class res_country_state
class res_partner_exemption
class res_partner_exemption_business_type
class res_partner_exemption_type
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: account_avatax_exemption. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon account_avatax_exemption
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,42 @@
# Security
Access control and security definitions in account_avatax_exemption.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../account_avatax_exemption/security/ir.model.access.csv)**
- 2 model access rules
## Record Rules
Row-level security rules defined in:
## Security Groups & Configuration
Security groups and permissions defined in:
- **[security.xml](../account_avatax_exemption/security/security.xml)**
- 1 security groups defined
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../account_avatax_exemption/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
- **[security.xml](../account_avatax_exemption/security/security.xml)**
- Security groups, categories, and XML-based rules
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon account_avatax_exemption
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,48 @@
[project]
name = "odoo-bringout-oca-account-fiscal-rule-account_avatax_exemption"
version = "16.0.0"
description = "Avatax Exemptions -
This application allows you to add exemptions to Avatax
"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-website>=16.0.0",
"odoo-bringout-oca-ocb-product>=16.0.0",
"odoo-bringout-oca-account-fiscal-rule-queue_job>=16.0.0",
"odoo-bringout-oca-account-fiscal-rule-account_avatax_sale_oca>=16.0.0",
"odoo-bringout-oca-account-fiscal-rule-account_avatax_exemption_base>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["account_avatax_exemption"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]