Commit 7f7b105f authored by mmhatre's avatar mmhatre

added side panel for invoice adjustment

git-svn-id: http://15.206.35.175/svn/proteus/business-java/trunk@214830 ce508802-f39f-4f6c-b175-0d175dae99d5
parent f3509b8c
<?xml version='1.0' encoding='utf-8'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:decimal-format NaN="0"/>
<xsl:template match="/">
<html>
<body>
<div class="mainContainer">
<div class="dataContainer">
<xsl:variable name="totAdjAmt"><xsl:value-of select="//Detail1/InvoiceAmt/totadj_amt"/></xsl:variable>
<div class="statusHeader" style="background-color:WHITE" >
<div class="statusLine">
<xsl:if test="$totAdjAmt=0">
<strong>No Adjustment against the Invoice  </strong>
</xsl:if>
<xsl:if test="$totAdjAmt=not(0)">
<div class="leftAlignDiv">
<strong>Invoice Amount:</strong>&#160;<xsl:value-of select="//Detail1/InvoiceAmt/inv_amt"/>&#160;
</div>
<div class="rightAlignDiv">
<strong>Adjust Amount:</strong>&#160;<xsl:value-of select="//Detail1/InvoiceAmt/totadj_amt"/>&#160;
</div>
</xsl:if>
</div>
</div>
</div>
<div class="dataContainer">
<xsl:for-each select="//Detail1/Invoice">
<div class='eachLineData'>
<div class="statusHeader">
<div class="statusLine">
<div class="leftAlignDiv">
<p><strong>Reference#:</strong>&#160;<xsl:value-of select="tran_id" /> </p>
</div>
<div class="rightAlignDiv">
<strong>Date :</strong>&#160;<xsl:value-of select="ref_date"/>
</div>
</div>
<div class="statusLine">
<div class="leftAlignDiv">
<strong><xsl:value-of select="ref_ser"/></strong>
</div>
<div class="rightAlignDiv">
<strong>Due Date:</strong>&#160;<xsl:value-of select="due_date"/>
</div>
</div>
<div class="statusLine">
<div class="leftAlignDiv" id="dueDateLine">
<strong>Total Amount:</strong>&#160;<xsl:value-of select="net_amt"/>
</div>
<div class="rightAlignDiv">
<strong>Adj Amount:</strong>&#160;<xsl:value-of select="rcp_amt"/>
</div>
</div>
<div class="statusLine">
<div class="leftAlignDiv" id="dueDateLine">
Currency Code:&#160;<xsl:value-of select="curr_code"/>
</div>
<div class="rightAlignDiv">
Exchange Rate:&#160;<xsl:value-of select="exch_rate"/>
</div>
</div>
</div><br/>
</div>
</xsl:for-each>
</div>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<%@page import = "java.lang.*,java.util.*, ibase.webitm.utility.*"%>
<%
response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
response.setHeader("Cache-Control", "no-store, no-cache,must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
%>
<%
System.out.println("#######################################################");
System.out.println("invoice.jsp ");
System.out.println("#######################################################");
String queryParam = request.getParameter( "QRY_PARAM" );
String paramType = request.getParameter( "QRY_PARAM_TYPE" );
String targetObject = request.getParameter( "TAR_OBJ_NAME" );
String linkDescr = request.getParameter( "LINK_DESCR" );
String objType = request.getParameter( "OBJ_TYPE" );
String objCtx = request.getParameter( "OBJ_CTXT" );
String invoiceId = request.getParameter( "INVOICE_ID" );
String refSeries = "S-INV";
%>
<html>
<head>
</head>
<body style="overflow:hidden;">
<iframe src="/ibase/webitm/jsp/InvoiceAdjustment.jsp?QRY_PARAM=<%=queryParam%>&QRY_PARAM_TYPE=<%=paramType%>&TAR_OBJ_NAME=<%=targetObject%>&LINK_DESCR=<%=linkDescr%>&OBJ_TYPE=<%=objType%>&INVOICE_ID=<%=invoiceId%>&REF_ID=<%=refSeries%>" width="100%" height="100%" class="FrameFlowPanel" style="border:none;"></iframe>
</body>
</html>
<%@page import = "java.lang.*,java.util.*, ibase.webitm.utility.*"%>
<%
response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
response.setHeader("Cache-Control", "no-store, no-cache,must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
%>
<%
System.out.println("#######################################################");
System.out.println("InvoiceAdjustment.jsp ");
System.out.println("#######################################################");
ibase.utility.UserInfoBean userInfo = ( ibase.utility.UserInfoBean )session.getAttribute( "USER_INFO" );
System.out.println("TransDB ::["+userInfo.getTransDB()+"]");
if( userInfo == null )
{
out.println("Your session has been expired. Please re-login.");
}
String queryParam = request.getParameter( "QRY_PARAM" );
String paramType = request.getParameter( "QRY_PARAM_TYPE" );
String targetObject = request.getParameter( "TAR_OBJ_NAME" );
String linkDescr = request.getParameter( "LINK_DESCR" );
String objType = request.getParameter( "OBJ_TYPE" );
String objCtx = request.getParameter( "OBJ_CTXT" );
String invoiceId = request.getParameter( "INVOICE_ID" );
String refSeries = "S-INV";
System.out.println(" invoice Id ::"+invoiceId + "refSeries ::"+refSeries);
ibase.webitm.ejb.fin.InvoiceAdjustmentBean invoiceAdjustment = new ibase.webitm.ejb.fin.InvoiceAdjustmentBean();
String status = invoiceAdjustment.InvoiceAdjustmentInfo(invoiceId,refSeries,userInfo);
ibase.utility.E12GenericUtility genericUtilityObj = new ibase.utility.E12GenericUtility();
String displayThemeXSL = ( (String)session.getAttribute( "DISPLAY_THEME") )== null ? genericUtilityObj.getThemeFormat():(String)session.getAttribute( "DISPLAY_THEME");
%>
<html>
<HEAD>
<TITLE>
<%= targetObject %>
</TITLE>
<!-- Changed by Pravin on 28/07/08.[to apply theme, request ID- WS89BAS022 ]Start -->
<!-- <link type="text/css" rel="stylesheet" href="/ibase/webitm/css/default.css"/> -->
<link type="text/css" rel="stylesheet" href="/ibase/webitm/css/<%=displayThemeXSL%>/default.css"/>
<!-- Changed by Pravin on 28/07/08.[to apply theme, request ID- WS89BAS022 ]End -->
<!-- Added by Santosh on 11/02/2017 to link CSS file Start -->
<link type="text/css" rel="stylesheet" href="/ibase/webitm/css/SorderStatus.css"/>
<script type='text/javascript' language="javascript" src='/ibase/webitm/js/jquery-1.10.2.js'></script>
<!-- Added by Santosh on 11/02/2017 to link CSS file End -->
<script language="Javascript" src="../js/GlobalVar.js"></script>
<script language="Javascript" src="../js/GlobalFunc.js"></script>
<script language="Javascript" src="../js/ITMLinkPage.js"></script>
</HEAD>
<div id="linkBrowDiv">
</div>
<!-- Changed by Dhruv on 11/10/2007 to focus window on load -->
<!-- Changed by Santosh on 13/02/2017 -->
<%-- <body onLoad="loadLink(),viewLinkBrow('<%=targetObject%>','<%=queryParam%>','<%=paramType%>');window.focus();" class="" onClick = "hideContextMenu()"> --%>
<!-- <body onLoad="window.focus();removeDuplicateRows();" class="" onClick = "hideContextMenu()">
-->
<!--changes by sarita on 28NOV2017 -->
<body onLoad="window.focus();removeDuplicateRows();" class="" onClick = "hideContextMenu()" style="margin:0px;">
<!-- changes made by sanket on 12-09-16 for label width 100% from <hr style="position:absolute;top:2;left:5;height:22;width:790;background-color: #D7D7D7;font-family:Verdana"> -->
<!-- Commented by Santosh on 11/02/2017 Start -->
<%-- <hr style="position:absolute;top:2;left:5;height:22;width:99%;background-color: #D7D7D7;font-family:Verdana">
<b><a id ="menudescr" style ="position : absolute; top : 3;left:10;color: #0000FF;font-family:Tahoma;font-size: 12"><%= linkDescr %></a></b> --%>
<!-- Commented by Santosh on 11/02/2017 End -->
<!--//Added by sarita on 28NOV2017 -->
<%= status %>
</body>
<script>
link_obj_name = '<%= targetObject%>';
//Changed by Dayanand on 31/03/08 [Pass OBJ_CTXT for display link for selected form]
obj_ctx = '<%= objCtx%>';
//Changed by Roshan 22/11/07 [Gui related changes.Applying Theme]
displayTheme='<%= session.getAttribute( "DISPLAY_THEME")%>';
//Changed by Roshan 09/01/08 [to get obj type anywhere]
obj_Type = '<%= objType%>' ;
function invokeAction()
{
alert(" Not Allowed ");
}
</script>
</html>
\ No newline at end of file
package ibase.webitm.ejb.fin;
import ibase.planner.utility.ITMException;
import ibase.system.config.AppConnectParm;
import ibase.utility.CommonConstants;
import ibase.utility.E12GenericUtility;
import ibase.utility.UserInfoBean;
import java.io.File;
import javax.naming.InitialContext;
public class InvoiceAdjustmentBean
{
E12GenericUtility genericUtility = new E12GenericUtility();
private String user_lang ="en";
private String user_country = "US";
private String user_status = "V";
public String InvoiceAdjustmentInfo(String invoiceId,String ref_series,UserInfoBean userInfo) throws ITMException
{
InvoiceAdjustmentEJB invoiceAdjustmentEJB = null;
String getXmlData = "";
String xslFileName = "",finalString = "";
try
{
System.out.println("Inside InvoiceAdjustmentBean class");
System.out.println("Value of Invoice is 1234556::"+invoiceId +"ref_series ::"+ref_series);
AppConnectParm appConnect = new AppConnectParm();
InitialContext ctx = new InitialContext(appConnect.getProperty());
invoiceAdjustmentEJB = new InvoiceAdjustmentEJB();
getXmlData = invoiceAdjustmentEJB.getInvoiceAdjustmentXML(invoiceId,ref_series,userInfo);
System.out.println("Returned XML is ::::"+getXmlData);
xslFileName = getXSLFileName( "invoice_adjustment11_" + this.user_lang + "_" + this.user_country + "_" + this.user_status +".xsl" );
finalString = (genericUtility).transformToString(xslFileName, getXmlData, CommonConstants.APPLICATION_CONTEXT + File.separator + "temp", "Output", ".html");
}
catch(Exception e)
{
System.out.println("Exception Inside InvoiceAdjustmentBean InvoiceAdjustmentInfo() method ::"+e.getMessage());
throw new ITMException(e);
}
System.out.println("finalString is >>>>>>>>>>>"+finalString);
return finalString;
}
private String getXSLFileName( String xslFileName )throws ITMException
{
String retFileName = null;
try
{
String defaultPath = null;
if( CommonConstants.APPLICATION_CONTEXT != null )
{
defaultPath = CommonConstants.APPLICATION_CONTEXT + CommonConstants.ITM_CONTEXT + File.separator;
}
else
{
defaultPath = ".." + File.separator + "webapps" + File.separator + "ibase" + File.separator + CommonConstants.ITM_CONTEXT + File.separator;
}
File xslPath = new File( defaultPath + File.separator + "xsl" + File.separator + CommonConstants.THEME);
if ( !xslPath.exists() )
{
xslPath.mkdir();
}
System.out.println( " 1xslPath [" + xslPath +"] xslFileName ["+xslFileName +"]");
File xslFile = new File(xslPath , xslFileName);
if( xslFile.exists() )
{
retFileName = xslFile.getAbsolutePath();
}
else
{
throw new ITMException( new Exception( retFileName + " Wizard XSL file Not Found") );
}
}
catch (Exception e)
{
throw new ITMException(e);
}
return retFileName;
}//end of method getXSLFileName
}
\ No newline at end of file
package ibase.webitm.ejb.fin;
import ibase.utility.UserInfoBean;
import ibase.webitm.ejb.ValidatorEJB;
import ibase.webitm.ejb.dis.PostOrdCreditChk;
import ibase.webitm.utility.ITMException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
@javax.ejb.Stateless
public class InvoiceAdjustmentEJB extends ValidatorEJB
{
ibase.utility.E12GenericUtility genericUtility= new ibase.utility.E12GenericUtility();
PostOrdCreditChk postOrdCreditChk = new PostOrdCreditChk();
public String getInvoiceAdjustmentXML(String invoiceId, String ref_series,UserInfoBean userInfo) throws ITMException
{
StringBuffer valueXmlString = new StringBuffer();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null ;
String sql="";
String refSer="";
// String invoiceId="";
HashMap<String,Object> sordData = null;
String refDate="",refDt="",dueDate="",dueDt="";
double invoiceAmt=0.0;
String sql1="";
PreparedStatement pstmt1=null;
ResultSet rs1=null;
double rcpAmt=0,ibcaAmt=0,adjAmt=0,totAdjAmt=0;
try
{
setUserInfo(userInfo);
conn = getConnection();
SimpleDateFormat sdf = new SimpleDateFormat(genericUtility.getApplDateFormat());
System.out.println("Inside getInvoiceAdjustmentXML method of InvoiceAdjustmentEJB");
System.out.println("invoice id ::"+invoiceId + "\t"+ "ref_series ::"+ref_series);
refSer="S-INV";
valueXmlString = new StringBuffer("<?xml version = \"1.0\"?> <Root> <header>");
valueXmlString.append("</header>");
valueXmlString.append("<Detail1>");
sql1="Select net_amt,adj_amount from invoice where invoice_id= ? ";
pstmt1 = conn.prepareStatement(sql1);
pstmt1.setString(1,invoiceId);
rs1 = pstmt1.executeQuery();
valueXmlString.append("<InvoiceAmt>\n");
if(rs1.next())
{
/*invoiceAmt=rs1.getDouble("inv_amt");
adjAmt=rs1.getDouble("adj_amount");*/
adjAmt=rs1.getDouble(2);
valueXmlString.append("<inv_amt><![CDATA["+rs1.getDouble(1)+"]]></inv_amt>\n");
}
rs1.close();
rs1 = null;
pstmt1.close();
pstmt1 = null;
sql1="select sum(rcp_amt) from rcpdet where ref_ser = ? and ref_no=? ";
pstmt1 = conn.prepareStatement(sql1);
pstmt1.setString(1,refSer);
pstmt1.setString(2,invoiceId);
rs1 = pstmt1.executeQuery();
if(rs1.next())
{
rcpAmt=rs1.getDouble(1);
}
rs1.close();
rs1 = null;
pstmt1.close();
pstmt1 = null;
sql1="select sum(tot_amt) from rcp_ibca_det where ref_ser = ? and ref_no=? ";
pstmt1 = conn.prepareStatement(sql1);
pstmt1.setString(1,refSer);
pstmt1.setString(2,invoiceId);
rs1 = pstmt1.executeQuery();
if(rs1.next())
{
ibcaAmt=rs1.getDouble(1);
}
rs1.close();
rs1 = null;
pstmt1.close();
pstmt1 = null;
totAdjAmt= adjAmt+rcpAmt+ibcaAmt;
if(totAdjAmt ==0)
{
valueXmlString.append("<totadj_amt><![CDATA["+"0"+"]]></totadj_amt>\n");
}
else
{
valueXmlString.append("<totadj_amt><![CDATA["+totAdjAmt+"]]></totadj_amt>\n");
}
valueXmlString.append("</InvoiceAmt>\n");
sql=" SELECT rcpdet.tran_id, " +
" (select DESCR from REFSER WHERE REF_SER= 'RCP') AS REF_SER , " +
" rcpdet.ref_date, " +
" rcpdet.curr_code, " +
" rcpdet.exch_rate__rcv," +
" rcpdet.disc_amt, " +
" rcpdet.tax_amt, " +
" rcpdet.exch_rate, " +
" rcpdet.net_amt, " +
" rcpdet.rcp_amt, " +
" rcpdet.diff_amt__exch, " +
" rcpdet.cust_code, " +
" rcpdet.due_date, " +
" rcpdet.acct_code__ar, " +
" rcpdet.cctr_code__ar, " +
" ' ' REF_NO_ADJ, " +
" ' ' REF_SER_ADJ, " +
" receipt.confirmed " +
" FROM rcpdet, " +
" receipt " +
" WHERE ( receipt.tran_id = rcpdet.tran_id ) and " +
" ( rcpdet.ref_ser = ? ) AND " +
" ( rcpdet.ref_no = ? ) " +
" UNION " +
" SELECT rcp_ibca_det.tran_id, " +
" (select DESCR from REFSER WHERE REF_SER= 'R-IBCA') AS REF_SER, " +
" rcp_ibca_det.ref_date, " +
" rcp_ibca_det.curr_code, " +
" 0.00 as exch_rate__rcv, " +
" rcp_ibca_det.discount, " +
" rcp_ibca_det.tax_amt, " +
" rcp_ibca_det.exch_rate, " +
" rcp_ibca_det.tot_amt, " +
" rcp_ibca_det.tot_amt, " +
" 0.00 as diff_amt__exch, " +
" rcp_ibca_det.cust_code, " +
" rcp_ibca_det.due_date, " +
" rcp_ibca_det.acct_code, " +
" rcp_ibca_det.cctr_code, " +
" ' ' as REF_NO_ADJ, " +
" ' ' as REF_SER_ADJ, " +
" rcp_ibca.confirmed " +
" FROM rcp_ibca, " +
" rcp_ibca_det " +
" WHERE ( rcp_ibca_det.tran_id = rcp_ibca.tran_id ) and " +
" ( ( rcp_ibca_det.ref_ser = ? ) AND " +
" ( rcp_ibca_det.ref_no = ? ) ) " +
" UNION " +
" SELECT receivables_adj.ref_no, " +
" (select DESCR from REFSER WHERE REF_SER= receivables_adj.ref_ser) AS REF_SER, " +
" receivables.ref_date, " +
" receivables.curr_code, " +
" 0.00 as exch_rate__rcv, " +
" receivables.discount, " +
" receivables.tax_amt, " +
" receivables.exch_rate, " +
" receivables_adj.tot_amt, " +
" receivables_adj.adj_amt, " +
" 0.00 as diff_amt__exch, " +
" receivables.cust_code, " +
" receivables.due_date, " +
" receivables.acct_code, " +
" receivables.cctr_code, " +
" receivables_adj.ref_no_adj, " +
" receivables_adj.ref_ser_adj, " +
" 'Y' as confirmed " +
" FROM receivables, " +
" receivables_adj " +
" WHERE ( receivables.ref_no = receivables_adj.ref_no ) and " +
" ( ( RECEIVABLES_ADJ.ref_ser_adj = ? ) AND " +
" ( RECEIVABLES_ADJ.ref_no_adj = ? ) ) " ;
/*" UNION " +
" SELECT receivables_adj.ref_no, " +
" receivables_adj.ref_ser, " +
" receivables.ref_date, " +
" receivables.curr_code, " +
" 0.00 as exch_rate__rcv, " +
" receivables.discount, " +
" receivables.tax_amt, " +
" receivables.exch_rate, " +
" receivables_adj.tot_amt, " +
" receivables_adj.adj_amt, " +
" 0.00 as diff_amt__exch, " +
" receivables.cust_code, " +
" receivables.due_date, " +
" receivables.acct_code, " +
" receivables.cctr_code, " +
" receivables_adj.ref_no_adj, " +
" receivables_adj.ref_ser_adj, " +
" 'Y' as confirmed " +
" FROM receivables, " +
" receivables_adj " +
" WHERE ( receivables.ref_no = receivables_adj.ref_no ) and " +
" ( ( RECEIVABLES_ADJ.ref_ser = ? ) AND " +
" ( RECEIVABLES_ADJ.ref_no = ? ) ) ";*/
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,refSer);
pstmt.setString(2,invoiceId);
pstmt.setString(3,refSer);
pstmt.setString(4,invoiceId);
pstmt.setString(5,refSer);
pstmt.setString(6,invoiceId);
/* pstmt.setString(7,refSer);
pstmt.setString(8,invoiceId);*/
rs = pstmt.executeQuery();
while(rs.next())
{
refDate = rs.getString("ref_date");
if(refDate != null)
{
refDt = genericUtility.getValidDateString(refDate, genericUtility.getDBDateFormat(), genericUtility.getApplDateFormat());
}
dueDate = rs.getString("due_date");
if(dueDate != null)
{
dueDt = genericUtility.getValidDateString(dueDate, genericUtility.getDBDateFormat(), genericUtility.getApplDateFormat());
}
valueXmlString.append("<Invoice>\n");
valueXmlString.append("<tran_id><![CDATA["+checkNull(rs.getString("tran_id"))+"]]></tran_id>\n");
valueXmlString.append("<ref_ser><![CDATA["+checkNull(rs.getString("ref_ser"))+"]]></ref_ser>\n");
valueXmlString.append("<ref_date><![CDATA["+checkNull(refDt)+"]]></ref_date>\n");
valueXmlString.append("<curr_code><![CDATA["+checkNull(rs.getString("curr_code"))+"]]></curr_code>\n");
valueXmlString.append("<exch_rate__rcv><![CDATA["+rs.getDouble("exch_rate__rcv")+"]]></exch_rate__rcv>\n");
valueXmlString.append("<disc_amt><![CDATA["+rs.getDouble("disc_amt")+"]]></disc_amt>\n");
valueXmlString.append("<tax_amt><![CDATA["+rs.getDouble("tax_amt")+"]]></tax_amt>\n");
valueXmlString.append("<exch_rate><![CDATA["+rs.getDouble("exch_rate")+"]]></exch_rate>\n");
valueXmlString.append("<net_amt><![CDATA["+rs.getDouble("net_amt")+"]]></net_amt>\n");
valueXmlString.append("<rcp_amt><![CDATA["+rs.getDouble("rcp_amt")+"]]></rcp_amt>\n");
valueXmlString.append("<diff_amt__exch><![CDATA["+rs.getDouble("diff_amt__exch")+"]]></diff_amt__exch>\n");
valueXmlString.append("<cust_code><![CDATA["+checkNull(rs.getString("cust_code"))+"]]></cust_code>\n");
valueXmlString.append("<due_date><![CDATA["+checkNull(dueDt)+"]]></due_date>\n");
valueXmlString.append("<acct_code__ar><![CDATA["+checkNull(rs.getString("acct_code__ar"))+"]]></acct_code__ar>\n");
valueXmlString.append("<cctr_code__ar><![CDATA["+checkNull(rs.getString("cctr_code__ar"))+"]]></cctr_code__ar>\n");
valueXmlString.append("<ref_no_adj><![CDATA["+checkNull(rs.getString("ref_no_adj"))+"]]></ref_no_adj>\n");
valueXmlString.append("<ref_ser_adj><![CDATA["+checkNull(rs.getString("ref_ser_adj"))+"]]></ref_ser_adj>\n");
valueXmlString.append("<confirmed><![CDATA["+checkNull(rs.getString("confirmed"))+"]]></confirmed>\n");
valueXmlString.append("</Invoice>\n");
}
valueXmlString.append("</Detail1>");
valueXmlString.append("</Root>");
}//end of try block
catch(Exception e)
{
e.printStackTrace();
System.out.println("Inside InvoiceAdjustmentEJB getinvoiceAdjustmentXML method ::"+e.getMessage());
throw new ITMException(e);
}
finally
{
try
{
if(conn != null)
{
conn.close();
conn = null;
}
if(rs != null)
{
rs.close();
rs = null;
}
if(pstmt != null)
{
pstmt.close();
pstmt = null;
}
}
catch(Exception d)
{
d.printStackTrace();
}
}
return valueXmlString.toString();
}
public String checkNull(String input)
{
if(input == null)
{
input = "";
}
return input.trim();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment