コード例 #1
0
        private double CosteoOrdenProduccion(Common.Models.Contabilidad.CostoProduccion costoProduccion, OrdenProduccion ordenProduccion, ApplicationDbContext context)
        {
            double costeoOrdenProduccion = 0;

            foreach (var ordenProduccionInsumo in ordenProduccion.OrdenProduccionInsumos)
            {
                var kardexMovimientoId = (from rd in context.RecepcionDetalles
                                          join km in context.KardexMovimientos on rd.RecepcionDetalleId equals km.RecepcionDetalleId
                                          where rd.OrdenProduccionInsumoId == ordenProduccionInsumo.OrdenProduccionInsumoId
                                          select km.KardexMovimientoId)
                                         .FirstOrDefault();
                var costoProduccionMovimiento = context.CostoProduccionMovimientos
                                                .Where(o => o.KardexMovimientoId == kardexMovimientoId)
                                                .FirstOrDefault();

                if (costoProduccionMovimiento != null)
                {
                    costeoOrdenProduccion += costoProduccionMovimiento.Costo;
                }
                else
                {
                    var kardexMovimiento = context.KardexMovimientos.FirstOrDefault(o => o.KardexMovimientoId == kardexMovimientoId);
                    costeoOrdenProduccion += CosteoKardexMovimiento(costoProduccion, kardexMovimiento, context);
                }
            }

            return(costeoOrdenProduccion);
        }
コード例 #2
0
 private void ProcesarMp(Common.Models.Contabilidad.CostoProduccion costoProduccion)
 {
     foreach (var costOrdenProduccionViewModel in ViewModel.CostoOrdenProduccionViewModels)
     {
         ProcesaInsumos(costoProduccion, fechaInicioDateTimePicker.Value, fechaFinDateTimePicker.Value);
         ProcesaIntermedios(ViewModel.FechaInicio, ViewModel.FechaFin);
         ProcesaTerminados(ViewModel.FechaInicio, ViewModel.FechaFin);
         CosteaMercaderia(costoProduccion, costOrdenProduccionViewModel.CodigoMercaderia, ViewModel.FechaInicio, ViewModel.FechaFin);
     }
 }
コード例 #3
0
        private void ProcesaInsumos(Common.Models.Contabilidad.CostoProduccion costoProduccion, DateTime fechaInicio, DateTime fechaFin)
        {
            using (var context = new ApplicationDbContext())
            {
                var tipoMercaderia = context.TipoMercaderias
                                     .Where(o => o.Codigo == "INS")
                                     .FirstOrDefault();
                var mercaderias = (from k in context.KardexMovimientos
                                   where k.Mercaderia.TipoMercaderiaId == tipoMercaderia.TipoMercaderiaId &&
                                   k.Fecha >= fechaInicio && k.Fecha <= fechaFin
                                   group k by k.MercaderiaId into g
                                   select g.FirstOrDefault().Mercaderia).ToList();

                foreach (var mercaderia in mercaderias)
                {
                    CosteaMercaderia(costoProduccion, mercaderia.MercaderiaId, fechaInicio, fechaFin);
                }
            }
        }
コード例 #4
0
        private double CosteoKardexMovimiento(Common.Models.Contabilidad.CostoProduccion costoProduccion, KardexMovimiento kardexMovimiento, ApplicationDbContext context)
        {
            double costoMovimientoDetalle = 0;

            switch (kardexMovimiento.TipoMovimiento.Codigo)
            {
            case "ENT":
                var recepcion = context.RecepcionDetalles
                                .FirstOrDefault(o => o.RecepcionDetalleId == kardexMovimiento.RecepcionDetalleId)
                                .Recepcion;
                //Orden de Produccion
                if (!string.IsNullOrEmpty(recepcion.OrdenProduccionId))
                {
                    var ordenProduccion = context.OrdenProduccions
                                          .Where(o => o.OrdenProduccionId == recepcion.OrdenProduccionId)
                                          .FirstOrDefault();
                    costoMovimientoDetalle = CosteoOrdenProduccion(costoProduccion, ordenProduccion, context);
                }
                //Compra
                if (!string.IsNullOrEmpty(recepcion.CompraId))
                {
                    var compraDetalle = context.CompraDetalles
                                        .Where(o => o.CompraDetalleId == kardexMovimiento.RecepcionDetalle.CompraDetalleId)
                                        .FirstOrDefault();
                    costoMovimientoDetalle = compraDetalle.PrecioTotal;
                }
                break;

            case "SAL":
                CosteaMercaderia(costoProduccion, kardexMovimiento.MercaderiaId, fechaInicioDateTimePicker.Value, kardexMovimiento.Fecha);
                costoMovimientoDetalle = context.CostoProduccionMovimientos
                                         .FirstOrDefault(o => o.KardexMovimientoId == kardexMovimiento.KardexMovimientoId)
                                         .Costo;
                break;
            }
            return(costoMovimientoDetalle);
        }
コード例 #5
0
        private void CosteaMercaderia(Common.Models.Contabilidad.CostoProduccion costoProduccion, string mercaderiaId, DateTime fechaInicio, DateTime fechaFin)
        {
            using (var context = new ApplicationDbContext())
            {
                var mercaderiaMovimientoViewModel
                    = MercaderiaMovimientoViewModel.CargarMovimientoMercaderia(fechaInicio.AddDays(-1), mercaderiaId);

                //detalle de recepciones en fecha
                var recepcionDetalleIds = from r in context.Recepcions
                                          join d in context.RecepcionDetalles on r.RecepcionId equals d.RecepcionId
                                          where r.Fecha >= fechaInicio && r.Fecha <= fechaFin
                                          select d.RecepcionDetalleId;
                //detalle de despachos en fecha
                var despachoDetalleIds = from r in context.Despachos
                                         join d in context.DespachoDetalles
                                         on r.DespachoId equals d.DespachoId
                                         where r.Fecha >= fechaInicio && r.Fecha <= fechaFin
                                         select d.DespachoDetalleId;
                //movimientos asociados ordenados por fecha y tipo de movimiento
                var kardexMovimientos = context.KardexMovimientos
                                        .Where(o => recepcionDetalleIds.Contains(o.RecepcionDetalleId) ||
                                               despachoDetalleIds.Contains(o.DespachoDetalleId))
                                        .OrderBy(o => o.Fecha)
                                        .ThenBy(o => o.TipoMovimiento.Codigo)
                                        .ToList();

                double cantidadAcumulada        = mercaderiaMovimientoViewModel.SaldoActual;
                double cantidadAcumuladaEntrada = mercaderiaMovimientoViewModel.SaldoActual;
                double costoAcumulado           = mercaderiaMovimientoViewModel.CostoActual;
                double costoUnitarioPromedio    = mercaderiaMovimientoViewModel.CostoActual / mercaderiaMovimientoViewModel.SaldoActual;
                double costoMovimiento          = 0;
                double costoUnitarioMovimiento  = 0;

                foreach (var kardexMovimiento in kardexMovimientos)
                {
                    var costoProduccionMovimiento = context.CostoProduccionMovimientos
                                                    .Where(o => o.KardexMovimientoId == kardexMovimiento.KardexMovimientoId)
                                                    .FirstOrDefault();

                    switch (kardexMovimiento.TipoMovimiento.Codigo)
                    {
                    case "ENT":
                        cantidadAcumulada        += kardexMovimiento.Cantidad;
                        cantidadAcumuladaEntrada += kardexMovimiento.Cantidad;

                        if (costoProduccionMovimiento == null)
                        {
                            costoMovimiento         = CosteoKardexMovimiento(costoProduccion, kardexMovimiento, context);
                            costoUnitarioMovimiento = costoMovimiento / kardexMovimiento.Cantidad;
                            costoAcumulado         += costoMovimiento;
                            costoUnitarioPromedio   = costoAcumulado / cantidadAcumulada;

                            //Se graba el costo del movimiento
                            var costoProduccionMovimientodb = new CostoProduccionMovimiento
                            {
                                CostoProduccionId     = costoProduccion.CostoProduccionId,
                                KardexMovimientoId    = kardexMovimiento.KardexMovimientoId,
                                CostoMp               = costoMovimiento,
                                CostoUnitario         = costoUnitarioMovimiento,
                                CostoUnitarioPromedio = costoUnitarioPromedio
                            };
                            context.CostoProduccionMovimientos.Add(costoProduccionMovimientodb);
                            context.SaveChanges();
                        }
                        else
                        {
                            costoMovimiento         = costoProduccionMovimiento.Costo;
                            costoUnitarioMovimiento = costoProduccionMovimiento.CostoUnitario;
                            costoAcumulado         += costoProduccionMovimiento.Costo;
                            costoUnitarioPromedio   = costoAcumulado / cantidadAcumulada;

                            //Se valida que coincidan los costos promedios por si hubo cambios
                            if (costoUnitarioPromedio != costoProduccionMovimiento.CostoUnitarioPromedio)
                            {
                                costoProduccionMovimiento.CostoUnitarioPromedio = costoUnitarioPromedio;
                                context.Entry(costoProduccionMovimiento).State  = EntityState.Modified;
                                context.SaveChanges();
                            }
                        }
                        break;

                    case "SAL":
                        cantidadAcumulada        -= kardexMovimiento.Cantidad;
                        cantidadAcumuladaEntrada += kardexMovimiento.Cantidad;
                        costoMovimiento           = costoUnitarioPromedio * kardexMovimiento.Cantidad;
                        costoUnitarioMovimiento   = costoUnitarioPromedio;
                        costoAcumulado           -= costoMovimiento;

                        if (costoProduccionMovimiento == null)
                        {
                            //Se graba el costo del movimiento
                            var costoProduccionMovimientodb = new CostoProduccionMovimiento
                            {
                                CostoProduccionId     = costoProduccion.CostoProduccionId,
                                KardexMovimientoId    = kardexMovimiento.KardexMovimientoId,
                                CostoMp               = costoMovimiento,
                                CostoUnitario         = costoUnitarioMovimiento,
                                CostoUnitarioPromedio = costoUnitarioPromedio
                            };
                            context.CostoProduccionMovimientos.Add(costoProduccionMovimientodb);
                            context.SaveChanges();
                        }
                        else
                        {
                            //Se valida que coincidan los costos promedios por si hubo cambios
                            if (costoUnitarioPromedio != costoProduccionMovimiento.CostoUnitarioPromedio)
                            {
                                costoProduccionMovimiento.CostoMp               = costoMovimiento;
                                costoProduccionMovimiento.CostoUnitario         = costoUnitarioMovimiento;
                                costoProduccionMovimiento.CostoUnitarioPromedio = costoUnitarioPromedio;
                                context.Entry(costoProduccionMovimiento).State  = EntityState.Modified;
                                context.SaveChanges();
                            }
                        }
                        break;
                    }
                }
            }
        }