예제 #1
0
        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());
        }