From f5a2126e41b5ec391e15edad4c8203f702e3eb12 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Wed, 6 Jun 2007 05:53:38 +0000 Subject: [PATCH] * Refactoring to better separate business logic from view - Move some business rule from swing dialog VDocAction to DocumentEngine --- base/src/org/compiere/process/DocAction.java | 4 +- .../org/compiere/process/DocumentEngine.java | 247 ++++++++++++++++++ 2 files changed, 250 insertions(+), 1 deletion(-) diff --git a/base/src/org/compiere/process/DocAction.java b/base/src/org/compiere/process/DocAction.java index 3cf3cccc91..8ca5022c92 100644 --- a/base/src/org/compiere/process/DocAction.java +++ b/base/src/org/compiere/process/DocAction.java @@ -85,7 +85,9 @@ public interface DocAction /** Waiting Confirmation = WC */ public static final String STATUS_WaitingConfirmation = "WC"; - + /** DocAction Ref_List values **/ + public static final int AD_REFERENCE_ID = 135; + /** * Set Doc Status * @param newStatus new Status diff --git a/base/src/org/compiere/process/DocumentEngine.java b/base/src/org/compiere/process/DocumentEngine.java index 7ce7990156..019f2af50f 100644 --- a/base/src/org/compiere/process/DocumentEngine.java +++ b/base/src/org/compiere/process/DocumentEngine.java @@ -18,7 +18,12 @@ package org.compiere.process; import java.io.*; import java.math.*; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.*; +import java.util.logging.Level; + import javax.naming.*; import org.compiere.db.*; @@ -64,6 +69,9 @@ public class DocumentEngine implements DocAction /** Actual Doc Action */ private String m_action = null; + /** Logger */ + private static CLogger log = CLogger.getCLogger(DocumentEngine.class); + /** * Get Doc Status * @return document status @@ -823,4 +831,243 @@ public class DocumentEngine implements DocAction return null; } + /** + * Get list of valid document action into the options arary parameter. + * Set default document action into the docAction array parameter. + * @param docStatus + * @param processing + * @param orderType + * @param isSOTrx + * @param AD_Table_ID + * @param docAction + * @param options + * @return Number of valid options + */ + public static int getValidActions(String docStatus, Object processing, + String orderType, String isSOTrx, int AD_Table_ID, String[] docAction, String[] options) + { + if (options == null) + throw new IllegalArgumentException("Option array parameter is null"); + if (docAction == null) + throw new IllegalArgumentException("Doc action array parameter is null"); + + int index = 0; + +// Locked + if (processing != null) + { + boolean locked = "Y".equals(processing); + if (!locked && processing instanceof Boolean) + locked = ((Boolean)processing).booleanValue(); + if (locked) + options[index++] = DocumentEngine.ACTION_Unlock; + } + + // Approval required .. NA + if (docStatus.equals(DocumentEngine.STATUS_NotApproved)) + { + options[index++] = DocumentEngine.ACTION_Prepare; + options[index++] = DocumentEngine.ACTION_Void; + } + // Draft/Invalid .. DR/IN + else if (docStatus.equals(DocumentEngine.STATUS_Drafted) + || docStatus.equals(DocumentEngine.STATUS_Invalid)) + { + options[index++] = DocumentEngine.ACTION_Complete; + // options[index++] = DocumentEngine.ACTION_Prepare; + options[index++] = DocumentEngine.ACTION_Void; + } + // In Process .. IP + else if (docStatus.equals(DocumentEngine.STATUS_InProgress) + || docStatus.equals(DocumentEngine.STATUS_Approved)) + { + options[index++] = DocumentEngine.ACTION_Complete; + options[index++] = DocumentEngine.ACTION_Void; + } + // Complete .. CO + else if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Close; + } + // Waiting Payment + else if (docStatus.equals(DocumentEngine.STATUS_WaitingPayment) + || docStatus.equals(DocumentEngine.STATUS_WaitingConfirmation)) + { + options[index++] = DocumentEngine.ACTION_Void; + options[index++] = DocumentEngine.ACTION_Prepare; + } + // Closed, Voided, REversed .. CL/VO/RE + else if (docStatus.equals(DocumentEngine.STATUS_Closed) + || docStatus.equals(DocumentEngine.STATUS_Voided) + || docStatus.equals(DocumentEngine.STATUS_Reversed)) + return 0; + + /******************** + * Order + */ + if (AD_Table_ID == MOrder.Table_ID) + { + // Draft .. DR/IP/IN + if (docStatus.equals(DocumentEngine.STATUS_Drafted) + || docStatus.equals(DocumentEngine.STATUS_InProgress) + || docStatus.equals(DocumentEngine.STATUS_Invalid)) + { + options[index++] = DocumentEngine.ACTION_Prepare; + options[index++] = DocumentEngine.ACTION_Close; + // Draft Sales Order Quote/Proposal - Process + if ("Y".equals(isSOTrx) + && ("OB".equals(orderType) || "ON".equals(orderType))) + docAction[0] = DocumentEngine.ACTION_Prepare; + } + // Complete .. CO + else if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Void; + options[index++] = DocumentEngine.ACTION_ReActivate; + } + else if (docStatus.equals(DocumentEngine.STATUS_WaitingPayment)) + { + options[index++] = DocumentEngine.ACTION_ReActivate; + options[index++] = DocumentEngine.ACTION_Close; + } + } + /******************** + * Shipment + */ + else if (AD_Table_ID == MInOut.Table_ID) + { + // Complete .. CO + if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Void; + options[index++] = DocumentEngine.ACTION_Reverse_Correct; + } + } + /******************** + * Invoice + */ + else if (AD_Table_ID == MInvoice.Table_ID) + { + // Complete .. CO + if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Void; + options[index++] = DocumentEngine.ACTION_Reverse_Correct; + } + } + /******************** + * Payment + */ + else if (AD_Table_ID == MPayment.Table_ID) + { + // Complete .. CO + if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Void; + options[index++] = DocumentEngine.ACTION_Reverse_Correct; + } + } + /******************** + * GL Journal + */ + else if (AD_Table_ID == MJournal.Table_ID || AD_Table_ID == MJournalBatch.Table_ID) + { + // Complete .. CO + if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Reverse_Correct; + options[index++] = DocumentEngine.ACTION_Reverse_Accrual; + } + } + /******************** + * Allocation + */ + else if (AD_Table_ID == MAllocationHdr.Table_ID) + { + // Complete .. CO + if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Void; + options[index++] = DocumentEngine.ACTION_Reverse_Correct; + } + } + /******************** + * Bank Statement + */ + else if (AD_Table_ID == MBankStatement.Table_ID) + { + // Complete .. CO + if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Void; + } + } + /******************** + * Inventory Movement, Physical Inventory + */ + else if (AD_Table_ID == MMovement.Table_ID + || AD_Table_ID == MInventory.Table_ID) + { + // Complete .. CO + if (docStatus.equals(DocumentEngine.STATUS_Completed)) + { + options[index++] = DocumentEngine.ACTION_Void; + options[index++] = DocumentEngine.ACTION_Reverse_Correct; + } + } + return index; + } + + /** + * Fill Vector with DocAction Ref_List(135) values + * @param v_value + * @param v_name + * @param v_description + */ + public static void readReferenceList(ArrayList v_value, ArrayList v_name, + ArrayList v_description) + { + if (v_value == null) + throw new IllegalArgumentException("v_value parameter is null"); + if (v_name == null) + throw new IllegalArgumentException("v_name parameter is null"); + if (v_description == null) + throw new IllegalArgumentException("v_description parameter is null"); + + String sql; + if (Env.isBaseLanguage(Env.getCtx(), "AD_Ref_List")) + sql = "SELECT Value, Name, Description FROM AD_Ref_List " + + "WHERE AD_Reference_ID=? ORDER BY Name"; + else + sql = "SELECT l.Value, t.Name, t.Description " + + "FROM AD_Ref_List l, AD_Ref_List_Trl t " + + "WHERE l.AD_Ref_List_ID=t.AD_Ref_List_ID" + + " AND t.AD_Language='" + Env.getAD_Language(Env.getCtx()) + "'" + + " AND l.AD_Reference_ID=? ORDER BY t.Name"; + + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, DocAction.AD_REFERENCE_ID); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) + { + String value = rs.getString(1); + String name = rs.getString(2); + String description = rs.getString(3); + if (description == null) + description = ""; + // + v_value.add(value); + v_name.add(name); + v_description.add(description); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + } } // DocumentEnine