public ActionResult VinculaGarantia(int id)
        {
            decimal Tqtd_avariada      = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_avariada * p.vlr_lancamento);
            decimal Tqtd_faltante      = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_faltante * p.vlr_lancamento);
            decimal Tqtd_outras_marcas = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_outras_marcas * p.vlr_lancamento);
            decimal Tqtd_atendida      = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_atendida * p.vlr_lancamento);
            decimal Tqtd_descartada    = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_descartada * p.vlr_lancamento);
            decimal Tqtd_fora_garantia = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_fora_garantia * p.vlr_lancamento);
            decimal Tqtd_lancamento    = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_lancamento * p.vlr_lancamento);
            decimal Ttd_reaproveitada  = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_reaproveitada * p.vlr_lancamento);
            decimal Ttd_recebida       = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_recebida * p.vlr_lancamento);
            decimal Tqtd_rejeitada     = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_rejeitada * p.vlr_lancamento);
            decimal Timpostos          = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.vlr_icms_subs + p.vlr_icms_subs);

            decimal VlrCreditoCliente      = Tqtd_atendida + Timpostos;
            decimal VlrDebitoCliente       = Tqtd_fora_garantia + Tqtd_outras_marcas + Tqtd_faltante + Tqtd_avariada;
            decimal VlrDebitoFoxlux        = Tqtd_descartada;
            decimal VlrDebitoRepresentante = 0;
            decimal VlrDebitoTransportador = 0;



            var data = new Garantia_Procedimento_Model
            {
                ProcedimentoAdm          = new ProcedimentoAdm(),
                Garantia                 = db.Garantia.Find(id),
                vlr_credito_cliente      = VlrCreditoCliente,
                vlr_debito_cliente       = VlrDebitoCliente,
                vlr_debito_foxlux        = VlrDebitoFoxlux,
                vlr_debito_representante = VlrDebitoRepresentante,
                vlr_debito_transportador = VlrDebitoTransportador,
                Obs = ""
            };

            ViewBag.cd_cadastro       = new SelectList(db.Clientes.Where(a => a.CD_CADASTRO == data.Garantia.cod_cliente).ToList(), "CD_CADASTRO", "RAZAO", data.Garantia.cod_cliente);
            ViewBag.cd_tipo           = new SelectList(db.TP_PROCEDIMENTO.Where(a => a.ATIVO == "S").ToList(), "CD_TIPO", "DES_TIPO", string.Empty);
            ViewBag.cd_departamento   = new SelectList(db.DEPARTAMENTOes.Where(a => a.ATIVO == "S").ToList(), "CD_DEPARTAMENTO", "DESC_DEPARTAMENTO", string.Empty);
            ViewBag.cod_transportador = new SelectList(db.TRANSPORTADOR.ToList(), "COD_TRANSPORTADOR", "FullNameWithCode", data.Garantia.cod_transportador);
            ViewBag.motivoid          = new SelectList(db.Tp_Procedimento_Motivos.Where(a => a.COD_TIPO == 0).ToList(), "cod_tipo", "des_nome");
            return(View(data));
        }
        public ActionResult VinculaGarantia(Garantia_Procedimento_Model data, IEnumerable <HttpPostedFileBase> files)
        {
            #region initializer
            ModelState.Clear();
            data.Garantia = db.Garantia.Find(data.Garantia.garantiaid);

            ViewBag.cd_cadastro       = new SelectList(db.Clientes.Where(a => a.CD_CADASTRO == data.Garantia.cod_cliente).ToList(), "CD_CADASTRO", "RAZAO", data.Garantia.cod_cliente);
            ViewBag.cd_tipo           = new SelectList(db.TP_PROCEDIMENTO.Where(a => a.ATIVO == "S").ToList(), "CD_TIPO", "DES_TIPO", data.ProcedimentoAdm.CD_TIPO);
            ViewBag.cd_departamento   = new SelectList(db.DEPARTAMENTOes.Where(a => a.ATIVO == "S").ToList(), "CD_DEPARTAMENTO", "DESC_DEPARTAMENTO", data.ProcedimentoAdm.CD_DEPARTAMENTO);
            ViewBag.cod_transportador = new SelectList(db.TRANSPORTADOR.ToList(), "COD_TRANSPORTADOR", "FullNameWithCode", data.Garantia.cod_transportador);
            ViewBag.motivoid          = new SelectList(db.Tp_Procedimento_Motivos.Where(a => a.COD_TIPO == 0).ToList(), "cod_tipo", "des_nome");

            data.ProcedimentoAdm.VL_CLIENTE  = data.vlr_credito_cliente;
            data.ProcedimentoAdm.VL_DCLIENTE = data.vlr_debito_cliente;

            data.ProcedimentoAdm.VL_TRANSPORTADORA = data.vlr_debito_transportador;
            data.ProcedimentoAdm.VL_REPRESENTANTE  = data.vlr_debito_representante;
            data.ProcedimentoAdm.VL_FOXLUX         = data.vlr_debito_foxlux;


            #endregion



            #region logic_to_add_procedimetno


            int cd_tipo_procedimento = data.ProcedimentoAdm.CD_TIPO;
            int?nf_fox     = data.ProcedimentoAdm.NF_FOX.GetValueOrDefault(0);
            int?nf_cliente = data.ProcedimentoAdm.NF_CLIENTE.GetValueOrDefault(0);

            string NFFOXOBRIGATORIA = (from a in db.TP_PROCEDIMENTO.Where(a => a.CD_TIPO == cd_tipo_procedimento) select a.SOL_NF_OBRIGATORIA).FirstOrDefault().ToString();
            string NFCLIOBRIGATORIA = (from a in db.TP_PROCEDIMENTO.Where(a => a.CD_TIPO == cd_tipo_procedimento) select a.SOL_NF_CLIENTE_OBRIGATORIA).FirstOrDefault().ToString();

            if (NFFOXOBRIGATORIA == "S" && nf_fox == 0)
            {
                ModelState.AddModelError("ProcedimentoAdm_NF_FOX", "*");
                return(View(data));
            }

            if (NFCLIOBRIGATORIA == "S" && nf_cliente == 0)
            {
                ModelState.AddModelError("ProcedimentoAdm_NF_CLIENTE", "*");
                return(View(data));
            }

            #endregion



            if (ModelState.IsValid)
            {
                data.ProcedimentoAdm.NF_FOX = nf_fox;
                string dta_nf   = "";
                string cod_oper = "";



                if (data.ProcedimentoAdm.NF_FOX != 0)
                {
                    dta_nf   = (from a in db.eNota.Where(a => a.NR_NOTA == data.ProcedimentoAdm.NF_FOX) select a.DT_EMISSAO).FirstOrDefault().ToString();
                    cod_oper = (from a in db.eNota.Where(a => a.NR_NOTA == data.ProcedimentoAdm.NF_FOX) select a.COD_OPER).FirstOrDefault().ToString();
                    data.cd_transportador = (from a in db.eNota.Where(a => a.NR_NOTA == data.ProcedimentoAdm.NF_FOX) select a.CD_TRANSPORTADOR).FirstOrDefault();
                }
                else
                {
                    dta_nf   = "";
                    cod_oper = "";
                }

                Int32?intCD_PROCEDIMENTO = db.ProcedimentoAdm.Max(s => (Int32?)s.CD_PROCEDIMENTO);

                if (intCD_PROCEDIMENTO != null)
                {
                    intCD_PROCEDIMENTO++;
                }
                else
                {
                    intCD_PROCEDIMENTO = 1;
                }

                data.ProcedimentoAdm.CD_PROCEDIMENTO  = (Int32)intCD_PROCEDIMENTO;
                data.ProcedimentoAdm.DTA_ABERTURA     = DateTime.Now;
                data.ProcedimentoAdm.ID_SITUACAO      = 1;
                data.ProcedimentoAdm.DTA_NF_FOX       = dta_nf;
                data.ProcedimentoAdm.COD_OPER         = cod_oper;
                data.ProcedimentoAdm.CD_TRANSPORTADOR = data.cd_transportador;

                if (files != null)
                {
                    foreach (var a in files)
                    {
                        if (a != null)
                        {
                            if (a.ContentLength > 0)
                            {
                                Int32?intCD_PROCEDIMENTOARQ = db.ProcedimentoAdmArq.Max(s => (Int32?)s.ID_ARQ);

                                if (intCD_PROCEDIMENTOARQ != null)
                                {
                                    intCD_PROCEDIMENTOARQ++;
                                }
                                else
                                {
                                    intCD_PROCEDIMENTOARQ = 1;
                                }
                                string NomeArquivo = data.ProcedimentoAdm.CD_PROCEDIMENTO.ToString() + '_' + intCD_PROCEDIMENTOARQ.ToString() + '_' + string.Format("{0}", Path.GetFileName(a.FileName));
                                var    path        = Path.Combine(Server.MapPath(Settings.caminho_arquivos_procedimento), NomeArquivo);
                                string sqlFile     = string.Format(" INSERT INTO PROCEDIMENTOARQ VALUES ({0},{1},\'{2}\')",
                                                                   intCD_PROCEDIMENTOARQ,
                                                                   data.ProcedimentoAdm.CD_PROCEDIMENTO,
                                                                   NomeArquivo);
                                db.Database.ExecuteSqlCommand(sqlFile);
                                a.SaveAs(path);
                            }
                        }
                    }
                }

                //}


                int cd_regional = (from a in db.Clientes.Where(a => a.CD_CADASTRO == data.ProcedimentoAdm.CD_CADASTRO) select a.CD_REGIONAL).FirstOrDefault();
                data.ProcedimentoAdm.CD_USUARIO           = cd_usuario;
                data.ProcedimentoAdm.CD_USUARIO_ALTERACAO = cd_usuario;
                data.ProcedimentoAdm.OBSATENDIMENTO       = "";
                data.ProcedimentoAdm.CD_REGIONAL          = cd_regional;
                data.ProcedimentoAdm.CD_ANEXO             = 1;


                try
                {
                    db.ProcedimentoAdm.Add(data.ProcedimentoAdm);

                    data.Garantia.cod_procedimento_vinculado = data.ProcedimentoAdm.CD_PROCEDIMENTO;
                    data.Garantia.vlr_credito_vinculado      = data.ProcedimentoAdm.VL_CLIENTE;
                    db.Entry(data.Garantia).State            = EntityState.Modified;

                    GarantiaProcedimento Gatprocedimento = new GarantiaProcedimento {
                        id = db.Database.SqlQuery <Int32>("select GarantiaProcedimentoSeq.NextVal from dual ").FirstOrDefault <Int32>(), garantiaId = data.Garantia.garantiaid, cod_procedimento = data.ProcedimentoAdm.CD_PROCEDIMENTO
                    };
                    db.GarantiaProcedimento.Add(Gatprocedimento);


                    db.SaveChanges();
                    SendEmail email = new SendEmail();
                    email.EnviarEmail(data.ProcedimentoAdm.CD_PROCEDIMENTO, "Create");
                }
                catch (DbEntityValidationException e)
                {
                    //foreach (var result in e.EntityValidationErrors)
                    // {
                    //   foreach (var error in result.ValidationErrors)
                    // {
                    ModelState.AddModelError("", e.Message);
                    //}
                    // }
                    return(View(data));
                }
            }
            else
            {
                foreach (ModelState modelState in ModelState.Values)
                {
                    foreach (ModelError error in modelState.Errors)
                    {
                        ModelState.AddModelError("", error.Exception.Message);
                    }
                }
                return(View(data));
            }


            return(RedirectToAction("Details", "Garantias", new { id = data.Garantia.garantiaid }));



            return(View(data));
        }
        public ActionResult FinalizaGarantia(int id)
        {
            decimal Tqtd_avariada      = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_avariada * p.vlr_lancamento);
            decimal Tqtd_faltante      = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_faltante * p.vlr_lancamento);
            decimal Tqtd_outras_marcas = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_outras_marcas * p.vlr_lancamento);
            decimal Tqtd_atendida      = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_atendida * p.vlr_lancamento);
            decimal Tqtd_descartada    = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_descartada * p.vlr_lancamento);
            decimal Tqtd_fora_garantia = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_fora_garantia * p.vlr_lancamento);
            decimal Tqtd_lancamento    = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_lancamento * p.vlr_lancamento);
            decimal Ttd_reaproveitada  = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_reaproveitada * p.vlr_lancamento);
            decimal Ttd_recebida       = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_recebida * p.vlr_lancamento);
            decimal Tqtd_rejeitada     = db.GarantiaItem.Where(a => a.garantiaid == id).Sum(p => p.qtd_rejeitada * p.vlr_lancamento);

            decimal VlrCreditoCliente      = Tqtd_atendida;
            decimal VlrDebitoCliente       = Tqtd_fora_garantia + Tqtd_outras_marcas + Tqtd_faltante + Tqtd_avariada;
            decimal VlrDebitoFoxlux        = Tqtd_descartada;
            decimal VlrDebitoRepresentante = 0;
            decimal VlrDebitoTransportador = 0;



            var data = new Garantia_Procedimento_Model
            {
                ProcedimentoAdm          = new ProcedimentoAdm(),
                Garantia                 = db.Garantia.Find(id),
                vlr_credito_cliente      = VlrCreditoCliente,
                vlr_debito_cliente       = VlrDebitoCliente,
                vlr_debito_foxlux        = VlrDebitoFoxlux,
                vlr_debito_representante = VlrDebitoRepresentante,
                vlr_debito_transportador = VlrDebitoTransportador,
                Obs = ""
            };

            decimal?VlrCreditoJaDadoAoCliente = data.Garantia.vlr_credito_vinculado;

            if (VlrCreditoJaDadoAoCliente.HasValue)
            {
                if (VlrCreditoJaDadoAoCliente > 0)
                {
                    if (VlrCreditoJaDadoAoCliente == VlrCreditoCliente)
                    {
                        data.Garantia.dta_finalizacao = System.DateTime.Now;
                        data.Garantia.cod_status      = 3;
                        db.Entry(data.Garantia).State = EntityState.Modified;
                        db.SaveChanges();

                        return(RedirectToAction("Details", "Garantias", new { id = data.Garantia.garantiaid }));
                    }
                    else
                    if (VlrCreditoJaDadoAoCliente > VlrCreditoCliente)
                    {
                        data.vlr_credito_cliente      = 0;
                        data.vlr_debito_representante = Math.Abs((decimal)VlrCreditoJaDadoAoCliente - (decimal)VlrCreditoCliente);
                    }
                    else
                    if (VlrCreditoJaDadoAoCliente < VlrCreditoCliente)
                    {
                        data.vlr_credito_cliente      = Math.Abs((decimal)VlrCreditoJaDadoAoCliente - (decimal)VlrCreditoCliente);
                        data.vlr_debito_representante = 0;
                    }
                }
            }


            ViewBag.cd_cadastro       = new SelectList(db.Clientes.Where(a => a.CD_CADASTRO == data.Garantia.cod_cliente).ToList(), "CD_CADASTRO", "RAZAO", data.Garantia.cod_cliente);
            ViewBag.cd_tipo           = new SelectList(db.TP_PROCEDIMENTO.Where(a => a.ATIVO == "S").ToList(), "CD_TIPO", "DES_TIPO", string.Empty);
            ViewBag.cd_departamento   = new SelectList(db.DEPARTAMENTOes.Where(a => a.ATIVO == "S").ToList(), "CD_DEPARTAMENTO", "DESC_DEPARTAMENTO", string.Empty);
            ViewBag.cod_transportador = new SelectList(db.TRANSPORTADOR.ToList(), "COD_TRANSPORTADOR", "FullNameWithCode", data.Garantia.cod_transportador);
            ViewBag.motivoid          = new SelectList(db.Tp_Procedimento_Motivos.Where(a => a.COD_TIPO == 0).ToList(), "cod_tipo", "des_nome");



            return(View(data));
        }