public ReceptorEditViewModel(Receptor receptor) {
            if (receptor == null)
                throw new ArgumentNullException("receptor");

            this.PublicKey = receptor.PublicKey;

            this.RFC = receptor.RFC;
            this.Nombre = receptor.Nombre;

            if (receptor.Domicilio != null) {
                this.Domicilio = new UbicacionViewModel(receptor.Domicilio);
            //    this.Calle = emisor.DomicilioFiscal.Calle;
            //    this.NoExterior = emisor.DomicilioFiscal.NoExterior;
            //    this.NoInterior = emisor.DomicilioFiscal.NoInterior;
            //    this.Colonia = emisor.DomicilioFiscal.Colonia;
            //    this.Localidad = emisor.DomicilioFiscal.Localidad;
            //    this.Municipio = emisor.DomicilioFiscal.Municipio;
            //    this.Estado = emisor.DomicilioFiscal.Estado;
            //    this.Pais = emisor.DomicilioFiscal.Pais;
            //    this.CodigoPostal = emisor.DomicilioFiscal.CodigoPostal;
            //    this.Referencia = emisor.DomicilioFiscal.Referencia;
            }
            ////this.RegimenFiscal = emisor.RegimenFiscal;

            //this.Correo = emisor.Correo;
            //this.Telefono = emisor.Telefono;
            //this.CifUrl = emisor.CifUrl;
            //this.LogoUrl = emisor.LogoUrl;
        }
        public ReceptorDetailsViewModel(Receptor receptor) {
            if (receptor == null)
                throw new ArgumentNullException("receptor");

            this.PublicKey = receptor.PublicKey;

            this.RFC = receptor.RFC;
            this.Nombre = receptor.Nombre;
            //if (receptor.RegimenFiscal != null && receptor.RegimenFiscal.Count > 0)
            //    this.RegimenFiscal = receptor.RegimenFiscal[0].Regimen;

            if (receptor.Domicilio != null) {
                this.Domicilio = new UbicacionViewModel(receptor.Domicilio);
            }
        }
        public ActionResult Upload(ComprobanteUploadViewModel model)
        {
            string comprobanteId = "";
            if (ModelState.IsValid) {

                if (model.ComprobanteArchivo == null || model.ComprobanteArchivo.ContentLength == 0) {
                    return View();
                }
                try {

                    Comprobante comprobante = new Comprobante();
                    Emisor comprobanteEmisor = null;// new Emisor();
                    Receptor comprobanteReceptor = null; // new Receptor();
                    Certificado certificado = new Certificado();

                    if (model.ComprobanteArchivo != null) {
                        // MemoryStream target = new MemoryStream();

                        System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(model.ComprobanteArchivo.InputStream);

                        while (xmlReader.Read()) {
                            if (xmlReader.NodeType == System.Xml.XmlNodeType.Element) {

                                if ("xml".Equals(xmlReader.Name)) {

                                }
                                else if ("cfdi:Comprobante".Equals(xmlReader.Name)) {
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "version":
                                                comprobante.Version = xmlReader.Value;
                                                break;
                                            case "serie":
                                                comprobante.Serie = xmlReader.Value;
                                                break;
                                            case "folio":
                                                comprobante.Folio = xmlReader.Value;
                                                break;
                                            case "fecha":
                                                comprobante.Fecha = DateTime.Parse(xmlReader.Value);
                                                break;
                                            case "sello":
                                                comprobante.Sello = xmlReader.Value;
                                                break;
                                            case "noAprobacion":
                                                comprobante.NoAprobacion = xmlReader.Value;
                                                break;
                                            case "anoAprobacion":
                                                comprobante.AnoAprobacion = xmlReader.Value;
                                                break;
                                            case "formaDePago":
                                                comprobante.FormaDePago = xmlReader.Value;
                                                break;
                                            case "noCertificado":
                                                certificado.NumSerie = xmlReader.Value;
                                                //comprobante.LugarExpedicion = xmlReader.Value;
                                                comprobante.HasNoCertificado = true;
                                                break;
                                            case "certificado":
                                                //comprobante.LugarExpedicion = xmlReader.Value;
                                                certificado.CertificadoBase64 = xmlReader.Value;
                                                comprobante.HasCertificado = true;
                                                break;
                                            case "condicionesDePago":
                                                comprobante.CondicionesDePago = xmlReader.Value;
                                                break;
                                            case "subTotal":
                                                comprobante.SubTotal = decimal.Parse(xmlReader.Value);
                                                break;
                                            case "descuento":
                                                comprobante.Descuento = decimal.Parse(xmlReader.Value);
                                                break;
                                            case "motivoDescuento":
                                                comprobante.MotivoDescuento = xmlReader.Value;
                                                break;
                                            case "TipoCambio":
                                                comprobante.TipoCambio = xmlReader.Value;
                                                break;
                                            case "Moneda":
                                                comprobante.Moneda = xmlReader.Value;
                                                break;
                                            case "total":
                                                comprobante.Total = decimal.Parse(xmlReader.Value);
                                                break;
                                            case "tipoDeComprobante":
                                                comprobante.TipoDeComprobante = xmlReader.Value;
                                                break;
                                            case "metodoDePago":
                                                comprobante.MetodoDePago = xmlReader.Value;
                                                break;
                                            case "LugarExpedicion":
                                                comprobante.LugarExpedicion = xmlReader.Value;
                                                break;
                                            case "NumCtaPago":
                                                comprobante.NumCtaPago = xmlReader.Value;
                                                break;
                                            case "SerieFolioFiscalOrig":
                                                comprobante.SerieFolioFiscalOrig = xmlReader.Value;
                                                break;
                                            case "FechaFolioFiscalOrig":
                                                comprobante.FechaFolioFiscalOrig = DateTime.Parse(xmlReader.Value);
                                                break;
                                            case "MontoFolioFiscalOrig":
                                                comprobante.MontoFolioFiscalOrig = decimal.Parse(xmlReader.Value);
                                                break;

                                            case "xmlns:cfdi":
                                            case "xmlns:xsi":
                                            case "xsi:schemaLocation":
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:Comprobante.");
                                        }
                                    }

                                }

                                else if ("cfdi:Emisor".Equals(xmlReader.Name)) {
                                    //comprobante.Emisor = new Emisor();
                                    comprobanteEmisor = new Emisor();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "rfc":
                                                //comprobante.Emisor.RFC = xmlReader.Value;
                                                comprobanteEmisor.RFC = xmlReader.Value;
                                                break;
                                            case "nombre":
                                                //comprobante.Emisor.Nombre = xmlReader.Value;
                                                comprobanteEmisor.Nombre = xmlReader.Value;
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:Emisor.");
                                        }
                                    }
                                }

                                else if ("cfdi:DomicilioFiscal".Equals(xmlReader.Name)) {
                                    comprobanteEmisor.DomicilioFiscal = new UbicacionFiscal();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "calle":
                                                comprobanteEmisor.DomicilioFiscal.Calle = xmlReader.Value;
                                                break;
                                            case "noExterior":
                                                comprobanteEmisor.DomicilioFiscal.NoExterior = xmlReader.Value;
                                                break;
                                            case "noInterior":
                                                comprobanteEmisor.DomicilioFiscal.NoInterior = xmlReader.Value;
                                                break;
                                            case "colonia":
                                                comprobanteEmisor.DomicilioFiscal.Colonia = xmlReader.Value;
                                                break;
                                            case "localidad":
                                                comprobanteEmisor.DomicilioFiscal.Localidad = xmlReader.Value;
                                                break;
                                            case "referencia":
                                                comprobanteEmisor.DomicilioFiscal.Referencia = xmlReader.Value;
                                                break;
                                            case "municipio":
                                                comprobanteEmisor.DomicilioFiscal.Municipio = xmlReader.Value;
                                                break;
                                            case "estado":
                                                comprobanteEmisor.DomicilioFiscal.Estado = xmlReader.Value;
                                                break;
                                            case "pais":
                                                comprobanteEmisor.DomicilioFiscal.Pais = xmlReader.Value;
                                                break;
                                            case "codigoPostal":
                                                comprobanteEmisor.DomicilioFiscal.CodigoPostal = xmlReader.Value;
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:DomicilioFiscal.");
                                        }
                                    }
                                }

                                else if ("cfdi:RegimenFiscal".Equals(xmlReader.Name)) {
                                    if (comprobanteEmisor.RegimenFiscal == null)
                                        comprobanteEmisor.RegimenFiscal = new List<RegimenFiscal>();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "Regimen":
                                                RegimenFiscal regimen = new RegimenFiscal();
                                                regimen.Regimen = xmlReader.Value;
                                                comprobanteEmisor.RegimenFiscal.Add(regimen);
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:RegimenFiscal.");
                                        }
                                    }
                                }

                                else if ("cfdi:Receptor".Equals(xmlReader.Name)) {
                                    //comprobante.Receptor = new Receptor();
                                    comprobanteReceptor = new Receptor();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "rfc":
                                                //comprobante.Receptor.RFC = xmlReader.Value;
                                                comprobanteReceptor.RFC = xmlReader.Value;
                                                break;
                                            case "nombre":
                                                //comprobante.Receptor.Nombre = xmlReader.Value;
                                                comprobanteReceptor.Nombre = xmlReader.Value;
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:Receptor.");
                                        }
                                    }
                                }

                                else if ("cfdi:Domicilio".Equals(xmlReader.Name)) {
                                    //comprobante.Receptor.Domicilio = new Ubicacion();
                                    comprobanteReceptor.Domicilio = new Ubicacion();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "calle":
                                                comprobanteReceptor.Domicilio.Calle = xmlReader.Value;
                                                break;
                                            case "noExterior":
                                                comprobanteReceptor.Domicilio.NoExterior = xmlReader.Value;
                                                break;
                                            case "noInterior":
                                                comprobanteReceptor.Domicilio.NoInterior = xmlReader.Value;
                                                break;
                                            case "colonia":
                                                comprobanteReceptor.Domicilio.Colonia = xmlReader.Value;
                                                break;
                                            case "localidad":
                                                comprobanteReceptor.Domicilio.Localidad = xmlReader.Value;
                                                break;
                                            case "referencia":
                                                comprobanteReceptor.Domicilio.Referencia = xmlReader.Value;
                                                break;
                                            case "municipio":
                                                comprobanteReceptor.Domicilio.Municipio = xmlReader.Value;
                                                break;
                                            case "estado":
                                                comprobanteReceptor.Domicilio.Estado = xmlReader.Value;
                                                break;
                                            case "pais":
                                                comprobanteReceptor.Domicilio.Pais = xmlReader.Value;
                                                break;
                                            case "codigoPostal":
                                                comprobanteReceptor.Domicilio.CodigoPostal = xmlReader.Value;
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:Domicilio.");
                                        }
                                    }
                                }

                                else if ("cfdi:Conceptos".Equals(xmlReader.Name)) {
                                    comprobante.Conceptos = new List<Concepto>();
                                }

                                else if ("cfdi:Concepto".Equals(xmlReader.Name)) {
                                    Concepto concepto = new Concepto();
                                    concepto.PublicKey = Guid.NewGuid();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "cantidad":
                                                concepto.Cantidad = decimal.Parse(xmlReader.Value);
                                                break;
                                            case "unidad":
                                                concepto.Unidad = xmlReader.Value;
                                                break;
                                            case "noIdentificacion":
                                                concepto.NoIdentificacion = xmlReader.Value;
                                                break;
                                            case "descripcion":
                                                concepto.Descripcion = xmlReader.Value;
                                                break;
                                            case "valorUnitario":
                                                concepto.ValorUnitario = decimal.Parse(xmlReader.Value);
                                                break;
                                            case "importe":
                                                concepto.Importe = decimal.Parse(xmlReader.Value);
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:Domicilio.");
                                        }
                                    }
                                    concepto.Ordinal = comprobante.Conceptos.Count + 1;
                                    comprobante.Conceptos.Add(concepto);
                                }

                                else if ("cfdi:Impuestos".Equals(xmlReader.Name)) {
                                    comprobante.Impuestos = new Impuestos();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "totalImpuestosRetenidos":
                                                comprobante.Impuestos.TotalImpuestosRetenidos = decimal.Parse(xmlReader.Value);
                                                break;
                                            case "totalImpuestosTrasladados":
                                                comprobante.Impuestos.TotalImpuestosTrasladados = decimal.Parse(xmlReader.Value);
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:Impuestos.");
                                        }
                                    }
                                }

                                else if ("cfdi:Traslados".Equals(xmlReader.Name)) {
                                    comprobante.Impuestos.Traslados = new List<Traslado>();
                                }

                                else if ("cfdi:Traslado".Equals(xmlReader.Name)) {
                                    Traslado traslado = new Traslado();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "impuesto":
                                                traslado.Impuesto = xmlReader.Value;
                                                break;
                                            case "tasa":
                                                traslado.Tasa = decimal.Parse(xmlReader.Value);
                                                break;
                                            case "importe":
                                                traslado.Importe = decimal.Parse(xmlReader.Value);
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:Impuestos.");
                                        }
                                    }
                                    comprobante.Impuestos.Traslados.Add(traslado);
                                }

                                else if ("cfdi:Retenciones".Equals(xmlReader.Name)) {
                                    comprobante.Impuestos.Retenciones = new List<Retencion>();
                                }

                                else if ("cfdi:Retencion".Equals(xmlReader.Name)) {
                                    Retencion retencion = new Retencion();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "impuesto":
                                                retencion.Impuesto = xmlReader.Value;
                                                break;
                                            case "importe":
                                                retencion.Importe = decimal.Parse(xmlReader.Value);
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + "is not a valid attribute for cfdi:Retencion.");
                                        }
                                    }
                                    comprobante.Impuestos.Retenciones.Add(retencion);
                                }

                                else if ("cfdi:Complemento".Equals(xmlReader.Name)) {
                                    comprobante.Complementos = new List<Complemento>();
                                }

                                else if ("tfd:TimbreFiscalDigital".Equals(xmlReader.Name)) {
                                    TimbreFiscalDigital timbre = new TimbreFiscalDigital();
                                    while (xmlReader.MoveToNextAttribute()) {
                                        switch (xmlReader.Name) {
                                            case "version":
                                                timbre.Version = xmlReader.Value;
                                                break;
                                            case "UUID":
                                                timbre.UUID = xmlReader.Value;
                                                break;
                                            case "FechaTimbrado":
                                                timbre.FechaTimbrado = DateTime.Parse(xmlReader.Value);
                                                break;
                                            case "selloCFD":
                                                timbre.SelloCFD = xmlReader.Value;
                                                break;
                                            case "noCertificadoSAT":
                                                timbre.NoCertificadoSAT = xmlReader.Value;
                                                break;
                                            case "selloSAT":
                                                timbre.SelloSAT = xmlReader.Value;
                                                break;
                                            case "xmlns:tfd":
                                            case "xsi:schemaLocation":
                                                break;
                                            default:
                                                throw new Exception(xmlReader.Name + " is not a valid attribute for cfdi:TimbreFiscalDigital.");
                                        }
                                    }
                                    comprobante.Complementos.Add(timbre);
                                }

                                else {
                                    xmlReader.NodeType.ToString();
                                    xmlReader.Name.ToString();
                                }
                                //xmlReader.NodeType.ToString();
                            }
                        }

                        //xmlReader.Dispose();
                        //xmlReader.Close();

                        model.ComprobanteArchivo.InputStream.Position = 0;
                        //model.ComprobanteArchivo.InputStream.Position = 0;

                        //model.ComprobanteArchivo.InputStream.CopyTo(target);
                        //Byte[] data = target.ToArray();

                        if (certificado != null) {
                            if (!string.IsNullOrEmpty(certificado.NumSerie)) {
                                certificado = DBContext.Certificados.Where(c => c.NumSerie == certificado.NumSerie).SingleOrDefault();
                                comprobante.Certificado = certificado;
                            }
                        }

                        if (comprobanteEmisor != null) {
                            //Emisor emisor = DBContext.Emisores.Where(e =>
                            //    (e.RFC == comprobante.Emisor.RFC)
                            //    && (e.Nombre == comprobante.Emisor.Nombre)
                            //    && (e.Status == "A")
                            //    ).SingleOrDefault();

                            List<Emisor> emisores = DBContext.Emisores.Where(e =>
                                (e.RFC == comprobanteEmisor.RFC)
                                && (e.Nombre == comprobanteEmisor.Nombre)
                                ).ToList();

                            if (emisores != null && emisores.Count > 0) {
                                foreach (Emisor emisor in emisores) {

                                    if ((emisor.DomicilioFiscal != null && comprobanteEmisor.DomicilioFiscal != null)
                                        && (emisor.DomicilioFiscal.Calle == comprobanteEmisor.DomicilioFiscal.Calle)
                                        && (emisor.DomicilioFiscal.NoExterior == comprobanteEmisor.DomicilioFiscal.NoExterior)
                                        && (emisor.DomicilioFiscal.NoInterior == comprobanteEmisor.DomicilioFiscal.NoInterior)
                                        && (emisor.DomicilioFiscal.Colonia == comprobanteEmisor.DomicilioFiscal.Colonia)
                                        && (emisor.DomicilioFiscal.Referencia == comprobanteEmisor.DomicilioFiscal.Referencia)
                                        && (emisor.DomicilioFiscal.Localidad == comprobanteEmisor.DomicilioFiscal.Localidad)
                                        && (emisor.DomicilioFiscal.Municipio == comprobanteEmisor.DomicilioFiscal.Municipio)
                                        && (emisor.DomicilioFiscal.Estado == comprobanteEmisor.DomicilioFiscal.Estado)
                                        && (emisor.DomicilioFiscal.CodigoPostal == comprobanteEmisor.DomicilioFiscal.CodigoPostal)
                                        && (emisor.DomicilioFiscal.Pais == comprobanteEmisor.DomicilioFiscal.Pais)
                                        ) {

                                        //if (receptor != null) {
                                        comprobanteEmisor = emisor;
                                        comprobanteEmisor.EmisorId = emisor.EmisorId;
                                        comprobanteEmisor.DomicilioFiscal = emisor.DomicilioFiscal;
                                        comprobanteEmisor.DomicilioFiscalId = emisor.DomicilioFiscalId;
                                        //comprobante.Emisor = DBContext.ComprobantesEmisores.Where( e => e.EmisorId == emisor.EmisorId && e.DomicilioFiscalId = emisor.DomicilioFiscalId && e.ExpedidoEnId)
                                        comprobante.Emisor = DBContext.ComprobantesEmisores.Where(e => e.EmisorId == emisor.EmisorId && e.DomicilioFiscalId == emisor.DomicilioFiscalId).SingleOrDefault();

                                        if (comprobante.Emisor == null) {
                                            comprobante.Emisor = new ComprobanteEmisor {
                                                Emisor = comprobanteEmisor,
                                                //EmisorId = emisor.EmisorId,
                                                DomicilioFiscal = comprobanteEmisor.DomicilioFiscal
                                                //,DomicilioId = receptor.DomicilioId
                                                // TODO:
                                                //RegimenFiscal = emisor.RegimenFiscal
                                            };
                                        }
                                    }
                                }
                                //if (comprobanteEmisor.DomicilioFiscalId == null) {
                                //    // The address has changed, create a new one and inactive the oldone
                                //    foreach (Emisor emisor in emisores) {
                                //        emisor.Status = "I";
                                //    }
                                //    comprobante.Emisor.Status = "A";

                                //}
                                if (comprobanteEmisor.EmisorId == null) {
                                    // The address has changed, create a new one and inactive the oldone

                                    foreach (Emisor emisor in emisores) {
                                        emisor.Status = "I";
                                    }

                                    comprobanteEmisor.Status = "A";

                                    comprobante.Emisor = new ComprobanteEmisor {
                                        Emisor = comprobanteEmisor,
                                        //EmisorId = emisor.EmisorId,
                                        DomicilioFiscal = comprobanteEmisor.DomicilioFiscal
                                        //,DomicilioId = receptor.DomicilioId
                                        // TODO:
                                        //RegimenFiscal = emisor.RegimenFiscal
                                    };

                                }

                            }
                            else {
                                comprobante.Emisor = new ComprobanteEmisor {
                                    Emisor = comprobanteEmisor,
                                    //EmisorId = emisor.EmisorId,
                                    DomicilioFiscal = comprobanteEmisor.DomicilioFiscal
                                    //,DomicilioId = receptor.DomicilioId
                                    // TODO:
                                    //RegimenFiscal = emisor.RegimenFiscal
                                };
                                comprobanteEmisor.Status = "A";
                            }
                        }

                        if (comprobanteReceptor != null) {
                            //Receptor receptor = DBContext.Receptores.Where(r =>
                            //    (r.RFC == comprobante.Receptor.RFC)
                            //    && (r.Nombre == comprobante.Receptor.Nombre)
                            //    && (r.Status == "A")
                            //    ).SingleOrDefault();

                            List<Receptor> receptores = DBContext.Receptores.Where(r =>
                                (r.RFC == comprobanteReceptor.RFC)
                                && (r.Nombre == comprobanteReceptor.Nombre)
                                ).ToList();

                            if (receptores != null && receptores.Count > 0) {
                                foreach (Receptor receptor in receptores) {

                                    if ((receptor.Domicilio != null && comprobanteReceptor.Domicilio != null)
                                        && (receptor.Domicilio.Calle == comprobanteReceptor.Domicilio.Calle)
                                        && (receptor.Domicilio.NoExterior == comprobanteReceptor.Domicilio.NoExterior)
                                        && (receptor.Domicilio.NoInterior == comprobanteReceptor.Domicilio.NoInterior)
                                        && (receptor.Domicilio.Colonia == comprobanteReceptor.Domicilio.Colonia)
                                        && (receptor.Domicilio.Referencia == comprobanteReceptor.Domicilio.Referencia)
                                        && (receptor.Domicilio.Localidad == comprobanteReceptor.Domicilio.Localidad)
                                        && (receptor.Domicilio.Municipio == comprobanteReceptor.Domicilio.Municipio)
                                        && (receptor.Domicilio.Estado == comprobanteReceptor.Domicilio.Estado)
                                        && (receptor.Domicilio.CodigoPostal == comprobanteReceptor.Domicilio.CodigoPostal)
                                        && (receptor.Domicilio.Pais == comprobanteReceptor.Domicilio.Pais)
                                        ) {

                                        //if (receptor != null) {
                                        comprobanteReceptor = receptor;
                                        comprobanteReceptor.ReceptorId = receptor.ReceptorId;
                                        comprobanteReceptor.Domicilio = receptor.Domicilio;
                                        comprobanteReceptor.DomicilioId = receptor.DomicilioId;

                                        comprobante.Receptor = DBContext.ComprobantesReceptores.Where(r => r.ReceptorId == receptor.ReceptorId && r.DomicilioId == receptor.DomicilioId).SingleOrDefault();

                                        if (comprobante.Receptor == null) {
                                            comprobante.Receptor = new ComprobanteReceptor {
                                                Receptor = comprobanteReceptor,
                                                //ReceptorId = comprobanteReceptor.ReceptorId,
                                                Domicilio = comprobanteReceptor.Domicilio
                                                //,DomicilioId = comprobanteReceptor.DomicilioId
                                            };
                                        }
                                    }
                                }
                                if (comprobanteReceptor.ReceptorId == null) {
                                    // The address has changed, create a new one and inactive the oldone

                                    foreach (Receptor receptor in receptores) {
                                        receptor.Status = "I";
                                    }

                                    comprobanteReceptor.Status = "A";

                                    comprobante.Receptor = new ComprobanteReceptor {
                                        Receptor = comprobanteReceptor,
                                        //ReceptorId = comprobanteReceptor.ReceptorId,
                                        Domicilio = comprobanteReceptor.Domicilio
                                        //,DomicilioId = comprobanteReceptor.DomicilioId
                                    };

                                }
                            }
                            else {
                                comprobanteReceptor.Status = "A";
                                comprobante.Receptor = new ComprobanteReceptor {
                                    Receptor = comprobanteReceptor,
                                    //ReceptorId = comprobanteReceptor.ReceptorId,
                                    Domicilio = comprobanteReceptor.Domicilio
                                    //,DomicilioId = comprobanteReceptor.DomicilioId
                                };
                            }

                            //if (receptor != null) {
                            //    comprobante.Receptor = receptor;
                            //    comprobante.ReceptorId = receptor.ReceptorId;
                            //}
                            //else {

                            //}
                        }

                        comprobante.GeneratedCadenaOriginal = comprobante.GetCadenaOriginal();

                        if (model.ComprobantePDFArchivo != null && model.ComprobantePDFArchivo.ContentLength > 0) {
                            comprobante.GeneratedXmlUrl = string.Format(@"https://sistrategiacfdi1.blob.core.windows.net/{0}/{1}.xml",
                                comprobante.Emisor.PublicKey.ToString("N"),
                                comprobante.PublicKey.ToString("N"));
                            comprobante.GeneratedPDFUrl = string.Format(@"https://sistrategiacfdi1.blob.core.windows.net/{0}/{1}.pdf",
                                comprobante.Emisor.PublicKey.ToString("N"),
                                comprobante.PublicKey.ToString("N"));
                            //comprobante.GeneratedPDFUrl
                            //comprobante.ExtendedIntValue1 = model.NoOrden;
                            //comprobante.ExtendedIntValue2 = model.NoCliente;
                        }

                        comprobante.ExtendedIntValue1 = DBContext.Comprobantes.Max(c => c.ExtendedIntValue1) + 1; // DBContext.Comprobantes.Count() + 1;
                        if (comprobante.Receptor.ReceptorId != null && comprobante.Receptor.ReceptorId > 0)
                            comprobante.ExtendedIntValue2 = comprobante.Receptor.ReceptorId;
                        else
                            comprobante.ExtendedIntValue2 = DBContext.Receptores.Count() + 1;

                        comprobante.ViewTemplate = DBContext.ViewTemplates.Find(2);
                        comprobante.ViewTemplateId = comprobante.ViewTemplate.ViewTemplateId;

                        comprobante.Status = "A";

                        comprobanteId = comprobante.PublicKey.ToString("N");
                        DBContext.Comprobantes.Add(comprobante);
                        DBContext.SaveChanges();

                        if (model.ComprobantePDFArchivo != null && model.ComprobantePDFArchivo.ContentLength > 0) {
                            CloudStorageMananger manager = new CloudStorageMananger();
                            manager.UploadFromStream(ConfigurationManager.AppSettings["AzureAccountName"],
                                ConfigurationManager.AppSettings["AzureAccountKey"],
                                comprobante.Emisor.PublicKey.ToString("N"),
                                comprobante.PublicKey.ToString("N") + ".xml",
                                model.ComprobanteArchivo.FileName,
                                model.ComprobanteArchivo.ContentType,
                                model.ComprobanteArchivo.InputStream);

                            manager.UploadFromStream(ConfigurationManager.AppSettings["AzureAccountName"],
                                ConfigurationManager.AppSettings["AzureAccountKey"],
                                comprobante.Emisor.PublicKey.ToString("N"),
                                comprobante.PublicKey.ToString("N") + ".pdf",
                                model.ComprobantePDFArchivo.FileName,
                                model.ComprobantePDFArchivo.ContentType,
                                model.ComprobantePDFArchivo.InputStream);
                        }
                    }
                }
                catch (Exception ex) {
                    //log.Error(ex, "Error upload photo blob to storage");
                    ex.ToString();
                }
            }
            return RedirectToAction("Details", "Comprobante", new { id = comprobanteId });
        }
        public ActionResult Create(ReceptorCreateViewModel model) {
            //var model = new EmisorCreateViewModel();
            var receptor = new Receptor();

            receptor.RFC = model.RFC;

            if (!string.IsNullOrEmpty(model.Nombre))
                receptor.Nombre = model.Nombre;

            if (model.Domicilio != null) {
                if (!string.IsNullOrEmpty(model.Domicilio.Pais)) {
                    receptor.Domicilio = new Ubicacion {
                        Pais = model.Domicilio.Pais,
                        Calle = string.IsNullOrEmpty(model.Domicilio.Calle) ? null : model.Domicilio.Calle,
                        NoExterior = string.IsNullOrEmpty(model.Domicilio.NoExterior) ? null : model.Domicilio.NoExterior,
                        NoInterior = string.IsNullOrEmpty(model.Domicilio.NoInterior) ? null : model.Domicilio.NoInterior,
                        Colonia = string.IsNullOrEmpty(model.Domicilio.Colonia) ? null : model.Domicilio.Colonia,
                        Localidad = string.IsNullOrEmpty(model.Domicilio.Localidad) ? null : model.Domicilio.Localidad,
                        Municipio = string.IsNullOrEmpty(model.Domicilio.Municipio) ? null : model.Domicilio.Municipio,
                        Estado = string.IsNullOrEmpty(model.Domicilio.Estado) ? null : model.Domicilio.Estado,
                        CodigoPostal = string.IsNullOrEmpty(model.Domicilio.CodigoPostal) ? null : model.Domicilio.CodigoPostal,
                        Referencia = string.IsNullOrEmpty(model.Domicilio.Referencia) ? null : model.Domicilio.Referencia
                    };
                }
            }           

            //if (!string.IsNullOrEmpty(model.RegimenFiscal))
            //    receptor.RegimenFiscal = new List<RegimenFiscal> {
            //        new RegimenFiscal {
            //            Regimen = model.RegimenFiscal
            //        }
            //    };

            this.DBContext.Receptores.Add(receptor);
            this.DBContext.SaveChanges();

            //return RedirectToAction("Details", new { Id = receptor.PublicKey.ToString("N") }); // "Index", "Home");
            return RedirectToAction("Index");
        }
        public ActionResult Edit(ReceptorEditViewModel model) {
            Guid publicKey = model.PublicKey; //  Guid.Parse(id);
            var originalReceptor = DBContext.Receptores.Where(r => r.PublicKey == publicKey).SingleOrDefault();

            if (originalReceptor.RFC.Equals(model.RFC) && originalReceptor.Nombre.Equals(model.Nombre)) {
                // if ubicacion is equals then don't create newReceptor

                if (model.Domicilio != null && originalReceptor.Domicilio != null) {
                    if (originalReceptor.Domicilio.Pais.Equals(model.Domicilio.Pais)
                        && originalReceptor.Domicilio.Calle.Equals(model.Domicilio.Calle)
                        && originalReceptor.Domicilio.NoExterior.Equals(model.Domicilio.NoExterior)
                        && originalReceptor.Domicilio.NoInterior.Equals(model.Domicilio.NoInterior)
                        && originalReceptor.Domicilio.Colonia.Equals(model.Domicilio.Colonia)
                        && originalReceptor.Domicilio.Localidad.Equals(model.Domicilio.Localidad)
                        && originalReceptor.Domicilio.Municipio.Equals(model.Domicilio.Municipio)
                        && originalReceptor.Domicilio.Estado.Equals(model.Domicilio.Estado)
                        && originalReceptor.Domicilio.CodigoPostal.Equals(model.Domicilio.CodigoPostal)
                        && originalReceptor.Domicilio.Referencia.Equals(model.Domicilio.Referencia)                        
                        )
                    {
                        return RedirectToAction("Index");
                    }
                }

            }

            var newReceptor = new Receptor();

            newReceptor.RFC = model.RFC;

            if (!string.IsNullOrEmpty(model.Nombre))
                newReceptor.Nombre = model.Nombre;

            if (model.Domicilio != null) {
                if (!string.IsNullOrEmpty(model.Domicilio.Pais)) {
                    newReceptor.Domicilio = new Ubicacion {
                        Pais = model.Domicilio.Pais,
                        Calle = string.IsNullOrEmpty(model.Domicilio.Calle) ? null : model.Domicilio.Calle,
                        NoExterior = string.IsNullOrEmpty(model.Domicilio.NoExterior) ? null : model.Domicilio.NoExterior,
                        NoInterior = string.IsNullOrEmpty(model.Domicilio.NoInterior) ? null : model.Domicilio.NoInterior,
                        Colonia = string.IsNullOrEmpty(model.Domicilio.Colonia) ? null : model.Domicilio.Colonia,
                        Localidad = string.IsNullOrEmpty(model.Domicilio.Localidad) ? null : model.Domicilio.Localidad,
                        Municipio = string.IsNullOrEmpty(model.Domicilio.Municipio) ? null : model.Domicilio.Municipio,
                        Estado = string.IsNullOrEmpty(model.Domicilio.Estado) ? null : model.Domicilio.Estado,
                        CodigoPostal = string.IsNullOrEmpty(model.Domicilio.CodigoPostal) ? null : model.Domicilio.CodigoPostal,
                        Referencia = string.IsNullOrEmpty(model.Domicilio.Referencia) ? null : model.Domicilio.Referencia
                    };
                }
            }

            //if (!string.IsNullOrEmpty(model.RegimenFiscal))
            //    receptor.RegimenFiscal = new List<RegimenFiscal> {
            //        new RegimenFiscal {
            //            Regimen = model.RegimenFiscal
            //        }
            //    };

            originalReceptor.Status = "I"; // Inactive
            //this.DBContext.Receptores.Add(originalReceptor);
            this.DBContext.Receptores.Add(newReceptor);
            this.DBContext.SaveChanges();

            //return RedirectToAction("Details", new { Id = receptor.PublicKey.ToString("N") }); // "Index", "Home");
            return RedirectToAction("Index");


        }