Document Revision

63 views
Skip to first unread message

shiju01

unread,
Mar 22, 2018, 10:02:33 AM3/22/18
to iDempiere
Hi all,

In many business it is a normal practice to REVISE documents especially Sales Quotation and/or Purchase Order

This requirement arise because once a Sales Quotation or Purchase Order is created and submitted to the Prospect / Customer (if Sales) or Supplier / Vendor (if Purchase)     

sometime either the Customer / Vendor can ask for some amendments like change of few line items or addition of new line items, so that revision of the original document is needed.


Since they are working on the same opportunity,  normally organization insist to have the  same Document No without incrementing it when creating the new revised document.



This leads to have a new feature where


       a) original or source Document should be in COMPLETED  status
      
       b) then a new DocAction is required RV-REVISE along with CO-CLOSE

       c) new RV-REVISE DocAction should

             - copy the source / original document to another new revised document

             - but the Document No of the newly created revised document should not increment the Document Sequence

             - instead it should copy / use the same Document No of the source document with an appended suffix called Revision No

             - the suffix of the Revision No should increment automatically each time the same opportunity is further revised (in case)

              - the newly created revised document should be left as DRAFT status for amendments by the users
  
              - where as the source / original document should be CLOSED blocking all further modification

             
    I request your further inputs, enhancements,  use cases, ideas  and solutions from rest of globe ....


Best Regards

      


 

  







 




shiju01

unread,
Mar 23, 2018, 5:30:05 AM3/23/18
to iDempiere

Seems like no one from the community is interested in  the feature for Revising the document .. so i made a tweak as follow instead elaborate development effort




/******************************************************************************
 * Product: Adempiere ERP & CRM Smart Business Solution                       *
 * Copyright (C) 1999-2006 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 in...@compiere.org or http://www.compiere.org/license.html           *
 *****************************************************************************/
package com.cattleya.process;
 
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.logging.Level;
 
import org.compiere.model.MDocType;
import org.compiere.model.MOrder;
import org.compiere.process.ProcessInfoParameter;
import org.compiere.process.SvrProcess;
 
/**
 *    Revise Order and optionally close
 *     
 *  @author Jorg Janke
 *  @version $Id: CopyOrder.java,v 1.2 2006/07/30 00:51:01 jjanke Exp $
 */
public class ReviseQuote extends SvrProcess
{
    /** Order to Copy                */
    private int         p_C_Order_ID = 0;
    /** Document Type of new Order    */
    private int         p_C_DocType_ID = 0;
    /** New Doc Date                */
    private Timestamp    p_DateDoc = null;
    /** Close/Process Old Order        */
    private boolean     p_IsCloseDocument = false;
     
    /**
     *  Prepare - e.g., get Parameters.
     */
    protected void prepare()
    {
        ProcessInfoParameter[] para = getParameter();
        for (int i = 0; i < para.length; i++)
        {
            String name = para[i].getParameterName();
            if (para[i].getParameter() == null)
                ;
            else if (name.equals("C_Order_ID"))
                p_C_Order_ID = ((BigDecimal)para[i].getParameter()).intValue();
            else if (name.equals("C_DocType_ID"))
                p_C_DocType_ID = ((BigDecimal)para[i].getParameter()).intValue();
            else if (name.equals("DateDoc"))
                p_DateDoc = (Timestamp)para[i].getParameter();
            else if (name.equals("IsCloseDocument"))
                p_IsCloseDocument = "Y".equals(para[i].getParameter());
            else
                log.log(Level.SEVERE, "Unknown Parameter: " + name);
        }
    }    //    prepare
 
    /**
     *  Perform process.
     *  @return Message (clear text)
     *  @throws Exception if not successful
     */
    protected String doIt() throws Exception
    {
        if (log.isLoggable(Level.INFO)) log.info("C_Order_ID=" + p_C_Order_ID 
            + ", C_DocType_ID=" + p_C_DocType_ID 
            + ", CloseDocument=" + p_IsCloseDocument);
        if (p_C_Order_ID == 0)
            throw new IllegalArgumentException("No Order");
/*         
        MDocType dt = MDocType.get(getCtx(), p_C_DocType_ID);
        if (dt.get_ID() == 0)
            throw new IllegalArgumentException("No DocType");
*/
        if (p_DateDoc == null)
            p_DateDoc = new Timestamp (System.currentTimeMillis());
        //
        MOrder from = new MOrder (getCtx(), p_C_Order_ID, get_TrxName());
        // Target Document Type
        p_C_DocType_ID = from.getC_DocTypeTarget_ID();
        MDocType dt = MDocType.get(getCtx(), p_C_DocType_ID);
        if (dt.get_ID() == 0)
            throw new IllegalArgumentException("No DocType");
        //
        MOrder newOrder = MOrder.copyFrom (from, p_DateDoc, 
            dt.getC_DocType_ID(), dt.isSOTrx(), false, true, get_TrxName());        //    copy ASI
        newOrder.setC_DocTypeTarget_ID(p_C_DocType_ID);
 
        newOrder.setDocumentNo(getRevisionNo(from.getDocumentNo()));

        newOrder.setRef_Order_ID(from.getC_Order_ID());
        // newOrder.setQuotationOrder_ID(from.getC_Order_ID()); // IDEMPIERE-475
        boolean OK = newOrder.save();
        if (!OK)
            throw new IllegalStateException("Could not create new Order");
        //
        p_IsCloseDocument=true;
        if (p_IsCloseDocument)
        {
            MOrder original = new MOrder (getCtx(), p_C_Order_ID, get_TrxName());         
/*
 *              original.setDocAction(MOrder.DOCACTION_Complete);
 *             if (!original.processIt(MOrder.DOCACTION_Complete)) {
 *                 log.warning("Order Process Failed: " + original.getDocumentNo() + " " + original.getProcessMsg());
 *                 throw new IllegalStateException("Order Process Failed: " + original.getDocumentNo() + " " + original.getProcessMsg());
 *             }
 * 
 *             original.saveEx();
 */
            original.setDocAction(MOrder.DOCACTION_Close);
            if (!original.processIt(MOrder.DOCACTION_Close)) {
                log.warning("Order Process Failed: " + original.getDocumentNo() + " " + original.getProcessMsg());
                throw new IllegalStateException("Order Process Failed: " + original.getDocumentNo() + " " + original.getProcessMsg());     
            }             
            original.saveEx();
        }
 
    //    Env.setSOTrx(getCtx(), newOrder.isSOTrx());
    //    return "@C_Order_ID@ " + newOrder.getDocumentNo();
        StringBuilder msgreturn = new StringBuilder().append(dt.getName()).append(": ").append(newOrder.getDocumentNo());
        addLog(0, null, null, msgreturn.toString(), newOrder.get_Table_ID(), newOrder.getC_Order_ID());
        return "@C_Order_ID@ @Created@";
    }    //    doIt
 
    private String getRevisionNo(String originalNo)
    {
        String revisionNo=originalNo.trim();
        if (originalNo.contains(".R")) 
        {
            int l=originalNo.trim().length();
            int i=originalNo.lastIndexOf(".R0");
            int version=Integer.valueOf(originalNo.substring(i+2).trim());
            revisionNo=originalNo.substring(0,i-1).concat(".R0".concat(String.valueOf(version+1))); 
        } 
        else 
        {
            revisionNo=originalNo.trim().concat(".R01");
        }
        //                     
        return revisionNo;
    }
     
}    //    CopyOrder
Reply all
Reply to author
Forward
0 new messages