IDEMPIERE-4578 generic DocAction (#736)
* IDEMPIERE-4578 generic DocAction * IDEMPIERE-4578 generic DocAction * IDEMPIERE-4578 generic DocAction Refactor generic docaction implementation to a separate delegate class. This should make it easier for any model class to implement the DocAction interface using the DocActionDelegate class. * IDEMPIERE-4578 generic DocAction add generic type support * IDEMPIERE-4578 generic DocAction generic type should implements DocAction * IDEMPIERE-4578 generic DocAction Co-authored-by: hengsin <hengsin@gmail.com>
This commit is contained in:
parent
0e58005d6f
commit
361edea318
|
@ -0,0 +1,540 @@
|
|||
/***********************************************************************
|
||||
* This file is part of iDempiere ERP Open Source *
|
||||
* http://www.idempiere.org *
|
||||
* *
|
||||
* Copyright (C) Contributors *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License *
|
||||
* as published by the Free Software Foundation; either version 2 *
|
||||
* of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the Free Software *
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *
|
||||
* MA 02110-1301, USA. *
|
||||
* *
|
||||
* Contributors: *
|
||||
* - Carlos Ruiz *
|
||||
* - hengsin *
|
||||
**********************************************************************/
|
||||
package org.adempiere.model;
|
||||
|
||||
import java.io.File;
|
||||
import java.math.BigDecimal;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.Properties;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.adempiere.exceptions.AdempiereException;
|
||||
import org.adempiere.exceptions.PeriodClosedException;
|
||||
import org.compiere.model.MDocType;
|
||||
import org.compiere.model.MPeriod;
|
||||
import org.compiere.model.ModelValidationEngine;
|
||||
import org.compiere.model.ModelValidator;
|
||||
import org.compiere.model.PO;
|
||||
import org.compiere.process.DocAction;
|
||||
import org.compiere.process.DocumentEngine;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.TimeUtil;
|
||||
import org.compiere.util.Util;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class DocActionDelegate<T extends PO & DocAction> implements DocAction {
|
||||
|
||||
private T po;
|
||||
/** Process Message */
|
||||
private String m_processMsg = null;
|
||||
/** Just Prepared Flag */
|
||||
private boolean m_justPrepared = false;
|
||||
|
||||
/** Logger */
|
||||
protected transient CLogger log = CLogger.getCLogger (getClass());
|
||||
|
||||
public DocActionDelegate(T po) {
|
||||
this.po = po;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDocStatus(String DocStatus) {
|
||||
po.columnExists(DOC_COLUMNNAME_DocStatus, true);
|
||||
po.set_ValueOfColumn(DOC_COLUMNNAME_DocStatus, DocStatus);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDocStatus() {
|
||||
po.columnExists(DOC_COLUMNNAME_DocStatus, true);
|
||||
return (String)po.get_Value(DOC_COLUMNNAME_DocStatus);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean processIt(String action) {
|
||||
m_processMsg = null;
|
||||
DocumentEngine engine = new DocumentEngine (po, getDocStatus());
|
||||
return engine.processIt (action, getDocAction());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean unlockIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info("unlockIt - " + po.toString());
|
||||
setProcessing(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean invalidateIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info("invalidateIt - " + po.toString());
|
||||
setDocAction(DocAction.ACTION_Prepare);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String prepareIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po, ModelValidator.TIMING_BEFORE_PREPARE);
|
||||
if (m_processMsg != null)
|
||||
return DocAction.STATUS_Invalid;
|
||||
|
||||
int doctype = -1;
|
||||
if (po.columnExists(DOC_COLUMNNAME_C_DocTypeTarget_ID)) {
|
||||
doctype = po.get_ValueAsInt(DOC_COLUMNNAME_C_DocTypeTarget_ID);
|
||||
} else if (po.columnExists(DOC_COLUMNNAME_C_DocType_ID)) {
|
||||
doctype = po.get_ValueAsInt(DOC_COLUMNNAME_C_DocType_ID);
|
||||
}
|
||||
Timestamp date = null;
|
||||
if (po.columnExists(DOC_COLUMNNAME_DateAcct)) {
|
||||
date = (Timestamp) po.get_Value(DOC_COLUMNNAME_DateAcct);
|
||||
} else if (po.columnExists(DOC_COLUMNNAME_DateTrx)) {
|
||||
date = (Timestamp) po.get_Value(DOC_COLUMNNAME_DateTrx);
|
||||
} else {
|
||||
date = TimeUtil.getDay(0);
|
||||
}
|
||||
if (doctype >= 0) {
|
||||
MPeriod.testPeriodOpen(getCtx(), date, doctype, getAD_Org_ID());
|
||||
}
|
||||
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po, ModelValidator.TIMING_AFTER_PREPARE);
|
||||
if (m_processMsg != null)
|
||||
return DocAction.STATUS_Invalid;
|
||||
|
||||
m_justPrepared = true;
|
||||
if (!DocAction.ACTION_Complete.equals(getDocAction()))
|
||||
setDocAction(DocAction.ACTION_Complete);
|
||||
return DocAction.STATUS_InProgress;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean approveIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
setIsApproved(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean rejectIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
setIsApproved(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String completeIt() {
|
||||
// Re-Check
|
||||
if (!m_justPrepared)
|
||||
{
|
||||
String status = prepareIt();
|
||||
m_justPrepared = false;
|
||||
if (!DocAction.STATUS_InProgress.equals(status))
|
||||
return status;
|
||||
}
|
||||
|
||||
if ( po.columnExists(DOC_COLUMNNAME_C_DocTypeTarget_ID)
|
||||
&& po.columnExists(DOC_COLUMNNAME_C_DocType_ID)) {
|
||||
po.set_ValueOfColumn(DOC_COLUMNNAME_C_DocType_ID, po.get_ValueAsInt(DOC_COLUMNNAME_C_DocTypeTarget_ID));
|
||||
}
|
||||
|
||||
// Set the definite document number after completed (if needed)
|
||||
setDefiniteDocumentNo();
|
||||
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po, ModelValidator.TIMING_BEFORE_COMPLETE);
|
||||
if (m_processMsg != null)
|
||||
return DocAction.STATUS_Invalid;
|
||||
|
||||
// Implicit Approval
|
||||
if (!isApproved())
|
||||
approveIt();
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
|
||||
// User Validation
|
||||
String valid = ModelValidationEngine.get().fireDocValidate(po, ModelValidator.TIMING_AFTER_COMPLETE);
|
||||
if (valid != null)
|
||||
{
|
||||
m_processMsg = valid;
|
||||
return DocAction.STATUS_Invalid;
|
||||
}
|
||||
|
||||
setProcessed(true);
|
||||
setDocAction(DocAction.ACTION_Close);
|
||||
return DocAction.STATUS_Completed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean voidIt() {
|
||||
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
|
||||
if ( DocAction.STATUS_Closed.equals(getDocStatus())
|
||||
|| DocAction.STATUS_Reversed.equals(getDocStatus())
|
||||
|| DocAction.STATUS_Voided.equals(getDocStatus())) {
|
||||
m_processMsg = "Document Closed: " + getDocStatus();
|
||||
setDocAction(DocAction.ACTION_None);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Not Processed
|
||||
if ( DocAction.STATUS_Drafted.equals(getDocStatus())
|
||||
|| DocAction.STATUS_Invalid.equals(getDocStatus())
|
||||
|| DocAction.STATUS_InProgress.equals(getDocStatus())
|
||||
|| DocAction.STATUS_Approved.equals(getDocStatus())
|
||||
|| DocAction.STATUS_NotApproved.equals(getDocStatus())) {
|
||||
// Before Void
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_BEFORE_VOID);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
} else {
|
||||
boolean accrual = false;
|
||||
int doctype = -1;
|
||||
if (po.columnExists(DOC_COLUMNNAME_C_DocTypeTarget_ID)) {
|
||||
doctype = po.get_ValueAsInt(DOC_COLUMNNAME_C_DocTypeTarget_ID);
|
||||
} else if (po.columnExists(DOC_COLUMNNAME_C_DocType_ID)) {
|
||||
doctype = po.get_ValueAsInt(DOC_COLUMNNAME_C_DocType_ID);
|
||||
}
|
||||
Timestamp date = null;
|
||||
if (po.columnExists(DOC_COLUMNNAME_DateAcct)) {
|
||||
date = (Timestamp) po.get_Value(DOC_COLUMNNAME_DateAcct);
|
||||
} else if (po.columnExists(DOC_COLUMNNAME_DateTrx)) {
|
||||
date = (Timestamp) po.get_Value(DOC_COLUMNNAME_DateTrx);
|
||||
} else {
|
||||
date = TimeUtil.getDay(0);
|
||||
}
|
||||
if (doctype >= 0) {
|
||||
try {
|
||||
MPeriod.testPeriodOpen(getCtx(), date, doctype, getAD_Org_ID());
|
||||
} catch (PeriodClosedException e) {
|
||||
accrual = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (accrual)
|
||||
return reverseAccrualIt();
|
||||
else
|
||||
return reverseCorrectIt();
|
||||
}
|
||||
|
||||
// After Void
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_AFTER_VOID);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
setProcessed(true);
|
||||
setDocAction(DocAction.ACTION_None);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean closeIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
// Before Close
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_BEFORE_CLOSE);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
setProcessed(true);
|
||||
setDocAction(DocAction.ACTION_None);
|
||||
|
||||
// After Close
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_AFTER_CLOSE);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean reverseCorrectIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
// Before reverseCorrect
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_BEFORE_REVERSECORRECT);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
// After reverseCorrect
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_AFTER_REVERSECORRECT);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
return false; // reverse needs to be implemented to create a negative document
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean reverseAccrualIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
// Before reverseAccrual
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_BEFORE_REVERSEACCRUAL);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
// After reverseAccrual
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_AFTER_REVERSEACCRUAL);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
return false; // reverse needs to be implemented to create a negative document
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean reActivateIt() {
|
||||
if (log.isLoggable(Level.INFO)) log.info(po.toString());
|
||||
// Before reActivate
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_BEFORE_REACTIVATE);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
// After reActivate
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(po,ModelValidator.TIMING_AFTER_REACTIVATE);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
setDocAction(DocAction.ACTION_Complete);
|
||||
setProcessed(false);
|
||||
return false; // reactivate needs to be implemented to reverse the effect of complete and post
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSummary() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(getDocumentNo());
|
||||
String description = null;
|
||||
if (po.columnExists(DOC_COLUMNNAME_Description))
|
||||
description = po.get_ValueAsString(DOC_COLUMNNAME_Description);
|
||||
if (!Util.isEmpty(description))
|
||||
sb.append(" - ").append(description);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDocumentNo() {
|
||||
if (po.columnExists(DOC_COLUMNNAME_DocumentNo)) {
|
||||
return po.get_ValueAsString(DOC_COLUMNNAME_DocumentNo);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDocumentInfo() {
|
||||
int doctype = -1;
|
||||
if (po.columnExists(DOC_COLUMNNAME_C_DocTypeTarget_ID)) {
|
||||
doctype = po.get_ValueAsInt(DOC_COLUMNNAME_C_DocTypeTarget_ID);
|
||||
} else if (po.columnExists(DOC_COLUMNNAME_C_DocType_ID)) {
|
||||
doctype = po.get_ValueAsInt(DOC_COLUMNNAME_C_DocType_ID);
|
||||
}
|
||||
MDocType dt = null;
|
||||
if (doctype > 0) {
|
||||
dt = MDocType.get(getCtx(), doctype);
|
||||
}
|
||||
StringBuilder msgreturn = new StringBuilder().append((dt != null ? dt.getNameTrl() : "")).append(" ").append(getDocumentNo());
|
||||
return msgreturn.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public File createPDF() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProcessMsg() {
|
||||
return m_processMsg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDoc_User_ID() {
|
||||
int userid = 0;
|
||||
if (po.columnExists(DOC_COLUMNNAME_SalesRep_ID)) {
|
||||
userid = po.get_ValueAsInt(DOC_COLUMNNAME_SalesRep_ID);
|
||||
} else if (po.columnExists(DOC_COLUMNNAME_AD_User_ID)) {
|
||||
userid = po.get_ValueAsInt(DOC_COLUMNNAME_AD_User_ID);
|
||||
} else {
|
||||
userid = po.getCreatedBy();
|
||||
}
|
||||
return userid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getC_Currency_ID() {
|
||||
int currency = 0;
|
||||
if (po.columnExists(DOC_COLUMNNAME_C_Currency_ID)) {
|
||||
currency = po.get_ValueAsInt(DOC_COLUMNNAME_C_Currency_ID);
|
||||
}
|
||||
return currency;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BigDecimal getApprovalAmt() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAD_Client_ID() {
|
||||
return po.getAD_Client_ID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAD_Org_ID() {
|
||||
return po.getAD_Org_ID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDocAction() {
|
||||
po.columnExists(DOC_COLUMNNAME_DocAction, true);
|
||||
return (String)po.get_Value(DOC_COLUMNNAME_DocAction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean save() {
|
||||
return po.save();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveEx() throws AdempiereException {
|
||||
po.saveEx();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Properties getCtx() {
|
||||
return po.getCtx();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int get_ID() {
|
||||
return po.get_ID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int get_Table_ID() {
|
||||
return po.get_Table_ID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CLogger get_Logger() {
|
||||
return po.get_Logger();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String get_TrxName() {
|
||||
return po.get_TrxName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Document Action.
|
||||
* @param DocAction The targeted status of the document
|
||||
*/
|
||||
public void setDocAction (String DocAction) {
|
||||
po.columnExists(DOC_COLUMNNAME_DocAction, true);
|
||||
po.set_ValueOfColumn(DOC_COLUMNNAME_DocAction, DocAction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Processing Now.
|
||||
* @param Processing Process Now
|
||||
*/
|
||||
public void setProcessing (boolean Processing)
|
||||
{
|
||||
po.columnExists(DOC_COLUMNNAME_Processing, true);
|
||||
po.set_ValueOfColumn(DOC_COLUMNNAME_Processing, Boolean.valueOf(Processing));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Processed.
|
||||
* @param Processed The document has been processed
|
||||
*/
|
||||
public void setProcessed (boolean Processed) {
|
||||
po.columnExists(DOC_COLUMNNAME_Processed, true);
|
||||
po.set_ValueNoCheck (DOC_COLUMNNAME_Processed, Boolean.valueOf(Processed));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Approved.
|
||||
* @return Indicates if this document requires approval
|
||||
*/
|
||||
public boolean isApproved() {
|
||||
if (po.columnExists(DOC_COLUMNNAME_IsApproved)) {
|
||||
Object oo = po.get_Value(DOC_COLUMNNAME_IsApproved);
|
||||
if (oo != null) {
|
||||
if (oo instanceof Boolean)
|
||||
return ((Boolean)oo).booleanValue();
|
||||
return "Y".equals(oo);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Approved.
|
||||
* @param IsApproved Indicates if this document requires approval
|
||||
*/
|
||||
public void setIsApproved (boolean IsApproved) {
|
||||
po.columnExists(DOC_COLUMNNAME_IsApproved, true);
|
||||
po.set_ValueNoCheck (DOC_COLUMNNAME_IsApproved, Boolean.valueOf(IsApproved));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the definite document number after completed
|
||||
*/
|
||||
private void setDefiniteDocumentNo() {
|
||||
int doctype = -1;
|
||||
if (po.columnExists(DOC_COLUMNNAME_C_DocType_ID)) {
|
||||
doctype = po.get_ValueAsInt(DOC_COLUMNNAME_C_DocType_ID);
|
||||
}
|
||||
Timestamp dateacct = null;
|
||||
if (po.columnExists(DOC_COLUMNNAME_DateAcct)) {
|
||||
dateacct = (Timestamp) po.get_Value(DOC_COLUMNNAME_DateAcct);
|
||||
}
|
||||
Timestamp datetrx = null;
|
||||
if (po.columnExists(DOC_COLUMNNAME_DateTrx)) {
|
||||
datetrx = (Timestamp) po.get_Value(DOC_COLUMNNAME_DateTrx);
|
||||
}
|
||||
if (datetrx == null) {
|
||||
datetrx = TimeUtil.getDay(0);
|
||||
}
|
||||
if (doctype >= 0) {
|
||||
MPeriod.testPeriodOpen(getCtx(), (dateacct != null ? dateacct : datetrx), doctype, getAD_Org_ID());
|
||||
MDocType dt = MDocType.get(doctype);
|
||||
if (dt.isOverwriteDateOnComplete()) {
|
||||
if (po.columnExists(DOC_COLUMNNAME_DateTrx)) {
|
||||
po.set_ValueOfColumn(DOC_COLUMNNAME_DateTrx, TimeUtil.getDay(0));
|
||||
}
|
||||
if (dateacct != null && dateacct.before(datetrx)) {
|
||||
po.set_ValueOfColumn(DOC_COLUMNNAME_DateAcct, datetrx);
|
||||
MPeriod.testPeriodOpen(getCtx(), datetrx, doctype, getAD_Org_ID());
|
||||
}
|
||||
}
|
||||
if (dt.isOverwriteSeqOnComplete()) {
|
||||
if (po.columnExists(DOC_COLUMNNAME_DocumentNo)) {
|
||||
String value = DB.getDocumentNo(doctype, get_TrxName(), true, po);
|
||||
if (value != null)
|
||||
po.set_ValueOfColumn(DOC_COLUMNNAME_DocumentNo, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -20,6 +20,8 @@
|
|||
// Generic PO.
|
||||
package org.adempiere.model;
|
||||
|
||||
import java.io.File;
|
||||
import java.math.BigDecimal;
|
||||
// import for GenericPO
|
||||
import java.sql.ResultSet;
|
||||
import java.util.Properties;
|
||||
|
@ -27,6 +29,7 @@ import java.util.Properties;
|
|||
import org.compiere.model.MTable;
|
||||
import org.compiere.model.PO;
|
||||
import org.compiere.model.POInfo;
|
||||
import org.compiere.process.DocAction;
|
||||
|
||||
/**
|
||||
* Generic PO implementation, this can be use together with ModelValidator as alternative to the classic
|
||||
|
@ -36,13 +39,14 @@ import org.compiere.model.POInfo;
|
|||
* @author Marco LOMBARDO
|
||||
* @contributor Low Heng Sin
|
||||
*/
|
||||
public class GenericPO extends PO {
|
||||
|
||||
public class GenericPO extends PO implements DocAction {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -6558017105997010172L;
|
||||
|
||||
private static final long serialVersionUID = 3180937588404433030L;
|
||||
|
||||
private DocActionDelegate<GenericPO> docActionDelegate = new DocActionDelegate<>(this);
|
||||
|
||||
/**
|
||||
* @param tableName
|
||||
* @param ctx
|
||||
|
@ -132,6 +136,210 @@ public class GenericPO extends PO {
|
|||
return Integer.parseInt(p_info.getAccessLevel());
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* METHODS TO USE GenericPO in Documents */
|
||||
|
||||
/**
|
||||
* Set Document Status.
|
||||
* @param DocStatus The current status of the document
|
||||
*/
|
||||
@Override
|
||||
public void setDocStatus(String DocStatus) {
|
||||
docActionDelegate.setDocStatus(DocStatus);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Document Status.
|
||||
* @return The current status of the document
|
||||
*/
|
||||
@Override
|
||||
public String getDocStatus() {
|
||||
return docActionDelegate.getDocStatus();
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* Process document
|
||||
* @param processAction document action
|
||||
* @return true if performed
|
||||
*/
|
||||
@Override
|
||||
public boolean processIt (String processAction) {
|
||||
return docActionDelegate.processIt(processAction);
|
||||
} // process
|
||||
|
||||
/**
|
||||
* Unlock Document.
|
||||
* @return true if success
|
||||
*/
|
||||
@Override
|
||||
public boolean unlockIt()
|
||||
{
|
||||
return docActionDelegate.unlockIt();
|
||||
} // unlockIt
|
||||
|
||||
/**
|
||||
* Get Document Action.
|
||||
* @return The targeted status of the document
|
||||
*/
|
||||
@Override
|
||||
public String getDocAction() {
|
||||
return docActionDelegate.getDocAction();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalidate Document
|
||||
* @return true if success
|
||||
*/
|
||||
@Override
|
||||
public boolean invalidateIt()
|
||||
{
|
||||
return docActionDelegate.invalidateIt();
|
||||
} // invalidateIt
|
||||
|
||||
/**
|
||||
* Prepare Document
|
||||
* @return new status (In Progress or Invalid)
|
||||
*/
|
||||
@Override
|
||||
public String prepareIt() {
|
||||
return docActionDelegate.prepareIt();
|
||||
} // prepareIt
|
||||
|
||||
/**
|
||||
* Approve Document
|
||||
* @return true if success
|
||||
*/
|
||||
@Override
|
||||
public boolean approveIt() {
|
||||
return docActionDelegate.approveIt();
|
||||
} // approveIt
|
||||
|
||||
/**
|
||||
* Reject Approval
|
||||
* @return true if success
|
||||
*/
|
||||
@Override
|
||||
public boolean rejectIt() {
|
||||
return docActionDelegate.rejectIt();
|
||||
} // rejectIt
|
||||
|
||||
/**
|
||||
* Complete Document
|
||||
* @return new status (Complete, In Progress, Invalid, Waiting ..)
|
||||
*/
|
||||
@Override
|
||||
public String completeIt() {
|
||||
return docActionDelegate.completeIt();
|
||||
} // completeIt
|
||||
|
||||
/**
|
||||
* Void Document.
|
||||
* @return true if success
|
||||
*/
|
||||
@Override
|
||||
public boolean voidIt()
|
||||
{
|
||||
return docActionDelegate.voidIt();
|
||||
} // voidIt
|
||||
|
||||
/**
|
||||
* Close Document.
|
||||
* @return true if success
|
||||
*/
|
||||
@Override
|
||||
public boolean closeIt()
|
||||
{
|
||||
return docActionDelegate.closeIt();
|
||||
} // closeIt
|
||||
|
||||
/**
|
||||
* Reverse Correction - same date
|
||||
* @return true if success
|
||||
*/
|
||||
@Override
|
||||
public boolean reverseCorrectIt()
|
||||
{
|
||||
return docActionDelegate.reverseCorrectIt();
|
||||
} // reverseCorrectIt
|
||||
|
||||
/**
|
||||
* Reverse Accrual - none
|
||||
* @return false
|
||||
*/
|
||||
@Override
|
||||
public boolean reverseAccrualIt()
|
||||
{
|
||||
return docActionDelegate.reverseAccrualIt();
|
||||
} // reverseAccrualIt
|
||||
|
||||
/**
|
||||
* Re-activate.
|
||||
* @return true if success
|
||||
*/
|
||||
@Override
|
||||
public boolean reActivateIt()
|
||||
{
|
||||
return docActionDelegate.reActivateIt();
|
||||
} // reActivateIt
|
||||
|
||||
/*************************************************************************
|
||||
* Get Summary
|
||||
* @return Summary of Document
|
||||
*/
|
||||
@Override
|
||||
public String getSummary() {
|
||||
return docActionDelegate.getSummary();
|
||||
} // getSummary
|
||||
|
||||
@Override
|
||||
public String getDocumentNo() {
|
||||
return docActionDelegate.getDocumentNo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Document Info
|
||||
* @return document info (untranslated)
|
||||
*/
|
||||
@Override
|
||||
public String getDocumentInfo() {
|
||||
return docActionDelegate.getDocumentInfo();
|
||||
} // getDocumentInfo
|
||||
|
||||
@Override
|
||||
public File createPDF() {
|
||||
return docActionDelegate.createPDF();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Process Message
|
||||
* @return clear text error message
|
||||
*/
|
||||
@Override
|
||||
public String getProcessMsg() {
|
||||
return docActionDelegate.getProcessMsg();
|
||||
} // getProcessMsg
|
||||
|
||||
@Override
|
||||
public int getDoc_User_ID() {
|
||||
return docActionDelegate.getDoc_User_ID();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Currency.
|
||||
* @return The Currency for this record
|
||||
*/
|
||||
@Override
|
||||
public int getC_Currency_ID() {
|
||||
return docActionDelegate.getC_Currency_ID();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public BigDecimal getApprovalAmt() {
|
||||
return docActionDelegate.getApprovalAmt();
|
||||
}
|
||||
|
||||
} // GenericPO
|
||||
|
||||
/**
|
||||
|
|
|
@ -112,7 +112,7 @@ public abstract class PO
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -6130455457377290526L;
|
||||
private static final long serialVersionUID = 571979727987834997L;
|
||||
|
||||
public static final String LOCAL_TRX_PREFIX = "POSave";
|
||||
|
||||
|
@ -5174,4 +5174,26 @@ public abstract class PO
|
|||
return retValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if a column exists
|
||||
* @param columnName
|
||||
* @param throwException - must throw an exception when the column doesn't exist
|
||||
* @return
|
||||
*/
|
||||
public boolean columnExists(String columnName, boolean throwException) {
|
||||
int idx = get_ColumnIndex(columnName);
|
||||
if (idx < 0 && throwException)
|
||||
throw new AdempiereException("Column " + get_TableName() +"." + columnName + " not found");
|
||||
return (idx >= 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if a column exists
|
||||
* @param columnName
|
||||
* @return boolean
|
||||
*/
|
||||
public boolean columnExists(String columnName) {
|
||||
return columnExists(columnName, false);
|
||||
}
|
||||
|
||||
} // PO
|
||||
|
|
|
@ -90,7 +90,37 @@ public interface DocAction
|
|||
|
||||
/** DocAction Ref_List values **/
|
||||
public static final int AD_REFERENCE_ID = SystemIDs.REFERENCE_DOCUMENTACTION;
|
||||
|
||||
|
||||
/* Common Document columns */
|
||||
/** Column name DocAction */
|
||||
public static final String DOC_COLUMNNAME_DocAction = "DocAction";
|
||||
/** Column name DocStatus */
|
||||
public static final String DOC_COLUMNNAME_DocStatus = "DocStatus";
|
||||
/** Column name Processing */
|
||||
public static final String DOC_COLUMNNAME_Processing = "Processing";
|
||||
/** Column name C_DocTypeTarget_ID */
|
||||
public static final String DOC_COLUMNNAME_C_DocTypeTarget_ID = "C_DocTypeTarget_ID";
|
||||
/** Column name C_DocType_ID */
|
||||
public static final String DOC_COLUMNNAME_C_DocType_ID = "C_DocType_ID";
|
||||
/** Column name DateAcct */
|
||||
public static final String DOC_COLUMNNAME_DateAcct = "DateAcct";
|
||||
/** Column name DateTrx */
|
||||
public static final String DOC_COLUMNNAME_DateTrx = "DateTrx";
|
||||
/** Column name IsApproved */
|
||||
public static final String DOC_COLUMNNAME_IsApproved = "IsApproved";
|
||||
/** Column name Processed */
|
||||
public static final String DOC_COLUMNNAME_Processed = "Processed";
|
||||
/** Column name DocumentNo */
|
||||
public static final String DOC_COLUMNNAME_DocumentNo = "DocumentNo";
|
||||
/** Column name Description */
|
||||
public static final String DOC_COLUMNNAME_Description = "Description";
|
||||
/** Column name SalesRep_ID */
|
||||
public static final String DOC_COLUMNNAME_SalesRep_ID = "SalesRep_ID";
|
||||
/** Column name AD_User_ID */
|
||||
public static final String DOC_COLUMNNAME_AD_User_ID = "AD_User_ID";
|
||||
/** Column name C_Currency_ID */
|
||||
public static final String DOC_COLUMNNAME_C_Currency_ID = "C_Currency_ID";
|
||||
|
||||
/**
|
||||
* Set Doc Status
|
||||
* @param newStatus new Status
|
||||
|
|
Loading…
Reference in New Issue