public String prepareIt() { String error = null; MBoletaDepositoLine[] lines = getLines(); // Se valida el estado de los cheques en las líneas de esta boleta. for (MBoletaDepositoLine line : lines) { // Se valida que el Cheque asociado a la línea no hayan sido previamente // depositados por otra boleta de depósito. if (line.getPayment().getM_BoletaDeposito_ID() > 0) { error = "@PaymentAlreadyDepositedError@"; } // El cheque debe estar en estado Completo if (!line.getPayment().getDocStatus().equals(MPayment.DOCSTATUS_Completed)) { error = "@CheckMustBeCompleted@"; } // El cheque debe pertenecer a una cuenta de cheques en cartera if (!checkInCartera(line.getPayment())) { error = "@CheckMustBeInCartera@"; } // Si hubo error se cancela el preparado. if (error != null) { m_processMsg = error + " (@Check@: " + line.getPayment().getDocumentNo() + ")"; return STATUS_Invalid; } } // La próxima acción es completar. setDocAction(DOCACTION_Complete); return DocAction.STATUS_InProgress; }
/** * Crea un cheque de entrada a la cuenta de la boleta por cada cheque a depositar. * * @throws Exception cuando se produce un error en la creación o procesado de alguno de los nuevos * cheques. */ private void createDocumentForEachCheck() throws Exception { // Se recorren la líneas de la boleta y se crea un nuevo cheque por cada // cheque a depositar, en donde la cuenta bancaria y la EC del nuevo cheque // son la EC y la Cta Bcria de la Boleta. for (MBoletaDepositoLine line : getLines()) { MPayment check = line.getPayment(); MPayment newCheck = new MPayment(getCtx(), 0, get_TrxName()); String error = null; PO.copyValues(check, newCheck); // Se asigna la fecha del nuevo cheque newCheck.setDateTrx( check.getDateTrx()); // incidencia 4324 - Si se usa el tilde de "crear un payment por // cheque", la fecha de emisión y Vto se deberían mantener. newCheck.setDateAcct(getDocumentDate()); newCheck.setDueDate( check.getDueDate()); // incidencia 4324 - Si se usa el tilde de "crear un payment por // cheque", la fecha de emisión y Vto se deberían mantener. newCheck.setIsReconciled( false); // incidencia 4324 - el nuevo cheque no se encuentra inicialmente conciliado // Se asigna los datos de la boleta newCheck.setC_BPartner_ID(getC_BPartner_ID()); newCheck.setC_BankAccount_ID(getC_BankAccount_ID()); newCheck.setAD_Org_ID(getAD_Org_ID()); // Se agrega una descripcion newCheck.setDescription( Msg.getMsg(getCtx(), "IncomeBoletaCheck", new Object[] {getDocumentNo()})); // Se quita la referencia a la Boleta newCheck.setM_BoletaDeposito_ID(0); // Se Completa y se cierra el cheque if (!newCheck.processIt(ACTION_Complete)) { error = newCheck.getProcessMsg(); } else if (!newCheck.save()) { error = CLogger.retrieveErrorAsString(); } // Si ocurrió un error al procesar se termina la operación de completado. if (error != null) { throw new Exception( "@IncomeBoletaCheckProcessError@ (" + newCheck.getDocumentNo() + "): " + error); } // Se asigna a la línea de la boleta la referencia al cheque creado // por el depósito del cheque original. line.setC_Depo_Payment_ID(newCheck.getC_Payment_ID()); if (!line.save()) { error = CLogger.retrieveErrorAsString(); throw new Exception( "@BoletaLineSaveError@ (@Check@ " + check.getDocumentNo() + "): " + error); } } }
/*----------------------------------------- @Author: Jorge Vidal - Disytel @Fecha: 16/09/2006 @Comentario: Setea isReconciled = valor a : la boleta las lineas los pagos asociados a las lineas @Parametros: valor: Valor a setear como conciliado (true/false) -------------------------------------------*/ public boolean setConciliado(boolean valor) { // TODO Auto-generated method stub MBoletaDepositoLine lineas[] = getLines(); for (int i = 0; i < lineas.length; i++) { MBoletaDepositoLine line = lineas[i]; line.setIsReconciled(valor); line.save(); if (line.getC_Payment_ID() != 0) { MPayment payment = new MPayment(getCtx(), line.getC_Payment_ID(), get_TrxName()); payment.setIsReconciled(valor); payment.save(); } } setIsReconciled(valor); setProcessed(true); setDocAction(DOCACTION_None); save(); return true; }
/** * Crea un contra-movimiento por cada cheque a depositar para efectuar la salida del cheque de la * cuenta de cheques en cartera. * * @throws Exception cuando se produce algún error al crear o procesar el cheque original o el * contra-movimiento. */ private void createReversalChecks() throws Exception { MBoletaDepositoLine[] lines = getLines(true); // Por cada Cheque asociado a la boleta, se crea un contramovimiento // con el importe invertido para realizar la salida del cheque de la cuenta // de cheques en cartera. for (MBoletaDepositoLine line : lines) { MPayment check = line.getPayment(); MPayment reversalCheck = new MPayment(getCtx(), 0, get_TrxName()); String error = null; PO.copyValues(check, reversalCheck); // Se asigna la fecha del contra-movimiento reversalCheck.setDateTrx(getDocumentDate()); reversalCheck.setDateAcct(getDocumentDate()); reversalCheck.setDueDate(getDocumentDate()); reversalCheck.setIsReconciled(true); // incidencia 4324 - conciliado con check // Se asigna la EC de la boleta reversalCheck.setC_BPartner_ID(getC_BPartner_ID()); // Se invierte el signo del monto del cheque original reversalCheck.setPayAmt(check.getPayAmt().negate()); // Se asigna la organizacion del cheque origen reversalCheck.setAD_Org_ID(check.getAD_Org_ID()); // Se agrega una descripcion reversalCheck.addDescription( Msg.getMsg( getCtx(), "ReversalCheck", new Object[] {check.getDocumentNo(), getDocumentNo()})); // FB - Corrección a partir de problema detectado en Intersys // Setea el estado a Borrador ya que el copyValues copia el estado // del cheque original (Completado) y entonces al completar el // reversal el engine ignora esa acción (no se puede completar un // documento ya completado) y entonces ejecuta el DocAction guardado // en el registro. Normalmente esa acción es CL y por eso no se // rompía, pero en Intersys el pago tenía acción RC y quería // revertir el reverso, lógica errónea que además tiraba un // NullPointerException. reversalCheck.setDocStatus(DOCSTATUS_Drafted); reversalCheck.setDocAction(DOCACTION_Complete); // Se Completa y se cierra el cheque if (!reversalCheck.save()) { error = CLogger.retrieveErrorAsString(); } else if (!reversalCheck.processIt(ACTION_Complete)) { error = reversalCheck.getProcessMsg(); } else if (!reversalCheck.processIt(ACTION_Close)) { error = reversalCheck.getProcessMsg(); } else if (!reversalCheck.save()) { error = CLogger.retrieveErrorAsString(); } // Si ocurrió un error al procesar se termina la operación de completado. if (error != null) { throw new Exception( "@ReversalCheckProcessError@ (" + reversalCheck.getDocumentNo() + "): " + error); } // Al cheque original se le asigna la referencia a esta boleta de depósito // y se agrega una descripción. check.setM_BoletaDeposito_ID(getM_BoletaDeposito_ID()); check.addDescription(getDepositedDescription()); check.setIsReconciled(true); // incidencia 4324 - conciliado con reversalCheck // Se cierra también el cheque original para que no pueda ser depositado nuevamente. if (!check.processIt(ACTION_Close)) { error = check.getProcessMsg(); } else if (!check.save()) { error = CLogger.retrieveErrorAsString(); } // Si ocurrió un error al procesar se termina la operación de completado. if (error != null) { throw new Exception( "@OriginalCheckProcessError@ (" + check.getDocumentNo() + "): " + error); } // Se asigna a la línea de la boleta la referencia al cheque Contra-Movimiento line.setC_Reverse_Payment_ID(reversalCheck.getC_Payment_ID()); if (!line.save()) { error = CLogger.retrieveErrorAsString(); throw new Exception( "@BoletaLineSaveError@ (@Check@ " + check.getDocumentNo() + "): " + error); } } }
public boolean voidIt() { String error = null; MBoletaDepositoLine[] lines = getLines(); for (MBoletaDepositoLine line : lines) { // Se anulan el cheque Contra-Movimiento generado a partir // del Cheque original asociado a la línea. MPayment reversalCheck = line.getReversalPayment(); // Se cambia el estado para que el engine permita Anular (si está en Closed no // permite la anulación) reversalCheck.setDocStatus(MPayment.STATUS_Completed); // Se anula el cheque. if (!reversalCheck.processIt(MPayment.ACTION_Void)) { error = reversalCheck.getProcessMsg(); } else if (!reversalCheck.save()) { error = CLogger.retrieveErrorAsString(); } // Si ocurrió algún error se cancela la operación if (error != null) { m_processMsg = "@ReversalCheckVoidError@ (" + reversalCheck.getDocumentNo() + "): " + error; return false; } // Si al completar la boleta se generó un cheque entrante a la cuenta // destino a partir del cheque original, entonces se anula también // este cheque generado. if (isDocumentForEachCheck() && line.getC_Depo_Payment_ID() > 0) { MPayment depoCheck = line.getDepoPayment(); // Se cambia el estado para que el engine permita Anular (si está en Closed no // permite la anulación) depoCheck.setDocStatus(MPayment.DOCSTATUS_Completed); if (!depoCheck.processIt(MPayment.ACTION_Void)) { error = depoCheck.getProcessMsg(); } else if (!depoCheck.save()) { error = CLogger.retrieveErrorAsString(); } // Si ocurrió algún error se cancela la operación if (error != null) { m_processMsg = "@IncomeBoletaCheckVoidError@ (" + depoCheck.getDocumentNo() + "): " + error; return false; } } // Se libera el cheque original para que pueda ser depositado // en otra boleta. MPayment originalCheck = line.getPayment(); originalCheck.setM_BoletaDeposito_ID(0); originalCheck.setDocStatus(MPayment.DOCSTATUS_Completed); originalCheck.setDocAction(MPayment.DOCACTION_Close); clearDepositedDescription(originalCheck); if (!originalCheck.save()) { error = CLogger.retrieveErrorAsString(); m_processMsg = "@OriginalCheckFreeError@ (" + originalCheck.getDocumentNo() + "): " + error; return false; } } // Si la acción al completar fue crear un documento por el total de la boleta // entonces se anula también este documento. if (isDocumentForBoleta() && getC_Boleta_Payment_ID() > 0) { MPayment boletaPayment = getBoletaPayment(); if (!boletaPayment.processIt(MPayment.ACTION_Void)) { error = boletaPayment.getProcessMsg(); } else if (!boletaPayment.save()) { error = CLogger.retrieveErrorAsString(); } // Si ocurrió algún error se cancela la operación if (error != null) { m_processMsg = "@DocumentForBoletaVoidError@ (" + boletaPayment.getDocumentNo() + "): " + error; return false; } } setDocAction(ACTION_None); return true; }