📄 finreport.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.report;
import java.math.*;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
import org.compiere.model.*;
import org.compiere.print.*;
import org.compiere.process.*;
import org.compiere.util.*;
/**
* Financial Report Engine
*
* @author Jorg Janke
* @version $Id: FinReport.java,v 1.37 2005/11/01 16:36:41 jjanke Exp $
*/
public class FinReport extends SvrProcess
{
/** Period Parameter */
private int p_C_Period_ID = 0;
/** Org Parameter */
private int p_Org_ID = 0;
/** BPartner Parameter */
private int p_C_BPartner_ID = 0;
/** Product Parameter */
private int p_M_Product_ID = 0;
/** Project Parameter */
private int p_C_Project_ID = 0;
/** Activity Parameter */
private int p_C_Activity_ID = 0;
/** SalesRegion Parameter */
private int p_C_SalesRegion_ID = 0;
/** Campaign Parameter */
private int p_C_Campaign_ID = 0;
/** Update Balances Parameter */
private boolean p_UpdateBalances = true;
/** Details before Lines */
private boolean p_DetailsSourceFirst = false;
/** Hierarchy */
private int p_PA_Hierarchy_ID = 0;
/** Start Time */
private long m_start = System.currentTimeMillis();
/** Report Definition */
private MReport m_report = null;
/** Periods in Calendar */
private FinReportPeriod[] m_periods = null;
/** Index of m_C_Period_ID in m_periods **/
private int m_reportPeriod = -1;
/** Parameter Where Clause */
private StringBuffer m_parameterWhere = new StringBuffer();
/** The Report Columns */
private MReportColumn[] m_columns;
/** The Report Lines */
private MReportLine[] m_lines;
/**
* Prepare - e.g., get Parameters.
*/
protected void prepare()
{
StringBuffer sb = new StringBuffer ("Record_ID=")
.append(getRecord_ID());
// Parameter
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_Period_ID"))
p_C_Period_ID = para[i].getParameterAsInt();
else if (name.equals("PA_Hierarchy_ID"))
p_PA_Hierarchy_ID = para[i].getParameterAsInt();
else if (name.equals("Org_ID"))
p_Org_ID = ((BigDecimal)para[i].getParameter()).intValue();
else if (name.equals("C_BPartner_ID"))
p_C_BPartner_ID = ((BigDecimal)para[i].getParameter()).intValue();
else if (name.equals("M_Product_ID"))
p_M_Product_ID = ((BigDecimal)para[i].getParameter()).intValue();
else if (name.equals("C_Project_ID"))
p_C_Project_ID = ((BigDecimal)para[i].getParameter()).intValue();
else if (name.equals("C_Activity_ID"))
p_C_Activity_ID = ((BigDecimal)para[i].getParameter()).intValue();
else if (name.equals("C_SalesRegion_ID"))
p_C_SalesRegion_ID = ((BigDecimal)para[i].getParameter()).intValue();
else if (name.equals("C_Campaign_ID"))
p_C_Campaign_ID = ((BigDecimal)para[i].getParameter()).intValue();
else if (name.equals("UpdateBalances"))
p_UpdateBalances = "Y".equals(para[i].getParameter());
else if (name.equals("DetailsSourceFirst"))
p_DetailsSourceFirst = "Y".equals(para[i].getParameter());
else
log.log(Level.SEVERE, "Unknown Parameter: " + name);
}
// Optional Org
if (p_Org_ID != 0)
m_parameterWhere.append(" AND ").append(MReportTree.getWhereClause(getCtx(),
p_PA_Hierarchy_ID, MAcctSchemaElement.ELEMENTTYPE_Organization, p_Org_ID));
// Optional BPartner
if (p_C_BPartner_ID != 0)
m_parameterWhere.append(" AND ").append(MReportTree.getWhereClause(getCtx(),
p_PA_Hierarchy_ID, MAcctSchemaElement.ELEMENTTYPE_BPartner, p_C_BPartner_ID));
// Optional Product
if (p_M_Product_ID != 0)
m_parameterWhere.append(" AND ").append(MReportTree.getWhereClause(getCtx(),
p_PA_Hierarchy_ID, MAcctSchemaElement.ELEMENTTYPE_Product, p_M_Product_ID));
// Optional Project
if (p_C_Project_ID != 0)
m_parameterWhere.append(" AND ").append(MReportTree.getWhereClause(getCtx(),
p_PA_Hierarchy_ID, MAcctSchemaElement.ELEMENTTYPE_Project, p_C_Project_ID));
// Optional Activity
if (p_C_Activity_ID != 0)
m_parameterWhere.append(" AND ").append(MReportTree.getWhereClause(getCtx(),
p_PA_Hierarchy_ID, MAcctSchemaElement.ELEMENTTYPE_Activity, p_C_Activity_ID));
// Optional Campaign
if (p_C_Campaign_ID != 0)
m_parameterWhere.append(" AND C_Campaign_ID=").append(p_C_Campaign_ID);
// m_parameterWhere.append(" AND ").append(MReportTree.getWhereClause(getCtx(),
// MAcctSchemaElement.ELEMENTTYPE_Campaign, p_C_Campaign_ID));
// Optional Sales Region
if (p_C_SalesRegion_ID != 0)
m_parameterWhere.append(" AND ").append(MReportTree.getWhereClause(getCtx(),
p_PA_Hierarchy_ID, MAcctSchemaElement.ELEMENTTYPE_SalesRegion, p_C_SalesRegion_ID));
// Load Report Definition
m_report = new MReport (getCtx(), getRecord_ID(), null);
sb.append(" - ").append(m_report);
//
setPeriods();
sb.append(" - C_Period_ID=").append(p_C_Period_ID)
.append(" - ").append(m_parameterWhere);
//
log.info(sb.toString());
// m_report.list();
} // prepare
/**
* Set Periods
*/
private void setPeriods()
{
log.info("C_Calendar_ID=" + m_report.getC_Calendar_ID());
Timestamp today = TimeUtil.getDay(System.currentTimeMillis());
ArrayList<FinReportPeriod> list = new ArrayList<FinReportPeriod>();
String sql = "SELECT p.C_Period_ID, p.Name, p.StartDate, p.EndDate, MIN(p1.StartDate) "
+ "FROM C_Period p "
+ " INNER JOIN C_Year y ON (p.C_Year_ID=y.C_Year_ID),"
+ " C_Period p1 "
+ "WHERE y.C_Calendar_ID=?"
+ " AND p.PeriodType='S' "
+ " AND p1.C_Year_ID=y.C_Year_ID AND p1.PeriodType='S' "
+ "GROUP BY p.C_Period_ID, p.Name, p.StartDate, p.EndDate "
+ "ORDER BY p.StartDate";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, m_report.getC_Calendar_ID());
ResultSet rs = pstmt.executeQuery();
while (rs.next())
{
FinReportPeriod frp = new FinReportPeriod (rs.getInt(1), rs.getString(2),
rs.getTimestamp(3), rs.getTimestamp(4), rs.getTimestamp(5));
list.add(frp);
if (p_C_Period_ID == 0 && frp.inPeriod(today))
p_C_Period_ID = frp.getC_Period_ID();
}
rs.close();
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, sql, e);
}
finally
{
try
{
if (pstmt != null)
pstmt.close ();
}
catch (Exception e)
{}
pstmt = null;
}
// convert to Array
m_periods = new FinReportPeriod[list.size()];
list.toArray(m_periods);
// today after latest period
if (p_C_Period_ID == 0)
{
m_reportPeriod = m_periods.length - 1;
p_C_Period_ID = m_periods[m_reportPeriod].getC_Period_ID ();
}
} // setPeriods
/**************************************************************************
* Perform process.
* @return Message to be translated
* @throws Exception
*/
protected String doIt() throws Exception
{
log.info("AD_PInstance_ID=" + getAD_PInstance_ID());
// ** Create Temporary and empty Report Lines from PA_ReportLine
// - AD_PInstance_ID, PA_ReportLine_ID, 0, 0
int PA_ReportLineSet_ID = m_report.getLineSet().getPA_ReportLineSet_ID();
StringBuffer sql = new StringBuffer ("INSERT INTO T_Report "
+ "(AD_PInstance_ID, PA_ReportLine_ID, Record_ID,Fact_Acct_ID, SeqNo,LevelNo, Name,Description) "
+ "SELECT ").append(getAD_PInstance_ID()).append(", PA_ReportLine_ID, 0,0, SeqNo,0, Name,Description "
+ "FROM PA_ReportLine "
+ "WHERE IsActive='Y' AND PA_ReportLineSet_ID=").append(PA_ReportLineSet_ID);
int no = DB.executeUpdate(sql.toString(), get_TrxName());
log.fine("Report Lines = " + no);
// Update AcctSchema Balances
if (p_UpdateBalances)
FinBalance.updateBalance (m_report.getC_AcctSchema_ID(), false);
// ** Get Data ** Segment Values
m_columns = m_report.getColumnSet().getColumns();
if (m_columns.length == 0)
throw new CompiereUserError("@No@ @PA_ReportColumn_ID@");
m_lines = m_report.getLineSet().getLiness();
if (m_lines.length == 0)
throw new CompiereUserError("@No@ @PA_ReportLine_ID@");
// for all lines
for (int line = 0; line < m_lines.length; line++)
{
// Line Segment Value (i.e. not calculation)
if (m_lines[line].isLineTypeSegmentValue())
insertLine (line);
} // for all lines
insertLineDetail();
doCalculations();
deleteUnprintedLines();
// Create Report
if (Ini.isClient())
getProcessInfo().setTransientObject (getPrintFormat());
else
getProcessInfo().setSerializableObject(getPrintFormat());
log.fine((System.currentTimeMillis() - m_start) + " ms");
return "";
} // doIt
/**************************************************************************
* For all columns (in a line) with relative period access
* @param line line
*/
private void insertLine (int line)
{
log.info("" + m_lines[line]);
// No source lines - Headings
if (m_lines[line] == null || m_lines[line].getSources().length == 0)
{
log.warning ("No Source lines: " + m_lines[line]);
return;
}
StringBuffer update = new StringBuffer();
// for all columns
for (int col = 0; col < m_columns.length; col++)
{
// Ignore calculation columns
if (m_columns[col].isColumnTypeCalculation())
continue;
StringBuffer info = new StringBuffer();
info.append("Line=").append(line).append(",Col=").append(col);
// SELECT SUM()
StringBuffer select = new StringBuffer ("SELECT ");
if (m_lines[line].getAmountType() != null) // line amount type overwrites column
{
String sql = m_lines[line].getSelectClause (true);
select.append (sql);
info.append(": LineAmtType=").append(m_lines[line].getAmountType());
}
else if (m_columns[col].getAmountType() != null)
{
String sql = m_columns[col].getSelectClause (true);
select.append (sql);
info.append(": ColumnAmtType=").append(m_columns[col].getAmountType());
}
else
{
log.warning("No Amount Type in line: " + m_lines[line] + " or column: " + m_columns[col]);
continue;
}
// Get Period/Date info
select.append(" FROM Fact_Acct_Balance WHERE DateAcct ");
BigDecimal relativeOffset = null; // current
if (m_columns[col].isColumnTypeRelativePeriod())
relativeOffset = m_columns[col].getRelativePeriod();
FinReportPeriod frp = getPeriod (relativeOffset);
if (m_lines[line].getAmountType() != null) // line amount type overwrites column
{
info.append(" - LineDateAcct=");
if (m_lines[line].isPeriod())
{
String sql = frp.getPeriodWhere();
info.append("Period");
select.append(sql);
}
else if (m_lines[line].isYear())
{
String sql = frp.getYearWhere();
info.append("Year");
select.append(sql);
}
else if (m_lines[line].isTotal())
{
String sql = frp.getTotalWhere();
info.append("Total");
select.append(sql);
}
else
{
log.log(Level.SEVERE, "No valid Line AmountType");
select.append("=0"); // valid sql
}
}
else if (m_columns[col].getAmountType() != null)
{
info.append(" - ColumnDateAcct=");
if (m_columns[col].isPeriod())
{
String sql = frp.getPeriodWhere();
info.append("Period");
select.append(sql);
}
else if (m_columns[col].isYear())
{
String sql = frp.getYearWhere();
info.append("Year");
select.append(sql);
}
else if (m_columns[col].isTotal())
{
String sql = frp.getTotalWhere();
info.append("Total");
select.append(sql);
}
else
{
log.log(Level.SEVERE, "No valid Column AmountType");
select.append("=0"); // valid sql
}
}
// Line Where
String s = m_lines[line].getWhereClause(p_PA_Hierarchy_ID); // (sources, posting type)
if (s != null && s.length() > 0)
select.append(" AND ").append(s);
// Report Where
s = m_report.getWhereClause();
if (s != null && s.length() > 0)
select.append(" AND ").append(s);
// PostingType
if (!m_lines[line].isPostingType()) // only if not defined on line
{
String PostingType = m_columns[col].getPostingType();
if (PostingType != null && PostingType.length() > 0)
select.append(" AND PostingType='").append(PostingType).append("'");
}
if (m_columns[col].isColumnTypeSegmentValue())
{
String elementType = m_columns[col].getElementType();
if (MReportColumn.ELEMENTTYPE_Organization.equals(elementType))
select.append(" AND AD_Org_ID=").append(m_columns[col].getOrg_ID());
else if (MReportColumn.ELEMENTTYPE_BPartner.equals(elementType))
select.append(" AND C_BPartner_ID=").append(m_columns[col].getC_BPartner_ID());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -