public VO.AddressCustomer SaveOrUpdateAddress(VO.AddressCustomer address, Guid accountCode) { address.IsValid(); if (address.Purpose == AddressPurposeType.None || address.Purpose.IsNull()) { address.Purpose = AddressPurposeType.Shipping; } address.Country = address.Country.IsNullOrWhiteSpace() ? "Brasil" : address.Country; address.Status = address.Status.IsNull() ? true : address.Status; var account = accountRepository.Get(accountCode, true); if (account.IsNull()) { return(new VO.AddressCustomer()); } Entities.Customer _customer = account.Customer; if (!_customer.IsNull()) { List <AddressCustomer> resultAdresses = _customer.AddressData.Deserialize <List <VO.AddressCustomer> >(); var addressOld = resultAdresses.FirstOrDefault(a => a.AddressCustomerCode == address.AddressCustomerCode); if (addressOld.IsNull()) { if (!address.AddressCustomerCode.IsEmpty()) { throw new ArgumentException("Endereço não encontrado com esse código: {0}".ToFormat(address.AddressCustomerCode)); } addressOld = resultAdresses.FirstOrDefault(a => a.Number.ToLower() == address.Number.ToLower() && a.ZipCode.ClearStrings() == address.ZipCode.ClearStrings()); } if (addressOld.IsNull()) { address.AddressCustomerCode = Guid.NewGuid(); address.UpdateDate = DateTime.Now; resultAdresses.Add(address); } else { resultAdresses.ForEach(a => { if (a.Number.ToLower() == address.Number.ToLower() && a.ZipCode.ClearStrings() == address.ZipCode.ClearStrings() || addressOld.AddressCustomerCode == address.AddressCustomerCode) { a.AddressCustomerCode = a.AddressCustomerCode; a.Name = address.Name; a.ContactName = address.ContactName; a.Type = address.Type; a.Street = address.Street; a.Complement = address.Complement; a.District = address.District; a.City = address.City; a.ZipCode = address.ZipCode; a.Number = address.Number; a.State = address.State; a.Country = address.Country; a.Purpose = address.Purpose; a.Phones = address.Phones; a.UpdateDate = DateTime.Now; a.SaveDate = a.SaveDate; } }); } _customer.AddressData = resultAdresses.Serialize <List <AddressCustomer> >().RemoveHeaderXML(); _customer.UpdateDate = DateTime.Now; customerRepository.Save(_customer); address.AddressCustomerCode = !address.AddressCustomerCode.IsEmpty() ? address.AddressCustomerCode : addressOld.AddressCustomerCode; return(address); } return(new VO.AddressCustomer()); }