#36018
Javier Ader
Participante

Ah, si si…. por alguna razón medio magica a mi entender, la lineas chquean que haya bastante stock cada vez que son guardadas….
El tema es asi; en es punto el pedido ya esta completo, y se reservo stock por una unidad (vos tenes en este punto 1 unidad real y 1 reservada, por lo tanto no te quedan ninguna disponible). La logica de completar la factura, modifica la lineas del pedido asociado, y las guarda; la lineas al ser guardada nuevamente chequean stock, pero en este punto te quedan 0 disponibles (la misma complecíón del mismo pedido incremento las cantidades reservadas..) y falla.
Esto se da en MOrderLine.beforeSave(), en la sección:

Code:
/*
* Añade una comprobacion en el metodo beforSave
* de las lineas de pedido y albaran, para que en
* las transacciones de venta, no se pueda guardar
* seleccionar un conjunto de atributos cuyo
* stockage sea menor que el indicado en la linea.
*/
if (o.isSOTrx() && getM_AttributeSetInstance_ID() != 0) {
// BigDecimal avQty = (BigDecimal)DB.getSQLObject(get_TrxName(), “SELECT COALESCE(SUM(QtyOnHand-QtyReserved), 0.0) FROM M_Storage INNER JOIN M_Locator ON (M_Locator.M_Warehouse_ID=M_Storage.M_Locator_ID) WHERE ? IN (M_AttributeSetInstance_ID,0) AND M_Product_ID = ? AND M_Locator.M_Warehouse_ID = ? “, new Object[]{getM_AttributeSetInstance_ID(), getM_Product_ID(), getM_Warehouse_ID()});
// BigDecimal avQty = MStorage.get(getCtx(), getM_Locator_ID(), getM_Product_ID(), getM_AttributeSetInstance_ID(), get_TrxName());
BigDecimal avQty = MStorage.getQtyAvailable(getM_Warehouse_ID(), getM_Product_ID(), getM_AttributeSetInstance_ID(), get_TrxName());
if (avQty.compareTo(getQtyEntered()) < 0) { log.saveError("NotEnoughStocked", ""); return false; } }

Lo extraño es que ese chequeo lo hace solo si la linea tiene seteado un valor en getM_AttributeSetInstance_ID(), lo cual no es el caso en general. Estas usando productos con conjuntos de atributos? Porque si no, hay un doble bug; primero, la linea de pedido que comienza con un M_AttributeSetInstance_ID con 0 o null , termina con un valor distinto de 0; y despues el chequeo de stock se hace dos veces (en realidad, a mi entender, no se debería hacer nunca; a lo sumo se hace en la compleción del pedido, pero no cada vez que se guarda una linea….).

Por lo pronto te diría que comentes todo ese chequeo; después si podes, busca el id del pedido generado, y ejecuta la siguiente sentencia desde pgAdmin

Code:
select M_OrderLine_ID, M_Product_ID,M_AttributeSetInstance_ID, * form M_OrderLine
where M_Order_ID =

Y postealo.
La tercer columna, M_AttributeSetInstance_ID, debería en teoria estar en cero si es que no usas productos con conjuntos de instancia.