public ActionResult Edit(string id) {
            Guid publicKey = Guid.Parse(id);
            var comprobante = DBContext.Comprobantes.Where(e => e.PublicKey == publicKey && e.Status == "P")
                .SingleOrDefault();
            var model = new ComprobanteCreateViewModel(comprobante);

            var tipoMetodoDePagoList = DBContext.TiposMetodoDePago.ToList();
            var tipoMetodoDePagoSelectList = new List<SelectListItem>();
            foreach (var tipoMetodoDePago in tipoMetodoDePagoList) {
                tipoMetodoDePagoSelectList.Add(new SelectListItem {
                    Value = tipoMetodoDePago.TipoMetodoDePagoValue,
                    Text = tipoMetodoDePago.TipoMetodoDePagoValue
                });
            }
            model.TipoMetodoDePago = tipoMetodoDePagoSelectList;

            var tiposFormaDePagoList = DBContext.TiposFormaDePago.ToList();
            var tiposFormaDePagoListSelectList = new List<SelectListItem>();
            foreach (var formaDePago in tiposFormaDePagoList) {
                tiposFormaDePagoListSelectList.Add(new SelectListItem {
                    Value = formaDePago.TipoFormaDePagoValue,
                    Text = formaDePago.TipoFormaDePagoValue
                });
            }
            model.TiposFormaDePago = tiposFormaDePagoListSelectList;

            var tiposImpuestoRetencionList = DBContext.TiposImpuestoRetencion.ToList();
            var tiposImpuestoRetencionSelectList = new List<SelectListItem>();
            foreach (var tiposImpuestoRetencion in tiposImpuestoRetencionList) {
                tiposImpuestoRetencionSelectList.Add(new SelectListItem {
                    Value = tiposImpuestoRetencion.TipoImpuestoRetencionValue,
                    Text = tiposImpuestoRetencion.TipoImpuestoRetencionValue
                });
            }
            model.TiposImpuestoRetencion = tiposImpuestoRetencionSelectList;

            var tiposImpuestoTrasladoList = DBContext.TiposImpuestoTraslado.ToList();
            var tiposImpuestoTrasladoSelectList = new List<SelectListItem>();
            foreach (var tiposImpuestoTraslado in tiposImpuestoTrasladoList) {
                tiposImpuestoTrasladoSelectList.Add(new SelectListItem {
                    Value = tiposImpuestoTraslado.TipoImpuestoTrasladoValue,
                    Text = tiposImpuestoTraslado.TipoImpuestoTrasladoValue
                });
            }
            model.TiposImpuestoTraslado = tiposImpuestoTrasladoSelectList;

            var tiposMonedaList = DBContext.TiposMoneda.ToList();
            var tiposMonedaListSelectList = new List<SelectListItem>();
            foreach (var moneda in tiposMonedaList) {
                tiposMonedaListSelectList.Add(new SelectListItem {
                    Value = moneda.TipoMonedaValue,
                    Text = moneda.TipoMonedaValue
                });
            }
            model.TiposMoneda = tiposMonedaListSelectList;

            List<dynamic> itemList = new List<dynamic>();
            foreach (ConceptoViewModel concepto in model.Conceptos) {
                var dynamicItems = new {
                    ConceptoCantidad = concepto.Cantidad,
                    ConceptoUnidad = concepto.Unidad,
                    ConceptoNoIdentificacion = concepto.NoIdentificacion,
                    ConceptoDescripcion = concepto.Descripcion,
                    ConceptoValorUnitario = concepto.ValorUnitario,
                    ConceptoImporte = concepto.Importe,
                    ConceptoOrdinal = concepto.Ordinal
                };

                itemList.Add(dynamicItems);
            }

            ViewBag.JsonConceptos = JsonConvert.SerializeObject(itemList);
            ViewBag.TotalConceptos = itemList.Count();

            List<dynamic> itemList2 = new List<dynamic>();

            if (model.Traslados != null && model.Traslados.Count > 0) {
              
                int ordinal = 0;
                foreach (TrasladoViewModel traslado in model.Traslados) {
                    ordinal++;
                    var dynamicItems2 = new {
                        TrasladadoImpuesto = traslado.Impuesto,
                        TrasladadoTasa = traslado.Tasa,
                        TrasladadoImporte = traslado.Importe,
                        TrasladadoOrdinal = ordinal
                    };
                    itemList2.Add(dynamicItems2);
                }

                ViewBag.JsonImpuestosTrasladados = JsonConvert.SerializeObject(itemList2);
                ViewBag.TotalImpuestosTrasladados = model.Traslados.Count();
            }
            else {
                ViewBag.JsonImpuestosTrasladados = JsonConvert.SerializeObject(itemList2);
                ViewBag.TotalImpuestosTrasladados = 0;
            }

            List<dynamic> itemList3 = new List<dynamic>();

            if (model.Retenciones != null && model.Retenciones.Count > 0) {

                int ordinal2 = 0;
                foreach (RetencionViewModel retencion in model.Retenciones) {
                    ordinal2++;
                    var dynamicItems3 = new {
                        RetencionImpuesto = retencion.Impuesto,
                        RetencionImporte = retencion.Importe,
                        RetencionOrdinal = ordinal2
                    };
                    itemList3.Add(dynamicItems3);
                }

                ViewBag.JsonImpuestosRetenidos = JsonConvert.SerializeObject(itemList3);
                ViewBag.TotalImpuestosRetenidos = model.Retenciones.Count();
            }
            else {
                ViewBag.JsonImpuestosRetenidos = JsonConvert.SerializeObject(itemList3);
                ViewBag.TotalImpuestosRetenidos = 0;
            }

            return View(model);
        }
        public JsonResult Create(ComprobanteCreateViewModel model) {
            try {
                if (String.IsNullOrEmpty(model.LugarExpedicion))
                    throw new ApplicationException("¡Ingrese el lugar de expedición!");
                else if (model.EmisorId <= 0)
                    throw new ApplicationException("¡Ingrese el emisor!");
                else if (model.ReceptorId <= 0)
                    throw new ApplicationException("¡Ingrese el receptor!");
                else if (model.CertificadoId <= 0)
                    throw new ApplicationException("¡Ingrese el certificado!");
                else if (String.IsNullOrEmpty(model.FormaDePago))
                    throw new ApplicationException("¡Ingrese la forma de pago!");
                else if (String.IsNullOrEmpty(model.MetodoDePago))
                    throw new ApplicationException("¡Ingrese el método de pago!");
                else if ((model.MetodoDePago != "EFECTIVO" && model.MetodoDePago != "NO IDENTIFICADO") && (model.NumCtaPago == null || (model.NumCtaPago.Count() > 6 || model.NumCtaPago.Count() < 4)))
                    throw new ApplicationException("¡El valor de NumCtaPago debe contener entre 4 hasta 6 caracteres!");
                else if ((model.MetodoDePago != "EFECTIVO" && model.MetodoDePago != "NO IDENTIFICADO") && (string.IsNullOrEmpty(model.Banco)))
                    throw new ApplicationException("¡Ingrese el banco!");
                else if ((model.Conceptos != null || model.Conceptos.Count > 0)
                    && model.Conceptos.All(x => x.Cantidad < 0m || x.Unidad == null || x.Descripcion == null || x.ValorUnitario < 0m))
                    throw new ApplicationException("¡Ingrese al menos un concepto!");
                else if (model.SubTotal < 0m)
                    throw new ApplicationException("¡SubTotal no válido!");
                else if (model.TotalImpuestosTrasladados < 0m)
                    throw new ApplicationException("¡Total Impuestos Trasladados no válido!");
                else if (model.TotalImpuestosRetenidos < 0m)
                    throw new ApplicationException("¡Total Impuestos Retenidos no válido!");
                else if (model.Total < 0m)
                    throw new ApplicationException("¡Total no válido!");
                else {

                    var comprobante = new Comprobante();

                    comprobante.EmisorId = model.EmisorId;
                    comprobante.Emisor = DBContext.Emisores.Find(model.EmisorId); // .Where(e => e.PublicKey == publicKey).SingleOrDefault();
                    comprobante.ReceptorId = model.ReceptorId;
                    comprobante.Receptor = DBContext.Receptores.Find(model.ReceptorId); // .Where(e => e.PublicKey == publicKey).SingleOrDefault();
                    comprobante.Serie = model.Serie;
                    comprobante.Folio = model.Folio;
                    comprobante.Fecha = DateTime.Now + SATManager.GetCFDIServiceTimeSpan();
                    comprobante.FormaDePago = model.FormaDePago;
                    comprobante.SubTotal = model.SubTotal;
                    comprobante.Total = model.Total;

                    //comprobante.NoCertificado;
                    //comprobante.Certificado;
                    comprobante.TipoDeComprobante = "ingreso";

                    comprobante.FormaDePago = model.FormaDePago;
                    comprobante.MetodoDePago = model.MetodoDePago;
                    comprobante.LugarExpedicion = model.LugarExpedicion;
                    comprobante.TipoCambio = model.TipoCambio;
                    comprobante.Moneda = model.Moneda;
                    comprobante.NumCtaPago = model.NumCtaPago;
                    comprobante.ExtendedStringValue1 = model.Banco;
                    comprobante.Moneda = model.Moneda;

                    comprobante.Conceptos = new List<Concepto>();

                    foreach (var modelConcepto in model.Conceptos) {
                        if (!string.IsNullOrEmpty(modelConcepto.Descripcion)) {
                            comprobante.Conceptos.Add(new Concepto {
                                Cantidad = modelConcepto.Cantidad,
                                Unidad = modelConcepto.Unidad,
                                NoIdentificacion = modelConcepto.NoIdentificacion,
                                Descripcion = modelConcepto.Descripcion,
                                ValorUnitario = modelConcepto.ValorUnitario,
                                Importe = modelConcepto.Importe,
                                PublicKey = Guid.NewGuid(),
                                Ordinal = modelConcepto.Ordinal
                            });
                        }
                    }

                    comprobante.Impuestos = new Impuestos();
                    comprobante.Impuestos.Traslados = new List<Traslado>();

                    foreach (var modelTraslado in model.Traslados) {
                        if (modelTraslado.Tasa > 0 && modelTraslado.Importe > 0) {
                            comprobante.Impuestos.Traslados.Add(new Traslado {
                                Importe = modelTraslado.Importe,
                                Impuesto = modelTraslado.Impuesto,
                                Tasa = modelTraslado.Tasa,
                            });
                        }
                    }

                    comprobante.Impuestos.Retenciones = new List<Retencion>();
                    foreach (var modelRetencion in model.Retenciones) {
                        if (modelRetencion.Importe > 0) {
                            comprobante.Impuestos.Retenciones.Add(new Retencion {
                                Importe = modelRetencion.Importe,
                                Impuesto = modelRetencion.Impuesto,
                            });
                        }
                    }

                    if (model.TotalImpuestosRetenidos > 0)
                        comprobante.Impuestos.TotalImpuestosRetenidos = model.TotalImpuestosRetenidos;

                    if (model.TotalImpuestosTrasladados > 0)
                        comprobante.Impuestos.TotalImpuestosTrasladados = model.TotalImpuestosTrasladados;

                    comprobante.PublicKey = Guid.NewGuid();

                    Certificado certificado = DBContext.Certificados.Find(model.CertificadoId);

                    if (certificado != null) {
                        // comprobante.NoCertificado = certificado.NumSerie;
                        // comprobante.Certificado = certificado.CertificadoBase64;
                        comprobante.CertificadoId = certificado.CertificadoId;
                        comprobante.Certificado = certificado;
                        comprobante.HasNoCertificado = true;
                        comprobante.HasCertificado = true;
                    }

                    string cadenaOriginal = comprobante.GetCadenaOriginal();
                    comprobante.Sello = certificado.GetSello(cadenaOriginal);
                    comprobante.Status = "P";
                    DBContext.Comprobantes.Add(comprobante);
                    DBContext.SaveChanges();

                    TempData["success"] = "Se ha creado el comprobante correctamente";
                    var data = new {
                        error = false,
                        errorMsg = "",
                        comprobanteId = comprobante.PublicKey
                    };
                    return Json(data);
                }
            }
            catch (Exception ex) {
                var data = new {
                    error = true,
                    errorMsg = ex.Message.ToString()
                };
                return Json(data);
            }
        }
        public JsonResult Create(ComprobanteCreateViewModel model)
        {
            try {
                if (String.IsNullOrEmpty(model.LugarExpedicion))
                    throw new ApplicationException("¡Ingrese el lugar de expedición!");
                else if (string.IsNullOrEmpty(model.TipoDeComprobante))
                    throw new ApplicationException("¡Ingrese el tipo de comprobante!");
                else if (model.EmisorId <= 0)
                    throw new ApplicationException("¡Ingrese el emisor!");
                else if (model.ReceptorId <= 0)
                    throw new ApplicationException("¡Ingrese el receptor!");
                else if (model.CertificadoId <= 0)
                    throw new ApplicationException("¡Ingrese el certificado!");
                else if (String.IsNullOrEmpty(model.FormaDePago))
                    throw new ApplicationException("¡Ingrese la forma de pago!");
                else if (String.IsNullOrEmpty(model.MetodoDePago))
                    throw new ApplicationException("¡Ingrese el método de pago!");
                else if ((model.MetodoDePago != "EFECTIVO" && model.MetodoDePago != "NO IDENTIFICADO") && (model.NumCtaPago == null || (model.NumCtaPago.Count() > 6 || model.NumCtaPago.Count() < 4)))
                    throw new ApplicationException("¡El valor de NumCtaPago debe contener entre 4 hasta 6 caracteres!");
                else if ((model.MetodoDePago != "EFECTIVO" && model.MetodoDePago != "NO IDENTIFICADO") && (string.IsNullOrEmpty(model.Banco)))
                    throw new ApplicationException("¡Ingrese el banco!");
                else if ((model.Conceptos != null || model.Conceptos.Count > 0)
                    && model.Conceptos.All(x => x.Cantidad < 0m || x.Unidad == null || x.Descripcion == null || x.ValorUnitario < 0m))
                    throw new ApplicationException("¡Ingrese al menos un concepto!");
                else if (model.SubTotal < 0m)
                    throw new ApplicationException("¡SubTotal no válido!");
                else if (model.TotalImpuestosTrasladados < 0m)
                    throw new ApplicationException("¡Total Impuestos Trasladados no válido!");
                else if (model.TotalImpuestosRetenidos < 0m)
                    throw new ApplicationException("¡Total Impuestos Retenidos no válido!");
                else if (model.Total < 0m)
                    throw new ApplicationException("¡Total no válido!");
                else {

                    var comprobante = new Comprobante();

                    Emisor emisor = DBContext.Emisores.Find(model.EmisorId);

                    ComprobanteEmisor comprobanteEmisor = null;

                    if (model.ExpedidoEn != null && model.ExpedidoEn.UbicacionId != null) {
                        comprobanteEmisor = DBContext.ComprobantesEmisores.Where(e => e.EmisorId == emisor.EmisorId && e.DomicilioFiscalId == emisor.DomicilioFiscalId && e.ExpedidoEnId == model.ExpedidoEn.UbicacionId).SingleOrDefault();
                    }
                    //else if () {
                    //}
                    else {
                        // crear o seleccionar la ubicación y agregarla
                        //comprobanteEmisor = DBContext.ComprobantesEmisores.Where(e => e.EmisorId == model.EmisorId && e.DomicilioFiscalId == model.DomicilioFiscalId && e.ExpedidoEnId == model.ExpedidoEnId);
                        comprobanteEmisor = DBContext.ComprobantesEmisores.Where(e => e.EmisorId == emisor.EmisorId && e.DomicilioFiscalId == emisor.DomicilioFiscalId && e.ExpedidoEnId == model.ExpedidoEn.UbicacionId).SingleOrDefault();
                    }

                    // Crear uno nuevo
                    if (comprobanteEmisor == null) {
                        comprobanteEmisor = new ComprobanteEmisor {
                            Emisor = emisor,
                            //EmisorId = emisor.EmisorId,
                            DomicilioFiscal = emisor.DomicilioFiscal
                            //,DomicilioId = receptor.DomicilioId
                            // TODO:
                            //RegimenFiscal = emisor.RegimenFiscal
                        };

                    }

                    comprobante.Emisor = comprobanteEmisor;

                    //comprobante.EmisorId = model.EmisorId;
                    //comprobante.Emisor = DBContext.Emisores.Find(model.EmisorId); // .Where(e => e.PublicKey == publicKey).SingleOrDefault();
                    //if (model.Emisor. .ExpedidoEnId != null) {
                    //    comprobante.Emisor = DBContext.ComprobantesEmisores.Where(e => e.EmisorId == model.EmisorId && e.DomicilioFiscalId == model.DomicilioFiscalId && e.ExpedidoEnId == model.ExpedidoEnId);
                    //}
                    //else {
                    //    comprobante.Emisor = DBContext.ComprobantesEmisores.Where(e => e.EmisorId == model.EmisorId && e.DomicilioFiscalId == model.DomicilioFiscalId && e.ExpedidoEnId == model.ExpedidoEnId);
                    //}

                    Receptor receptor = DBContext.Receptores.Find(model.ReceptorId);

                    ComprobanteReceptor comprobanteReceptor = DBContext.ComprobantesReceptores.Where(r => r.ReceptorId == receptor.ReceptorId && r.DomicilioId == receptor.DomicilioId).SingleOrDefault();

                    // Crear uno nuevo
                    if (comprobanteReceptor == null) {
                        comprobanteReceptor = new ComprobanteReceptor {
                            Receptor = receptor,
                            //ReceptorId = receptor.ReceptorId,
                            Domicilio = receptor.Domicilio
                            //,DomicilioId = receptor.DomicilioId
                        };
                    }

                    //comprobante.ReceptorId = model.ReceptorId;
                    //comprobante.Receptor = DBContext.Receptores.Find(model.ReceptorId); // .Where(e => e.PublicKey == publicKey).SingleOrDefault();
                    comprobante.Receptor = comprobanteReceptor;
                    comprobante.Serie = model.Serie;
                    comprobante.Folio = model.Folio;
                    comprobante.Fecha = DateTime.Now + SATManager.GetCFDIServiceTimeSpan();
                    comprobante.FormaDePago = model.FormaDePago;
                    comprobante.SubTotal = model.SubTotal;
                    comprobante.Total = model.Total;

                    //comprobante.NoCertificado;
                    //comprobante.Certificado;
                    comprobante.TipoDeComprobante = model.TipoDeComprobante;

                    comprobante.ExtendedIntValue1 = model.OrdenNumero;
                    comprobante.ExtendedIntValue2 = model.CteNumero;
                    comprobante.ExtendedStringValue2 = model.Notas;

                    comprobante.ViewTemplateId = model.TemplateId;

                    comprobante.FormaDePago = model.FormaDePago;
                    comprobante.MetodoDePago = model.MetodoDePago;
                    comprobante.LugarExpedicion = model.LugarExpedicion;
                    comprobante.TipoCambio = model.TipoCambio;
                    comprobante.Moneda = model.Moneda;
                    comprobante.NumCtaPago = model.NumCtaPago;
                    comprobante.ExtendedStringValue1 = model.Banco;
                    comprobante.Moneda = model.Moneda;

                    comprobante.Conceptos = new List<Concepto>();

                    foreach (var modelConcepto in model.Conceptos) {
                        if (!string.IsNullOrEmpty(modelConcepto.Descripcion)) {
                            comprobante.Conceptos.Add(new Concepto {
                                Cantidad = modelConcepto.Cantidad,
                                Unidad = modelConcepto.Unidad,
                                NoIdentificacion = modelConcepto.NoIdentificacion,
                                Descripcion = modelConcepto.Descripcion,
                                ValorUnitario = modelConcepto.ValorUnitario,
                                Importe = modelConcepto.Importe,
                                PublicKey = Guid.NewGuid(),
                                Ordinal = modelConcepto.Ordinal
                            });
                        }
                    }

                    comprobante.Impuestos = new Impuestos();
                    comprobante.Impuestos.Traslados = new List<Traslado>();

                    foreach (var modelTraslado in model.Traslados) {
                        if (modelTraslado.Tasa > 0 && modelTraslado.Importe > 0) {
                            comprobante.Impuestos.Traslados.Add(new Traslado {
                                Importe = modelTraslado.Importe,
                                Impuesto = modelTraslado.Impuesto,
                                Tasa = modelTraslado.Tasa,
                            });
                        }
                    }

                    comprobante.Impuestos.Retenciones = new List<Retencion>();
                    foreach (var modelRetencion in model.Retenciones) {
                        if (modelRetencion.Importe > 0) {
                            comprobante.Impuestos.Retenciones.Add(new Retencion {
                                Importe = modelRetencion.Importe,
                                Impuesto = modelRetencion.Impuesto,
                            });
                        }
                    }

                    if (model.TotalImpuestosRetenidos > 0)
                        comprobante.Impuestos.TotalImpuestosRetenidos = model.TotalImpuestosRetenidos;

                    if (model.TotalImpuestosTrasladados > 0)
                        comprobante.Impuestos.TotalImpuestosTrasladados = model.TotalImpuestosTrasladados;

                    comprobante.PublicKey = Guid.NewGuid();

                    Certificado certificado = DBContext.Certificados.Find(model.CertificadoId);

                    if (certificado != null) {
                        // comprobante.NoCertificado = certificado.NumSerie;
                        // comprobante.Certificado = certificado.CertificadoBase64;
                        comprobante.CertificadoId = certificado.CertificadoId;
                        comprobante.Certificado = certificado;
                        comprobante.HasNoCertificado = true;
                        comprobante.HasCertificado = true;
                    }

                    string cadenaOriginal = comprobante.GetCadenaOriginal();
                    comprobante.Sello = certificado.GetSello(cadenaOriginal);
                    //comprobante.Status = "P";
                    DBContext.Comprobantes.Add(comprobante);
                    DBContext.SaveChanges();

                    TempData["success"] = "Se ha creado el comprobante correctamente";
                    var data = new {
                        error = false,
                        errorMsg = "",
                        comprobanteId = comprobante.PublicKey
                    };
                    return Json(data);
                }
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException dex) {
                string errorTxt = dex.Message.ToString();

                foreach (var valError in dex.EntityValidationErrors)
                {
                    foreach (var error in valError.ValidationErrors)
                    {
                        errorTxt = errorTxt + Environment.NewLine + error.ErrorMessage;
                    }
                }

                var data = new {
                    error = true,
                    errorMsg = errorTxt

                };

                return Json(data);
            }
            catch (Exception ex) {

                string errorTxt = ex.Message.ToString();

                foreach (ModelState modelState in ViewData.ModelState.Values)
                {
                    foreach (ModelError error in modelState.Errors)
                    {
                        errorTxt = errorTxt + Environment.NewLine + error.ErrorMessage;
                    }
                }

                var data = new {
                    error = true,
                    errorMsg = errorTxt

                };

                return Json(data);
            }
        }
        public ActionResult Create() {
            var model = new ComprobanteCreateViewModel();

            var tipoMetodoDePagoList = DBContext.TiposMetodoDePago.ToList();
            var tipoMetodoDePagoSelectList = new List<SelectListItem>();
            foreach (var tipoMetodoDePago in tipoMetodoDePagoList) {
                tipoMetodoDePagoSelectList.Add(new SelectListItem {
                    Value = tipoMetodoDePago.TipoMetodoDePagoValue,
                    Text = tipoMetodoDePago.TipoMetodoDePagoValue
                });
            }
            model.TipoMetodoDePago = tipoMetodoDePagoSelectList;

            var tiposImpuestoRetencionList = DBContext.TiposImpuestoRetencion.ToList();
            var tiposImpuestoRetencionSelectList = new List<SelectListItem>();
            foreach (var tiposImpuestoRetencion in tiposImpuestoRetencionList) {
                tiposImpuestoRetencionSelectList.Add(new SelectListItem {
                    Value = tiposImpuestoRetencion.TipoImpuestoRetencionValue,
                    Text = tiposImpuestoRetencion.TipoImpuestoRetencionValue
                });
            }
            model.TiposImpuestoRetencion = tiposImpuestoRetencionSelectList;

            var tiposImpuestoTrasladoList = DBContext.TiposImpuestoTraslado.ToList();
            var tiposImpuestoTrasladoSelectList = new List<SelectListItem>();
            foreach (var tiposImpuestoTraslado in tiposImpuestoTrasladoList) {
                tiposImpuestoTrasladoSelectList.Add(new SelectListItem {
                    Value = tiposImpuestoTraslado.TipoImpuestoTrasladoValue,
                    Text = tiposImpuestoTraslado.TipoImpuestoTrasladoValue
                });
            }
            model.TiposImpuestoTraslado = tiposImpuestoTrasladoSelectList;

            var tiposFormaDePagoList = DBContext.TiposFormaDePago.ToList();
            var tiposFormaDePagoSelectList = new List<SelectListItem>();
            foreach (var tiposFormaDePago in tiposFormaDePagoList) {
                tiposFormaDePagoSelectList.Add(new SelectListItem {
                    Value = tiposFormaDePago.TipoFormaDePagoValue,
                    Text = tiposFormaDePago.TipoFormaDePagoValue
                });
            }
            model.TiposFormaDePago = tiposFormaDePagoSelectList;

            var bancosList = DBContext.Bancos.ToList();
            var bancosSelectList = new List<SelectListItem>();
            foreach (var banco in bancosList) {
                bancosSelectList.Add(new SelectListItem {
                    Value = banco.NombreCorto,
                    Text = banco.NombreCorto
                });
            }
            model.Bancos = bancosSelectList;

            var monedasList = DBContext.TiposMoneda.ToList();
            var monedasListSelectList = new List<SelectListItem>();
            foreach (var moneda in monedasList) {
                monedasListSelectList.Add(new SelectListItem {
                    Value = moneda.TipoMonedaValue,
                    Text = moneda.TipoMonedaValue
                });
            }
            model.TiposMoneda = monedasListSelectList;  

            return View(model);
        }
        public ActionResult Create()
        {
            var model = new ComprobanteCreateViewModel();

            var tipoMetodoDePagoList = DBContext.TiposMetodoDePago.ToList();
            var tipoMetodoDePagoSelectList = new List<SelectListItem>();
            foreach (var tipoMetodoDePago in tipoMetodoDePagoList) {
                tipoMetodoDePagoSelectList.Add(new SelectListItem {
                    Value = tipoMetodoDePago.TipoMetodoDePagoValue,
                    Text = tipoMetodoDePago.TipoMetodoDePagoValue
                });
            }
            model.TipoMetodoDePago = tipoMetodoDePagoSelectList;

            var tiposImpuestoRetencionList = DBContext.TiposImpuestoRetencion.ToList();
            var tiposImpuestoRetencionSelectList = new List<SelectListItem>();
            foreach (var tiposImpuestoRetencion in tiposImpuestoRetencionList) {
                tiposImpuestoRetencionSelectList.Add(new SelectListItem {
                    Value = tiposImpuestoRetencion.TipoImpuestoRetencionValue,
                    Text = tiposImpuestoRetencion.TipoImpuestoRetencionValue
                });
            }
            model.TiposImpuestoRetencion = tiposImpuestoRetencionSelectList;

            var tiposImpuestoTrasladoList = DBContext.TiposImpuestoTraslado.ToList();
            var tiposImpuestoTrasladoSelectList = new List<SelectListItem>();
            foreach (var tiposImpuestoTraslado in tiposImpuestoTrasladoList) {
                tiposImpuestoTrasladoSelectList.Add(new SelectListItem {
                    Value = tiposImpuestoTraslado.TipoImpuestoTrasladoValue,
                    Text = tiposImpuestoTraslado.TipoImpuestoTrasladoValue
                });
            }
            model.TiposImpuestoTraslado = tiposImpuestoTrasladoSelectList;

            var tiposFormaDePagoList = DBContext.TiposFormaDePago.ToList();
            var tiposFormaDePagoSelectList = new List<SelectListItem>();
            foreach (var tiposFormaDePago in tiposFormaDePagoList) {
                tiposFormaDePagoSelectList.Add(new SelectListItem {
                    Value = tiposFormaDePago.TipoFormaDePagoValue,
                    Text = tiposFormaDePago.TipoFormaDePagoValue
                });
            }
            model.TiposFormaDePago = tiposFormaDePagoSelectList;

            var bancosList = DBContext.Bancos.ToList();
            var bancosSelectList = new List<SelectListItem>();
            foreach (var banco in bancosList) {
                bancosSelectList.Add(new SelectListItem {
                    Value = banco.NombreCorto,
                    Text = banco.NombreCorto
                });
            }
            model.Bancos = bancosSelectList;

            var monedasList = DBContext.TiposMoneda.ToList();
            var monedasListSelectList = new List<SelectListItem>();
            foreach (var moneda in monedasList) {
                monedasListSelectList.Add(new SelectListItem {
                    Value = moneda.TipoMonedaValue,
                    Text = moneda.TipoMonedaValue
                });
            }
            model.TiposMoneda = monedasListSelectList;

            var tiposDeComprobanteList = DBContext.TiposTipoDeComprobante.ToList();
            var tiposDeComprobanteListSelectList = new List<SelectListItem>();
            foreach (var tipoDeComprobante in tiposDeComprobanteList)
            {
                tiposDeComprobanteListSelectList.Add(new SelectListItem
                {
                    Value = tipoDeComprobante.TipoTipoDeComprobanteValue,
                    Text = tipoDeComprobante.TipoTipoDeComprobanteValue
                });
            }
            model.TiposDeComprobante = tiposDeComprobanteListSelectList;

            var viewTemplatesList = DBContext.ViewTemplates.ToList();
            var viewTemplatesListSelectList = new List<SelectListItem>();
            foreach (var vTemplate in viewTemplatesList)
            {
                viewTemplatesListSelectList.Add(new SelectListItem
                {
                    Value = vTemplate.ViewTemplateId.ToString(),
                    Text = vTemplate.DisplayName
                });
            }
            model.ViewTemplates = viewTemplatesListSelectList;

            Emisor emisor = DBContext.Emisores.SingleOrDefault(x => x.EmisorId == 1);

            model.EmisorId = emisor.EmisorId;
            model.Emisor.Nombre = emisor.Nombre;
            model.Emisor.RFC = emisor.RFC;
            // model.ExpedidoEn = emisor.ExpedidoEn select one?
            model.ExpedidoEn.UbicacionId = null; // default null (same as domicilioFiscal)
            model.CertificadoId = emisor.Certificados.FirstOrDefault(x => x.Estado == "A").CertificadoId;

            model.Folio = this.DBContext.Database.SqlQuery<string>("SELECT CONVERT(NVARCHAR,MAX(CONVERT(INT,[folio]))+1) FROM [sat_comprobante] WHERE [serie] = 'A'").FirstOrDefault();
            model.OrdenNumero = this.DBContext.Database.SqlQuery<int>("SELECT MAX([extended_int_value_1])+1 FROM [sat_comprobante] WHERE [serie] = 'A'").FirstOrDefault();

            var SampleConceptsList = this.DBContext.Database.SqlQuery<SelectListItem>("SELECT [no_identificacion] as Value, [no_identificacion] + ' - ' + [descripcion] as Text FROM [sat_concepto] GROUP BY [no_identificacion], [descripcion] order by [no_identificacion] DESC");
            ViewBag.SampleConcepts = SampleConceptsList;

            return View(model);
        }