public ActionResult Edit(long?id)
        {
            bool detalle = false;

            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            orden_pago_cab orden_pago_cab = db.orden_pago_cab.Find(id);

            orden_pago_det orden_pago_det = db.orden_pago_det.Where(x => x.orden_pago_cab_id == id).FirstOrDefault();

            if (orden_pago_det != null)
            {
                detalle = true;
            }

            OrdenPagoCabVM opVm = new OrdenPagoCabVM
            {
                id             = orden_pago_cab.id,
                Fecha          = orden_pago_cab.fecha,
                Profesional_Id = orden_pago_cab.profesional_id,
                Importe        = orden_pago_cab.importe_total,
                create_user_id = orden_pago_cab.create_user_id,
                detalle        = detalle
            };

            GetProfesionales();

            return(View(opVm));
        }
        public ActionResult DeleteDetalle(OrdenesPagoDetailsDetalle opvm)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    //cacebera
                    orden_pago_cab orden_pago_cab = db.orden_pago_cab.Find(opvm.idCab);

                    //factura
                    factura_proveedores fp = db.factura_proveedores.Find(opvm.FacturaProveedorId);

                    //detalle
                    orden_pago_det orden_pago_det = db.orden_pago_det.Find(opvm.idDet);

                    //actualizacion del importe en la cabecera
                    orden_pago_cab.importe_total   = orden_pago_cab.importe_total - orden_pago_det.importe;
                    db.Entry(orden_pago_cab).State = EntityState.Modified;
                    db.SaveChanges();

                    //actualizo estado de la factura
                    if (fp.estado == 0) //pagado
                    {
                        if (fp.importe_total == orden_pago_det.importe)
                        {
                            fp.estado = 2;
                        }
                        else if (fp.importe_total > orden_pago_det.importe)
                        {
                            fp.estado = 1;
                        }
                    }
                    else if (fp.estado == 1) //pago parcial.
                    {
                        //tengo que buscar si existe la factura en algun detalle que no sea el actual para diferenciar si queda pago parcial o no.
                        int cont = db.orden_pago_det.Where(x => x.factura_proveedores_id == opvm.FacturaProveedorId && x.id != opvm.idDet).Count();
                        if (cont == 0)
                        {
                            fp.estado = 2;
                        }
                    }

                    db.Entry(fp).State = EntityState.Modified;
                    db.SaveChanges();

                    //eliminacion fisica del detalle
                    db.orden_pago_det.Remove(orden_pago_det);
                    db.SaveChanges();

                    return(RedirectToAction("Details", new { id = opvm.idCab, page = 1 }));
                }
            }
            catch
            {
                ModelState.AddModelError("", "Se produjo un error, en caso de persistir, ponerse en contacto con el Administrador.");
            }
            return(View(opvm));
        }
        public ActionResult CreateDetalle(OrdenesPagoDetVM OPvm, string submit)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    factura_proveedores fp = db.factura_proveedores.Where(x => x.id == OPvm.FacturaProveedorId).First();
                    double importeDetalle  = 0;

                    if (OPvm.PagaTotal == false) //ingresa los valores a mano, por eso controlo.
                    {
                        if (OPvm.Importe == null || OPvm.Importe == 0)
                        {
                            GetFacturas(OPvm.ProfesionalId);
                            GetFormasPago();
                            ModelState.AddModelError("", "Debe ingresar un importe mayor a 0!");
                            return(View(OPvm));
                        }
                        //Controlo que el importe a pagar sea menor al ingresado.
                        if (OPvm.Importe > fp.importe_total)
                        {
                            GetFacturas(OPvm.ProfesionalId);
                            GetFormasPago();
                            ModelState.AddModelError("", "El importe ingresado en la Orden de Pago, no puede ser mayor al saldo por pagar de la Factura que es de: " + fp.importe_total);
                            return(View(OPvm));
                        }
                        else if (fp.estado == 1) //tiene pago parcial. O sea, le queda algo por saldar pero no es todo el importe de la factura
                        {
                            //Ver en que detalle de orden de pago está para sacar el importe y hacer la diferencia.
                            double importeCargado = db.orden_pago_det.Where(x => x.factura_proveedores_id == OPvm.FacturaProveedorId).Select(x => x.importe).FirstOrDefault();
                            double diferencia     = fp.importe_total - importeCargado;
                            if (OPvm.Importe > diferencia)
                            {
                                GetFacturas(OPvm.ProfesionalId);
                                GetFormasPago();
                                ModelState.AddModelError("", "El importe ingresado en la Orden de Pago, no puede ser mayor al saldo por pagar de la Factura que es de: " + diferencia);
                                return(View(OPvm));
                            }
                        }
                        importeDetalle = (double)OPvm.Importe;
                    }
                    else
                    {
                        //tengo que controlar si ya hay algo pago de esa factura
                        if (fp.estado == 1) //pago parcial
                        {
                            double        importesSum      = 0;
                            List <double> importesCargados = db.orden_pago_det.Where(x => x.factura_proveedores_id == OPvm.FacturaProveedorId).Select(x => x.importe).ToList();
                            foreach (var l in importesCargados)
                            {
                                importesSum = importesSum + l;
                            }
                            double diferencia = fp.importe_total - importesSum;
                            importeDetalle = diferencia;
                        }
                        else //es 2, significa que no tiene nada pago
                        {
                            importeDetalle = fp.importe_total;
                        }
                    }
                    //Guardo el detalle
                    orden_pago_det opdet = new orden_pago_det
                    {
                        orden_pago_cab_id      = OPvm.idCab,
                        factura_proveedores_id = (long)OPvm.FacturaProveedorId,
                        paga_total             = OPvm.PagaTotal,
                        importe              = importeDetalle,
                        forma_pago           = OPvm.FormaPago,
                        nro_cheque           = OPvm.NroCheque,
                        nro_cuenta_corriente = OPvm.NroCtaCte,
                        banco         = OPvm.Banco,
                        observaciones = OPvm.Observaciones
                    };

                    db.orden_pago_det.Add(opdet);
                    db.SaveChanges();

                    //Actualizo el importe en la cabecera
                    orden_pago_cab orden_pago_cab = db.orden_pago_cab.Find(OPvm.idCab);
                    orden_pago_cab.importe_total   = orden_pago_cab.importe_total + importeDetalle;
                    db.Entry(orden_pago_cab).State = EntityState.Modified;
                    db.SaveChanges();

                    //actualizo el estado de la factur
                    fp.estado          = OPvm.PagaTotal == true ? 0 : 1;
                    db.Entry(fp).State = EntityState.Modified;
                    db.SaveChanges();

                    //segun el boton veo adonde lo llevo.
                    if (submit == "Guardar y Volver")
                    {
                        return(RedirectToAction("Details", new { id = OPvm.idCab, page = 1 }));
                    }
                    else
                    {
                        return(RedirectToAction("CreateDetalle", new { idCab = OPvm.idCab }));
                    }
                }
            }
            catch
            {
                ModelState.AddModelError("", "Se produjo un error, en caso de persistir, ponerse en contacto con el Administrador.");
            }
            GetFacturas(OPvm.ProfesionalId);
            GetFormasPago();
            return(View(OPvm));
        }