[ 1883270 ] Enhance Document No Formatting
This commit is contained in:
parent
62daa9a782
commit
0eb0137c73
|
@ -0,0 +1,76 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Product: Adempiere ERP & CRM Smart Business Solution *
|
||||||
|
* Copyright (C) 2008 Adempiere, 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. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.process;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
|
||||||
|
import org.compiere.process.ProcessInfoParameter;
|
||||||
|
import org.compiere.process.SvrProcess;
|
||||||
|
import org.compiere.util.DB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert AD_Sequence records that restart sequence at every year into
|
||||||
|
* AD_Sequence_No table if the record does not exists
|
||||||
|
*
|
||||||
|
* @author Elaine
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class UpdateSequenceNo extends SvrProcess {
|
||||||
|
|
||||||
|
private String year;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void prepare() {
|
||||||
|
ProcessInfoParameter[] parameters = this.getParameter();
|
||||||
|
for (ProcessInfoParameter p : parameters) {
|
||||||
|
if (p.getParameterName().equals("CalendarYear")) {
|
||||||
|
year = p.getParameter().toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String doIt() throws Exception {
|
||||||
|
|
||||||
|
PreparedStatement insertStmt = null;
|
||||||
|
try {
|
||||||
|
insertStmt = DB
|
||||||
|
.prepareStatement(
|
||||||
|
"INSERT INTO AD_Sequence_No(AD_SEQUENCE_ID, CALENDARYEAR, "
|
||||||
|
+ "AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY, "
|
||||||
|
+ "UPDATED, UPDATEDBY, CURRENTNEXT) "
|
||||||
|
+ "(SELECT AD_Sequence_ID, '" + year + "', "
|
||||||
|
+ "AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, "
|
||||||
|
+ "Updated, UpdatedBy, StartNo "
|
||||||
|
+ "FROM AD_Sequence a "
|
||||||
|
+ "WHERE StartNewYear = 'Y' AND NOT EXISTS ( "
|
||||||
|
+ "SELECT AD_Sequence_ID "
|
||||||
|
+ "FROM AD_Sequence_No b "
|
||||||
|
+ "WHERE a.AD_Sequence_ID = b.AD_Sequence_ID "
|
||||||
|
+ "AND CalendarYear = ?)) ",
|
||||||
|
get_TrxName());
|
||||||
|
insertStmt.setString(1, year);
|
||||||
|
insertStmt.executeUpdate();
|
||||||
|
commit();
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
rollback();
|
||||||
|
throw ex;
|
||||||
|
} finally {
|
||||||
|
DB.close(insertStmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Sequence No updated successfully";
|
||||||
|
}
|
||||||
|
}
|
|
@ -99,7 +99,8 @@ public class CalloutInOut extends CalloutEngine
|
||||||
if (C_DocType_ID == null || C_DocType_ID.intValue() == 0)
|
if (C_DocType_ID == null || C_DocType_ID.intValue() == 0)
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
String sql = "SELECT d.DocBaseType, d.IsDocNoControlled, s.CurrentNext "
|
String sql = "SELECT d.DocBaseType, d.IsDocNoControlled, s.CurrentNext, " //1..3
|
||||||
|
+ "s.AD_Sequence_ID, s.StartNewYear, s.DateColumn " //4..6
|
||||||
+ "FROM C_DocType d, AD_Sequence s "
|
+ "FROM C_DocType d, AD_Sequence s "
|
||||||
+ "WHERE C_DocType_ID=?" // 1
|
+ "WHERE C_DocType_ID=?" // 1
|
||||||
+ " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)";
|
+ " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)";
|
||||||
|
@ -139,7 +140,19 @@ public class CalloutInOut extends CalloutEngine
|
||||||
|
|
||||||
// DocumentNo
|
// DocumentNo
|
||||||
if (rs.getString("IsDocNoControlled").equals("Y"))
|
if (rs.getString("IsDocNoControlled").equals("Y"))
|
||||||
mTab.setValue("DocumentNo", "<" + rs.getString("CurrentNext") + ">");
|
{
|
||||||
|
if ("Y".equals(rs.getString(5)))
|
||||||
|
{
|
||||||
|
String dateColumn = rs.getString(6);
|
||||||
|
int AD_Sequence_ID = rs.getInt(4);
|
||||||
|
mTab.setValue("DocumentNo",
|
||||||
|
"<"
|
||||||
|
+ MSequence.getPreliminaryNoByYear(mTab, AD_Sequence_ID, dateColumn, null)
|
||||||
|
+ ">");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
mTab.setValue("DocumentNo", "<" + rs.getString("CurrentNext") + ">");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
rs.close();
|
rs.close();
|
||||||
pstmt.close();
|
pstmt.close();
|
||||||
|
|
|
@ -18,7 +18,9 @@ package org.compiere.model;
|
||||||
|
|
||||||
import java.math.*;
|
import java.math.*;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
import org.compiere.util.*;
|
import org.compiere.util.*;
|
||||||
|
|
||||||
|
@ -52,8 +54,9 @@ public class CalloutInvoice extends CalloutEngine
|
||||||
if (C_DocType_ID == null || C_DocType_ID.intValue() == 0)
|
if (C_DocType_ID == null || C_DocType_ID.intValue() == 0)
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
String sql = "SELECT d.HasCharges,'N',d.IsDocNoControlled,"
|
String sql = "SELECT d.HasCharges,'N',d.IsDocNoControlled," // 1..3
|
||||||
+ "s.CurrentNext, d.DocBaseType "
|
+ "s.CurrentNext, d.DocBaseType, " // 4..5
|
||||||
|
+ "s.StartNewYear, s.DateColumn, s.AD_Sequence_ID " //6..8
|
||||||
+ "FROM C_DocType d, AD_Sequence s "
|
+ "FROM C_DocType d, AD_Sequence s "
|
||||||
+ "WHERE C_DocType_ID=?" // 1
|
+ "WHERE C_DocType_ID=?" // 1
|
||||||
+ " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)";
|
+ " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)";
|
||||||
|
@ -68,7 +71,18 @@ public class CalloutInvoice extends CalloutEngine
|
||||||
Env.setContext(ctx, WindowNo, "HasCharges", rs.getString(1));
|
Env.setContext(ctx, WindowNo, "HasCharges", rs.getString(1));
|
||||||
// DocumentNo
|
// DocumentNo
|
||||||
if (rs.getString(3).equals("Y"))
|
if (rs.getString(3).equals("Y"))
|
||||||
mTab.setValue("DocumentNo", "<" + rs.getString(4) + ">");
|
{
|
||||||
|
if ("Y".equals(rs.getString(6)))
|
||||||
|
{
|
||||||
|
String dateColumn = rs.getString(7);
|
||||||
|
mTab.setValue("DocumentNo",
|
||||||
|
"<"
|
||||||
|
+ MSequence.getPreliminaryNoByYear(mTab, rs.getInt(8), dateColumn, null)
|
||||||
|
+ ">");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
mTab.setValue("DocumentNo", "<" + rs.getString(4) + ">");
|
||||||
|
}
|
||||||
// DocBaseType - Set Context
|
// DocBaseType - Set Context
|
||||||
String s = rs.getString(5);
|
String s = rs.getString(5);
|
||||||
Env.setContext(ctx, WindowNo, "DocBaseType", s);
|
Env.setContext(ctx, WindowNo, "DocBaseType", s);
|
||||||
|
@ -89,7 +103,6 @@ public class CalloutInvoice extends CalloutEngine
|
||||||
return "";
|
return "";
|
||||||
} // docType
|
} // docType
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoice Header- BPartner.
|
* Invoice Header- BPartner.
|
||||||
* - M_PriceList_ID (+ Context)
|
* - M_PriceList_ID (+ Context)
|
||||||
|
|
|
@ -18,7 +18,9 @@ package org.compiere.model;
|
||||||
|
|
||||||
import java.math.*;
|
import java.math.*;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
import org.compiere.util.*;
|
import org.compiere.util.*;
|
||||||
|
|
||||||
|
@ -65,7 +67,8 @@ public class CalloutOrder extends CalloutEngine
|
||||||
|
|
||||||
String sql = "SELECT d.DocSubTypeSO,d.HasCharges,'N'," // 1..3
|
String sql = "SELECT d.DocSubTypeSO,d.HasCharges,'N'," // 1..3
|
||||||
+ "d.IsDocNoControlled,s.CurrentNext,s.CurrentNextSys," // 4..6
|
+ "d.IsDocNoControlled,s.CurrentNext,s.CurrentNextSys," // 4..6
|
||||||
+ "s.AD_Sequence_ID,d.IsSOTrx " // 7..8
|
+ "s.AD_Sequence_ID,d.IsSOTrx, " // 7..8
|
||||||
|
+ "s.StartNewYear, s.DateColumn " // 9..10
|
||||||
+ "FROM C_DocType d, AD_Sequence s "
|
+ "FROM C_DocType d, AD_Sequence s "
|
||||||
+ "WHERE C_DocType_ID=?" // #1
|
+ "WHERE C_DocType_ID=?" // #1
|
||||||
+ " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)";
|
+ " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)";
|
||||||
|
@ -80,7 +83,7 @@ public class CalloutOrder extends CalloutEngine
|
||||||
pstmt.setInt(1, oldC_DocType_ID.intValue());
|
pstmt.setInt(1, oldC_DocType_ID.intValue());
|
||||||
ResultSet rs = pstmt.executeQuery();
|
ResultSet rs = pstmt.executeQuery();
|
||||||
if (rs.next())
|
if (rs.next())
|
||||||
AD_Sequence_ID = rs.getInt(6);
|
AD_Sequence_ID = rs.getInt(7);
|
||||||
rs.close();
|
rs.close();
|
||||||
pstmt.close();
|
pstmt.close();
|
||||||
}
|
}
|
||||||
|
@ -138,7 +141,20 @@ public class CalloutOrder extends CalloutEngine
|
||||||
if (Ini.isPropertyBool(Ini.P_ADEMPIERESYS) && Env.getAD_Client_ID(Env.getCtx()) < 1000000)
|
if (Ini.isPropertyBool(Ini.P_ADEMPIERESYS) && Env.getAD_Client_ID(Env.getCtx()) < 1000000)
|
||||||
mTab.setValue("DocumentNo", "<" + rs.getString(6) + ">");
|
mTab.setValue("DocumentNo", "<" + rs.getString(6) + ">");
|
||||||
else
|
else
|
||||||
mTab.setValue("DocumentNo", "<" + rs.getString(5) + ">");
|
{
|
||||||
|
if ("Y".equals(rs.getString(9)))
|
||||||
|
{
|
||||||
|
String dateColumn = rs.getString(10);
|
||||||
|
mTab.setValue("DocumentNo",
|
||||||
|
"<"
|
||||||
|
+ MSequence.getPreliminaryNoByYear(mTab, rs.getInt(7), dateColumn, null)
|
||||||
|
+ ">");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mTab.setValue("DocumentNo", "<" + rs.getString(5) + ">");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rs.close();
|
rs.close();
|
||||||
|
@ -208,7 +224,6 @@ public class CalloutOrder extends CalloutEngine
|
||||||
return "";
|
return "";
|
||||||
} // docType
|
} // docType
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Order Header - BPartner.
|
* Order Header - BPartner.
|
||||||
* - M_PriceList_ID (+ Context)
|
* - M_PriceList_ID (+ Context)
|
||||||
|
|
|
@ -1499,7 +1499,7 @@ public class MInOut extends X_M_InOut implements DocAction
|
||||||
setMovementDate(new Timestamp (System.currentTimeMillis()));
|
setMovementDate(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -610,7 +610,7 @@ public class MInventory extends X_M_Inventory implements DocAction
|
||||||
setMovementDate(new Timestamp (System.currentTimeMillis()));
|
setMovementDate(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1887,7 +1887,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
|
||||||
setDateInvoiced(new Timestamp (System.currentTimeMillis()));
|
setDateInvoiced(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -330,7 +330,7 @@ public class MJournal extends X_GL_Journal implements DocAction
|
||||||
protected boolean afterSave (boolean newRecord, boolean success)
|
protected boolean afterSave (boolean newRecord, boolean success)
|
||||||
{
|
{
|
||||||
if (!success)
|
if (!success)
|
||||||
return success;
|
return success;
|
||||||
return updateBatch();
|
return updateBatch();
|
||||||
} // afterSave
|
} // afterSave
|
||||||
|
|
||||||
|
@ -567,7 +567,7 @@ public class MJournal extends X_GL_Journal implements DocAction
|
||||||
setDateDoc(new Timestamp (System.currentTimeMillis()));
|
setDateDoc(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -496,7 +496,7 @@ public class MJournalBatch extends X_GL_JournalBatch implements DocAction
|
||||||
setDateDoc(new Timestamp (System.currentTimeMillis()));
|
setDateDoc(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -549,7 +549,7 @@ public class MMovement extends X_M_Movement implements DocAction
|
||||||
setMovementDate(new Timestamp (System.currentTimeMillis()));
|
setMovementDate(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1774,7 +1774,7 @@ public class MOrder extends X_C_Order implements DocAction
|
||||||
setDateOrdered(new Timestamp (System.currentTimeMillis()));
|
setDateOrdered(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1672,7 +1672,7 @@ public final class MPayment extends X_C_Payment
|
||||||
setDateTrx(new Timestamp (System.currentTimeMillis()));
|
setDateTrx(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -422,7 +422,7 @@ public class MRMA extends X_M_RMA implements DocAction
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -355,7 +355,7 @@ public class MRequisition extends X_M_Requisition implements DocAction
|
||||||
setDateDoc(new Timestamp (System.currentTimeMillis()));
|
setDateDoc(new Timestamp (System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
if (dt.isOverwriteSeqOnComplete()) {
|
if (dt.isOverwriteSeqOnComplete()) {
|
||||||
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true);
|
String value = DB.getDocumentNo(getC_DocType_ID(), get_TrxName(), true, this);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
setDocumentNo(value);
|
setDocumentNo(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,11 @@ package org.compiere.model;
|
||||||
|
|
||||||
import java.rmi.RemoteException;
|
import java.rmi.RemoteException;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
@ -27,6 +31,7 @@ import java.net.*;
|
||||||
import org.compiere.db.CConnection;
|
import org.compiere.db.CConnection;
|
||||||
import org.compiere.interfaces.Server;
|
import org.compiere.interfaces.Server;
|
||||||
import org.compiere.util.*;
|
import org.compiere.util.*;
|
||||||
|
import org.postgresql.jdbc2.optional.SimpleDataSource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence Model.
|
* Sequence Model.
|
||||||
|
@ -294,33 +299,73 @@ public class MSequence extends X_AD_Sequence
|
||||||
cstmt.registerOutParameter(3, Types.INTEGER);
|
cstmt.registerOutParameter(3, Types.INTEGER);
|
||||||
cstmt.execute();
|
cstmt.execute();
|
||||||
retValue = cstmt.getInt(3);
|
retValue = cstmt.getInt(3);
|
||||||
cstmt.close();
|
|
||||||
cstmt = null;
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
s_log.log(Level.SEVERE, e.toString());
|
s_log.log(Level.SEVERE, e.toString());
|
||||||
}
|
}
|
||||||
// Finish
|
finally
|
||||||
try
|
{
|
||||||
{
|
DB.close(cstmt);
|
||||||
if (cstmt != null)
|
|
||||||
cstmt.close();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
return retValue;
|
return retValue;
|
||||||
} // nextID
|
} // nextID
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get next id by year
|
||||||
|
* @param conn
|
||||||
|
* @param AD_Sequence_ID
|
||||||
|
* @param incrementNo
|
||||||
|
* @param calendarYear
|
||||||
|
* @return next id
|
||||||
|
*/
|
||||||
|
private static int nextIDByYear(Connection conn, int AD_Sequence_ID,
|
||||||
|
int incrementNo, String calendarYear) {
|
||||||
|
if (conn == null || AD_Sequence_ID == 0)
|
||||||
|
return -3;
|
||||||
|
//
|
||||||
|
int retValue = -1;
|
||||||
|
String sqlUpdate = "{call nextIDByYear(?,?,?,?)}";
|
||||||
|
CallableStatement cstmt = null;
|
||||||
|
try {
|
||||||
|
cstmt = conn.prepareCall(sqlUpdate, ResultSet.TYPE_FORWARD_ONLY,
|
||||||
|
ResultSet.CONCUR_READ_ONLY);
|
||||||
|
|
||||||
|
cstmt.setInt(1, AD_Sequence_ID);
|
||||||
|
cstmt.setInt(2, incrementNo);
|
||||||
|
cstmt.setString(3, calendarYear);
|
||||||
|
cstmt.registerOutParameter(4, Types.INTEGER);
|
||||||
|
cstmt.execute();
|
||||||
|
retValue = cstmt.getInt(4);
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_log.log(Level.SEVERE, e.toString());
|
||||||
|
} finally {
|
||||||
|
DB.close(cstmt);
|
||||||
|
}
|
||||||
|
return retValue;
|
||||||
|
} // nextID
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* Get Document No from table
|
||||||
|
* @param AD_Client_ID client
|
||||||
|
* @param TableName table name
|
||||||
|
* @param trxName optional Transaction Name
|
||||||
|
* @return document no or null
|
||||||
|
*/
|
||||||
|
public static synchronized String getDocumentNo (int AD_Client_ID, String TableName, String trxName)
|
||||||
|
{
|
||||||
|
return getDocumentNo(AD_Client_ID, TableName, trxName, null);
|
||||||
|
|
||||||
|
}
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* Get Document No from table
|
* Get Document No from table
|
||||||
* @param AD_Client_ID client
|
* @param AD_Client_ID client
|
||||||
* @param TableName table name
|
* @param TableName table name
|
||||||
* @param trxName optional Transaction Name
|
* @param trxName optional Transaction Name
|
||||||
|
* @param PO
|
||||||
* @return document no or null
|
* @return document no or null
|
||||||
*/
|
*/
|
||||||
public static synchronized String getDocumentNo (int AD_Client_ID, String TableName, String trxName)
|
public static synchronized String getDocumentNo (int AD_Client_ID, String TableName, String trxName, PO po)
|
||||||
{
|
{
|
||||||
if (TableName == null || TableName.length() == 0)
|
if (TableName == null || TableName.length() == 0)
|
||||||
throw new IllegalArgumentException("TableName missing");
|
throw new IllegalArgumentException("TableName missing");
|
||||||
|
@ -354,42 +399,93 @@ public class MSequence extends X_AD_Sequence
|
||||||
//
|
//
|
||||||
if (CLogMgt.isLevel(LOGLEVEL))
|
if (CLogMgt.isLevel(LOGLEVEL))
|
||||||
s_log.log(LOGLEVEL, TableName + " - AdempiereSys=" + adempiereSys + " [" + trxName + "]");
|
s_log.log(LOGLEVEL, TableName + " - AdempiereSys=" + adempiereSys + " [" + trxName + "]");
|
||||||
//begin vpj-cd e-evolution 09/02/2005 PostgreSQL
|
|
||||||
|
PreparedStatement pstmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
boolean isStartNewYear = false;
|
||||||
|
String dateColumn = null;
|
||||||
|
|
||||||
|
if (!adempiereSys)
|
||||||
|
{
|
||||||
|
// Get the Start New Year flag
|
||||||
|
String startNewYearSQL = "SELECT StartNewYear, DateColumn FROM AD_Sequence "
|
||||||
|
+ "WHERE Name = ? AND IsActive = 'Y' AND IsTableID = 'N' AND IsAutoSequence='Y' AND AD_Client_ID = ?";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
pstmt = DB.prepareStatement(startNewYearSQL, trxName);
|
||||||
|
pstmt.setString(1, PREFIX_DOCSEQ + TableName);
|
||||||
|
pstmt.setInt(2, AD_Client_ID);
|
||||||
|
rs = pstmt.executeQuery();
|
||||||
|
if (rs.next()) {
|
||||||
|
isStartNewYear = "Y".equals(rs.getString(1));
|
||||||
|
dateColumn = rs.getString(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
s_log.log(Level.SEVERE, "(Table) [" + trxName + "]", e);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
DB.close(rs, pstmt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
String selectSQL = null;
|
String selectSQL = null;
|
||||||
if (DB.isOracle() == false)
|
if (DB.isOracle() == false)
|
||||||
{
|
{
|
||||||
selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, Prefix, Suffix, AD_Sequence_ID "
|
if (isStartNewYear) {
|
||||||
+ "FROM AD_Sequence "
|
selectSQL = "SELECT y.CurrentNext, s.IncrementNo, s.CurrentNextSys, s.Prefix, s.Suffix, s.AD_Sequence_ID "
|
||||||
+ "WHERE Name=?"
|
+ "FROM AD_Sequence_No y, AD_Sequence s "
|
||||||
//jz fix duplicated nextID + " AND AD_Client_ID IN (0,?)"
|
+ "WHERE y.AD_Sequence_ID = s.AD_Sequence_ID "
|
||||||
+ " AND AD_Client_ID = ?"
|
+ "AND s.Name = ? "
|
||||||
+ " AND IsActive='Y' AND IsTableID='N' AND IsAutoSequence='Y' "
|
+ "AND s.AD_Client_ID = ? "
|
||||||
+ "ORDER BY AD_Client_ID DESC "
|
+ "AND y.CalendarYear = ? "
|
||||||
+ " FOR UPDATE OF AD_Sequence ";
|
+ "AND s.IsActive='Y' AND s.IsTableID='N' AND s.IsAutoSequence='Y' "
|
||||||
|
+ "ORDER BY s.AD_Client_ID DESC "
|
||||||
|
+ "FOR UPDATE OF AD_Sequence_No";
|
||||||
|
} else {
|
||||||
|
selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, AD_Sequence_ID "
|
||||||
|
+ "FROM AD_Sequence "
|
||||||
|
+ "WHERE Name = ? "
|
||||||
|
+ "AND AD_Client_ID = ? "
|
||||||
|
+ "AND IsActive='Y' AND IsTableID='N' AND IsAutoSequence='Y' "
|
||||||
|
+ "ORDER BY AD_Client_ID DESC "
|
||||||
|
+ "FOR UPDATE OF AD_Sequence";
|
||||||
|
}
|
||||||
USE_PROCEDURE=false;
|
USE_PROCEDURE=false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//String selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, Prefix, Suffix, AD_Sequence_ID "
|
if (isStartNewYear) {
|
||||||
selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, Prefix, Suffix, AD_Sequence_ID "
|
selectSQL = "SELECT y.CurrentNext, s.IncrementNo, s.CurrentNextSys, Prefix, Suffix, s.AD_Sequence_ID "
|
||||||
//end vpj-cd e-evolution 09/02/2005 PostgreSQL
|
+ "FROM AD_Sequence_No y, AD_Sequence s "
|
||||||
+ "FROM AD_Sequence "
|
+ "WHERE y.AD_Sequence_ID = s.AD_Sequence_ID "
|
||||||
+ "WHERE Name=?"
|
+ "AND s.Name = ? "
|
||||||
//jz fix duplicated nextID + " AND AD_Client_ID IN (0,?)"
|
+ "AND s.AD_Client_ID = ? "
|
||||||
+ " AND AD_Client_ID = ?"
|
+ "AND y.CalendarYear = ? "
|
||||||
+ " AND IsActive='Y' AND IsTableID='N' AND IsAutoSequence='Y' "
|
+ "AND s.IsActive='Y' AND s.IsTableID='N' AND s.IsAutoSequence='Y' "
|
||||||
+ " ORDER BY AD_Client_ID DESC ";
|
+ "ORDER BY s.AD_Client_ID DESC";
|
||||||
|
} else {
|
||||||
|
selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, Prefix, Suffix, AD_Sequence_ID "
|
||||||
|
+ "FROM AD_Sequence "
|
||||||
|
+ "WHERE Name = ? "
|
||||||
|
+ "AND AD_Client_ID = ? "
|
||||||
|
+ "AND IsActive='Y' AND IsTableID='N' AND IsAutoSequence='Y' "
|
||||||
|
+ "ORDER BY AD_Client_ID DESC";
|
||||||
|
}
|
||||||
USE_PROCEDURE = true;
|
USE_PROCEDURE = true;
|
||||||
}
|
}
|
||||||
Connection conn = null;
|
Connection conn = null;
|
||||||
PreparedStatement pstmt = null;
|
|
||||||
Trx trx = trxName == null ? null : Trx.get(trxName, true);
|
Trx trx = trxName == null ? null : Trx.get(trxName, true);
|
||||||
//
|
//
|
||||||
int AD_Sequence_ID = 0;
|
int AD_Sequence_ID = 0;
|
||||||
int incrementNo = 0;
|
int incrementNo = 0;
|
||||||
int next = -1;
|
int next = -1;
|
||||||
String prefix = "";
|
String prefix = "";
|
||||||
String suffix = "";
|
String suffix = "";
|
||||||
|
String calendarYear = "";
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (trx != null)
|
if (trx != null)
|
||||||
|
@ -398,14 +494,33 @@ public class MSequence extends X_AD_Sequence
|
||||||
conn = DB.getConnectionID();
|
conn = DB.getConnectionID();
|
||||||
// Error
|
// Error
|
||||||
if (conn == null)
|
if (conn == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
if (isStartNewYear)
|
||||||
|
{
|
||||||
|
if (po != null && dateColumn != null && dateColumn.length() > 0)
|
||||||
|
{
|
||||||
|
Date docDate = (Date)po.get_Value(dateColumn);
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
|
||||||
|
calendarYear = sdf.format(docDate);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
|
||||||
|
calendarYear = sdf.format(new Date());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
pstmt = conn.prepareStatement(selectSQL,
|
pstmt = conn.prepareStatement(selectSQL,
|
||||||
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
|
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
|
||||||
pstmt.setString(1, PREFIX_DOCSEQ + TableName);
|
pstmt.setString(1, PREFIX_DOCSEQ + TableName);
|
||||||
pstmt.setInt(2, AD_Client_ID);
|
pstmt.setInt(2, AD_Client_ID);
|
||||||
|
if (isStartNewYear)
|
||||||
|
pstmt.setString(3, calendarYear);
|
||||||
|
|
||||||
//
|
//
|
||||||
ResultSet rs = pstmt.executeQuery();
|
rs = pstmt.executeQuery();
|
||||||
// s_log.fine("AC=" + conn.getAutoCommit() + " -Iso=" + conn.getTransactionIsolation()
|
// s_log.fine("AC=" + conn.getAutoCommit() + " -Iso=" + conn.getTransactionIsolation()
|
||||||
// + " - Type=" + pstmt.getResultSetType() + " - Concur=" + pstmt.getResultSetConcurrency());
|
// + " - Type=" + pstmt.getResultSetType() + " - Concur=" + pstmt.getResultSetConcurrency());
|
||||||
if (rs.next())
|
if (rs.next())
|
||||||
|
@ -416,24 +531,37 @@ public class MSequence extends X_AD_Sequence
|
||||||
incrementNo = rs.getInt(3);
|
incrementNo = rs.getInt(3);
|
||||||
if (USE_PROCEDURE)
|
if (USE_PROCEDURE)
|
||||||
{
|
{
|
||||||
next = nextID(conn, AD_Sequence_ID, adempiereSys);
|
next = isStartNewYear
|
||||||
|
? nextIDByYear(conn, AD_Sequence_ID, incrementNo, calendarYear)
|
||||||
|
: nextID(conn, AD_Sequence_ID, adempiereSys);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PreparedStatement updateSQL;
|
PreparedStatement updateSQL = null;
|
||||||
if (adempiereSys) {
|
try
|
||||||
updateSQL = conn
|
{
|
||||||
.prepareStatement("UPDATE AD_Sequence SET CurrentNextSys = CurrentNextSys + ? WHERE AD_Sequence_ID = ?");
|
if (adempiereSys) {
|
||||||
next = rs.getInt(2);
|
updateSQL = conn
|
||||||
} else {
|
.prepareStatement("UPDATE AD_Sequence SET CurrentNextSys = CurrentNextSys + ? WHERE AD_Sequence_ID = ?");
|
||||||
updateSQL = conn
|
next = rs.getInt(2);
|
||||||
.prepareStatement("UPDATE AD_Sequence SET CurrentNext = CurrentNext + ? WHERE AD_Sequence_ID = ?");
|
} else {
|
||||||
next = rs.getInt(1);
|
String sql = isStartNewYear
|
||||||
|
? "UPDATE AD_Sequence_No SET CurrentNext = CurrentNext + ? WHERE AD_Sequence_ID = ? AND CalendarYear = ?"
|
||||||
|
: "UPDATE AD_Sequence SET CurrentNext = CurrentNext + ? WHERE AD_Sequence_ID = ?";
|
||||||
|
updateSQL = conn
|
||||||
|
.prepareStatement(sql);
|
||||||
|
next = rs.getInt(1);
|
||||||
|
}
|
||||||
|
updateSQL.setInt(1, incrementNo);
|
||||||
|
updateSQL.setInt(2, AD_Sequence_ID);
|
||||||
|
if (isStartNewYear)
|
||||||
|
updateSQL.setString(3, calendarYear);
|
||||||
|
updateSQL.executeUpdate();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
DB.close(updateSQL);
|
||||||
}
|
}
|
||||||
updateSQL.setInt(1, incrementNo);
|
|
||||||
updateSQL.setInt(2, AD_Sequence_ID);
|
|
||||||
updateSQL.executeUpdate();
|
|
||||||
updateSQL.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -443,37 +571,33 @@ public class MSequence extends X_AD_Sequence
|
||||||
next = seq.getNextID();
|
next = seq.getNextID();
|
||||||
seq.save();
|
seq.save();
|
||||||
}
|
}
|
||||||
rs.close();
|
|
||||||
pstmt.close();
|
|
||||||
pstmt = null;
|
|
||||||
// Commit
|
// Commit
|
||||||
if (trx == null)
|
if (trx == null)
|
||||||
{
|
{
|
||||||
conn.commit();
|
conn.commit();
|
||||||
conn.close();
|
|
||||||
}
|
}
|
||||||
conn = null;
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
s_log.log(Level.SEVERE, "(Table) [" + trxName + "]", e);
|
s_log.log(Level.SEVERE, "(Table) [" + trxName + "]", e);
|
||||||
next = -2;
|
next = -2;
|
||||||
}
|
}
|
||||||
// Finish
|
finally
|
||||||
try
|
{
|
||||||
{
|
//Finish
|
||||||
if (pstmt != null)
|
DB.close(rs, pstmt);
|
||||||
pstmt.close();
|
try
|
||||||
pstmt = null;
|
{
|
||||||
if (trx == null && conn != null)
|
if (trx == null && conn != null)
|
||||||
conn.close();
|
conn.close();
|
||||||
conn = null;
|
conn = null;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
s_log.log(Level.SEVERE, "(Table) - finish", e);
|
s_log.log(Level.SEVERE, "(Table) - finish", e);
|
||||||
pstmt = null;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error
|
// Error
|
||||||
if (next < 0)
|
if (next < 0)
|
||||||
return null;
|
return null;
|
||||||
|
@ -481,16 +605,88 @@ public class MSequence extends X_AD_Sequence
|
||||||
// create DocumentNo
|
// create DocumentNo
|
||||||
StringBuffer doc = new StringBuffer();
|
StringBuffer doc = new StringBuffer();
|
||||||
if (prefix != null && prefix.length() > 0)
|
if (prefix != null && prefix.length() > 0)
|
||||||
doc.append(prefix);
|
doc.append(parseVariable(prefix, po, trxName));
|
||||||
doc.append(next);
|
doc.append(next);
|
||||||
if (suffix != null && suffix.length() > 0)
|
if (suffix != null && suffix.length() > 0)
|
||||||
doc.append(suffix);
|
doc.append(parseVariable(suffix, po, trxName));
|
||||||
String documentNo = doc.toString();
|
String documentNo = doc.toString();
|
||||||
s_log.finer (documentNo + " (" + incrementNo + ")"
|
s_log.finer (documentNo + " (" + incrementNo + ")"
|
||||||
+ " - Table=" + TableName + " [" + trx + "]");
|
+ " - Table=" + TableName + " [" + trx + "]");
|
||||||
return documentNo;
|
return documentNo;
|
||||||
} // getDocumentNo
|
} // getDocumentNo
|
||||||
|
|
||||||
|
private static String parseVariable(String value, PO po, String trxName) {
|
||||||
|
if (value == null || value.length() == 0)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
String token;
|
||||||
|
String inStr = new String(value);
|
||||||
|
StringBuffer outStr = new StringBuffer();
|
||||||
|
|
||||||
|
int i = inStr.indexOf('@');
|
||||||
|
while (i != -1)
|
||||||
|
{
|
||||||
|
outStr.append(inStr.substring(0, i)); // up to @
|
||||||
|
inStr = inStr.substring(i+1, inStr.length()); // from first @
|
||||||
|
|
||||||
|
int j = inStr.indexOf('@'); // next @
|
||||||
|
if (j < 0)
|
||||||
|
{
|
||||||
|
s_log.log(Level.SEVERE, "No second tag: " + inStr);
|
||||||
|
return ""; // no second tag
|
||||||
|
}
|
||||||
|
|
||||||
|
token = inStr.substring(0, j);
|
||||||
|
|
||||||
|
//format string
|
||||||
|
String format = "";
|
||||||
|
int f = token.indexOf('<');
|
||||||
|
if (f > 0 && token.endsWith(">")) {
|
||||||
|
format = token.substring(f+1, token.length()-1);
|
||||||
|
token = token.substring(0, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token.startsWith("#") || token.startsWith("$")) {
|
||||||
|
//take from context
|
||||||
|
Properties ctx = po != null ? po.getCtx() : Env.getCtx();
|
||||||
|
String v = Env.getContext(ctx, token);
|
||||||
|
if (v != null && v.length() > 0)
|
||||||
|
outStr.append(v);
|
||||||
|
} else if (po != null) {
|
||||||
|
//take from po
|
||||||
|
Object v = po.get_Value(token);
|
||||||
|
if (v != null) {
|
||||||
|
if (format != null && format.length() > 0) {
|
||||||
|
if (v instanceof Integer && token.endsWith("_ID")) {
|
||||||
|
int tblIndex = format.indexOf(".");
|
||||||
|
String table = tblIndex > 0 ? format.substring(0, tblIndex) : token.substring(0, token.length() - 3);
|
||||||
|
String column = tblIndex > 0 ? format.substring(tblIndex + 1) : format;
|
||||||
|
outStr.append(DB.getSQLValueString(trxName,
|
||||||
|
"select " + column + " from " + table + " where " + table + "_id = ?", (Integer)v));
|
||||||
|
} else if (v instanceof Date) {
|
||||||
|
SimpleDateFormat df = new SimpleDateFormat(format);
|
||||||
|
outStr.append(df.format((Date)v));
|
||||||
|
} else if (v instanceof Number) {
|
||||||
|
DecimalFormat df = new DecimalFormat(format);
|
||||||
|
outStr.append(df.format(((Number)v).doubleValue()));
|
||||||
|
} else {
|
||||||
|
MessageFormat mf = new MessageFormat(format);
|
||||||
|
outStr.append(mf.format(v));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
outStr.append(v.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inStr = inStr.substring(j+1, inStr.length()); // from second @
|
||||||
|
i = inStr.indexOf('@');
|
||||||
|
}
|
||||||
|
outStr.append(inStr); // add the rest of the string
|
||||||
|
|
||||||
|
return outStr.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Document No based on Document Type
|
* Get Document No based on Document Type
|
||||||
* @param C_DocType_ID document type
|
* @param C_DocType_ID document type
|
||||||
|
@ -503,14 +699,27 @@ public class MSequence extends X_AD_Sequence
|
||||||
return getDocumentNo (C_DocType_ID, trxName, false);
|
return getDocumentNo (C_DocType_ID, trxName, false);
|
||||||
} // getDocumentNo
|
} // getDocumentNo
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Document No based on Document Type
|
||||||
|
* @param C_DocType_ID document type
|
||||||
|
* @param trxName optional Transaction Name
|
||||||
|
* @param definite asking for a definitive or temporary sequence
|
||||||
|
* @return document no or null
|
||||||
|
*/
|
||||||
|
public static synchronized String getDocumentNo (int C_DocType_ID, String trxName, boolean definite)
|
||||||
|
{
|
||||||
|
return getDocumentNo(C_DocType_ID, trxName, definite, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Document No based on Document Type
|
* Get Document No based on Document Type
|
||||||
* @param C_DocType_ID document type
|
* @param C_DocType_ID document type
|
||||||
* @param trxName optional Transaction Name
|
* @param trxName optional Transaction Name
|
||||||
* @param definite asking for a definitive or temporary sequence
|
* @param definite asking for a definitive or temporary sequence
|
||||||
|
* @param po
|
||||||
* @return document no or null
|
* @return document no or null
|
||||||
*/
|
*/
|
||||||
public static synchronized String getDocumentNo (int C_DocType_ID, String trxName, boolean definite)
|
public static synchronized String getDocumentNo (int C_DocType_ID, String trxName, boolean definite, PO po)
|
||||||
{
|
{
|
||||||
if (C_DocType_ID == 0)
|
if (C_DocType_ID == 0)
|
||||||
{
|
{
|
||||||
|
@ -565,35 +774,84 @@ public class MSequence extends X_AD_Sequence
|
||||||
boolean adempiereSys = Ini.isPropertyBool(Ini.P_ADEMPIERESYS);
|
boolean adempiereSys = Ini.isPropertyBool(Ini.P_ADEMPIERESYS);
|
||||||
if (CLogMgt.isLevel(LOGLEVEL))
|
if (CLogMgt.isLevel(LOGLEVEL))
|
||||||
s_log.log(LOGLEVEL, "DocType_ID=" + C_DocType_ID + " [" + trxName + "]");
|
s_log.log(LOGLEVEL, "DocType_ID=" + C_DocType_ID + " [" + trxName + "]");
|
||||||
//begin vpj-cd e-evolution 09/02/2005 PostgreSQL
|
|
||||||
|
PreparedStatement pstmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
boolean isStartNewYear = false;
|
||||||
|
String dateColumn = null;
|
||||||
|
|
||||||
|
if (!adempiereSys)
|
||||||
|
{
|
||||||
|
// Get the Start New Year & Sequence Type
|
||||||
|
String startNewYearSQL = "SELECT StartNewYear, DateColumn FROM AD_Sequence "
|
||||||
|
+ "WHERE AD_Sequence_ID = ? AND IsActive = 'Y' AND IsTableID = 'N' AND IsAutoSequence='Y'";
|
||||||
|
try {
|
||||||
|
pstmt = DB.prepareStatement(startNewYearSQL, trxName);
|
||||||
|
pstmt.setInt(1, definite ? dt.getDefiniteSequence_ID() : dt
|
||||||
|
.getDocNoSequence_ID());
|
||||||
|
rs = pstmt.executeQuery();
|
||||||
|
if (rs.next()) {
|
||||||
|
isStartNewYear = "Y".equals(rs.getString(1));
|
||||||
|
dateColumn = rs.getString(2);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_log.log(Level.SEVERE, "(Table) [" + trxName + "]", e);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
DB.close(rs, pstmt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
String selectSQL = null;
|
String selectSQL = null;
|
||||||
if (DB.isOracle() == false)
|
if (DB.isOracle() == false)
|
||||||
{
|
{
|
||||||
selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, Prefix, Suffix, AD_Client_ID, AD_Sequence_ID "
|
if (isStartNewYear)
|
||||||
+ "FROM AD_Sequence "
|
{
|
||||||
+ "WHERE AD_Sequence_ID=?"
|
selectSQL = "SELECT y.CurrentNext, s.CurrentNextSys, s.IncrementNo, s.Prefix, s.Suffix, s.AD_Client_ID, s.AD_Sequence_ID "
|
||||||
+ " AND IsActive='Y' AND IsTableID='N' AND IsAutoSequence='Y' "
|
+ "FROM AD_Sequence_No y, AD_Sequence s "
|
||||||
+ " FOR UPDATE OF AD_Sequence ";
|
+ "WHERE y.AD_Sequence_ID = s.AD_Sequence_ID "
|
||||||
|
+ "AND s.AD_Sequence_ID = ? "
|
||||||
|
+ "AND y.CalendarYear = ? "
|
||||||
|
+ "AND s.IsActive='Y' AND s.IsTableID='N' AND s.IsAutoSequence='Y' "
|
||||||
|
+ "FOR UPDATE OF AD_Sequence_No";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, Prefix, Suffix, AD_Client_ID, AD_Sequence_ID "
|
||||||
|
+ "FROM AD_Sequence "
|
||||||
|
+ "WHERE AD_Sequence_ID = ? "
|
||||||
|
+ "AND IsActive='Y' AND IsTableID='N' AND IsAutoSequence='Y' "
|
||||||
|
+ "FOR UPDATE OF AD_Sequence";
|
||||||
|
}
|
||||||
USE_PROCEDURE=false;
|
USE_PROCEDURE=false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, Prefix, Suffix, AD_Client_ID, AD_Sequence_ID "
|
if (isStartNewYear) {
|
||||||
//end vpj-cd e-evolution 09/02/2005 PostgreSQL
|
selectSQL = "SELECT y.CurrentNext, s.CurrentNextSys, s.IncrementNo, s.Prefix, s.Suffix, s.AD_Client_ID, s.AD_Sequence_ID "
|
||||||
+ "FROM AD_Sequence "
|
+ "FROM AD_Sequence_No y, AD_Sequence s "
|
||||||
+ "WHERE AD_Sequence_ID=?"
|
+ "WHERE y.AD_Sequence_ID = s.AD_Sequence_ID "
|
||||||
+ " AND IsActive='Y' AND IsTableID='N' AND IsAutoSequence='Y' ";
|
+ "AND s.AD_Sequence_ID = ? "
|
||||||
|
+ "AND y.CalendarYear = ? "
|
||||||
|
+ "AND s.IsActive='Y' AND s.IsTableID='N' AND s.IsAutoSequence='Y' ";
|
||||||
|
} else {
|
||||||
|
selectSQL = "SELECT CurrentNext, CurrentNextSys, IncrementNo, Prefix, Suffix, AD_Client_ID, AD_Sequence_ID "
|
||||||
|
+ "FROM AD_Sequence "
|
||||||
|
+ "WHERE AD_Sequence_ID = ? "
|
||||||
|
+ "AND IsActive='Y' AND IsTableID='N' AND IsAutoSequence='Y' ";
|
||||||
|
}
|
||||||
USE_PROCEDURE = true;
|
USE_PROCEDURE = true;
|
||||||
}
|
}
|
||||||
Connection conn = null;
|
Connection conn = null;
|
||||||
PreparedStatement pstmt = null;
|
|
||||||
Trx trx = trxName == null ? null : Trx.get(trxName, true);
|
Trx trx = trxName == null ? null : Trx.get(trxName, true);
|
||||||
//
|
//
|
||||||
int AD_Sequence_ID = 0;
|
int AD_Sequence_ID = 0;
|
||||||
int incrementNo = 0;
|
int incrementNo = 0;
|
||||||
int next = -1;
|
int next = -1;
|
||||||
String prefix = "";
|
String prefix = "";
|
||||||
String suffix = "";
|
String suffix = "";
|
||||||
|
String calendarYear = "";
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (trx != null)
|
if (trx != null)
|
||||||
|
@ -603,16 +861,33 @@ public class MSequence extends X_AD_Sequence
|
||||||
// Error
|
// Error
|
||||||
if (conn == null)
|
if (conn == null)
|
||||||
return null;
|
return null;
|
||||||
//
|
|
||||||
|
if (isStartNewYear)
|
||||||
|
{
|
||||||
|
if (po != null && dateColumn != null && dateColumn.length() > 0)
|
||||||
|
{
|
||||||
|
Date docDate = (Date)po.get_Value(dateColumn);
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
|
||||||
|
calendarYear = sdf.format(docDate);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
|
||||||
|
calendarYear = sdf.format(new Date());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pstmt = conn.prepareStatement(selectSQL,
|
pstmt = conn.prepareStatement(selectSQL,
|
||||||
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
|
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
|
||||||
if (definite)
|
if (definite)
|
||||||
pstmt.setInt(1, dt.getDefiniteSequence_ID());
|
pstmt.setInt(1, dt.getDefiniteSequence_ID());
|
||||||
else
|
else
|
||||||
pstmt.setInt(1, dt.getDocNoSequence_ID());
|
pstmt.setInt(1, dt.getDocNoSequence_ID());
|
||||||
|
if (isStartNewYear)
|
||||||
|
pstmt.setString(2, calendarYear);
|
||||||
|
|
||||||
//
|
//
|
||||||
ResultSet rs = pstmt.executeQuery();
|
rs = pstmt.executeQuery();
|
||||||
// s_log.fine("AC=" + conn.getAutoCommit() + " -Iso=" + conn.getTransactionIsolation()
|
// s_log.fine("AC=" + conn.getAutoCommit() + " -Iso=" + conn.getTransactionIsolation()
|
||||||
// + " - Type=" + pstmt.getResultSetType() + " - Concur=" + pstmt.getResultSetConcurrency());
|
// + " - Type=" + pstmt.getResultSetType() + " - Concur=" + pstmt.getResultSetConcurrency());
|
||||||
if (rs.next())
|
if (rs.next())
|
||||||
|
@ -627,24 +902,36 @@ public class MSequence extends X_AD_Sequence
|
||||||
|
|
||||||
if (USE_PROCEDURE)
|
if (USE_PROCEDURE)
|
||||||
{
|
{
|
||||||
next = nextID(conn, AD_Sequence_ID, adempiereSys);
|
next = isStartNewYear
|
||||||
|
? nextIDByYear(conn, AD_Sequence_ID, incrementNo, calendarYear)
|
||||||
|
: nextID(conn, AD_Sequence_ID, adempiereSys);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PreparedStatement updateSQL;
|
PreparedStatement updateSQL = null;
|
||||||
if (adempiereSys) {
|
try
|
||||||
updateSQL = conn
|
{
|
||||||
.prepareStatement("UPDATE AD_Sequence SET CurrentNextSys = CurrentNextSys + ? WHERE AD_Sequence_ID = ?");
|
if (adempiereSys) {
|
||||||
next = rs.getInt(2);
|
updateSQL = conn
|
||||||
} else {
|
.prepareStatement("UPDATE AD_Sequence SET CurrentNextSys = CurrentNextSys + ? WHERE AD_Sequence_ID = ?");
|
||||||
updateSQL = conn
|
next = rs.getInt(2);
|
||||||
.prepareStatement("UPDATE AD_Sequence SET CurrentNext = CurrentNext + ? WHERE AD_Sequence_ID = ?");
|
} else {
|
||||||
next = rs.getInt(1);
|
String sql = isStartNewYear
|
||||||
|
? "UPDATE AD_Sequence_No SET CurrentNext = CurrentNext + ? WHERE AD_Sequence_ID = ? AND CalendarYear = ?"
|
||||||
|
: "UPDATE AD_Sequence SET CurrentNext = CurrentNext + ? WHERE AD_Sequence_ID = ?";
|
||||||
|
updateSQL = conn.prepareStatement(sql);
|
||||||
|
next = rs.getInt(1);
|
||||||
|
}
|
||||||
|
updateSQL.setInt(1, incrementNo);
|
||||||
|
updateSQL.setInt(2, AD_Sequence_ID);
|
||||||
|
if (isStartNewYear)
|
||||||
|
updateSQL.setString(3, calendarYear);
|
||||||
|
updateSQL.executeUpdate();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
DB.close(updateSQL);
|
||||||
}
|
}
|
||||||
updateSQL.setInt(1, incrementNo);
|
|
||||||
updateSQL.setInt(2, AD_Sequence_ID);
|
|
||||||
updateSQL.executeUpdate();
|
|
||||||
updateSQL.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -652,36 +939,31 @@ public class MSequence extends X_AD_Sequence
|
||||||
s_log.warning ("(DocType)- no record found - " + dt);
|
s_log.warning ("(DocType)- no record found - " + dt);
|
||||||
next = -2;
|
next = -2;
|
||||||
}
|
}
|
||||||
rs.close();
|
|
||||||
pstmt.close();
|
|
||||||
pstmt = null;
|
|
||||||
// Commit
|
// Commit
|
||||||
if (trx == null)
|
if (trx == null)
|
||||||
{
|
{
|
||||||
conn.commit();
|
conn.commit();
|
||||||
conn.close();
|
|
||||||
}
|
}
|
||||||
conn = null;
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
s_log.log(Level.SEVERE, "(DocType) [" + trxName + "]", e);
|
s_log.log(Level.SEVERE, "(DocType) [" + trxName + "]", e);
|
||||||
next = -2;
|
next = -2;
|
||||||
}
|
}
|
||||||
// Finish
|
finally
|
||||||
try
|
|
||||||
{
|
{
|
||||||
if (pstmt != null)
|
// Finish
|
||||||
pstmt.close();
|
try
|
||||||
pstmt = null;
|
{
|
||||||
if (trx == null && conn != null)
|
DB.close(rs, pstmt);
|
||||||
conn.close();
|
if (trx == null && conn != null)
|
||||||
conn = null;
|
conn.close();
|
||||||
}
|
conn = null;
|
||||||
catch (Exception e)
|
}
|
||||||
{
|
catch (Exception e)
|
||||||
s_log.log(Level.SEVERE, "(DocType) - finish", e);
|
{
|
||||||
pstmt = null;
|
s_log.log(Level.SEVERE, "(DocType) - finish", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Error
|
// Error
|
||||||
if (next < 0)
|
if (next < 0)
|
||||||
|
@ -690,10 +972,10 @@ public class MSequence extends X_AD_Sequence
|
||||||
// create DocumentNo
|
// create DocumentNo
|
||||||
StringBuffer doc = new StringBuffer();
|
StringBuffer doc = new StringBuffer();
|
||||||
if (prefix != null && prefix.length() > 0)
|
if (prefix != null && prefix.length() > 0)
|
||||||
doc.append(prefix);
|
doc.append(parseVariable(prefix, po, trxName));
|
||||||
doc.append(next);
|
doc.append(next);
|
||||||
if (suffix != null && suffix.length() > 0)
|
if (suffix != null && suffix.length() > 0)
|
||||||
doc.append(suffix);
|
doc.append(parseVariable(suffix, po, trxName));
|
||||||
String documentNo = doc.toString();
|
String documentNo = doc.toString();
|
||||||
s_log.finer (documentNo + " (" + incrementNo + ")"
|
s_log.finer (documentNo + " (" + incrementNo + ")"
|
||||||
+ " - C_DocType_ID=" + C_DocType_ID + " [" + trx + "]");
|
+ " - C_DocType_ID=" + C_DocType_ID + " [" + trx + "]");
|
||||||
|
@ -1394,5 +1676,23 @@ public class MSequence extends X_AD_Sequence
|
||||||
// don't log selects or insert/update for exception tables (i.e. AD_Issue, AD_ChangeLog)
|
// don't log selects or insert/update for exception tables (i.e. AD_Issue, AD_ChangeLog)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get preliminary document no by year
|
||||||
|
* @param tab
|
||||||
|
* @param AD_Sequence_ID
|
||||||
|
* @param dateColumn
|
||||||
|
* @return Preliminary document no
|
||||||
|
*/
|
||||||
|
public static String getPreliminaryNoByYear(GridTab tab, int AD_Sequence_ID, String dateColumn, String trxName) {
|
||||||
|
Date d = (Date)tab.getValue(dateColumn);
|
||||||
|
if (d == null)
|
||||||
|
d = new Date();
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
|
||||||
|
String calendarYear = sdf.format(d);
|
||||||
|
String sql = "select CurrentNext From AD_Sequence_No Where AD_Sequence_ID = ? and CalendarYear = ?";
|
||||||
|
|
||||||
|
return DB.getSQLValueString(trxName, sql, AD_Sequence_ID, calendarYear);
|
||||||
|
}
|
||||||
|
|
||||||
} // MSequence
|
} // MSequence
|
|
@ -2134,9 +2134,9 @@ public abstract class PO
|
||||||
if (index == -1)
|
if (index == -1)
|
||||||
index = p_info.getColumnIndex("C_DocType_ID");
|
index = p_info.getColumnIndex("C_DocType_ID");
|
||||||
if (index != -1) // get based on Doc Type (might return null)
|
if (index != -1) // get based on Doc Type (might return null)
|
||||||
value = DB.getDocumentNo(get_ValueAsInt(index), m_trxName, false);
|
value = DB.getDocumentNo(get_ValueAsInt(index), m_trxName, false, this);
|
||||||
if (value == null) // not overwritten by DocType and not manually entered
|
if (value == null) // not overwritten by DocType and not manually entered
|
||||||
value = DB.getDocumentNo(AD_Client_ID, p_info.getTableName(), m_trxName);
|
value = DB.getDocumentNo(AD_Client_ID, p_info.getTableName(), m_trxName, this);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
log.warning("DocumentNo updated: " + m_oldValues[i] + " -> " + value);
|
log.warning("DocumentNo updated: " + m_oldValues[i] + " -> " + value);
|
||||||
|
@ -2291,9 +2291,9 @@ public abstract class PO
|
||||||
if (dt == -1)
|
if (dt == -1)
|
||||||
dt = p_info.getColumnIndex("C_DocType_ID");
|
dt = p_info.getColumnIndex("C_DocType_ID");
|
||||||
if (dt != -1) // get based on Doc Type (might return null)
|
if (dt != -1) // get based on Doc Type (might return null)
|
||||||
value = DB.getDocumentNo(get_ValueAsInt(dt), m_trxName, false);
|
value = DB.getDocumentNo(get_ValueAsInt(dt), m_trxName, false, this);
|
||||||
if (value == null) // not overwritten by DocType and not manually entered
|
if (value == null) // not overwritten by DocType and not manually entered
|
||||||
value = DB.getDocumentNo(getAD_Client_ID(), p_info.getTableName(), m_trxName);
|
value = DB.getDocumentNo(getAD_Client_ID(), p_info.getTableName(), m_trxName, this);
|
||||||
set_ValueNoCheck(columnName, value);
|
set_ValueNoCheck(columnName, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2305,7 +2305,7 @@ public abstract class PO
|
||||||
String value = (String)get_Value(index);
|
String value = (String)get_Value(index);
|
||||||
if (value == null || value.length() == 0)
|
if (value == null || value.length() == 0)
|
||||||
{
|
{
|
||||||
value = DB.getDocumentNo (getAD_Client_ID(), p_info.getTableName(), m_trxName);
|
value = DB.getDocumentNo (getAD_Client_ID(), p_info.getTableName(), m_trxName, this);
|
||||||
set_ValueNoCheck(columnName, value);
|
set_ValueNoCheck(columnName, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ import org.compiere.model.MLanguage;
|
||||||
import org.compiere.model.MRole;
|
import org.compiere.model.MRole;
|
||||||
import org.compiere.model.MSequence;
|
import org.compiere.model.MSequence;
|
||||||
import org.compiere.model.MSystem;
|
import org.compiere.model.MSystem;
|
||||||
|
import org.compiere.model.PO;
|
||||||
import org.compiere.process.SequenceCheck;
|
import org.compiere.process.SequenceCheck;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1466,7 +1467,7 @@ public final class DB
|
||||||
params.toArray(arr);
|
params.toArray(arr);
|
||||||
return getSQLValueTS(trxName, sql, arr);
|
return getSQLValueTS(trxName, sql, arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Array of Key Name Pairs
|
* Get Array of Key Name Pairs
|
||||||
* @param sql select with id / name as first / second column
|
* @param sql select with id / name as first / second column
|
||||||
|
@ -1629,9 +1630,21 @@ public final class DB
|
||||||
* @param definite asking for a definitive or temporary sequence
|
* @param definite asking for a definitive or temporary sequence
|
||||||
* @return document no or null
|
* @return document no or null
|
||||||
*/
|
*/
|
||||||
public static String getDocumentNo(int C_DocType_ID, String trxName, boolean definite)
|
public static String getDocumentNo(int C_DocType_ID, String trxName, boolean definite) {
|
||||||
|
return getDocumentNo(C_DocType_ID, trxName, definite, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Document No based on Document Type
|
||||||
|
* @param C_DocType_ID document type
|
||||||
|
* @param trxName optional Transaction Name
|
||||||
|
* @param definite asking for a definitive or temporary sequence
|
||||||
|
* @param PO
|
||||||
|
* @return document no or null
|
||||||
|
*/
|
||||||
|
public static String getDocumentNo(int C_DocType_ID, String trxName, boolean definite, PO po)
|
||||||
{
|
{
|
||||||
return MSequence.getDocumentNo (C_DocType_ID, trxName, definite);
|
return MSequence.getDocumentNo (C_DocType_ID, trxName, definite, po);
|
||||||
} // getDocumentNo
|
} // getDocumentNo
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1643,7 +1656,20 @@ public final class DB
|
||||||
*/
|
*/
|
||||||
public static String getDocumentNo (int AD_Client_ID, String TableName, String trxName)
|
public static String getDocumentNo (int AD_Client_ID, String TableName, String trxName)
|
||||||
{
|
{
|
||||||
String dn = MSequence.getDocumentNo (AD_Client_ID, TableName, trxName);
|
return getDocumentNo(AD_Client_ID, TableName, trxName, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Document No from table
|
||||||
|
* @param AD_Client_ID client
|
||||||
|
* @param TableName table name
|
||||||
|
* @param trxName optional Transaction Name
|
||||||
|
* @param po
|
||||||
|
* @return document no or null
|
||||||
|
*/
|
||||||
|
public static String getDocumentNo (int AD_Client_ID, String TableName, String trxName, PO po)
|
||||||
|
{
|
||||||
|
String dn = MSequence.getDocumentNo (AD_Client_ID, TableName, trxName, po);
|
||||||
if (dn == null)
|
if (dn == null)
|
||||||
throw new DBException ("No DocumentNo");
|
throw new DBException ("No DocumentNo");
|
||||||
return dn;
|
return dn;
|
||||||
|
|
Loading…
Reference in New Issue