Configurar M_InOut_Invoice automático


#1

Estou tentando personalizar o adempiere para o processo M_InOut_Invoice ser automático após o RECEBIMENTO DE MATERIAL ser completado.

Tentei de três formas, sem sucesso e pelo mesmo motivo:
Configurar como um Nó do tipo APPS PROCESS (Processo de aplicação)
Configurar como um novo processo do tipo VALOR DO DOCUMENTO para quando for detectado que um @docstatus@ = CO ele executa aquele processo.
Criar um VALIDADOR DE MODELO, mas esse foi em vão já que o método docValidate() é executado no PrepareIt()… aí não adianta muito hehe

Alguém tem alguma sugestão para automatizar o processo dessa forma??

Obrigado!!


#2

Usando o Model Validator você consegue definir qual é o tempo em que você deseja que o processo seja executado.

/** Called before document is prepared */ public static final int TIMING_BEFORE_PREPARE = 1; public static final int DOCTIMING_BEFORE_PREPARE = 1; // Compatibility with Compiere 260c /** Called before document is void */ public static final int TIMING_BEFORE_VOID = 2; /** Called before document is close */ public static final int TIMING_BEFORE_CLOSE = 3; /** Called before document is reactivate */ public static final int TIMING_BEFORE_REACTIVATE = 4; /** Called before document is reversecorrect */ public static final int TIMING_BEFORE_REVERSECORRECT = 5; /** Called before document is reverseaccrual */ public static final int TIMING_BEFORE_REVERSEACCRUAL = 6; /** Called before document is completed */ public static final int TIMING_BEFORE_COMPLETE = 7; /** Called after document is prepared */ public static final int TIMING_AFTER_PREPARE = 8; /** Called after document is completed */ public static final int TIMING_AFTER_COMPLETE = 9; public static final int DOCTIMING_AFTER_COMPLETE = 9; // Compatibility with Compiere 260c /** Called after document is void */ public static final int TIMING_AFTER_VOID = 10; /** Called after document is closed */ public static final int TIMING_AFTER_CLOSE = 11; /** Called after document is reactivated */ public static final int TIMING_AFTER_REACTIVATE = 12; /** Called after document is reversecorrect */ public static final int TIMING_AFTER_REVERSECORRECT = 13; /** Called after document is reverseaccrual */ public static final int TIMING_AFTER_REVERSEACCRUAL = 14; /** Called before document is posted */ public static final int TIMING_BEFORE_POST = 15; /** Called after document is posted */ public static final int TIMING_AFTER_POST = 16;

Para o seu caso eu sugiro usar o TIMING_AFTER_COMPLETE


#3

Sim, eu usei o TIMING_AFTER_COMPLETE, mas isso não adianta… porque o docValidate é no prepareIt… ou seja ele passa pelo DocValidate para depois completar.

aqui o meu método

[code]private String docValidate(MInOut ship, int timing){

	if (timing == TIMING_AFTER_COMPLETE ){
		log.info("M_InOut_ID=" + ship.get_ID()
				+ ", M_PriceList_ID=" + 0
				+ ", InvoiceDocumentNo=" + 0);
		
		if (ship.get_ID() == 0)
			throw new IllegalArgumentException("No Shipment");

		if (ship.get_ID() == 0)
			throw new IllegalArgumentException("Shipment not found");
			
		if (!MInOut.DOCSTATUS_Completed.equals(ship.getDocStatus()))
			throw new IllegalArgumentException("Shipment not completed");
			
		MInvoice invoice = new MInvoice (ship, null);
		
		// Should not override pricelist for RMA
		if (ship.get_ID() != 0 && ship.getM_RMA_ID() == 0)
			invoice.setM_PriceList_ID(ship.get_ID());
		if (!invoice.save())
			throw new IllegalArgumentException("Cannot save Invoice");

		MInOutLine[] shipLines = ship.getLines(false);
		for (int i = 0; i < shipLines.length; i++)
		{
			MInOutLine sLine = shipLines[i];
			MInvoiceLine line = new MInvoiceLine(invoice);
			line.setShipLine(sLine);
			if (sLine.sameOrderLineUOM())
				line.setQtyEntered(sLine.getQtyEntered());
			else
				line.setQtyEntered(sLine.getMovementQty());
			line.setQtyInvoiced(sLine.getMovementQty());
			if (!line.save())
				throw new IllegalArgumentException("Cannot save Invoice Line");
		}
		
		return invoice.getDocumentNo();
	}
	return null;
}[/code]

#4

Consegui resolver!!!

Primeiramente eu havia feito dessa forma:

(start) → (docprepare) → (doccomplete) → (Fatura Gerada), mas dava erro.

(Fatura Gerada) era da seguinte forma: Ação: Processo de aplicação | Processo: M_InOut_CreateInvoice_Gerar Fatura a partir do Recibo.

No entanto, ele dava um erro informando “Shipment not completed”.

Então fiz assim:

(start) → (docprepare) → (doccomplete) → (Recebimento de material concluído) → (Fatura Gerada) e funcionou.

(Recebimento de material concluído) era da seguinte forma: Ação: Janela de usuário | Janela: Recebimento de material.

Para a Requisição gerar Pedido de compra automaticamente não precisava desse passo intermediário, já que não importa o estado do documento para a Requisição se tornar um Pedido de compra, enquanto que para Recebimento de material se tornar Fatura, o estado do documento completo é exigido.

Enfim, Obrigado pela ajuda.