• Este debate está vacío.
Viendo 6 entradas - de la 1 a la 6 (de un total de 6)
  • Autor
    Entradas
  • #31850

    Buenas tardes, tengo un problema con el TPV y es lo siguiente: tengo configurado para que genere la factura pero cuando genero la venta me dice que no puede actualizar el stock, pero en realidad si tiene. Si genero el pedido de cliente, el remito de salida y la factura por separado me funciona perfecto. Alguno sabe que podria ser? Adjunto imagenes.

    [attachment=163]articulo_stock.png[/attachment]

    [attachment=164]factura_error.png[/attachment]

    Gracias!

    #36016

    Estas vendiendo una cantidad menor o igual a los disponible o a lo que tenes en stock? no es lo mismo. Podes tener en stock y tenerlo reservado.

    #36036

    No esta reservado, antes de ir al TPV realizo un remito de entrada del articulo y esta completo. Hice un debug de la aplicacion y parece como que pasa dos veces por el mismo paso y la segunda es donde tira el error. No se como solucionarlo todavia.

    #36017
    Javier Ader
    Participante

    Me parece que sí, hay algo raro (a mi me ha pasado crear un remito de entrada que no parece incrementar el stock…).
    No lo testie pero estoy casi seguro que el problema esta aca:
    MInOut.checkMaterialPolicy()

    Busca la siguiente sección de código:

    Code:
    if( ii == 0 ) {
    if( storage.getQtyOnHand().compareTo( qtyToDeliver ) >= 0 ) {
    line.setM_AttributeSetInstance_ID( storage.getM_AttributeSetInstance_ID());
    needSave = true;
    log.config( “Direct – ” + line );
    qtyToDeliver = Env.ZERO;
    } else {

    Eso lo que hace es modificar el M_AttributeSetInstance_ID de la linea de remito a algo que en general es distinto de cero. Posteriormente en el completeIt , al tener un linea M_AttributeSetInstance_ID distinto de cero se hace una hace, creo, una chequeo de cantidad de stock actual incorrecto.

    No lo testie, pero cambiando la primer sección que puse por esta:

    Code:
    if( ii == 0 ) {
    if( storage.getQtyOnHand().compareTo( qtyToDeliver ) >= 0 ) {
    //line.setM_AttributeSetInstance_ID( storage.getM_AttributeSetInstance_ID());
    //needSave = true;
    //log.config( “Direct – ” + line );
    //qtyToDeliver = Env.ZERO;

    MInOutLineMA ma = new
    MInOutLineMA( line,
    storage.getM_AttributeSetInstance_ID(),
    qtyToDeliver);

    if( !ma.save()) {
    ;
    }
    qtyToDeliver = Env.ZERO;

    } else

    Tal vez ande, ya que de esta manera nunca se modifica el M_AttributeSet_ID de la linea (pero requiere crear un MInOutLineMA como en todos los demás casos), y el completeIt en teoría haría el chequeo de stock correcto.

    No se si anda, pero casi seguro que por ahí viene la cosa (en realidad, todo eso código es medio raro…).
    En cualquier caso , si podes desde pgAdmin ejecuta la siguientes sentencias (seleccionando previamente la base de datos en cuestion y abriendo un editor de sentencias)

    Code:

    set search_path to libertya;
    select * from M_Storage
    where M_Product_ID =

    y postea lo que te muestra; tenes que reemplazar con el id real del producto que te esta trayendo problemas, esto es, el valor de la columna M_Proudct.M_Product_ID ; este valor lo podes ver en la ventana normal de productos (en la que podes modificarlos, no en la que posteaste en el screen) haciendo doble click en la parte inferior derecha que muestra algo como [1/233], una vez seleccionado el producto)

    #36038

    Hola Javier hice lo que me dijiste pero sale el mismo error, el problema no pareceria estar en el InOut. Cuando hago debug, el error se genera en la clase MOrderLine que se llama cuando entra en el metodo createOxpInvoice de la clase PoSOnline.

    #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.

Viendo 6 entradas - de la 1 a la 6 (de un total de 6)
  • Debes estar registrado para responder a este debate.