diff --git a/account_avatax_exemption/models/avalara_salestax.py b/account_avatax_exemption/models/avalara_salestax.py index 31630dc9d..0db47e12a 100644 --- a/account_avatax_exemption/models/avalara_salestax.py +++ b/account_avatax_exemption/models/avalara_salestax.py @@ -287,6 +287,74 @@ def export_new_exemption_rules(self, rules=None): 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( + [("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) diff --git a/account_avatax_exemption/views/avalara_salestax_view.xml b/account_avatax_exemption/views/avalara_salestax_view.xml index 6f83922ee..f05c541c9 100644 --- a/account_avatax_exemption/views/avalara_salestax_view.xml +++ b/account_avatax_exemption/views/avalara_salestax_view.xml @@ -26,6 +26,11 @@ name="download_exemptions" string="Import Exemptions" /> +