public void Insert(YumaPos.Server.Infrastructure.DataObjects.Address address)
		{
			DataAccessService.InsertObject(address, InsertQuery);
		}
		public async Task InsertAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			await DataAccessService.InsertObjectAsync(menuItem, InsertQuery);
		}
		public void Insert(YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax tax)
		{
			DataAccessService.InsertObject(tax, InsertQuery);
		}
		/*
		public void UpdateByMenuCategoryId(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
		menuItem.Modified = DateTimeOffset.Now;
		menuItem.ModifiedBy = _dataAccessController.EmployeeId.Value;
		menuItem.MenuItemVersionId = Guid.NewGuid();
		_menuItemVersionRepository.Insert(menuItem);
		_menuItemCacheRepository.UpdateByMenuCategoryId(menuItem);
		UpdateMenuItems2Taxes(menuItem);
		}
		public async Task UpdateByMenuCategoryIdAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
		menuItem.Modified = DateTimeOffset.Now;
		menuItem.ModifiedBy = _dataAccessController.EmployeeId.Value;
		menuItem.MenuItemVersionId = Guid.NewGuid();
		await _menuItemVersionRepository.InsertAsync(menuItem);
		await _menuItemCacheRepository.UpdateByMenuCategoryIdAsync(menuItem);
		UpdateMenuItems2Taxes(menuItem);
		}

		*/
		private void UpdateMenuItems2Taxes(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			if (menuItem.TaxIds == null)
				menuItem.TaxIds = _menuItems2TaxesCacheRepository.GetByMenuItemId(menuItem.MenuItemId).Select(i => i.TaxId);
			var listOfMenuItems2Taxes = menuItem.TaxIds.Select(ids => new MenuItems2Taxes()
			{
				TaxId = ids,
				TaxVersionId = _taxCacheRepository.GetByTaxId(ids).TaxVersionId,
				MenuItemId = menuItem.MenuItemId,
				MenuItemVersionId = menuItem.MenuItemVersionId,
			}).ToList();
			_menuItems2TaxesCacheRepository.RemoveByMenuItemId(menuItem.MenuItemId);
			foreach (var mt in listOfMenuItems2Taxes)
			{
				mt.Modified = DateTimeOffset.Now;
				mt.ModifiedBy = menuItem.ModifiedBy;
				_menuItems2TaxesCacheRepository.Insert(mt);
				_menuItems2TaxesVersionRepository.Insert(mt);
			}
		}
		public async Task RemoveByMenuItemIdAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			menuItem.IsDeleted = true;
			await UpdateByMenuItemIdAsync(menuItem);
		}
		public async Task RemoveByTaxIdAsync(YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax tax)
		{
			tax.IsDeleted = true;
			await UpdateByTaxIdAsync(tax);
		}
		public async Task<System.Guid> InsertAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			menuItem.Modified = DateTimeOffset.Now;
			menuItem.ModifiedBy = _dataAccessController.EmployeeId.Value;
			menuItem.MenuItemVersionId = Guid.NewGuid();
			if (menuItem.MenuItemId == null || menuItem.MenuItemId == Guid.Empty)
			{
				throw new ArgumentException("MenuItemId");
			}
			await _menuItemVersionRepository.InsertAsync(menuItem);
			var res = await _menuItemCacheRepository.InsertAsync(menuItem);
			UpdateMenuItems2Taxes(menuItem);
			return (System.Guid)res;
		}
		public async Task RemoveByMenuItemIdAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			var sql = SelectIntoTempTable + WhereQueryByMenuItemId + DeleteQueryBy;
			await DataAccessService.PersistObjectAsync(menuItem, sql);
		}
		public MenuItemCacheRepository(YumaPos.FrontEnd.Infrastructure.Configuration.IDataAccessService dataAccessService) : base(dataAccessService) { }
		public async Task UpdateByMenuItemIdAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			var sql = UpdateQueryBy + WhereQueryByMenuItemId + UpdateQueryJoin + WhereQueryByJoinPk;
			await DataAccessService.PersistObjectAsync(menuItem, sql);
		}
		/*
		public void UpdateByMenuCategoryId(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
		var sql = UpdateQueryBy + WhereQueryByMenuCategoryId + UpdateQueryJoin + WhereQueryByJoinPk; 
		DataAccessService.PersistObject(menuItem, sql);
		}
		public async Task UpdateByMenuCategoryIdAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
		var sql = UpdateQueryBy + WhereQueryByMenuCategoryId + UpdateQueryJoin + WhereQueryByJoinPk; 
		await DataAccessService.PersistObjectAsync(menuItem, sql);
		}


		*/
		public void RemoveByMenuItemId(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			var sql = SelectIntoTempTable + WhereQueryByMenuItemId + DeleteQueryBy;
			DataAccessService.PersistObject(menuItem, sql);
		}
		public void UpdateByMenuItemId(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			var sql = UpdateQueryBy + WhereQueryByMenuItemId + UpdateQueryJoin + WhereQueryByJoinPk;
			DataAccessService.PersistObject(menuItem, sql);
		}
		public async Task<System.Guid> InsertAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			var res = await DataAccessService.InsertObjectAsync(menuItem, InsertQuery);
			return (System.Guid)res;
		}
		public System.Guid Insert(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			var res = DataAccessService.InsertObject(menuItem, InsertQuery);
			return (System.Guid)res;
		}
		private void UpdateMenuItems2Taxes(YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax tax)
		{
			if (tax.MenuItemIds == null)
				tax.MenuItemIds = _menuItems2TaxesCacheRepository.GetByTaxId(tax.TaxId).Select(i => i.MenuItemId);
			var listOfMenuItems2Taxes = tax.MenuItemIds.Select(ids => new MenuItems2Taxes()
			{
				MenuItemId = ids,
				MenuItemVersionId = _menuItemCacheRepository.GetByMenuItemId(ids).MenuItemVersionId,
				TaxId = tax.TaxId,
				TaxVersionId = tax.TaxVersionId,
			}).ToList();
			_menuItems2TaxesCacheRepository.RemoveByTaxId(tax.TaxId);
			foreach (var mt in listOfMenuItems2Taxes)
			{
				mt.Modified = DateTimeOffset.Now;
				mt.ModifiedBy = tax.ModifiedBy;
				_menuItems2TaxesCacheRepository.Insert(mt);
				_menuItems2TaxesVersionRepository.Insert(mt);
			}
		}
		public CustomerSubscriptionRepository(YumaPos.FrontEnd.Infrastructure.Configuration.IDataAccessService dataAccessService) : base(dataAccessService) { }
		public void RemoveByTaxId(YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax tax)
		{
			tax.IsDeleted = true;
			UpdateByTaxId(tax);
		}
		/*
		public IEnumerable<YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription> GetAll()
		{
		var sql = SelectAllQuery;
		object parameters = null;
		var result = DataAccessService.Get<YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription>(sql, parameters).ToList();
		return result.ToList();
		}
		public async Task<IEnumerable<YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription>> GetAllAsync()
		{
		var sql = SelectAllQuery;
		object parameters = null;
		var result = (await DataAccessService.GetAsync<YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription>(sql, parameters));
		return result.ToList();
		}

		*/
		/*
		public IEnumerable<YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription> GetByCustomerIdAndCustomerNotificationsType(string customerId, int customerNotificationsType)
		{
		object parameters = new {customerId, customerNotificationsType};
		var sql = SelectByQuery + WhereQueryByCustomerIdAndCustomerNotificationsType;
		var result = DataAccessService.Get<YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription>(sql, parameters);
		return result.ToList();
		}
		public async Task<IEnumerable<YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription>> GetByCustomerIdAndCustomerNotificationsTypeAsync(string customerId, int customerNotificationsType)
		{
		object parameters = new {customerId, customerNotificationsType};
		var sql = SelectByQuery + WhereQueryByCustomerIdAndCustomerNotificationsType;
		var result = (await DataAccessService.GetAsync<YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription>(sql, parameters));
		return result.ToList();
		}


		*/
		public void Insert(YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription customerSubscription)
		{
			DataAccessService.InsertObject(customerSubscription, InsertQuery);
		}
		/*
		public IEnumerable<YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax> GetByTaxVersionId(System.Guid taxVersionId, bool? isDeleted = false)
		{
		var result = _taxVersionRepository.GetByTaxVersionId(taxVersionId, isDeleted);
		return result.ToList();
		}

		public async Task<IEnumerable<YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax>> GetByTaxVersionIdAsync(System.Guid taxVersionId, bool? isDeleted = false)
		{
		var result = await _taxVersionRepository.GetByTaxVersionIdAsync(taxVersionId, isDeleted);
		return result.ToList();
		}


		*/
		public int Insert(YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax tax)
		{
			tax.Modified = DateTimeOffset.Now;
			tax.ModifiedBy = _dataAccessController.EmployeeId.Value;
			tax.TaxVersionId = Guid.NewGuid();
			tax.TaxId = 0;
			_taxVersionRepository.Insert(tax);
			var res = _taxCacheRepository.Insert(tax);
			UpdateMenuItems2Taxes(tax);
			return (int)res;
		}
		public async Task InsertAsync(YumaPos.Server.Infrastructure.DataObjects.CustomerSubscription customerSubscription)
		{
			await DataAccessService.InsertObjectAsync(customerSubscription, InsertQuery);
		}
		public async Task UpdateByMenuItemIdAsync(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			menuItem.Modified = DateTimeOffset.Now;
			menuItem.ModifiedBy = _dataAccessController.EmployeeId.Value;
			menuItem.MenuItemVersionId = Guid.NewGuid();
			await _menuItemVersionRepository.InsertAsync(menuItem);
			await _menuItemCacheRepository.UpdateByMenuItemIdAsync(menuItem);
			UpdateMenuItems2Taxes(menuItem);
		}
		public async Task<int> InsertAsync(YumaPos.Server.Infrastructure.DataObjects.Address2 address2)
		{
			var res = await DataAccessService.InsertObjectAsync(address2, InsertQuery);
			return (int)res;
		}
		public void RemoveByMenuItemId(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			menuItem.IsDeleted = true;
			UpdateByMenuItemId(menuItem);
		}
		public int Insert(YumaPos.Server.Infrastructure.DataObjects.Address2 address2)
		{
			var res = DataAccessService.InsertObject(address2, InsertQuery);
			return (int)res;
		}
		public void Insert(YumaPos.Server.Infrastructure.DataObjects.MenuItem menuItem)
		{
			DataAccessService.InsertObject(menuItem, InsertQuery);
		}
		public EmployeesInRolesScheduleRepository(YumaPos.FrontEnd.Infrastructure.Configuration.IDataAccessService dataAccessService) : base(dataAccessService) { }
		public TaxVersionRepository(YumaPos.FrontEnd.Infrastructure.Configuration.IDataAccessService dataAccessService) : base(dataAccessService) { }
		public async Task UpdateByTaxIdAsync(YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax tax)
		{
			tax.Modified = DateTimeOffset.Now;
			tax.ModifiedBy = _dataAccessController.EmployeeId.Value;
			tax.TaxVersionId = Guid.NewGuid();
			await _taxVersionRepository.InsertAsync(tax);
			await _taxCacheRepository.UpdateByTaxIdAsync(tax);
			UpdateMenuItems2Taxes(tax);
		}
		public async Task InsertAsync(YumaPos.FrontEnd.Infrastructure.DataObjects.PosFdat.Taxes.Tax tax)
		{
			await DataAccessService.InsertObjectAsync(tax, InsertQuery);
		}
		public async Task RemoveByIdAndZipCodeAsync(YumaPos.Server.Infrastructure.DataObjects.Address address)
		{
			var sql = DeleteQueryBy + WhereQueryByIdAndZipCode;
			await DataAccessService.PersistObjectAsync(address, sql);
		}