public void Insertar(INCIDENCIA incidencia, List <EXT_RECEPCION_PRODUCTOS_B> recepcion_productos, string _id_usuario, FormaEntradaOrden formaEntradaOrden) { try { using (TransactionScope transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted })) { var secuencia_incidencia = GetSequence <int>("INCIDENCIA_SEQ"); incidencia.ID_INCIDENCIA = secuencia_incidencia; foreach (var item in recepcion_productos) { if (item.INCIDENCIA_TIPO != null) //Si el articulo esta marcado como rechazado { incidencia.INCIDENCIA_PRODUCTO.Add(new INCIDENCIA_PRODUCTO { CANTIDAD = item.ORDENADO, ID_ALMACEN_GRUPO = item.INCIDENCIA_TIPO.ID_ALMACEN_GRUPO, ID_TIPO_INCIDENCIA = item.INCIDENCIA_TIPO.ID_TIPO_INCIDENCIA, ID_PRODUCTO = item.ID_PRODUCTO, OBSERV = item.INCIDENCIA_OBSERVACIONES }); } //como todos los articulos se regresan, se eliminan de en transito y se mueven a no en transito. var orden_compra_detalle = Context.ORDEN_COMPRA_DETALLE.FirstOrDefault(w => w.ID_ALMACEN == incidencia.ID_ALMACEN && w.ID_ORDEN_COMPRA == incidencia.ID_ORDEN_COMPRA && w.ID_PRODUCTO == item.ID_PRODUCTO); orden_compra_detalle.CANTIDAD_TRANSITO -= item.ORDENADO; orden_compra_detalle.DIFERENCIA += item.ORDENADO; } Context.INCIDENCIA.Add(incidencia); Context.SaveChanges(); var incidencia_fecha = incidencia.FECHA.Value.Date; var calendarizar_entrega = Context.CALENDARIZAR_ENTREGA.FirstOrDefault(w => w.FEC_PACTADA == incidencia_fecha && w.ID_ALMACEN == incidencia.ID_ALMACEN && w.ID_ORDEN_COMPRA == incidencia.ID_ORDEN_COMPRA); if (formaEntradaOrden == FormaEntradaOrden.EntradaCalendarizada && calendarizar_entrega == null) { throw new Exception("La calendarizacion programada de esta entrega fue eliminada durante el proceso. Favor de avisar al administrador"); //si fue una orden calendarizada, aventar excepcion si esta nula } if (calendarizar_entrega != null) { calendarizar_entrega.ESTATUS = "RE"; //aunque se haya rechazado la entrega, el proveedor si llego en fecha //Cambiar estatus de los campos de la calendarizacion del producto foreach (var item in recepcion_productos) { var calendarizar_entrega_producto = calendarizar_entrega.CALENDARIZAR_ENTREGA_PRODUCTO.First(f => f.ID_PRODUCTO == item.ID_PRODUCTO && f.ESTATUS == "PR"); calendarizar_entrega_producto.ESTATUS = "RC"; //como se rechaza toda la orden se tiene que rechazar todos los productos if (item.INCIDENCIA_TIPO != null) //Si el articulo esta marcado con una incidencia { calendarizar_entrega_producto.ID_INCIDENCIA = incidencia.ID_INCIDENCIA; //hay que registrarla } } } Context.SaveChanges(); transaccion.Complete(); } } catch (Exception ex) { throw new ApplicationException(ex.Message + " " + (ex.InnerException != null ? ex.InnerException.InnerException.Message : "")); } }
public void Insertar(MOVIMIENTO entrada, List <EXT_RECEPCION_PRODUCTOS_B> recepcion_productos, string _id_usuario, FormaEntradaOrden formaEntradaOrden) { try { using (TransactionScope transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted })) { var sequencia_entrada = GetSequence <int>("ENTRADA_SEQ"); var entrada_fecha = entrada.FECHA.Value.Date; entrada.ID_MOVIMIENTO = sequencia_entrada; if (entrada.ENTRADA_FACTURA != null) { entrada.ENTRADA_FACTURA.ID_ENTRADA = sequencia_entrada; } Context.MOVIMIENTO.Add(entrada); var orden_compra = Context.ORDEN_COMPRA.FirstOrDefault(w => w.ID_ORDEN_COMPRA == entrada.ID_ORDEN_COMPRA); var calendarizar_entrega = Context.CALENDARIZAR_ENTREGA.FirstOrDefault(w => w.FEC_PACTADA == entrada_fecha && w.ID_ALMACEN == entrada.ID_ALMACEN && w.ID_ORDEN_COMPRA == entrada.ID_ORDEN_COMPRA); if (formaEntradaOrden == FormaEntradaOrden.EntradaCalendarizada && calendarizar_entrega == null) { throw new Exception("La calendarizacion para esta orden fue borrada durante el proceso"); //si la orden a la que se da entrada fue calendarizada hay que aventar excepcion } INCIDENCIA incidencia = null; if (calendarizar_entrega != null) { calendarizar_entrega.ID_ENTRADA = entrada.ID_MOVIMIENTO; calendarizar_entrega.ESTATUS = "RE"; } foreach (var item in recepcion_productos) { int seq_recalendarizar = 0; int consec_recalendarizacion = 0; var orden_compra_detalle = orden_compra.ORDEN_COMPRA_DETALLE.FirstOrDefault(w => w.ID_ALMACEN == entrada.ID_ALMACEN && w.ID_ORDEN_COMPRA == entrada.ID_ORDEN_COMPRA && w.ID_PRODUCTO == item.ID_PRODUCTO); if (orden_compra_detalle == null) { throw new Exception("El detalle de la orden de compra fue eliminado durante este proceso. Favor de contactar al administadror"); } if (item.RECIBIDO > 0) //si hubo recepcion del producto { if (item.RECEPCION_PRODUCTO_DETALLE.Count > 0) //si fue una recepcion por lotes { foreach (var item_recepcion in item.RECEPCION_PRODUCTO_DETALLE) { Context.MOVIMIENTO_PRODUCTO.Add(new MOVIMIENTO_PRODUCTO { CANTIDAD = item_recepcion.RECIBIDO, ID_MOVIMIENTO = entrada.ID_MOVIMIENTO, ID_PRODUCTO = item_recepcion.ID_PRODUCTO, ID_LOTE = item_recepcion.LOTE, CADUCIDAD_FEC = item_recepcion.FECHA_CADUCIDAD }); var inventario_producto = Context.ALMACEN_INVENTARIO.FirstOrDefault(f => f.ID_LOTE == item_recepcion.LOTE && f.ID_PRODUCTO == item_recepcion.ID_PRODUCTO && f.ID_ALMACEN == entrada.ID_ALMACEN); if (inventario_producto == null) { Context.ALMACEN_INVENTARIO.Add(new ALMACEN_INVENTARIO { CADUCIDAD_FEC = item_recepcion.FECHA_CADUCIDAD, CANTIDAD = item_recepcion.RECIBIDO, ID_ALMACEN = entrada.ID_ALMACEN.Value, ID_LOTE = item_recepcion.LOTE, ID_PRODUCTO = item_recepcion.ID_PRODUCTO }); } else { inventario_producto.CANTIDAD += item_recepcion.RECIBIDO; } } } else //si fue una recepcion normal { Context.MOVIMIENTO_PRODUCTO.Add(new MOVIMIENTO_PRODUCTO { CANTIDAD = item.RECIBIDO, ID_MOVIMIENTO = entrada.ID_MOVIMIENTO, ID_LOTE = 0, ID_PRODUCTO = item.ID_PRODUCTO }); var inventario_producto = Context.ALMACEN_INVENTARIO.FirstOrDefault(f => f.ID_LOTE == 0 && f.ID_PRODUCTO == item.ID_PRODUCTO && f.ID_ALMACEN == entrada.ID_ALMACEN); if (inventario_producto == null) { Context.ALMACEN_INVENTARIO.Add(new ALMACEN_INVENTARIO { CADUCIDAD_FEC = null, CANTIDAD = item.RECIBIDO, ID_ALMACEN = entrada.ID_ALMACEN.Value, ID_LOTE = 0, ID_PRODUCTO = item.ID_PRODUCTO }); } else { inventario_producto.CANTIDAD += item.RECIBIDO; } } if (item.RESTANTE > 0) //si hubo faltante { if (incidencia == null) //si no existe ya un registro de incidencia levantada para esta calendarizacion { var sequencia_incidencia = GetSequence <int>("INCIDENCIA_SEQ"); var incidencias_producto = new List <INCIDENCIA_PRODUCTO>(); incidencias_producto.Add(new INCIDENCIA_PRODUCTO { CANTIDAD = item.RESTANTE, ID_ALMACEN_GRUPO = item.INCIDENCIA_TIPO.ID_ALMACEN_GRUPO, ID_TIPO_INCIDENCIA = item.INCIDENCIA_TIPO.ID_TIPO_INCIDENCIA, ID_PRODUCTO = item.ID_PRODUCTO, OBSERV = item.INCIDENCIA_OBSERVACIONES }); // se agrega la primera incidencia detalle de la nueva incidencia incidencia = new INCIDENCIA { ID_INCIDENCIA = sequencia_incidencia, FECHA = DateTime.Now.Date, ID_ORDEN_COMPRA = entrada.ID_ORDEN_COMPRA, ID_USUARIO = _id_usuario, ID_ALMACEN = entrada.ID_ALMACEN, INCIDENCIA_PRODUCTO = incidencias_producto }; Context.INCIDENCIA.Add(incidencia); Context.SaveChanges(); } else { incidencia.INCIDENCIA_PRODUCTO.Add(new INCIDENCIA_PRODUCTO { CANTIDAD = item.RESTANTE, ID_ALMACEN_GRUPO = item.INCIDENCIA_TIPO.ID_ALMACEN_GRUPO, ID_TIPO_INCIDENCIA = item.INCIDENCIA_TIPO.ID_TIPO_INCIDENCIA, ID_PRODUCTO = item.ID_PRODUCTO, OBSERV = item.INCIDENCIA_OBSERVACIONES }); } } if (calendarizar_entrega != null && item.RESTANTE != 0) // si no se recibio en su totalidad { if (item.FechaRecalendarizacion.HasValue) //si se va a recalendarizar el restante { var recalendarizacion = Context.CALENDARIZAR_ENTREGA.FirstOrDefault(w => w.FEC_PACTADA == item.FechaRecalendarizacion.Value && w.ID_ALMACEN == entrada.ID_ALMACEN && w.ID_ORDEN_COMPRA == entrada.ID_ORDEN_COMPRA); if (recalendarizacion == null) //si no existe nada en la fecha a recalendarizar { seq_recalendarizar = GetSequence <int>("CALENDARIZAR_ENTREGA_SEQ"); consec_recalendarizacion = 1; var calendarizar_entrega_producto = new List <CALENDARIZAR_ENTREGA_PRODUCTO>(); calendarizar_entrega_producto.Add(new CALENDARIZAR_ENTREGA_PRODUCTO { CANTIDAD = item.RESTANTE, ID_PRODUCTO = item.ID_PRODUCTO, ID_CONSEC = consec_recalendarizacion, ESTATUS = "PR" }); Context.CALENDARIZAR_ENTREGA.Add(new CALENDARIZAR_ENTREGA { CALENDARIZAR_ENTREGA_PRODUCTO = calendarizar_entrega_producto, ESTATUS = "PR", FEC_PACTADA = item.FechaRecalendarizacion, FECHA = DateTime.Now, ID_USUARIO = _id_usuario, ID_ALMACEN = entrada.ID_ALMACEN, ID_CALENDARIZACION_ENTREGA = seq_recalendarizar, ID_ORDEN_COMPRA = entrada.ID_ORDEN_COMPRA }); Context.SaveChanges(); } else //si ya existe una calendarizacion para esa OC { var recalendarizacion_entrega_producto = recalendarizacion.CALENDARIZAR_ENTREGA_PRODUCTO.FirstOrDefault(w => w.ID_PRODUCTO == item.ID_PRODUCTO && w.ESTATUS == "PR"); seq_recalendarizar = recalendarizacion.ID_CALENDARIZACION_ENTREGA; if (recalendarizacion_entrega_producto == null) //si no existe la calendarizacion de ese producto { consec_recalendarizacion = recalendarizacion.CALENDARIZAR_ENTREGA_PRODUCTO.Where(w => w.ID_PRODUCTO == item.ID_PRODUCTO).Max(c => c.ID_CONSEC) + 1; recalendarizacion.CALENDARIZAR_ENTREGA_PRODUCTO.Add(new CALENDARIZAR_ENTREGA_PRODUCTO { ID_CONSEC = consec_recalendarizacion, CANTIDAD = item.RESTANTE, ID_PRODUCTO = item.ID_PRODUCTO, ESTATUS = "PR" }); Context.SaveChanges(); } else { recalendarizacion_entrega_producto.CANTIDAD += item.RESTANTE; consec_recalendarizacion = recalendarizacion_entrega_producto.ID_CONSEC; } } } else //si no se recalendariza el restante se regresa { orden_compra_detalle.CANTIDAD_TRANSITO -= item.RESTANTE; orden_compra_detalle.DIFERENCIA += item.RESTANTE; } //se mueve la cantidad de transito a entregada orden_compra_detalle.CANTIDAD_TRANSITO -= item.RECIBIDO; } else { if (calendarizar_entrega == null) { orden_compra_detalle.DIFERENCIA -= item.RECIBIDO; //si no hay calendario hay que restarla de la diferencia directamente } else { orden_compra_detalle.CANTIDAD_TRANSITO -= item.RECIBIDO; } } orden_compra_detalle.CANTIDAD_ENTREGADA += item.RECIBIDO; } else //si no hubo recepcion de ese producto dentro de la entrada { if (incidencia == null) //si no existe ya un registro de incidencia levantada para esta calendarizacion { var sequencia_incidencia = GetSequence <int>("INCIDENCIA_SEQ"); var incidencias_producto = new List <INCIDENCIA_PRODUCTO>(); incidencias_producto.Add(new INCIDENCIA_PRODUCTO { CANTIDAD = item.RESTANTE, ID_ALMACEN_GRUPO = item.INCIDENCIA_TIPO.ID_ALMACEN_GRUPO, ID_TIPO_INCIDENCIA = item.INCIDENCIA_TIPO.ID_TIPO_INCIDENCIA, ID_PRODUCTO = item.ID_PRODUCTO, OBSERV = item.INCIDENCIA_OBSERVACIONES }); // se agrega la primera incidencia detalle de la nueva incidencia incidencia = new INCIDENCIA { ID_INCIDENCIA = sequencia_incidencia, FECHA = DateTime.Now.Date, ID_ORDEN_COMPRA = entrada.ID_ORDEN_COMPRA, ID_USUARIO = _id_usuario, ID_ALMACEN = entrada.ID_ALMACEN, INCIDENCIA_PRODUCTO = incidencias_producto }; Context.INCIDENCIA.Add(incidencia); Context.SaveChanges(); } else { incidencia.INCIDENCIA_PRODUCTO.Add(new INCIDENCIA_PRODUCTO { CANTIDAD = item.RESTANTE, ID_ALMACEN_GRUPO = item.INCIDENCIA_TIPO.ID_ALMACEN_GRUPO, ID_TIPO_INCIDENCIA = item.INCIDENCIA_TIPO.ID_TIPO_INCIDENCIA, ID_PRODUCTO = item.ID_PRODUCTO, OBSERV = item.INCIDENCIA_OBSERVACIONES }); } if (calendarizar_entrega != null) { if (item.FechaRecalendarizacion.HasValue) //si se va a recalendarizar todo el producto { var recalendarizacion = Context.CALENDARIZAR_ENTREGA.FirstOrDefault(w => w.FEC_PACTADA == item.FechaRecalendarizacion.Value && w.ID_ALMACEN == entrada.ID_ALMACEN && w.ID_ORDEN_COMPRA == entrada.ID_ORDEN_COMPRA); if (recalendarizacion == null) //si no existe nada en la fecha a recalendarizar { seq_recalendarizar = GetSequence <int>("CALENDARIZAR_ENTREGA_SEQ"); consec_recalendarizacion = 1; var calendarizar_entrega_producto = new List <CALENDARIZAR_ENTREGA_PRODUCTO>(); calendarizar_entrega_producto.Add(new CALENDARIZAR_ENTREGA_PRODUCTO { CANTIDAD = item.ORDENADO, ID_PRODUCTO = item.ID_PRODUCTO, ID_CONSEC = consec_recalendarizacion, ESTATUS = "PR" }); Context.CALENDARIZAR_ENTREGA.Add(new CALENDARIZAR_ENTREGA { CALENDARIZAR_ENTREGA_PRODUCTO = calendarizar_entrega_producto, ESTATUS = "PR", FEC_PACTADA = item.FechaRecalendarizacion, FECHA = DateTime.Now, ID_USUARIO = _id_usuario, ID_ALMACEN = entrada.ID_ALMACEN, ID_CALENDARIZACION_ENTREGA = seq_recalendarizar, ID_ORDEN_COMPRA = entrada.ID_ORDEN_COMPRA }); Context.SaveChanges(); } else { var recalendarizacion_entrega_producto = recalendarizacion.CALENDARIZAR_ENTREGA_PRODUCTO.FirstOrDefault(w => w.ID_PRODUCTO == item.ID_PRODUCTO && w.ESTATUS == "PR"); seq_recalendarizar = recalendarizacion.ID_CALENDARIZACION_ENTREGA; if (recalendarizacion_entrega_producto == null) //si no existe la calendarizacion de ese producto { consec_recalendarizacion = recalendarizacion.CALENDARIZAR_ENTREGA_PRODUCTO.Where(w => w.ID_PRODUCTO == item.ID_PRODUCTO).Max(c => c.ID_CONSEC) + 1; recalendarizacion.CALENDARIZAR_ENTREGA_PRODUCTO.Add(new CALENDARIZAR_ENTREGA_PRODUCTO { CANTIDAD = item.ORDENADO, ID_PRODUCTO = item.ID_PRODUCTO, ID_CONSEC = consec_recalendarizacion, ESTATUS = "PR" }); } else { recalendarizacion_entrega_producto.CANTIDAD += item.ORDENADO; consec_recalendarizacion = recalendarizacion_entrega_producto.ID_CONSEC; } } } else //si no se va a recalendarizar, se regresa todo a su estado normal { orden_compra_detalle.CANTIDAD_TRANSITO -= item.ORDENADO; orden_compra_detalle.DIFERENCIA += item.ORDENADO; } } } if (calendarizar_entrega != null) //hay que cambiar los campos pertinentes de la calendarizacion del producto { var calendarizacion_entrega_producto = calendarizar_entrega.CALENDARIZAR_ENTREGA_PRODUCTO.First(f => f.ID_PRODUCTO == item.ID_PRODUCTO && f.ESTATUS == "PR"); if (item.RECIBIDO > 0) //si hubo recepcion { if (item.RESTANTE > 0) //si hubo recepcion parcial { calendarizacion_entrega_producto.ESTATUS = "RP"; //estatus recibido parcial if (item.FechaRecalendarizacion.HasValue) //si hubo recalendarizacion { calendarizacion_entrega_producto.CAL_ID_CALENDARIZACION_ENTREGA = seq_recalendarizar; calendarizacion_entrega_producto.CAL_ID_CONSEC = consec_recalendarizacion; } } else { calendarizacion_entrega_producto.ESTATUS = "RB"; } } else //si se rechazo todo el producto { if (item.FechaRecalendarizacion.HasValue) { calendarizacion_entrega_producto.ESTATUS = "RL"; calendarizacion_entrega_producto.CAL_ID_CALENDARIZACION_ENTREGA = seq_recalendarizar; calendarizacion_entrega_producto.CAL_ID_CONSEC = consec_recalendarizacion; } else { calendarizacion_entrega_producto.ESTATUS = "RC"; } } if (item.INCIDENCIA_TIPO != null && item.INCIDENCIA_TIPO.ID_TIPO_INCIDENCIA != -1) { calendarizacion_entrega_producto.ID_INCIDENCIA = incidencia.ID_INCIDENCIA; } } } if (orden_compra.ORDEN_COMPRA_DETALLE.Any(w => w.CANTIDAD_ENTREGADA != w.CANTIDAD_ORDEN && w.ID_ALMACEN == entrada.ID_ALMACEN)) { orden_compra.ESTATUS = "PR"; } else { orden_compra.ESTATUS = "RE"; } Context.SaveChanges(); transaccion.Complete(); } } catch (Exception ex) { throw new ApplicationException(ex.Message + " " + (ex.InnerException != null ? ex.InnerException.InnerException.Message : "")); } }