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); }
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); } }
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); } } }
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); }
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; } } } }