feat(UAE VAT 201): Add tests for report
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 2e5a714..8276c1f 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -1040,7 +1040,8 @@
 	pi.is_return = args.is_return
 	pi.credit_to = args.return_against or "Creditors - _TC"
 	pi.is_subcontracted = args.is_subcontracted or "No"
-	pi.supplier_warehouse = "_Test Warehouse 1 - _TC"
+	if args.supplier_warehouse: 
+		pi.supplier_warehouse = "_Test Warehouse 1 - _TC"
 
 	pi.append("items", {
 		"item_code": args.item or args.item_code or "_Test Item",
diff --git a/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py b/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py
new file mode 100644
index 0000000..8e845d7
--- /dev/null
+++ b/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py
@@ -0,0 +1,370 @@
+# coding=utf-8
+from __future__ import unicode_literals
+
+import erpnext
+import frappe
+from unittest import TestCase
+from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
+from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
+from erpnext.stock.doctype.warehouse.test_warehouse import get_warehouse_account
+from erpnext.regional.report.uae_vat_201.uae_vat_201 import (
+	get_total_emiratewise, 
+	get_tourist_tax_return_total, 
+	get_tourist_tax_return_tax,
+	get_reverse_charge_total,
+	get_reverse_charge_tax,
+	get_zero_rated_total,
+	get_exempt_total,
+	get_standard_rated_expenses_total,
+	get_standard_rated_expenses_tax,
+	get_reverse_charge_recoverable_total,
+	get_reverse_charge_recoverable_tax
+	)
+
+
+
+class TestUaeVat201(TestCase):
+	def setUp(self):
+		frappe.set_user("Administrator")
+
+		frappe.db.sql("delete from `tabSales Invoice` where company='_Test Company UAE VAT'")
+		frappe.db.sql("delete from `tabPurchase Invoice` where company='_Test Company UAE VAT'")
+
+
+		make_company("_Test Company UAE VAT", "_TCUV")
+		set_vat_accounts()
+
+		make_customers()
+
+		make_supplier()
+
+		create_warehouse("_Test UAE VAT Supplier Warehouse", company="_Test Company UAE VAT")
+
+
+		make_item("_Test UAE VAT Item", properties = {"is_zero_rated": 0, "is_exempt": 0})
+		make_item("_Test UAE VAT Zero Rated Item", properties = {"is_zero_rated": 1, "is_exempt": 0})
+		make_item("_Test UAE VAT Exempt Item", properties = {"is_zero_rated": 0, "is_exempt": 1})
+
+		make_sales_invoices()
+
+		create_purchase_invoices()
+
+	def test_uae_vat_201_report(self):
+		filters = {"company": "_Test Company UAE VAT"}
+		total_emiratewise = get_total_emiratewise(filters)
+		amounts_by_emirate = {}
+		for d in total_emiratewise:
+			emirate, amount, vat= d
+			amounts_by_emirate[emirate] = {
+					"raw_amount": amount,
+					"raw_vat_amount": vat,
+					}
+		self.assertEqual(amounts_by_emirate["Sharjah"]["raw_amount"],300)
+		self.assertEqual(amounts_by_emirate["Sharjah"]["raw_vat_amount"],5)
+		self.assertEqual(amounts_by_emirate["Dubai"]["raw_amount"],200)
+		self.assertEqual(amounts_by_emirate["Dubai"]["raw_vat_amount"],10)
+
+		self.assertEqual(get_tourist_tax_return_tax(filters),2)
+		self.assertEqual(get_reverse_charge_total(filters),250)
+		self.assertEqual(get_reverse_charge_tax(filters),12.5)
+		self.assertEqual(get_zero_rated_total(filters),100)
+		self.assertEqual(get_exempt_total(filters),100)
+		self.assertEqual(get_standard_rated_expenses_total(filters),250)
+		self.assertEqual(get_standard_rated_expenses_tax(filters),1)
+		self.assertEqual(get_reverse_charge_recoverable_total(filters),250)
+		self.assertEqual(get_reverse_charge_recoverable_tax(filters),12.5)
+
+def make_company(company_name, abbr):
+	if not frappe.db.exists("Company", company_name):
+		company = frappe.get_doc({
+			"doctype": "Company",
+			"company_name": company_name,
+			"abbr": abbr,
+			"default_currency": "AED",
+			"country": "United Arab Emirates",
+			"create_chart_of_accounts_based_on": "Standard Template",
+		})
+		company.insert()
+	else:
+		company = frappe.get_doc("Company", company_name)
+
+	# indempotent
+	company.create_default_warehouses()
+
+	if not frappe.db.get_value("Cost Center", {"is_group": 0, "company": company.name}):
+		company.create_default_cost_center()
+
+	company.save()
+	return company
+
+def set_vat_accounts():
+	if not frappe.db.exists("UAE VAT Settings", "_Test Company UAE VAT"):
+		vat_accounts = frappe.get_all(
+			"Account",
+			fields=["name"],
+			filters = {
+				"company": "_Test Company UAE VAT",
+				"is_group":0, 
+				"account_type": "Tax"})
+
+		uae_vat_accounts = []
+		for d in vat_accounts:
+			uae_vat_accounts.append(
+				{
+				"doctype": "UAE VAT Account", 
+				"account":d.name
+				})
+
+		frappe.get_doc({
+			"company": "_Test Company UAE VAT",
+			"uae_vat_accounts": uae_vat_accounts,
+			"doctype": "UAE VAT Settings",
+		}).insert()
+
+def make_customers():
+	if not frappe.db.exists("Customer", "_Test Dubai Customer"):
+		customer = frappe.get_doc({
+			"doctype": "Customer",
+			"customer_name": "_Test Dubai Customer",
+			"customer_type": "Company",
+		})
+		customer.insert()
+	else:
+		customer = frappe.get_doc("Customer", "_Test Dubai Customer")
+
+	if not frappe.db.exists("Customer", "_Test Sharjah Customer"):
+		customer = frappe.get_doc({
+			"doctype": "Customer",
+			"customer_name": "_Test Sharjah Customer",
+			"customer_type": "Company",
+		})
+		customer.insert()
+	else:
+		customer = frappe.get_doc("Customer", "_Test Sharjah Customer")
+
+	if not frappe.db.exists('Address', '_Test Dubai Address'):
+		address = frappe.get_doc({
+			"address_line1": "_Test Address Line 1",
+			"address_title": "_Test Dubai Address",
+			"address_type": "Billing",
+			"city": "_Test City",
+			"state": "Test State",
+			"country": "United Arab Emirates",
+			"doctype": "Address",
+			"emirate": "Dubai"
+		}).insert()
+
+		address.append("links", {
+			"link_doctype": "Customer",
+			"link_name": "_Test Dubai Customer"
+		})
+
+		address.save()
+
+	if not frappe.db.exists('Address', '_Test Sharjah Address'):
+		address = frappe.get_doc({
+			"address_line1": "_Test Address Line 1",
+			"address_title": "_Test Sharjah Address",
+			"address_type": "Billing",
+			"city": "_Test City",
+			"state": "Test State",
+			"country": "United Arab Emirates",
+			"doctype": "Address",
+			"emirate": "Sharjah"
+		}).insert()
+
+		address.append("links", {
+			"link_doctype": "Customer",
+			"link_name": "_Test Sharjah Customer"
+		})
+
+		address.save()
+
+def make_supplier():
+
+	if not frappe.db.exists("Supplier", "_Test UAE Supplier"):
+		frappe.get_doc({
+			"supplier_group": "Local",
+			"supplier_name": "_Test UAE Supplier",
+			"supplier_type": "Individual",
+			"doctype": "Supplier",
+		}).insert()
+
+def create_warehouse(warehouse_name, properties=None, company=None):
+	if not company:
+		company = "_Test Company"
+
+	warehouse_id = erpnext.encode_company_abbr(warehouse_name, company)
+	if not frappe.db.exists("Warehouse", warehouse_id):
+		w = frappe.new_doc("Warehouse")
+		w.warehouse_name = warehouse_name
+		w.parent_warehouse = "All Warehouses - _TCUV"
+		w.company = company
+		w.account = get_warehouse_account(warehouse_name, company)
+		if properties:
+			w.update(properties)
+		w.save()
+		return w.name
+	else:
+		return warehouse_id
+
+def make_item(item_code, properties=None):
+	if frappe.db.exists("Item", item_code):
+		return frappe.get_doc("Item", item_code)
+
+	item = frappe.get_doc({
+		"doctype": "Item",
+		"item_code": item_code,
+		"item_name": item_code,
+		"description": item_code,
+		"item_group": "Products"
+	})
+
+	if properties:
+		item.update(properties)
+	
+	item.insert()
+
+	return item
+
+def make_sales_invoices():
+	si = create_sales_invoice(company="_Test Company UAE VAT",
+			customer = '_Test Dubai Customer',
+			currency = 'AED',
+			warehouse = 'Finished Goods - _TCUV',
+			debit_to = 'Debtors - _TCUV',
+			income_account = 'Sales - _TCUV',
+			expense_account = 'Cost of Goods Sold - _TCUV',
+			cost_center = 'Main - _TCUV',
+			sales_taxes_and_charges_template = "UAE VAT 5% - _TCUV",
+			item = "_Test UAE VAT Item",
+			do_not_save=1
+		)
+	si.append("taxes", {
+			"charge_type": "On Net Total",
+			"account_head": "VAT 5% - _TCUV",
+			"cost_center": "Main - _TCUV",
+			"description": "VAT 5% @ 5.0",
+			"rate": 5.0
+		})
+	si.submit()
+
+	si = create_sales_invoice(company="_Test Company UAE VAT",
+			customer = '_Test Sharjah Customer',
+			currency = 'AED',
+			warehouse = 'Finished Goods - _TCUV',
+			debit_to = 'Debtors - _TCUV',
+			income_account = 'Sales - _TCUV',
+			expense_account = 'Cost of Goods Sold - _TCUV',
+			cost_center = 'Main - _TCUV',
+			sales_taxes_and_charges_template = "UAE VAT 5% - _TCUV",
+			item = "_Test UAE VAT Item",
+			do_not_save=1
+		)
+	si.append("taxes", {
+			"charge_type": "On Net Total",
+			"account_head": "VAT 5% - _TCUV",
+			"cost_center": "Main - _TCUV",
+			"description": "VAT 5% @ 5.0",
+			"rate": 5.0
+		})
+	si.submit()
+
+	si = create_sales_invoice(company="_Test Company UAE VAT",
+			customer = '_Test Dubai Customer',
+			currency = 'AED',
+			warehouse = 'Finished Goods - _TCUV',
+			debit_to = 'Debtors - _TCUV',
+			income_account = 'Sales - _TCUV',
+			expense_account = 'Cost of Goods Sold - _TCUV',
+			cost_center = 'Main - _TCUV',
+			sales_taxes_and_charges_template = "UAE VAT 5% - _TCUV",
+			item = "_Test UAE VAT Item",
+			do_not_save=1
+		)
+
+	si.tourist_tax_return = 2
+
+	si.append("taxes", {
+			"charge_type": "On Net Total",
+			"account_head": "VAT 5% - _TCUV",
+			"cost_center": "Main - _TCUV",
+			"description": "VAT 5% @ 5.0",
+			"rate": 5.0
+		})
+	si.submit()
+
+	si = create_sales_invoice(company="_Test Company UAE VAT",
+			customer = '_Test Sharjah Customer',
+			currency = 'AED',
+			warehouse = 'Finished Goods - _TCUV',
+			debit_to = 'Debtors - _TCUV',
+			income_account = 'Sales - _TCUV',
+			expense_account = 'Cost of Goods Sold - _TCUV',
+			cost_center = 'Main - _TCUV',
+			sales_taxes_and_charges_template = "UAE VAT 5% - _TCUV",
+			item = "_Test UAE VAT Zero Rated Item",
+		)
+
+	si = create_sales_invoice(company="_Test Company UAE VAT",
+			customer = '_Test Sharjah Customer',
+			currency = 'AED',
+			warehouse = 'Finished Goods - _TCUV',
+			debit_to = 'Debtors - _TCUV',
+			income_account = 'Sales - _TCUV',
+			expense_account = 'Cost of Goods Sold - _TCUV',
+			cost_center = 'Main - _TCUV',
+			sales_taxes_and_charges_template = "UAE VAT 5% - _TCUV",
+			item = "_Test UAE VAT Exempt Item",
+		)
+
+def create_purchase_invoices():
+
+	pi = make_purchase_invoice(
+			company="_Test Company UAE VAT",
+			supplier = '_Test UAE Supplier',
+			warehouse = '_Test UAE VAT Supplier Warehouse - _TCUV',
+			currency = 'AED',
+			cost_center = 'Main - _TCUV',
+			expense_account = 'Cost of Goods Sold - _TCUV',
+			item = "_Test UAE VAT Item",
+			do_not_save=1,
+		)
+	pi.append("taxes", {
+			"charge_type": "On Net Total",
+			"account_head": "VAT 5% - _TCUV",
+			"cost_center": "Main - _TCUV",
+			"description": "VAT 5% @ 5.0",
+			"rate": 5.0
+		})
+
+	pi.recoverable_standard_rated_expenses = 1
+
+	pi.submit()
+
+	pi = make_purchase_invoice(
+			company="_Test Company UAE VAT",
+			supplier = '_Test UAE Supplier',
+			warehouse = '_Test UAE VAT Supplier Warehouse - _TCUV',
+			currency = 'AED',
+			cost_center = 'Main - _TCUV',
+			expense_account = 'Cost of Goods Sold - _TCUV',
+			item = "_Test UAE VAT Item",
+			do_not_save=1,
+		)
+
+	pi.append("taxes", {
+			"charge_type": "On Net Total",
+			"account_head": "VAT 5% - _TCUV",
+			"cost_center": "Main - _TCUV",
+			"description": "VAT 5% @ 5.0",
+			"rate": 5.0
+		})
+
+	pi.reverse_charge = "Y"
+
+	pi.recoverable_reverse_charge = 100
+
+	pi.submit()
+
+