Skip to content

Commit

Permalink
Merge pull request #421 from richifernandez/arab-emirates-regime
Browse files Browse the repository at this point in the history
Arab emirates regime
  • Loading branch information
samlown authored Nov 21, 2024
2 parents 073123e + 940b2aa commit ce70cac
Show file tree
Hide file tree
Showing 14 changed files with 676 additions and 0 deletions.
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,27 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p

### Added

- ae: added UAE regime

## [v0.205.1] - 2024-11-19

### Added

- `org`: `Address` includes `LineOne()`, `LineTwo()`, `CompleteNumber()` methods to help with conversion to other formats with some regional formatting.

### Changes

- `bill`: `Invoice` can now have empty lines if discounts or charges present.

### Fixes

- `ch`: Deleted Supplier validation (not needed for under 2300 CHF/year)
- `bill`: `Invoice` `GetExtensions` method now works correctly if missing totals [Issue #424](https://github.com/invopop/gobl/issues/424).

## [v0.205.0] - 2024-11-12

### Added

- `org`: `Address` now includes a `state` code, for countries that require them.
- `es-tbai-v1`: normalize address information to automatically add new `es-tbai-region` extension to invoices.
- `org`: `Inbox` now supports `email` field, with auto-normalization of URLs and emails in the `code` field.
Expand Down
172 changes: 172 additions & 0 deletions data/regimes/ae.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
{
"$schema": "https://gobl.org/draft-0/tax/regime-def",
"name": {
"ar": "الإمارات العربية المتحدة",
"en": "United Arab Emirates"
},
"time_zone": "Asia/Dubai",
"country": "AE",
"currency": "AED",
"tags": [
{
"schema": "bill/invoice",
"list": [
{
"key": "simplified",
"name": {
"de": "Vereinfachte Rechnung",
"en": "Simplified Invoice",
"es": "Factura Simplificada",
"it": "Fattura Semplificata"
},
"desc": {
"de": "Wird für B2C-Transaktionen verwendet, wenn die Kundendaten nicht verfügbar sind. Bitte wenden Sie sich an die örtlichen Behörden, um die Grenzwerte zu ermitteln.",
"en": "Used for B2C transactions when the client details are not available, check with local authorities for limits.",
"es": "Usado para transacciones B2C cuando los detalles del cliente no están disponibles, consulte con las autoridades locales para los límites.",
"it": "Utilizzato per le transazioni B2C quando i dettagli del cliente non sono disponibili, controllare con le autorità locali per i limiti."
}
},
{
"key": "reverse-charge",
"name": {
"de": "Umkehr der Steuerschuld",
"en": "Reverse Charge",
"es": "Inversión del Sujeto Pasivo",
"it": "Inversione del soggetto passivo"
}
},
{
"key": "self-billed",
"name": {
"de": "Rechnung durch den Leistungsempfänger",
"en": "Self-billed",
"es": "Facturación por el destinatario",
"it": "Autofattura"
}
},
{
"key": "customer-rates",
"name": {
"de": "Kundensätze",
"en": "Customer rates",
"es": "Tarifas aplicables al destinatario",
"it": "Aliquote applicabili al destinatario"
}
},
{
"key": "partial",
"name": {
"de": "Teilweise",
"en": "Partial",
"es": "Parcial",
"it": "Parziale"
}
}
]
}
],
"scenarios": [
{
"schema": "bill/invoice",
"list": [
{
"tags": [
"reverse-charge"
],
"note": {
"key": "legal",
"src": "reverse-charge",
"text": "Reverse Charge"
}
},
{
"tags": [
"simplified"
],
"note": {
"key": "legal",
"src": "simplified",
"text": "Simplified Tax Invoice"
}
}
]
}
],
"corrections": [
{
"schema": "bill/invoice",
"types": [
"credit-note"
]
}
],
"categories": [
{
"code": "VAT",
"name": {
"ar": "ضريبة القيمة المضافة",
"en": "VAT"
},
"title": {
"ar": "ضريبة القيمة المضافة",
"en": "Value Added Tax"
},
"rates": [
{
"key": "zero",
"name": {
"ar": "معدل صفر",
"en": "Zero Rate"
},
"desc": {
"ar": "نسبة ضريبة قيمة مضافة 0٪ تطبق على الصادرات المحددة والمناطق المعينة والخدمات الأساسية.",
"en": "A VAT rate of 0% applicable to specific exports, designated areas, and essential services."
},
"values": [
{
"percent": "0.0%"
}
]
},
{
"key": "standard",
"name": {
"ar": "معدل قياسي",
"en": "Standard Rate"
},
"desc": {
"ar": "ينطبق على معظم السلع والخدمات ما لم ينص على خلاف ذلك.",
"en": "Applies to most goods and services unless specified otherwise."
},
"values": [
{
"since": "2018-01-01",
"percent": "5%"
}
]
},
{
"key": "exempt",
"name": {
"ar": "معفى",
"en": "Exempt"
},
"desc": {
"ar": "بعض السلع والخدمات، مثل الخدمات المالية والعقارات السكنية، معفاة من ضريبة القيمة المضافة.",
"en": "Certain goods and services, such as financial services and residential real estate, are exempt from VAT."
},
"exempt": true
}
],
"sources": [
{
"title": {
"ar": "الهيئة الاتحادية للضرائب",
"en": "Federal Tax Authority - UAE VAT Regulations"
},
"url": "https://www.tax.gov.ae"
}
]
}
]
}
47 changes: 47 additions & 0 deletions examples/ae/invoice-ae-ae-stnr.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
$schema: "https://gobl.org/draft-0/bill/invoice"
uuid: "3aea7b56-59d8-4beb-90bd-f8f280d852a0"
currency: "AED"
issue_date: "2022-02-01"
series: "SAMPLE"
code: "001"

supplier:
tax_id:
country: "AE"
code: "123456789012346"
name: "Provide One LLC"
emails:
- addr: "[email protected]"
addresses:
- num: "16"
street: "Sheikh Zayed Road"
locality: "Dubai"
code: "00000"
country: "AE"

customer:
tax_id:
country: "AE"
code: "123456789012345"
name: "Sample Consumer"
emails:
- addr: "[email protected]"
addresses:
- num: "25"
street: "Al Maryah Island"
locality: "Abu Dhabi"
code: "00000"
country: "AE"

lines:
- quantity: 20
item:
name: "Development services"
price: "90.00"
unit: "h"
discounts:
- percent: "5%"
reason: "Special discount"
taxes:
- cat: VAT
rate: standard
35 changes: 35 additions & 0 deletions examples/ae/invoice-ae-simplified.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
$schema: "https://gobl.org/draft-0/bill/invoice"
uuid: "3aea7b56-59d8-4beb-90bd-f8f280d852a0"
currency: "AED"
issue_date: "2022-02-01"
series: "SAMPLE"
code: "001"
tax:
tags:
- "simplified"
supplier:
tax_id:
country: "AE"
code: "123456789012346"
name: "Provide One LLC"
emails:
- addr: "[email protected]"
addresses:
- num: "16"
street: "Sheikh Zayed Road"
locality: "Dubai"
code: "00000"
country: "AE"

lines:
- quantity: 20
item:
name: "Development services"
price: "90.00"
unit: "h"
discounts:
- percent: "10%"
reason: "Special discount"
taxes:
- cat: VAT
rate: "standard"
Binary file added examples/ae/out/invoice-ae-ae-stnr.json
Binary file not shown.
Binary file added examples/ae/out/invoice-ae-simplified.json
Binary file not shown.
41 changes: 41 additions & 0 deletions regimes/ae/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# United Arab Emirates (AE) Tax Regime

This document provides an overview of the tax regime in the United Arab Emirates.

## Value-Added Tax (VAT)

The UAE VAT system categorizes goods and services into three main VAT rates:

- **Standard Rate (5%)**: Applies to most goods and services in the UAE.
- **Zero Rate (0%)**: Applies to certain essential goods, exports, and specific services.
- **Exempt**: Certain types of goods and services are exempt from VAT, including some financial services or residential real estate.

Businesses required to charge VAT must register with the UAE Federal Tax Authority to obtain a Tax Registration Number (TRN). Registration can be completed online via the [VAT registration portal](https://tax.gov.ae/en/services/vat.registration.aspx).

## VAT Registration Requirements

Businesses in the UAE must evaluate their eligibility for VAT registration based on their revenue and expenses. The registration requirements are as follows:

- **Mandatory Registration**: Businesses are required to register for VAT if the total value of taxable supplies and imports exceeds **AED 375,000** in a 12-month period.
- **Voluntary Registration**: Businesses may choose to register voluntarily if the total value of taxable supplies and imports, or taxable expenses, exceeds **AED 187,500** within a 12-month period.

**Note:** Businesses below the voluntary registration threshold are not permitted to register for VAT and, therefore, will issue invoices without a TRN.

For more information, visit the [Federal Tax Authority website](https://tax.gov.ae/en/taxes/Vat/vat.topics/registration.for.vat.aspx)

### TRN Validation

Currently, no checksum method is available for validating the TRN. Therefore, verification must be performed directly through the official UAE government website.

### Alcohol Sales Tax

In Dubai, a **30% sales tax** on alcohol previously existed but has since been abolished. Some sources suggest that a similar tax persists in Abu Dhabi, but without official confirmation, this has not been included in the UAE tax regime.

## VAT Invoicing Requirements

There are two types of VAT invoices: the standard and the simplified invoice.

**Simplified VAT Invoice**: Allowed in the following cases:

- When the recipient of goods or services is **not VAT registered**.
- When the recipient of goods or services **is VAT registered**, and the transaction value does not exceed **AED 10,000**.
64 changes: 64 additions & 0 deletions regimes/ae/ae.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// Package ae provides the tax region definition for United Arab Emirates.
package ae

import (
"github.com/invopop/gobl/bill"
"github.com/invopop/gobl/cbc"
"github.com/invopop/gobl/currency"
"github.com/invopop/gobl/i18n"
"github.com/invopop/gobl/regimes/common"
"github.com/invopop/gobl/tax"
)

func init() {
tax.RegisterRegimeDef(New())
}

// New provides the tax region definition for AE.
func New() *tax.RegimeDef {
return &tax.RegimeDef{
Country: "AE",
Currency: currency.AED,
Name: i18n.String{
i18n.EN: "United Arab Emirates",
i18n.AR: "الإمارات العربية المتحدة",
},
TimeZone: "Asia/Dubai",
Tags: []*tax.TagSet{
common.InvoiceTags(),
},
Scenarios: []*tax.ScenarioSet{
invoiceScenarios,
},
Corrections: []*tax.CorrectionDefinition{
{
Schema: bill.ShortSchemaInvoice,
Types: []cbc.Key{
bill.InvoiceTypeCreditNote,
},
},
},
Validator: Validate,
Normalizer: Normalize,
Categories: taxCategories,
}
}

// Validate function assesses the document type to determine if validation is required.
// Note that, under the AE tax regime, validation of the supplier's tax ID is not necessary if it does not meet the specified threshold (refer to the README section for more details).
func Validate(doc interface{}) error {
switch obj := doc.(type) {
case *tax.Identity:
return validateTaxIdentity(obj)
}
return nil
}

// Normalize attempts to clean up the object passed to it.
func Normalize(doc any) {
switch obj := doc.(type) {
case *tax.Identity:
tax.NormalizeIdentity(obj)

}
}
Loading

0 comments on commit ce70cac

Please sign in to comment.