Spin Contribution: FR: Table like Document
From ADempiere
This Wiki is read-only for reference purposes to avoid broken links.
Contents
Propose
This allow create automatically the columns like C_DocType_ID, DocumentNo, DateDoc, Processed, IsApproved, DocStatus, DocAction and Description.... Enjoy it.
Installing new Feature
Import Migration Script
- Before beginning, you must import the migration script saved like xml files, the xml are called:
- 0072_Add_ERPCYA_EntityType: it is for import the Spin Contribution Entity Type.
- 0104_Add_IsDocument_Column: it is for import the Document Change in table.
- Go to Migration window and find the name Spin Contribution Entity Type and run process Apply Migration see the image below:
- Repeat previous step for Add Default Columns to Document Tables.
Using Feature
Creating new Table as Document
- Go to Table and Column window and create your custom table for handle document work flow, and before save, you must set the Is Document flag to true like show the image below.
- After save, you can check the columnas created in Column tab:
Process Created Automatically
- Wow.... The process also is created, see image:
Work Flow
- If you see the process, the work flow is created also:
- See that the workflow is created referenced table:
Verify Work Flow
- If you want make sure of workflow, you can go to Workflow Editor window in menu:
- See the workflow:
Generating Model Class
From Eclipse IDE
- ADempiere can create model class for any table, in it example, must be I_Test_Document_Table.java and X_Test_Document_Table.java. For help to developer and make easy it, when you run Generate Model launch, automatically is create the M class, then it would have as MTestDocumentTable, se image below:
- In Eclipse IDE you can see it like follow image:
The class example is below
/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2007 ComPiere, Inc. All Rights Reserved. * * This program is free software, you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. 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., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ package org.compiere.model; import java.io.File; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.Timestamp; import java.util.Properties; import org.compiere.process.DocAction; import org.compiere.process.DocumentEngine; import org.compiere.util.DB; /** Generated Model for Test_Document_Table * @author Adempiere (generated) * @version Release 3.8.0 - $Id$ */ public class MTestDocumentTable extends X_Test_Document_Table implements DocAction { /** * */ private static final long serialVersionUID = 20151116L; /** Standard Constructor */ public MTestDocumentTable (Properties ctx, int Test_Document_Table_ID, String trxName) { super (ctx, Test_Document_Table_ID, trxName); } /** Load Constructor */ public MTestDocumentTable (Properties ctx, ResultSet rs, String trxName) { super (ctx, rs, trxName); } /** * Get Document Info * @return document info (untranslated) */ public String getDocumentInfo() { MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); return dt.getName() + " " + getDocumentNo(); } // getDocumentInfo /** * Create PDF * @return File or null */ public File createPDF () { try { File temp = File.createTempFile(get_TableName() + get_ID() +"_", ".pdf"); return createPDF (temp); } catch (Exception e) { log.severe("Could not create PDF - " + e.getMessage()); } return null; } // getPDF /** * Create PDF file * @param file output file * @return file if success */ public File createPDF (File file) { // ReportEngine re = ReportEngine.get (getCtx(), ReportEngine.INVOICE, getC_Invoice_ID()); // if (re == null) return null; // return re.getPDF(file); } // createPDF /************************************************************************** * Process document * @param processAction document action * @return true if performed */ public boolean processIt (String processAction) { m_processMsg = null; DocumentEngine engine = new DocumentEngine (this, getDocStatus()); return engine.processIt (processAction, getDocAction()); } // processIt /** Process Message */ private String m_processMsg = null; /** Just Prepared Flag */ private boolean m_justPrepared = false; /** * Unlock Document. * @return true if success */ public boolean unlockIt() { log.info("unlockIt - " + toString()); // setProcessing(false); return true; } // unlockIt /** * Invalidate Document * @return true if success */ public boolean invalidateIt() { log.info("invalidateIt - " + toString()); setDocAction(DOCACTION_Prepare); return true; } // invalidateIt /** * Prepare Document * @return new status (In Progress or Invalid) */ public String prepareIt() { log.info(toString()); m_processMsg = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_BEFORE_PREPARE); if (m_processMsg != null) return DocAction.STATUS_Invalid; MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); // Std Period open? if (!MPeriod.isOpen(getCtx(), getDateDoc(), dt.getDocBaseType(), getAD_Org_ID())) { m_processMsg = "@PeriodClosed@"; return DocAction.STATUS_Invalid; } // Add up Amounts m_processMsg = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_AFTER_PREPARE); if (m_processMsg != null) return DocAction.STATUS_Invalid; m_justPrepared = true; if (!DOCACTION_Complete.equals(getDocAction())) setDocAction(DOCACTION_Complete); return DocAction.STATUS_InProgress; } // prepareIt /** * Approve Document * @return true if success */ public boolean approveIt() { log.info("approveIt - " + toString()); setIsApproved(true); return true; } // approveIt /** * Reject Approval * @return true if success */ public boolean rejectIt() { log.info("rejectIt - " + toString()); setIsApproved(false); return true; } // rejectIt /** * Complete Document * @return new status (Complete, In Progress, Invalid, Waiting ..) */ public String completeIt() { // Re-Check if (!m_justPrepared) { String status = prepareIt(); if (!DocAction.STATUS_InProgress.equals(status)) return status; } m_processMsg = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_BEFORE_COMPLETE); if (m_processMsg != null) return DocAction.STATUS_Invalid; // Implicit Approval if (!isApproved()) approveIt(); log.info(toString()); // // User Validation String valid = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_AFTER_COMPLETE); if (valid != null) { m_processMsg = valid; return DocAction.STATUS_Invalid; } // Set Definitive Document No setDefiniteDocumentNo(); setProcessed(true); setDocAction(DOCACTION_Close); return DocAction.STATUS_Completed; } // completeIt /** * Set the definite document number after completed */ private void setDefiniteDocumentNo() { MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); if (dt.isOverwriteDateOnComplete()) { setDateDoc(new Timestamp(System.currentTimeMillis())); } if (dt.isOverwriteSeqOnComplete()) { String value = null; int index = p_info.getColumnIndex("C_DocType_ID"); if (index == -1) index = p_info.getColumnIndex("C_DocTypeTarget_ID"); if (index != -1) // get based on Doc Type (might return null) value = DB.getDocumentNo(get_ValueAsInt(index), get_TrxName(), true); if (value != null) { setDocumentNo(value); } } } /** * Void Document. * Same as Close. * @return true if success */ public boolean voidIt() { log.info("voidIt - " + toString()); return closeIt(); } // voidIt /** * Close Document. * Cancel not delivered Qunatities * @return true if success */ public boolean closeIt() { log.info("closeIt - " + toString()); // Close Not delivered Qty setDocAction(DOCACTION_None); return true; } // closeIt /** * Reverse Correction * @return true if success */ public boolean reverseCorrectIt() { log.info("reverseCorrectIt - " + toString()); return false; } // reverseCorrectionIt /** * Reverse Accrual - none * @return true if success */ public boolean reverseAccrualIt() { log.info("reverseAccrualIt - " + toString()); return false; } // reverseAccrualIt /** * Re-activate * @return true if success */ public boolean reActivateIt() { log.info("reActivateIt - " + toString()); setProcessed(false); if (reverseCorrectIt()) return true; return false; } // reActivateIt /************************************************************************* * Get Summary * @return Summary of Document */ public String getSummary() { StringBuffer sb = new StringBuffer(); sb.append(getDocumentNo()); // sb.append(": ") // .append(Msg.translate(getCtx(),"TotalLines")).append("=").append(getTotalLines()) // .append(" (#").append(getLines(false).length).append(")"); // - Description if (getDescription() != null && getDescription().length() > 0) sb.append(" - ").append(getDescription()); return sb.toString(); } // getSummary /** * Get Process Message * @return clear text error message */ public String getProcessMsg() { return m_processMsg; } // getProcessMsg /** * Get Document Owner (Responsible) * @return AD_User_ID */ public int getDoc_User_ID() { // return getSalesRep_ID(); return 0; } // getDoc_User_ID /** * Get Document Approval Amount * @return amount */ public BigDecimal getApprovalAmt() { return null; //getTotalLines(); } // getApprovalAmt /** * Get Document Currency * @return C_Currency_ID */ public int getC_Currency_ID() { // MPriceList pl = MPriceList.get(getCtx(), getM_PriceList_ID()); // return pl.getC_Currency_ID(); return 0; } // getC_Currency_ID @Override public String toString() { StringBuffer sb = new StringBuffer ("MTestDocumentTable[") .append(getSummary()).append("]"); return sb.toString(); } }
Adempiere Change Set and Feature Request
- For see the source code change set, you can see http://github.com/adempiere/adempiere/issues/94