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 Create(FacturaProveedoresVM fpVM)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    string FileName = "";
                    if (fpVM.file != null)
                    {
                        FileName = fpVM.file.FileName;
                        string url_path = Path.Combine(Server.MapPath("~/path"), Path.GetFileName(FileName));
                        fpVM.file.SaveAs(url_path);
                    }
                    factura_proveedores fp = new factura_proveedores()
                    {
                        periodo             = fpVM.periodo,
                        fecha_factura       = fpVM.fecha_factura,
                        fecha_pago          = fpVM.fecha_pago,
                        tipo_factura        = fpVM.tipo_factura,
                        create_user_id      = int.Parse(Session["UserID"].ToString()),
                        update_date         = DateTime.Now,
                        tipo_comprobante_id = fpVM.tipo_comprobante_id,
                        profesional_id      = fpVM.profesional_id,
                        punto_venta         = fpVM.punto_venta,
                        nro_comprobante     = fpVM.nro_comprobante,
                        cuit_cuil           = fpVM.cuit_cuil,
                        nro_cuit_cuil       = fpVM.nro_cuit_cuil,
                        description         = fpVM.description,
                        imp_neto_gravado    = fpVM.imp_neto_gravado,
                        imp_neto_no_gravado = fpVM.imp_neto_no_gravado,
                        imp_op_exentas      = fpVM.imp_op_exentas,
                        iva           = fpVM.iva,
                        importe_total = fpVM.importe_total,
                        name_file     = FileName,
                        estado        = fpVM.estado,
                        activo        = 1
                    };

                    db.factura_proveedores.Add(fp);
                    db.SaveChanges();

                    return(RedirectToAction("Index"));
                }
            }
            catch
            {
                ModelState.AddModelError("", "Se produjo un error, en caso de persistir, ponerse en contacto con el Administrador.");
            }
            GetTipoFactura();
            GetTipoComprobante();
            GetProfesionales();
            GetEstado();
            GetComboCC();
            GetComboPeriodo();
            return(View(fpVM));
        }
 public ActionResult Edit(FacturaProveedoresVM fpVM)
 {
     try
     {
         if (ModelState.IsValid)
         {
             factura_proveedores fp = new factura_proveedores
             {
                 id                  = fpVM.id,
                 periodo             = fpVM.periodo,
                 fecha_factura       = fpVM.fecha_factura,
                 fecha_pago          = fpVM.fecha_pago,
                 tipo_factura        = fpVM.tipo_factura,
                 create_user_id      = fpVM.create_user_id,
                 update_date         = DateTime.Now,
                 update_user_id      = int.Parse(Session["UserID"].ToString()),
                 tipo_comprobante_id = fpVM.tipo_comprobante_id,
                 punto_venta         = fpVM.punto_venta,
                 nro_comprobante     = fpVM.nro_comprobante,
                 cuit_cuil           = fpVM.cuit_cuil,
                 nro_cuit_cuil       = fpVM.nro_cuit_cuil,
                 description         = fpVM.description,
                 imp_neto_gravado    = fpVM.imp_neto_gravado,
                 imp_neto_no_gravado = fpVM.imp_neto_no_gravado,
                 imp_op_exentas      = fpVM.imp_op_exentas,
                 iva                 = fpVM.iva,
                 importe_total       = fpVM.importe_total,
                 estado              = fpVM.estado,
                 name_file           = fpVM.fileName,
                 activo              = 1,
                 profesional_id      = fpVM.profesional_id
             };
             db.Entry(fp).State = EntityState.Modified;
             db.SaveChanges();
             return(RedirectToAction("Index"));
         }
     }
     catch
     {
         ModelState.AddModelError("", "Se produjo un error, en caso de persistir, ponerse en contacto con el Administrador.");
     }
     GetComboPeriodo();
     GetTipoFactura();
     GetTipoComprobante();
     GetProfesionales();
     GetEstado();
     GetComboCC();
     GetUser();
     return(View(fpVM));
 }
 public ActionResult DeleteConfirmed(long id)
 {
     try
     {
         factura_proveedores factura_proveedores = db.factura_proveedores.Find(id);
         factura_proveedores.activo          = 0;
         db.Entry(factura_proveedores).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     catch
     {
         ModelState.AddModelError("", "Se produjo un error, en caso de persistir, ponerse en contacto con el Administrador.");
     }
     return(View());
 }
        public ActionResult Delete(long?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            factura_proveedores fp = db.factura_proveedores.Find(id);

            FacturaProveedoresVM fpVM = new FacturaProveedoresVM
            {
                id              = fp.id,
                periodo         = fp.periodo,
                fecha_factura   = fp.fecha_factura,
                fecha_pago      = fp.fecha_pago,
                nro_comprobante = fp.nro_comprobante,
                description     = fp.description,
                importe_total   = fp.importe_total,
                estadoDesc      = fp.estado == 0 ? "PAGADO" : fp.estado == 1 ? "PAGO PARCIAL" : "IMPAGO"
            };

            return(View(fpVM));
        }
        public ActionResult Edit(long?id)
        {
            factura_proveedores fp = db.factura_proveedores.Find(id);

            FacturaProveedoresVM fpVM = new FacturaProveedoresVM
            {
                id                  = fp.id,
                periodo             = fp.periodo,
                fecha_factura       = fp.fecha_factura,
                fecha_pago          = fp.fecha_pago,
                tipo_factura        = fp.tipo_factura,
                create_user_id      = fp.create_user_id,
                tipo_comprobante_id = fp.tipo_comprobante_id,
                punto_venta         = fp.punto_venta,
                nro_comprobante     = fp.nro_comprobante,
                cuit_cuil           = fp.cuit_cuil,
                nro_cuit_cuil       = fp.nro_cuit_cuil,
                description         = fp.description,
                imp_neto_gravado    = fp.imp_neto_gravado,
                imp_neto_no_gravado = fp.imp_neto_no_gravado,
                imp_op_exentas      = fp.imp_op_exentas,
                iva                 = fp.iva,
                importe_total       = fp.importe_total,
                estado              = fp.estado,
                fileName            = fp.name_file,
                profesional_id      = fp.profesional_id
            };

            GetProfesionales();
            GetComboPeriodo();
            GetTipoFactura();
            GetTipoComprobante();
            GetEstado();
            GetComboCC();
            GetUser();
            return(View(fpVM));
        }
        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));
        }
        public ActionResult DeleteConfirmed(long id)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    //eliminacion logica de la cabecera
                    orden_pago_cab orden_pago_cab = db.orden_pago_cab.Find(id);
                    orden_pago_cab.activo = 0;

                    //Busco si la cabecera tiene detalle y recorro.
                    List <orden_pago_det> OpDet = db.orden_pago_det.Where(x => x.orden_pago_cab_id == id).ToList();
                    foreach (var det in OpDet)
                    {
                        //actualizacion del estado de la factura del profesional asociado
                        factura_proveedores fp = db.factura_proveedores.Where(x => x.id == det.factura_proveedores_id).First();
                        if (fp != null)
                        {
                            if (fp.estado == 0 && det.importe == fp.importe_total) //pagado y los importes son iguales, queda impago
                            {
                                orden_pago_cab.importe_total = orden_pago_cab.importe_total - det.importe;
                                fp.estado = 2;
                            }
                            else if (fp.estado == 0 && det.importe < fp.importe_total) //pagado y el importe del detalle es menor a la factura, queda pago parcial.
                            {
                                orden_pago_cab.importe_total = orden_pago_cab.importe_total - det.importe;
                                fp.estado = 1;
                            }
                            else if (fp.estado == 1 && det.importe < fp.importe_total) //Pago parcial y el detalle es menor a la factura, queda pago parcial.
                            {
                                fp.estado = 1;
                                orden_pago_cab.importe_total = orden_pago_cab.importe_total - det.importe;
                            }

                            if (orden_pago_cab.importe_total == 0)
                            {
                                fp.estado = 2;
                            }

                            //actualizo cabecera
                            db.Entry(orden_pago_cab).State = EntityState.Modified;
                            db.SaveChanges();

                            //actualizo factura
                            db.Entry(fp).State = EntityState.Modified;
                            db.SaveChanges();
                        }
                        //eliminacion fisica del detalle
                        db.orden_pago_det.Remove(det);
                        db.SaveChanges();
                    }

                    if (OpDet.Count() == 0)//cabecera sin detalle.
                    {
                        //actualizo cabecera
                        db.Entry(orden_pago_cab).State = EntityState.Modified;
                        db.SaveChanges();
                    }
                    return(RedirectToAction("Index"));
                }
            }
            catch
            {
                ModelState.AddModelError("", "Se produjo un error, en caso de persistir, ponerse en contacto con el Administrador.");
            }
            return(View());
        }