예제 #1
0
        public static void CopiarAplicacionesDeEquivalentes(int iParteID)
        {
            var oPartesEq     = Datos.GetListOf <PartesEquivalentesView>(c => c.ParteID == iParteID);
            var oAplicaciones = Datos.GetListOf <ParteVehiculo>(c => c.ParteID == iParteID);

            foreach (var oParteEq in oPartesEq)
            {
                var oAplisEq = Datos.GetListOf <ParteVehiculo>(c => c.ParteID == oParteEq.ParteIDEquivalente);
                foreach (var oAplicacion in oAplicaciones)
                {
                    if (oAplisEq.Any(c => c.ModeloID == oAplicacion.ModeloID &&
                                     ((!c.Anio.HasValue && !oAplicacion.Anio.HasValue) || c.Anio == oAplicacion.Anio) &&
                                     ((!c.MotorID.HasValue && !oAplicacion.MotorID.HasValue) || c.MotorID == oAplicacion.MotorID)))
                    {
                        continue;
                    }
                    var oAplicacionNueva = new ParteVehiculo()
                    {
                        ParteID           = oParteEq.ParteIDEquivalente,
                        ModeloID          = oAplicacion.ModeloID,
                        MotorID           = oAplicacion.MotorID,
                        Anio              = oAplicacion.Anio,
                        TipoFuenteID      = oAplicacion.TipoFuenteID,
                        RegistroUsuarioID = Theos.UsuarioID,
                    };
                    Datos.Guardar <ParteVehiculo>(oAplicacionNueva);
                }
            }
        }
예제 #2
0
        public static void RegistrarKardex(ParteKardex oParteKardex)
        {
            oParteKardex.Folio = (oParteKardex.Folio == null ? "" : oParteKardex.Folio);

            // Se verifica si la parte es servicio, para no afectar la existencia nueva
            if (Datos.Exists <Parte>(c => c.ParteID == oParteKardex.ParteID && c.EsServicio.Value && c.Estatus))
            {
                oParteKardex.Cantidad = 0;
            }

            // Se calcula la existencia nueva
            var oParteKardexAnt = Datos.GetListOf <ParteKardex>(c => c.ParteID == oParteKardex.ParteID && c.SucursalID == oParteKardex.SucursalID)
                                  .OrderByDescending(c => c.ParteKardexID).FirstOrDefault();
            decimal mExistencia = (oParteKardexAnt == null ? 0 : oParteKardexAnt.ExistenciaNueva);
            decimal mCantidad   = oParteKardex.Cantidad;

            if (oParteKardex.OperacionID == Cat.OperacionesKardex.Venta || oParteKardex.OperacionID == Cat.OperacionesKardex.DevolucionAProveedor ||
                oParteKardex.OperacionID == Cat.OperacionesKardex.SalidaInventario || oParteKardex.OperacionID == Cat.OperacionesKardex.SalidaTraspaso)
            {
                mCantidad *= -1;
            }
            oParteKardex.ExistenciaNueva = (mExistencia + mCantidad);

            Datos.Guardar <ParteKardex>(oParteKardex);
        }
예제 #3
0
        public static void CopiarCodigosAlternosDeEquivalentes(int iParteID)
        {
            var oPartesEq   = Datos.GetListOf <PartesEquivalentesView>(c => c.ParteID == iParteID);
            var oCodigosAlt = Datos.GetListOf <ParteCodigoAlterno>(c => c.ParteID == iParteID);

            foreach (var oParteEq in oPartesEq)
            {
                foreach (var oCodigoAlt in oCodigosAlt)
                {
                    if (Datos.Exists <ParteCodigoAlterno>(c => c.ParteID == oParteEq.ParteIDEquivalente && c.MarcaParteID == oCodigoAlt.MarcaParteID &&
                                                          c.CodigoAlterno == oCodigoAlt.CodigoAlterno))
                    {
                        continue;
                    }
                    var oCodigoAltNuevo = new ParteCodigoAlterno()
                    {
                        ParteID          = oParteEq.ParteIDEquivalente,
                        MarcaParteID     = oCodigoAlt.MarcaParteID,
                        CodigoAlterno    = oCodigoAlt.CodigoAlterno,
                        RealizoUsuarioID = Theos.UsuarioID
                    };
                    Datos.Guardar <ParteCodigoAlterno>(oCodigoAltNuevo);
                }
            }
        }
예제 #4
0
        public static List <VentasPagosDetalleView> DeVentaPagoDetalleAVentasPagosDetalleView(List <VentaPagoDetalle> oPagoDetalle)
        {
            var oRes = new List <VentasPagosDetalleView>();

            // Se hace un dictionario con las descripciones de las formas de pago
            var oFormasDePago = Datos.GetListOf <TipoFormaPago>(c => c.Estatus);
            var oFormasDesc   = new Dictionary <int, string>();

            foreach (var oReg in oFormasDePago)
            {
                oFormasDesc.Add(oReg.TipoFormaPagoID, oReg.NombreTipoFormaPago);
            }

            foreach (var oReg in oPagoDetalle)
            {
                oRes.Add(new VentasPagosDetalleView()
                {
                    FormaDePagoID = oReg.TipoFormaPagoID,
                    FormaDePago   = oFormasDesc[oReg.TipoFormaPagoID],
                    Importe       = oReg.Importe,
                    BancoID       = oReg.BancoID,
                    Folio         = oReg.Folio,
                    Cuenta        = oReg.Cuenta
                });
            }

            return(oRes);
        }
예제 #5
0
        public static void RegistrarKardex(ParteKardex oParteKardex)
        {
            oParteKardex.Folio = (oParteKardex.Folio == null ? "" : oParteKardex.Folio);

            // Se verifica si la parte es servicio, para no afectar la existencia nueva
            if (Datos.Exists <Parte>(c => c.ParteID == oParteKardex.ParteID && c.EsServicio.Value && c.Estatus))
            {
                oParteKardex.Cantidad = 0;
            }

            // Se calcula la existencia nueva
            var oParteKardexAnt = Datos.GetListOf <ParteKardex>(c => c.ParteID == oParteKardex.ParteID && c.SucursalID == oParteKardex.SucursalID)
                                  .OrderByDescending(c => c.ParteKardexID).FirstOrDefault();
            decimal mExistencia = (oParteKardexAnt == null ? 0 : oParteKardexAnt.ExistenciaNueva);
            decimal mCantidad   = oParteKardex.Cantidad;

            /* if (oParteKardex.OperacionID == Cat.OperacionesKardex.Venta || oParteKardex.OperacionID == Cat.OperacionesKardex.DevolucionAProveedor
            || oParteKardex.OperacionID == Cat.OperacionesKardex.SalidaInventario || oParteKardex.OperacionID == Cat.OperacionesKardex.SalidaTraspaso)
            ||  mCantidad *= -1;
            */
            oParteKardex.ExistenciaNueva = (mExistencia + mCantidad);

            Datos.Guardar <ParteKardex>(oParteKardex);

            // Se valida la última entrada del kárdex con la existencia

            /*
             * var oParteEx = General.GetEntity<ParteExistencia>(c => c.ParteID == oParteKardex.ParteID && c.SucursalID == oParteKardex.SucursalID && c.Estatus);
             * if (oParteKardex.ExistenciaNueva != oParteEx.Existencia)
             *  UtilLocal.MensajeError(string.Format("Hay una diferencia entre la existencia del Kárdex y la existencia del sistema. ¡Verificar!"
             + "\n\nExistencia Kárdex: {0}\nExistencia Sistema: {1}", oParteKardex.ExistenciaNueva, oParteEx.Existencia));
             */
        }
예제 #6
0
파일: Guardar.cs 프로젝트: moisesiq/aupaga
        public static ResAcc Parte(Parte oParte, PartePrecio oPartePrecio)
        {
            // Se llenan datos predeterminados, si no han sido llenados
            oParte.ParteEstatusID = (oParte.ParteEstatusID > 0 ? oParte.ParteEstatusID : Cat.PartesEstatus.Activo);
            oParte.MedidaID       = (oParte.MedidaID > 0 ? oParte.MedidaID : Cat.Medidas.Pieza);
            oParte.UnidadEmpaque  = (oParte.UnidadEmpaque > 0 ? oParte.UnidadEmpaque : 1);
            oParte.AplicaComision = (oParte.AplicaComision.HasValue ? oParte.AplicaComision : true);
            oParte.Etiqueta       = (oParte.Etiqueta.HasValue ? oParte.Etiqueta : true);

            // Se guarda el registro de la parte
            Datos.Guardar <Parte>(oParte);

            // Se guarda el registro del precio
            if (oPartePrecio != null)
            {
                oPartePrecio.ParteID           = oParte.ParteID;
                oPartePrecio.CostoConDescuento = (oPartePrecio.CostoConDescuento.HasValue ? oPartePrecio.CostoConDescuento : oPartePrecio.Costo);
                Datos.Guardar <PartePrecio>(oPartePrecio);
            }

            // Se generan los registros de existencia, uno por cada sucursal
            var oSucursales = Datos.GetListOf <Sucursal>(q => q.Estatus);

            foreach (var oSucursal in oSucursales)
            {
                Datos.Guardar <ParteExistencia>(new ParteExistencia()
                {
                    ParteID    = oParte.ParteID,
                    SucursalID = oSucursal.SucursalID,
                    Existencia = 0
                });
            }

            // Se generan los registros para Máximos y Mínimos, uno por cada sucursal
            foreach (var oSucursal in oSucursales)
            {
                // Se buscan los criterios generales predefinidos, para asignarlos
                var oCriterioPred = Datos.GetEntity <ParteMaxMinCriterioPredefinido>(q => q.SucursalID == oSucursal.SucursalID &&
                                                                                     q.ProveedorID == oParte.ProveedorID && q.MarcaID == oParte.MarcaParteID && q.LineaID == oParte.LineaID);
                //
                Datos.Guardar <ParteMaxMin>(new ParteMaxMin()
                {
                    ParteID        = oParte.ParteID,
                    SucursalID     = oSucursal.SucursalID,
                    Calcular       = (oCriterioPred == null ? null : oCriterioPred.Calcular),
                    VentasGlobales = (oCriterioPred == null ? null : oCriterioPred.VentasGlobales)
                });
            }

            // Se genera el registro de Abc (ParteAbc)
            Datos.Guardar <ParteAbc>(new ParteAbc()
            {
                ParteID     = oParte.ParteID,
                AbcDeVentas = "Z"
            });

            return(new ResAcc(true));
        }
예제 #7
0
        public static void Cancelar9500(int i9500ID, string sMotivo, int iUsuarioID)
        {
            var o9500        = Datos.GetEntity <Cotizacion9500>(q => q.Cotizacion9500ID == i9500ID && q.Estatus);
            var o9500Detalle = Datos.GetListOf <Cotizacion9500Detalle>(q => q.Cotizacion9500ID == i9500ID && q.Estatus);

            // Se verifica si se cobró el anticipo, para cancelarlo
            if (o9500.Anticipo > 0)
            {
                var oAnticipo = Datos.GetEntity <Venta>(c => c.VentaID == o9500.AnticipoVentaID && c.Estatus);
                if (oAnticipo.VentaEstatusID == Cat.VentasEstatus.Cobrada || oAnticipo.VentaEstatusID == Cat.VentasEstatus.Completada)
                {
                    // Si se pagó, se genera una devolución
                    var oVentaV = Datos.GetEntity <VentasView>(c => c.VentaID == o9500.AnticipoVentaID);
                    if (oVentaV.Pagado > 0)
                    {
                        VentasProc.GenerarDevolucionDeEfectivo(oVentaV.VentaID, oVentaV.Pagado);
                    }

                    // Se cancela la venta del anticipo
                    oAnticipo.VentaEstatusID = (oVentaV.Pagado > 0 ? Cat.VentasEstatus.Cancelada : Cat.VentasEstatus.CanceladaSinPago);
                    Datos.Guardar <Venta>(oAnticipo);
                }
            }

            // Se borran las partes del 9500, si no han sido usadas
            foreach (var oParte in o9500Detalle)
            {
                // Se valida que la parte no haya sido usada en ventas
                if (Datos.Exists <VentaDetalle>(q => q.ParteID == oParte.ParteID))
                {
                    continue;
                }
                // Se valida que la parte no haya sido usada en almacén
                if (Datos.Exists <MovimientoInventarioDetalle>(q => q.ParteID == oParte.ParteID))
                {
                    continue;
                }
                // Se borra -> Deshabilitado hasta tener las validaciones del Almacén
                Guardar.EliminarParte(oParte.ParteID);
            }

            // Se verifica si hay autorizaciones, para borrarlas
            var oAuts = Datos.GetListOf <Autorizacion>(c => (c.AutorizacionProcesoID == Cat.AutorizacionesProcesos.c9500PrecioFueraDeRango ||
                                                             c.AutorizacionProcesoID == Cat.AutorizacionesProcesos.c9500SinAnticipo) && c.Tabla == Cat.Tablas.Tabla9500 && c.TablaRegistroID == i9500ID && c.Estatus);

            foreach (var oReg in oAuts)
            {
                oReg.Estatus = true;
                Datos.Guardar <Autorizacion>(oReg);
            }

            // Se cancela el 9500
            o9500.EstatusGenericoID = Cat.EstatusGenericos.CanceladoAntesDeVender;
            o9500.BajaUsuarioID     = iUsuarioID;
            o9500.BajaMotivo        = sMotivo;
            Datos.Guardar <Cotizacion9500>(o9500);
        }
예제 #8
0
파일: Guardar.cs 프로젝트: moisesiq/aupaga
        public static ResAcc ParteEquivalencia(int iParteID, int iParteIDEquivalente)
        {
            // Se obtiene el grupo de cualquiera de las partes
            var oParteEq1 = Datos.GetEntity <ParteEquivalente>(c => c.ParteID == iParteID);
            var oParteEq2 = Datos.GetEntity <ParteEquivalente>(c => c.ParteID == iParteIDEquivalente);
            // Si ninguna de las partes tiene grupo, se crea uno nuevo
            int iGrupoID = 0;

            if (oParteEq1 == null && oParteEq2 == null)
            {
                var oEquivalentes = Datos.GetListOf <ParteEquivalente>();
                iGrupoID = (oEquivalentes.Count > 0 ? oEquivalentes.Max(c => c.GrupoID) : 0);
                iGrupoID++;
            }
            else
            {
                iGrupoID = (oParteEq1 == null ? oParteEq2.GrupoID : oParteEq1.GrupoID);
            }

            // Se agrega la equivalencia de la parte 1, por si no existiera
            if (oParteEq1 == null)
            {
                oParteEq1 = new ParteEquivalente()
                {
                    GrupoID = iGrupoID, ParteID = iParteID
                };
                oParteEq1.RealizoUsuarioID = Theos.UsuarioID;
                Datos.Guardar <ParteEquivalente>(oParteEq1);
            }

            // Se agrega la equivalencia de la parte 2, según aplique
            if (oParteEq2 == null)
            {
                oParteEq2 = new ParteEquivalente()
                {
                    GrupoID = iGrupoID, ParteID = iParteIDEquivalente
                };
                oParteEq2.RealizoUsuarioID = Theos.UsuarioID;
                Datos.Guardar <ParteEquivalente>(oParteEq2);
            }

            // Se verifica si las dos ya tenían grupo, pero diferente, en cuyo caso todos se van a un mismo grupo
            if (oParteEq1.GrupoID != oParteEq2.GrupoID)
            {
                var oPartesEq2 = Datos.GetListOf <ParteEquivalente>(c => c.GrupoID == oParteEq2.GrupoID);
                foreach (var oEq in oPartesEq2)
                {
                    oEq.GrupoID          = oParteEq1.GrupoID;
                    oEq.RealizoUsuarioID = Theos.UsuarioID;
                    Datos.Guardar <ParteEquivalente>(oEq);
                }
            }

            return(new ResAcc(true));
        }
예제 #9
0
파일: Config.cs 프로젝트: moisesiq/aupaga
        public static Dictionary <string, string> ValoresVarios(int iSucursalID, string sLike)
        {
            var Res      = new Dictionary <string, string>();
            var oConfigs = Datos.GetListOf <Configuracion>(q => q.Nombre.Contains(sLike) && q.SucursalID == iSucursalID);

            foreach (var oConfig in oConfigs)
            {
                Res.Add(oConfig.Nombre, oConfig.Valor);
            }
            return(Res);
        }
예제 #10
0
        public static string VentaPagoVales(int iVentaPagoID)
        {
            string sVales = "";
            var    oDet   = Datos.GetListOf <VentaPagoDetalle>(c => c.VentaPagoID == iVentaPagoID && c.TipoFormaPagoID == Cat.FormasDePago.Vale && c.Estatus);

            foreach (var oReg in oDet)
            {
                sVales += string.Format(", {0}({1})", oReg.NotaDeCreditoID, oReg.Importe.ToString(Con.Formatos.Moneda));
            }
            sVales = (sVales == "" ? "" : sVales.Substring(2));
            return(sVales);
        }
예제 #11
0
        public static void EliminarPagosVenta(int iVentaID)
        {
            var oPagos = Datos.GetListOf <VentaPago>(c => c.VentaID == iVentaID && c.Estatus);

            foreach (var oPago in oPagos)
            {
                var oPagoDet = Datos.GetListOf <VentaPagoDetalle>(c => c.VentaPagoID == oPago.VentaPagoID && c.Estatus);
                foreach (var oPagoForma in oPagoDet)
                {
                    Datos.Eliminar <VentaPagoDetalle>(oPagoForma, true);
                }
                Datos.Eliminar <VentaPago>(oPago, true);
            }
        }
예제 #12
0
        public static List <string> InventarioUsuariosConteoPendiente()
        {
            var      oLista   = new List <string>();
            DateTime dHoy     = DateTime.Now.Date;
            var      oConteos = Datos.GetListOf <InventarioConteo>(c => c.Dia == dHoy && !c.Diferencia.HasValue)
                                .Select(c => new { UsuarioID = c.ConteoUsuarioID }).Distinct();
            var oUsuariosSuc = Datos.GetListOf <InventarioUsuario>(c => c.SucursalID == Theos.SucursalID);

            foreach (var oReg in oConteos)
            {
                if (oUsuariosSuc.Any(c => c.InvUsuarioID == oReg.UsuarioID))
                {
                    var oUsuario = Datos.GetEntity <Usuario>(c => c.UsuarioID == oReg.UsuarioID);
                    oLista.Add(oUsuario.NombreUsuario);
                }
            }
            return(oLista);
        }
예제 #13
0
        public static void CopiarPartesComplementariasDeEquivalentes(int iParteID)
        {
            var oPartesEq  = Datos.GetListOf <PartesEquivalentesView>(c => c.ParteID == iParteID);
            var oPartesCom = Datos.GetListOf <PartesComplementariasView>(c => c.ParteID == iParteID);

            foreach (var oParteEq in oPartesEq)
            {
                foreach (var oParteComp in oPartesCom)
                {
                    Guardar.ParteComplementaria(oParteEq.ParteIDEquivalente, oParteComp.ParteIDComplementaria);
                    // Se verifica si se debe guardar la forma inversa
                    if (Datos.Exists <ParteComplementaria>(c => c.ParteID == oParteComp.ParteIDComplementaria && c.ParteIDComplementaria == iParteID))
                    {
                        Guardar.ParteComplementaria(oParteComp.ParteIDComplementaria, oParteEq.ParteIDEquivalente);
                    }
                }
            }
        }
예제 #14
0
        public static ResAcc <bool> ValidarUsuarioPermisos(int iUsuarioID, List <string> oPermisos, bool bCumplirTodos)
        {
            var           oUsuarioPer = Datos.GetListOf <UsuariosPermisosView>(c => c.UsuarioID == iUsuarioID);
            bool          bCumplido;
            List <string> oNoCumplidos = new List <string>();

            foreach (string sPermiso in oPermisos)
            {
                bCumplido = false;
                // Se busca el permiso en la lista de permisos del usuario
                foreach (var oPermiso in oUsuarioPer)
                {
                    if (oPermiso.Permiso == sPermiso)
                    {
                        bCumplido = true;
                        break;
                    }
                }
                // Se verifica si el permiso actual se cumplió o no
                if (!bCumplido)
                {
                    oNoCumplidos.Add(sPermiso);
                }
            }

            // Se verifica si se cumplió la validación o no
            if (bCumplirTodos && oNoCumplidos.Count == 0)
            {
                return(new ResAcc <bool>(true));
            }
            else if (!bCumplirTodos && oNoCumplidos.Count < oPermisos.Count)
            {
                return(new ResAcc <bool>(true));
            }
            else
            {
                // Se obtiene el mensaje de error del primer permiso no cumplido
                string sPermiso = oNoCumplidos[0];
                var    oPermiso = Datos.GetEntity <Permiso>(c => c.NombrePermiso == sPermiso && c.Estatus);
                return(new ResAcc <bool>(false, oPermiso.MensajeDeError));
            }
        }
예제 #15
0
        public static void EliminarVenta(int iVentaID)
        {
            var oVenta = Datos.GetEntity <Venta>(q => q.VentaID == iVentaID && q.Estatus);

            // De momento sólo están contempladas las ventas que sólo han sido registradas. No cobradas, pagadas, canceladas
            if (oVenta.VentaEstatusID != Cat.VentasEstatus.Realizada)
            {
                return;
            }

            var oVentaDet = Datos.GetListOf <VentaDetalle>(q => q.VentaID == oVenta.VentaID && q.Estatus);

            // Se regresa la existencia y se borra el detalle de la venta
            foreach (var oParteDet in oVentaDet)
            {
                AdmonProc.AgregarExistencia(oParteDet.ParteID, oVenta.SucursalID, oParteDet.Cantidad, Cat.Tablas.Venta, iVentaID);
                Datos.Eliminar <VentaDetalle>(oParteDet, true);
            }
            // Se borra la venta en sí
            Datos.Eliminar <Venta>(oVenta, true);

            // Se borran los datos del kardex
            var oPartesKardex = Datos.GetListOf <ParteKardex>(c => c.OperacionID == Cat.OperacionesKardex.Venta && c.RelacionTabla == Cat.Tablas.Venta &&
                                                              c.RelacionID == iVentaID);

            foreach (var oReg in oVentaDet)
            {
                var oKardex = oPartesKardex.FirstOrDefault(c => c.ParteID == oReg.ParteID);
                if (oKardex == null)
                {
                    continue;
                }
                Datos.Eliminar <ParteKardex>(oKardex);
                // Se verifica si hubo algún otro movimiento en kardex de la misma parte, para hacer el reajuste
                var oDespues = Datos.GetListOf <ParteKardex>(c => c.ParteKardexID > oKardex.ParteKardexID && c.ParteID == oKardex.ParteID);
                foreach (var oRegD in oDespues)
                {
                    oRegD.ExistenciaNueva += (oKardex.Cantidad * -1);
                    Datos.Guardar <ParteKardex>(oRegD);
                }
            }
        }
예제 #16
0
        public static decimal VentaComisionCliente(int iVentaID, int iComisionistaID)
        {
            // Se calcula el importe de la comisión
            var oVentaDetalle = Datos.GetListOf <VentaDetalle>(q => q.VentaID == iVentaID && q.Estatus);
            var oComisionista = Datos.GetEntity <Cliente>(q => q.ClienteID == iComisionistaID && q.Estatus);

            if (oComisionista == null)
            {
                return(0);
            }

            decimal      mComision = 0;
            PreciosParte oPrecios;

            foreach (var ParteD in oVentaDetalle)
            {
                oPrecios   = new PreciosParte(ParteD.ParteID);
                mComision += (((ParteD.PrecioUnitario + ParteD.Iva) - oPrecios.ObtenerPrecio(oComisionista.ListaDePrecios)) * ParteD.Cantidad);
            }

            return(mComision);
        }
예제 #17
0
파일: Guardar.cs 프로젝트: moisesiq/aupaga
        public static ResAcc EliminarParte(int iParteID)
        {
            // Se borran los registros MaxMin
            var oMaxMins = Datos.GetListOf <ParteMaxMin>(q => q.ParteID == iParteID);

            foreach (var oParteMM in oMaxMins)
            {
                Datos.Eliminar <ParteMaxMin>(oParteMM, false);
            }

            // Se borran los registros de existencias
            var oExistencias = Datos.GetListOf <ParteExistencia>(q => q.ParteID == iParteID && q.Estatus);

            foreach (var oParteEx in oExistencias)
            {
                Datos.Eliminar <ParteExistencia>(oParteEx, true);
            }

            // Se borran los datos del precio
            var oPartePrecio = Datos.GetEntity <PartePrecio>(q => q.ParteID == iParteID && q.Estatus);

            if (oPartePrecio != null)
            {
                Datos.Eliminar <PartePrecio>(oPartePrecio, true);
            }

            // Se borra el registro de la parte
            var oParte = Datos.GetEntity <Parte>(q => q.ParteID == iParteID && q.Estatus);

            if (oParte != null)
            {
                Datos.Eliminar <Parte>(oParte, true);
            }

            return(new ResAcc(true));
        }
예제 #18
0
        public static ResAcc RecibirConteoInventario(int iUsuarioID, List <modConteoInventario> oConteo)
        {
            // Se obtiene la sucursal correspondiente a los conteos, pues debe ser la misma para todos
            if (oConteo.Count <= 0)
            {
                return(new ResAcc());
            }
            int iPrimerInvID = oConteo[0].InventarioLineaID;
            var oPrimerInv   = Datos.GetEntity <InventarioLinea>(c => c.InventarioLineaID == iPrimerInvID);
            int iSucursalID  = oPrimerInv.SucursalID;

            // Se registra lo del conteo
            oConteo = oConteo.OrderBy(c => c.InventarioLineaID).ToList();
            int iInventarioLineaID = 0;
            List <InventarioLinea>  oInvConteos      = new List <InventarioLinea>();
            InventarioLinea         oInventarioLinea = null;
            List <InventarioConteo> oDiferencias1    = new List <InventarioConteo>();
            List <InventarioConteo> oDiferencias2    = new List <InventarioConteo>();
            List <InventarioConteo> oDiferencias3    = new List <InventarioConteo>();

            foreach (var oReg in oConteo)
            {
                if (oReg.InventarioLineaID != iInventarioLineaID)
                {
                    oInventarioLinea = Datos.GetEntity <InventarioLinea>(c => c.InventarioLineaID == oReg.InventarioLineaID);
                    oInvConteos.Add(oInventarioLinea);
                    iInventarioLineaID = oReg.InventarioLineaID;
                }

                // Se obtiene el conteo y la existencia, para saber si hay diferencia
                var     oParteConteo = Datos.GetEntity <InventarioConteo>(c => c.InventarioConteoID == oReg.InventarioConteoID);
                var     oExistencia  = Datos.GetEntity <ParteExistencia>(c => c.ParteID == oParteConteo.ParteID && c.SucursalID == oInventarioLinea.SucursalID && c.Estatus);
                decimal mDiferencia  = (oReg.Conteo - oExistencia.Existencia.Valor());

                // Se evalua la diferencia
                oParteConteo.Valido = true;
                switch (oParteConteo.Revision)
                {
                case null:
                case Cat.InventarioConteosRevisiones.SinRevision:
                    if (mDiferencia != 0)
                    {
                        oDiferencias1.Add(oParteConteo);
                        oParteConteo.Valido = false;
                    }
                    break;

                case Cat.InventarioConteosRevisiones.Confirmacion:
                    var oParteConteoAnt = Datos.GetEntity <InventarioConteo>(c => c.InventarioLineaID == oParteConteo.InventarioLineaID && !c.Revision.HasValue);
                    if (oParteConteoAnt.Diferencia == mDiferencia)
                    {
                        oDiferencias3.Add(oParteConteo);
                    }
                    else
                    {
                        oDiferencias2.Add(oParteConteo);
                        oParteConteo.Valido = false;
                    }
                    break;

                case Cat.InventarioConteosRevisiones.ConfirmacionGerente:
                    if (mDiferencia != 0)
                    {
                        oDiferencias3.Add(oParteConteo);
                    }
                    break;
                }

                // Se guarda la diferencia
                oParteConteo.Diferencia = mDiferencia;
                Datos.Guardar <InventarioConteo>(oParteConteo);
            }

            // Se obtienen los usuarios para inventario de todas las sucursales
            var oUsuariosInv = Datos.GetListOf <InventarioUsuario>();

            // Se obtienen los usuario para inventario de la sucursal
            var oUsuariosSuc        = oUsuariosInv.Where(c => c.SucursalID == iSucursalID).ToList();
            int iCantidadPorUsuario = (oDiferencias1.Count / oUsuariosSuc.Count);
            // Se agregan los conteos para revisión 1 (de confirmación)
            int iUsuario = 0, iCantidad = 0;

            foreach (var oReg in oDiferencias1)
            {
                var oNuevoConteo = new InventarioConteo()
                {
                    InventarioLineaID = oReg.InventarioLineaID,
                    Dia             = DateTime.Now.AddDays(1),
                    ConteoUsuarioID = oUsuariosSuc[iUsuario].InvUsuarioID,
                    ParteID         = oReg.ParteID,
                    Revision        = Cat.InventarioConteosRevisiones.Confirmacion
                };
                Datos.Guardar <InventarioConteo>(oNuevoConteo);

                if (++iCantidad >= iCantidadPorUsuario)
                {
                    if (++iUsuario >= oUsuariosSuc.Count)
                    {
                        iUsuario = 0;
                    }
                }
            }

            // Se agregan los conteos para revisión 2 (confirmación del gerente)
            var oSucursal  = Datos.GetEntity <Sucursal>(c => c.SucursalID == iSucursalID && c.Estatus);
            int iGerenteID = oSucursal.GerenteID;

            foreach (var oReg in oDiferencias2)
            {
                var oNuevoConteo = new InventarioConteo()
                {
                    InventarioLineaID = oReg.InventarioLineaID,
                    Dia             = DateTime.Now,
                    ConteoUsuarioID = iGerenteID,
                    ParteID         = oReg.ParteID,
                    Revision        = Cat.InventarioConteosRevisiones.ConfirmacionGerente
                };
                Datos.Guardar <InventarioConteo>(oNuevoConteo);
            }

            // Se agregan los conteos para revisión 3 (otras sucursales si la existencia es 0)
            var oIndiceUsuarioSucursal = new Dictionary <int, int>();
            var oInvAbiertos           = new List <int>(); // Para marcar como incompletos los inventarios que se "abran" por meter un nuevo conteo tipo 3

            foreach (var oReg in oDiferencias3)
            {
                // Se valida si la existencia en otras sucursales es cero
                var oExistencias = Datos.GetListOf <ParteExistencia>(c => c.ParteID == oReg.ParteID && c.SucursalID != iSucursalID);
                foreach (var oExist in oExistencias)
                {
                    if (oExist.Existencia == 0)
                    {
                        // Para determinar el usuario al cual asignar
                        oUsuariosSuc = oUsuariosInv.Where(c => c.SucursalID == oExist.SucursalID).ToList();
                        if (!oIndiceUsuarioSucursal.ContainsKey(oExist.SucursalID))
                        {
                            oIndiceUsuarioSucursal.Add(oExist.SucursalID, 0);
                        }

                        var oNuevoConteo = new InventarioConteo()
                        {
                            InventarioLineaID = oReg.InventarioLineaID,
                            Dia             = DateTime.Now.AddDays(1),
                            ConteoUsuarioID = oUsuariosSuc[oIndiceUsuarioSucursal[oExist.SucursalID]].InvUsuarioID,
                            ParteID         = oReg.ParteID,
                            Revision        = Cat.InventarioConteosRevisiones.OtraSucursal
                        };
                        Datos.Guardar <InventarioConteo>(oNuevoConteo);

                        //
                        if (!oInvAbiertos.Contains(oReg.InventarioLineaID))
                        {
                            oInvAbiertos.Add(oReg.InventarioLineaID);
                        }

                        //
                        if (++oIndiceUsuarioSucursal[oExist.SucursalID] >= oUsuariosSuc.Count)
                        {
                            oIndiceUsuarioSucursal[oExist.SucursalID] = 0;
                        }
                    }
                }
            }
            // Se marcan como incompletos los inventarios abiertos por este proceso
            foreach (int iInvID in oInvAbiertos)
            {
                var oInv = Datos.GetEntity <InventarioLinea>(c => c.InventarioLineaID == iInvID);
                oInv.EstatusGenericoID = Cat.EstatusGenericos.EnRevision;
                oInv.FechaCompletado   = null;
                Datos.Guardar <InventarioLinea>(oInv);
            }

            // Se marcan como completado los inventarios ya concluidos, si hubiera
            foreach (var oReg in oInvConteos)
            {
                var oInvConteoV = Datos.GetEntity <InventarioLineasConteosView>(c => c.InventarioLineaID == oReg.InventarioLineaID);
                // Se valida si ya se completó el conteo
                if (oInvConteoV.PartesLinea > oInvConteoV.Conteo)
                {
                    continue;
                }
                else
                {
                    oReg.EstatusGenericoID = Cat.EstatusGenericos.Completada;
                    oReg.FechaCompletado   = DateTime.Now;
                }

                Datos.Guardar <InventarioLinea>(oReg);
            }

            return(new ResAcc());
        }
예제 #19
0
        /*
         * public static ResAcc<int> GenerarNotaDeCredito(int iClienteID, decimal mImporte, string sObservacion)
         * {
         *  return VentasProc.GenerarNotaDeCredito(iClienteID, mImporte, sObservacion, null);
         * }
         *
         * public static ResAcc<int> GenerarNotaDeCredito(int iClienteID, decimal mImporte, string sObservacion, int? iOrigenVentaID)
         * {
         *  DateTime dAhora = DateTime.Now;
         *
         *  // Se revisa si existen otras notas de crédito que se puedan usar para afectar ésta
         *  bool bNegativa = (mImporte < 0);
         *  var oNotas = General.GetListOf<NotaDeCredito>(q => q.ClienteID == iClienteID && q.Valida && q.Estatus).OrderByDescending(q => q.FechaDeEmision);
         *  foreach (var oNota in oNotas)
         *  {
         *      if ((bNegativa && oNota.Importe < 0) || (!bNegativa && oNota.Importe > 0))
         *          continue;
         *
         *      mImporte += oNota.Importe;
         *
         *      if ((bNegativa && mImporte <= 0) || (!bNegativa && mImporte >= 0))
         *      //
         *      {
         *          oNota.Valida = false;
         *          oNota.FechaDeUso = dAhora;
         *          oNota.Observacion += ("\n\n" + DateTime.Now.ToString() + "Nota cancelada por ser descontada al agregar otra nota con un importe mayor.");
         *          Datos.Guardar<NotaDeCredito>(oNota);
         *          // Se debe imprimir algo aquí ?
         *
         *          // Si ya se emparejó la cantidad, se sale
         *          if (mImporte == 0)
         *              return new ResAcc<int>(true, "");
         *      }
         *      else
         *      //
         *      {
         *          oNota.Importe += (mImporte * -1);
         *          Datos.Guardar<NotaDeCredito>(oNota);
         *          // Se debe imprimir algo aquí ?
         *
         *          // Se sale, pues ya no hay importe para afectar
         *          return new ResAcc<int>(true, "");
         *      }
         *  }
         *
         *  // Se crea la nota
         *  var oNotaNueva = new NotaDeCredito()
         *  {
         *      FechaDeEmision = DateTime.Now,
         *      Importe = mImporte,
         *      ClienteID = iClienteID,
         *      Valida = true,
         *      Observacion = sObservacion,
         *      OrigenVentaID = iOrigenVentaID
         *  };
         *  Datos.Guardar<NotaDeCredito>(oNotaNueva);
         *
         *  // Se imprime el ticket correspondiente
         *
         *
         *  return new ResAcc<int>(true, oNotaNueva.NotaDeCreditoID);
         * }
         */

        #region [ Vales ]

        public static ResAcc <int> GenerarNotaDeCredito(int iClienteID, decimal mImporte, string sObservacion, int iOrigenID, int iRelacionID)
        {
            DateTime dAhora = DateTime.Now;

            // Se revisa si existen otras notas de crédito que se puedan usar para afectar ésta
            bool bNegativa = (mImporte < 0);
            var  oNotas    = Datos.GetListOf <NotaDeCredito>(q => q.ClienteID == iClienteID && q.Valida && q.Estatus).OrderByDescending(q => q.FechaDeEmision);

            foreach (var oNota in oNotas)
            {
                if ((bNegativa && oNota.Importe < 0) || (!bNegativa && oNota.Importe > 0))
                {
                    continue;
                }

                mImporte += oNota.Importe;

                if ((bNegativa && mImporte <= 0) || (!bNegativa && mImporte >= 0))
                //
                {
                    oNota.Valida       = false;
                    oNota.FechaDeUso   = dAhora;
                    oNota.Observacion += ("\n\n" + DateTime.Now.ToString() + "Nota cancelada por ser descontada al agregar otra nota con un importe mayor.");
                    Datos.Guardar <NotaDeCredito>(oNota);
                    // Se debe imprimir algo aquí ?

                    // Si ya se emparejó la cantidad, se sale
                    if (mImporte == 0)
                    {
                        return(new ResAcc <int>(true, ""));
                    }
                }
                else
                //
                {
                    oNota.Importe += (mImporte * -1);
                    Datos.Guardar <NotaDeCredito>(oNota);
                    // Se debe imprimir algo aquí ?

                    // Se sale, pues ya no hay importe para afectar
                    return(new ResAcc <int>(true, ""));
                }
            }

            // Se crea la nota
            var oNotaNueva = new NotaDeCredito()
            {
                FechaDeEmision = DateTime.Now,
                SucursalID     = Theos.SucursalID,
                Importe        = mImporte,
                ClienteID      = iClienteID,
                Valida         = true,
                Observacion    = sObservacion,
                OrigenID       = iOrigenID,
                RelacionID     = iRelacionID
            };

            Datos.Guardar <NotaDeCredito>(oNotaNueva);

            // Se imprime el ticket correspondiente


            return(new ResAcc <int>(true, oNotaNueva.NotaDeCreditoID));
        }
예제 #20
0
        public static string GenerarFormaDePago(int iVentaID)
        {
            var oVentasP = Datos.GetListOf <VentasPagosDetalleView>(q => q.VentaID == iVentaID);

            return(VentasProc.GenerarFormaDePago(oVentasP));
        }
예제 #21
0
        public static string VentaPagoFormasDePago(int iVentaPagoID)
        {
            var oPagos = Datos.GetListOf <VentaPagoDetalle>(q => q.VentaPagoID == iVentaPagoID && q.Estatus);

            return(UtilDatos.VentaPagoFormasDePago(oPagos));
        }
예제 #22
0
파일: Guardar.cs 프로젝트: moisesiq/aupaga
        public static ResAcc VentaPago(VentaPago oPago, List <VentaPagoDetalle> Detalle)
        {
            // Se generan datos predeterminados o globales, en caso de que apliquen
            oPago.Fecha      = (oPago.Fecha != DateTime.MinValue ? oPago.Fecha : DateTime.Now);
            oPago.SucursalID = (oPago.SucursalID > 0 ? oPago.SucursalID : Theos.SucursalID);

            // Se guarda el pago
            Datos.Guardar <VentaPago>(oPago);

            // Se guarda el detalle
            var oVentaV = Datos.GetEntity <VentasView>(q => q.VentaID == oPago.VentaID);

            foreach (var PartePago in Detalle)
            {
                PartePago.VentaPagoID = oPago.VentaPagoID;
                Datos.Guardar <VentaPagoDetalle>(PartePago);

                // Se afectan las notas de crédito, si hay alguna
                if (PartePago.TipoFormaPagoID == Cat.FormasDePago.Vale && PartePago.Importe > 0)
                {
                    int iNotaID = PartePago.NotaDeCreditoID.Valor();
                    var oNota   = Datos.GetEntity <NotaDeCredito>(q => q.NotaDeCreditoID == iNotaID && q.Estatus);
                    if (oNota != null)
                    {
                        // Se verifica si se usó el importe total o sólo una parte
                        if (PartePago.Importe < oNota.Importe)
                        {
                            // Se crea una nueva nota, con el importe restante
                            // 25/11/2015 - Se busca el vale original para usarlo como origen de todas las notas derivadas, en vez de el OrigenVentaID que se mandaba antes
                            int iOrigenValeID = (oNota.OrigenID == Cat.OrigenesNotaDeCredito.ImporteRestante ? oNota.RelacionID.Valor() : oNota.NotaDeCreditoID);
                            VentasProc.GenerarNotaDeCredito(oNota.ClienteID, (oNota.Importe - PartePago.Importe), "", Cat.OrigenesNotaDeCredito.ImporteRestante
                                                            , iOrigenValeID);
                            //
                            oNota.Importe = PartePago.Importe;
                        }
                        //
                        oNota.Valida     = false;
                        oNota.FechaDeUso = DateTime.Now;
                        oNota.UsoVentaID = oPago.VentaID;
                        Datos.Guardar <NotaDeCredito>(oNota);
                    }
                }

                // Si es un pago bancario, se genera el movimiento correspondiente
                if (PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || PartePago.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito ||
                    PartePago.TipoFormaPagoID == Cat.FormasDePago.Transferencia || PartePago.TipoFormaPagoID == Cat.FormasDePago.Cheque)
                {
                    var oBanco = Datos.GetEntity <Banco>(c => c.BancoID == PartePago.BancoID && c.Estatus);

                    var oMovBanc = new BancoCuentaMovimiento()
                    {
                        // BancoCuentaID = (PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta ? (int?)Cat.CuentasBancarias.Banamex : null),
                        EsIngreso     = true,
                        Fecha         = oPago.Fecha,
                        FechaAsignado = ((PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || PartePago.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito)
                            ? (DateTime?)oPago.Fecha : null),
                        SucursalID      = oPago.SucursalID,
                        Importe         = PartePago.Importe,
                        Concepto        = oVentaV.Cliente,
                        Referencia      = oVentaV.Folio,
                        TipoFormaPagoID = PartePago.TipoFormaPagoID,
                        DatosDePago     = string.Format("{0}-{1}-{2}", oBanco.NombreBanco, PartePago.Folio, PartePago.Cuenta),
                        RelacionTabla   = Cat.Tablas.VentaPagoDetalle,
                        RelacionID      = PartePago.VentaPagoDetalleID,
                    };
                    ContaProc.RegistrarMovimientoBancario(oMovBanc);
                }
            }

            // Se verifica el estatus de la venta, por si debe cambiar según el pago
            if (oVentaV.VentaEstatusID == Cat.VentasEstatus.Cobrada)
            {
                // Se obtiene el total de los pagos
                decimal mPagado = Datos.GetListOf <VentasPagosView>(q => q.VentaID == oVentaV.VentaID).Sum(q => q.Importe);
                if (mPagado >= oVentaV.Total)
                {
                    var oVenta = Datos.GetEntity <Venta>(q => q.Estatus && q.VentaID == oPago.VentaID);
                    oVenta.VentaEstatusID = Cat.VentasEstatus.Completada;
                    // Se guarda con el nuevo estatus
                    Datos.Guardar <Venta>(oVenta);
                }
            }

            return(new ResAcc(true));
        }