public void RecalculateCostByNullification( ref Sadara.Models.V1.POCO.Kardex currentPostItemKardex, ref Sadara.Models.V1.POCO.Kardex itemKardexToRemove, ref Sadara.Models.V1.Database.CodeFirst db, ref decimal accumulatedCostToDebit, ref decimal accumulatedCostToAcredit ) { string serieId = currentPostItemKardex.IDSERIE; string nDocumento = currentPostItemKardex.N_DOCUMENTO; string existenciaId = currentPostItemKardex.IDEXISTENCIA; switch (currentPostItemKardex.OPERACION) { case "COMPRA CONTADO": case "COMPRA CREDITO": this.RecalculateQuantityToDebit(ref currentPostItemKardex, ref itemKardexToRemove, ref accumulatedCostToDebit, ref accumulatedCostToAcredit); break; case "VENTA CONTADO": case "VENTA CREDITO": this.RecalculateQuantityToAcredit(ref currentPostItemKardex, ref itemKardexToRemove, ref accumulatedCostToDebit, ref accumulatedCostToAcredit, true); var saleDetail = (from c in db.Ventas join d in db.VentasDetalles on c.IDVENTA equals d.IDVENTA where c.IDSERIE == serieId && c.CONSECUTIVO == nDocumento && d.IDEXISTENCIA == existenciaId select d).FirstOrDefault(); if (saleDetail != null) { //aquí se calcula el costo if (saleDetail.CMONEDA.Equals(this.CordobaLabel)) { saleDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO : currentPostItemKardex.COSTO_PROMEDIO * currentPostItemKardex.TAZACAMBIO); } else { saleDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO / currentPostItemKardex.TAZACAMBIO : currentPostItemKardex.COSTO_PROMEDIO); } db.Entry(saleDetail).State = EntityState.Modified; } break; case "ENTRADA": this.RecalculateQuantityToDebit(ref currentPostItemKardex, ref itemKardexToRemove, ref accumulatedCostToDebit, ref accumulatedCostToAcredit, true); var entryDetail = (from c in db.Entradas join d in db.EntradasDetalles on c.IDENTRADA equals d.IDENTRADA where c.IDSERIE == serieId && c.CONSECUTIVO == nDocumento && d.IDEXISTENCIA == existenciaId select d).FirstOrDefault(); if (entryDetail != null) { //aquí se calcula el costo if (entryDetail.CMONEDA.Equals(this.CordobaLabel)) { entryDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO : currentPostItemKardex.COSTO_PROMEDIO * currentPostItemKardex.TAZACAMBIO); } else { entryDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO / currentPostItemKardex.TAZACAMBIO : currentPostItemKardex.COSTO_PROMEDIO); } db.Entry(entryDetail).State = EntityState.Modified; } break; case "SALIDA": this.RecalculateQuantityToAcredit(ref currentPostItemKardex, ref itemKardexToRemove, ref accumulatedCostToDebit, ref accumulatedCostToAcredit, true); var outputDetail = (from c in db.Salidas join d in db.SalidasDetalles on c.IDSALIDA equals d.IDSALIDA where c.IDSERIE == serieId && c.CONSECUTIVO == nDocumento && d.IDEXISTENCIA == existenciaId select d).FirstOrDefault(); if (outputDetail != null) { //aquí se calcula el costo if (outputDetail.CMONEDA.Equals(this.CordobaLabel)) { outputDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO : currentPostItemKardex.COSTO_PROMEDIO * currentPostItemKardex.TAZACAMBIO); } else { outputDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO / currentPostItemKardex.TAZACAMBIO : currentPostItemKardex.COSTO_PROMEDIO); } db.Entry(outputDetail).State = EntityState.Modified; } break; case "TRASLADO": if (currentPostItemKardex.DEBER > 0) { this.RecalculateQuantityToDebit(ref currentPostItemKardex, ref itemKardexToRemove, ref accumulatedCostToDebit, ref accumulatedCostToAcredit, true); } if (currentPostItemKardex.HABER > 0) { this.RecalculateQuantityToAcredit(ref currentPostItemKardex, ref itemKardexToRemove, ref accumulatedCostToDebit, ref accumulatedCostToAcredit, true); } var transferDetail = (from c in db.Traslados join d in db.TrasladosDetalles on c.IDTRASLADO equals d.IDTRASLADO where c.IDSERIE == serieId && c.CONSECUTIVO == nDocumento && d.IDEXISTENCIA == existenciaId select d).FirstOrDefault(); if (transferDetail != null) { //aquí se calcula el costo if (transferDetail.CMONEDA.Equals(this.CordobaLabel)) { transferDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO : currentPostItemKardex.COSTO_PROMEDIO * currentPostItemKardex.TAZACAMBIO); } else { transferDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO / currentPostItemKardex.TAZACAMBIO : currentPostItemKardex.COSTO_PROMEDIO); } db.Entry(transferDetail).State = EntityState.Modified; } break; case "DEVOLUCION VENTA": this.RecalculateQuantityToDebit(ref currentPostItemKardex, ref itemKardexToRemove, ref accumulatedCostToDebit, ref accumulatedCostToAcredit, true); var saleReturnDetail = (from c in db.VentasDevoluciones join d in db.VentasDevolucionesDetalles on c.IDDEVOLUCION equals d.IDDEVOLUCION where c.IDSERIE == serieId && c.CONSECUTIVO == nDocumento && d.IDEXISTENCIA == existenciaId select d).FirstOrDefault(); if (saleReturnDetail != null) { //aquí se calcula el costo if (saleReturnDetail.CMONEDA.Equals(this.CordobaLabel)) { saleReturnDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO : currentPostItemKardex.COSTO_PROMEDIO * currentPostItemKardex.TAZACAMBIO); } else { saleReturnDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO / currentPostItemKardex.TAZACAMBIO : currentPostItemKardex.COSTO_PROMEDIO); } db.Entry(saleReturnDetail).State = EntityState.Modified; } break; case "DEVOLUCION COMPRA": this.RecalculateQuantityToAcredit(ref currentPostItemKardex, ref itemKardexToRemove, ref accumulatedCostToDebit, ref accumulatedCostToAcredit, true); var purchaseReturnDetail = (from c in db.ComprasDevoluciones join d in db.ComprasDevolucionesDetalles on c.IDDEVOLUCION equals d.IDDEVOLUCION where c.IDSERIE == serieId && c.CONSECUTIVO == nDocumento && d.IDEXISTENCIA == existenciaId select d).FirstOrDefault(); if (purchaseReturnDetail != null) { //aquí se calcula el costo if (purchaseReturnDetail.CMONEDA.Equals(this.CordobaLabel)) { purchaseReturnDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO : currentPostItemKardex.COSTO_PROMEDIO * currentPostItemKardex.TAZACAMBIO); } else { purchaseReturnDetail.COSTO = (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.COSTO_PROMEDIO / currentPostItemKardex.TAZACAMBIO : currentPostItemKardex.COSTO_PROMEDIO); } db.Entry(purchaseReturnDetail).State = EntityState.Modified; } break; } }
private void RecalculateQuantityToAcredit( ref Sadara.Models.V1.POCO.Kardex currentPostItemKardex, ref Sadara.Models.V1.POCO.Kardex itemKardexToRemove, ref decimal accumulatedCostToDebit, ref decimal accumulatedCostToAcredit, Boolean withAverageCost = false ) { if (currentPostItemKardex.EXISTENCIA_ALMACEN == 0) { currentPostItemKardex.SALDO = 0; currentPostItemKardex.COSTO_PROMEDIO = 0; } else { var quantityOfMoney = itemKardexToRemove.DEBER > 0 ? itemKardexToRemove.DEBER * -1 : itemKardexToRemove.HABER; var typeMovement = currentPostItemKardex.DEBER > 0 ? true : false; if (CurrencyOfProducts.Equals(itemKardexToRemove.CMONEDA)) { if (withAverageCost) { currentPostItemKardex.SALDO = currentPostItemKardex.SALDO + quantityOfMoney + currentPostItemKardex.HABER; currentPostItemKardex.COSTO_PROMEDIO = currentPostItemKardex.EXISTENCIA_ANTERIOR == 0 ? currentPostItemKardex.SALDO / currentPostItemKardex.EXISTENCIA_ANTERIOR : currentPostItemKardex.COSTO_PROMEDIO; currentPostItemKardex.COSTO = currentPostItemKardex.COSTO_PROMEDIO; currentPostItemKardex.HABER = currentPostItemKardex.SALIDA * currentPostItemKardex.COSTO_PROMEDIO; currentPostItemKardex.SALDO = currentPostItemKardex.SALDO - currentPostItemKardex.HABER; } else { currentPostItemKardex.SALDO = currentPostItemKardex.SALDO + quantityOfMoney; currentPostItemKardex.COSTO_PROMEDIO = currentPostItemKardex.SALDO / currentPostItemKardex.EXISTENCIA_ALMACEN; } } else { if (itemKardexToRemove.CMONEDA.Equals(this.CordobaLabel)) { if (withAverageCost) { currentPostItemKardex.SALDO = currentPostItemKardex.SALDO + (quantityOfMoney / itemKardexToRemove.TAZACAMBIO) + (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.HABER / currentPostItemKardex.TAZACAMBIO : currentPostItemKardex.HABER); currentPostItemKardex.COSTO_PROMEDIO = currentPostItemKardex.EXISTENCIA_ANTERIOR == 0 ?currentPostItemKardex.SALDO / (currentPostItemKardex.EXISTENCIA_ANTERIOR) : currentPostItemKardex.COSTO_PROMEDIO; currentPostItemKardex.COSTO = currentPostItemKardex.COSTO_PROMEDIO; currentPostItemKardex.HABER = (currentPostItemKardex.SALIDA * currentPostItemKardex.COSTO_PROMEDIO) * currentPostItemKardex.TAZACAMBIO; currentPostItemKardex.SALDO = currentPostItemKardex.SALDO - (currentPostItemKardex.HABER / currentPostItemKardex.TAZACAMBIO); } else { currentPostItemKardex.SALDO = currentPostItemKardex.SALDO + (quantityOfMoney / itemKardexToRemove.TAZACAMBIO); currentPostItemKardex.COSTO_PROMEDIO = currentPostItemKardex.SALDO / currentPostItemKardex.EXISTENCIA_ALMACEN; } } else { if (withAverageCost) { currentPostItemKardex.SALDO = currentPostItemKardex.SALDO + (itemKardexToRemove.HABER * itemKardexToRemove.TAZACAMBIO) + (currentPostItemKardex.CMONEDA.Equals(this.CordobaLabel) ? currentPostItemKardex.HABER : currentPostItemKardex.HABER * currentPostItemKardex.TAZACAMBIO); currentPostItemKardex.COSTO_PROMEDIO = currentPostItemKardex.EXISTENCIA_ANTERIOR == 0 ? currentPostItemKardex.SALDO / currentPostItemKardex.EXISTENCIA_ANTERIOR : currentPostItemKardex.COSTO_PROMEDIO; currentPostItemKardex.COSTO = currentPostItemKardex.COSTO_PROMEDIO; currentPostItemKardex.HABER = (currentPostItemKardex.SALIDA * currentPostItemKardex.COSTO_PROMEDIO) / currentPostItemKardex.TAZACAMBIO; currentPostItemKardex.SALDO = currentPostItemKardex.SALDO - (currentPostItemKardex.HABER * currentPostItemKardex.TAZACAMBIO); } else { currentPostItemKardex.SALDO = currentPostItemKardex.SALDO + (quantityOfMoney * itemKardexToRemove.TAZACAMBIO); currentPostItemKardex.COSTO_PROMEDIO = currentPostItemKardex.SALDO / currentPostItemKardex.EXISTENCIA_ALMACEN; } } } } }