Commit ca8e3ec3 authored by Ajit Deshmukh's avatar Ajit Deshmukh

Updated the package for ManageSql and ManageSqlConf class and On Submit click...

Updated the package for ManageSql and ManageSqlConf class and On Submit click added the validation through GENMST instead or code level
parent acff114a
...@@ -38,18 +38,19 @@ public class ManageSQLSubmit extends ActionHandlerEJB { ...@@ -38,18 +38,19 @@ public class ManageSQLSubmit extends ActionHandlerEJB {
ITMDBAccessEJB itmDBAccessEJB = new ITMDBAccessEJB(); ITMDBAccessEJB itmDBAccessEJB = new ITMDBAccessEJB();
String profileId = checkNull(userInfo.getProfileId()); String profileId = checkNull(userInfo.getProfileId());
if(!profileId.trim().equalsIgnoreCase("MSDEVTL")){ // if(!profileId.trim().equalsIgnoreCase("MSDEVTL")){
return itmDBAccessEJB.getErrorString("", "MSQLCNS", "", "", conn); // return itmDBAccessEJB.getErrorString("", "MSQLCNS", "", "", conn);
} // }
ConnDriver connDriver = new ConnDriver(); ConnDriver connDriver = new ConnDriver();
conn = connDriver.getConnectDB(userInfo.getTransDB()); conn = connDriver.getConnectDB(userInfo.getTransDB());
String ExecutiveApproval = ""; String ExecutiveApproval = "";
String ExecutionRights = ""; String ExecutionRights = "";
String wfStatus = ""; String wfStatus = "";
int aprvLevel = 0;
String checkExecAprvVal = "select exec_aprv, exec_rights, wf_status from sql_changes where tran_id = ?"; String checkExecAprvVal = "select exec_aprv, exec_rights, wf_status, aprv_level from sql_changes where tran_id = ?";
PreparedStatement checkExecAprvValPs = conn.prepareStatement(checkExecAprvVal); PreparedStatement checkExecAprvValPs = conn.prepareStatement(checkExecAprvVal);
checkExecAprvValPs.setString(1, tranID); checkExecAprvValPs.setString(1, tranID);
ResultSet checkExecAprvValRs = checkExecAprvValPs.executeQuery(); ResultSet checkExecAprvValRs = checkExecAprvValPs.executeQuery();
...@@ -57,13 +58,25 @@ public class ManageSQLSubmit extends ActionHandlerEJB { ...@@ -57,13 +58,25 @@ public class ManageSQLSubmit extends ActionHandlerEJB {
ExecutiveApproval = checkNull(checkExecAprvValRs.getString("exec_aprv")); ExecutiveApproval = checkNull(checkExecAprvValRs.getString("exec_aprv"));
ExecutionRights = checkNull(checkExecAprvValRs.getString("exec_rights")); ExecutionRights = checkNull(checkExecAprvValRs.getString("exec_rights"));
wfStatus = checkNull(checkExecAprvValRs.getString("wf_status")); wfStatus = checkNull(checkExecAprvValRs.getString("wf_status"));
aprvLevel = checkExecAprvValRs.getInt("aprv_level");
} }
BaseLogger.log("3", null, null, "ManageSQLSubmit exec_aprv:: " + ExecutiveApproval); BaseLogger.log("3", null, null, "ManageSQLSubmit exec_aprv:: " + ExecutiveApproval);
BaseLogger.log("3", null, null, "ManageSQLSubmit exec_rights:: " + ExecutionRights); BaseLogger.log("3", null, null, "ManageSQLSubmit exec_rights:: " + ExecutionRights);
BaseLogger.log("3", null, null, "ManageSQLSubmit wfStatus:: " + wfStatus); BaseLogger.log("3", null, null, "ManageSQLSubmit wfStatus:: " + wfStatus);
BaseLogger.log("3", null, null, "ManageSQLSubmit aprvLevel:: " + aprvLevel);
// if(aprvLevel<1){
// BaseLogger.log("3", null, null, "Transaction is not proceed aprvLevel:: " + aprvLevel);
// return itmDBAccessEJB.getErrorString("", "MSQLCNSBP", "", "", conn);
// }
// if(!ExecutiveApproval.trim().equalsIgnoreCase("Y")){
// BaseLogger.log("3", null, null, "Execution Approval is not Y cannot submit:: " + ExecutiveApproval);
// return itmDBAccessEJB.getErrorString("", "MSQLEXAPN", "", "", conn);
// }
if (checkExecAprvValPs != null) { if (checkExecAprvValPs != null) {
checkExecAprvValPs.close(); checkExecAprvValPs.close();
...@@ -74,15 +87,15 @@ public class ManageSQLSubmit extends ActionHandlerEJB { ...@@ -74,15 +87,15 @@ public class ManageSQLSubmit extends ActionHandlerEJB {
checkExecAprvValRs = null; checkExecAprvValRs = null;
} }
if(wfStatus.trim().equalsIgnoreCase("S") || wfStatus.trim().equalsIgnoreCase("A")){ // if(wfStatus.trim().equalsIgnoreCase("S") || wfStatus.trim().equalsIgnoreCase("A")){
BaseLogger.log("3", null, null, "Transaction already submitted...."); // BaseLogger.log("3", null, null, "Transaction already submitted....");
return itmDBAccessEJB.getErrorString("", "VTCAN127", "", "", conn); // return itmDBAccessEJB.getErrorString("", "VTCAN127", "", "", conn);
} // }
if(ExecutionRights.trim().equalsIgnoreCase("A") || ExecutionRights.trim().equalsIgnoreCase("P") || ExecutionRights.trim().equalsIgnoreCase("C") || ExecutionRights.trim().equalsIgnoreCase("Q")){ // if(ExecutionRights.trim().equalsIgnoreCase("A") || ExecutionRights.trim().equalsIgnoreCase("P") || ExecutionRights.trim().equalsIgnoreCase("C") || ExecutionRights.trim().equalsIgnoreCase("Q")){
BaseLogger.log("3", null, null, "For Execution Rights A, P, C and Q can not be submit...."); // BaseLogger.log("3", null, null, "For Execution Rights A, P, C and Q can not be submit....");
return itmDBAccessEJB.getErrorString("", "MSQLNS", "", "", conn); // return itmDBAccessEJB.getErrorString("", "MSQLNS", "", "", conn);
} // }
if (ExecutiveApproval.trim().equalsIgnoreCase("Y")) { if (ExecutiveApproval.trim().equalsIgnoreCase("Y")) {
String updateAprvLevelSql = "update sql_changes set aprv_level = '2' where tran_id = ?"; String updateAprvLevelSql = "update sql_changes set aprv_level = '2' where tran_id = ?";
PreparedStatement updateAprvLevelPs = conn.prepareStatement(updateAprvLevelSql); PreparedStatement updateAprvLevelPs = conn.prepareStatement(updateAprvLevelSql);
......
package ibase.webitm.ejb.wsfa.masters; package ibase.webitm.ejb.sys;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.sql.Connection; import java.sql.Connection;
...@@ -37,7 +37,7 @@ public class ManageSql extends ValidatorEJB { ...@@ -37,7 +37,7 @@ public class ManageSql extends ValidatorEJB {
public String wfValData(String xmlString, String xmlString1, String xmlString2, String objContext, String editFlag, String xtraParams) throws RemoteException, ITMException public String wfValData(String xmlString, String xmlString1, String xmlString2, String objContext, String editFlag, String xtraParams) throws RemoteException, ITMException
{ {
System.out.println("Inside wfValData updated method 20/07/22 ::: Ajit"); System.out.println("Inside wfValData updated method 20/07/22 :::: Ajit");
Document dom = null; Document dom = null;
Document dom1 = null; Document dom1 = null;
Document dom2 = null; Document dom2 = null;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* AUTHOR : Mrunalini Sinkar * AUTHOR : Mrunalini Sinkar
*/ */
package ibase.webitm.ejb.wsfa.masters; package ibase.webitm.ejb.sys;
import ibase.system.config.ConnDriver; import ibase.system.config.ConnDriver;
import ibase.utility.BaseLogger; import ibase.utility.BaseLogger;
...@@ -33,7 +33,7 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -33,7 +33,7 @@ public class ManageSqlConf extends ActionHandlerEJB {
String sqlError = ""; String sqlError = "";
public String confirm(String tranId, String xtraParams, String forcedFlag) throws RemoteException, ITMException { public String confirm(String tranId, String xtraParams, String forcedFlag) throws RemoteException, ITMException {
System.out.println("HeaderDetailConf Called!!!!!.......gsb .[" + tranId + "]"); System.out.println("HeaderDetailConf Called!!!!!!!.......gsb .[" + tranId + "]");
System.out.println("xtraParams !!!!!........[" + xtraParams + "]"); System.out.println("xtraParams !!!!!........[" + xtraParams + "]");
String enterprise = getUserInfo().getEnterprise(); String enterprise = getUserInfo().getEnterprise();
......
...@@ -84,6 +84,8 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB { ...@@ -84,6 +84,8 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB {
// InitialContext ctx = null; // InitialContext ctx = null;
String retString = null; String retString = null;
String executionRights = ""; String executionRights = "";
String remarks = "";
Connection conn = null; Connection conn = null;
// MasterStatefulLocal masterStateful = null; // for ejb3 // MasterStatefulLocal masterStateful = null; // for ejb3
...@@ -143,7 +145,7 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB { ...@@ -143,7 +145,7 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB {
String msqlDetSql = "SELECT TRAN_ID, TRAN_DATE, REQ_ID, REQ_DATE, CUST_CODE, EMP_CODE__GIVEN, EMP_CODE__MERGE, " String msqlDetSql = "SELECT TRAN_ID, TRAN_DATE, REQ_ID, REQ_DATE, CUST_CODE, EMP_CODE__GIVEN, EMP_CODE__MERGE, "
+ "EXECUTED, TRAN_ID__ORG, ACTIVE_YN, ITM_VER, CHG_USER, CHG_TERM, CHG_DATE, CONFIRMED, CONF_DATE, " + "EXECUTED, TRAN_ID__ORG, ACTIVE_YN, ITM_VER, CHG_USER, CHG_TERM, CHG_DATE, CONFIRMED, CONF_DATE, "
+ "EMP_CODE_APRV, ENTERPRISES, APPL_DB, EXEC_RIGHTS, TRAN_ID__REF " + "EMP_CODE_APRV, ENTERPRISES, APPL_DB, EXEC_RIGHTS, TRAN_ID__REF, REMARKS "
+ "FROM sql_changes where tran_id = ?"; + "FROM sql_changes where tran_id = ?";
mSqlPstmt = conn.prepareStatement(msqlDetSql); mSqlPstmt = conn.prepareStatement(msqlDetSql);
...@@ -170,6 +172,7 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB { ...@@ -170,6 +172,7 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB {
applDb = checkNull(mSqlRs.getString("APPL_DB")); applDb = checkNull(mSqlRs.getString("APPL_DB"));
execRights = checkNull(mSqlRs.getString("EXEC_RIGHTS")); execRights = checkNull(mSqlRs.getString("EXEC_RIGHTS"));
tranIdRef = checkNull(mSqlRs.getString("TRAN_ID__REF")); tranIdRef = checkNull(mSqlRs.getString("TRAN_ID__REF"));
remarks = checkNull(mSqlRs.getString("REMARKS"));
// Do something with these values directly (e.g., use them in logic, or store in // Do something with these values directly (e.g., use them in logic, or store in
// a collection) // a collection)
...@@ -191,6 +194,7 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB { ...@@ -191,6 +194,7 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB {
"ENTERPRISES: " + enterprises + ", " + "ENTERPRISES: " + enterprises + ", " +
"APPL_DB: " + applDb + ", " + "APPL_DB: " + applDb + ", " +
"EXEC_RIGHTS: " + execRights + ", " + "EXEC_RIGHTS: " + execRights + ", " +
"REMAKRS: " + remarks + ", " +
"TRAN_ID__REF: " + tranIdRef); "TRAN_ID__REF: " + tranIdRef);
} }
...@@ -234,6 +238,7 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB { ...@@ -234,6 +238,7 @@ public class ManageSqlReleaseFromQC extends ActionHandlerEJB {
processDynXmlString.append("<appl_db><![CDATA[" + applDb + "]]></appl_db>"); processDynXmlString.append("<appl_db><![CDATA[" + applDb + "]]></appl_db>");
processDynXmlString.append("<exec_rights><![CDATA[{{executionRights}}]]></exec_rights>"); processDynXmlString.append("<exec_rights><![CDATA[{{executionRights}}]]></exec_rights>");
processDynXmlString.append("<tran_id__ref><![CDATA[" + tranId + "]]></tran_id__ref>"); processDynXmlString.append("<tran_id__ref><![CDATA[" + tranId + "]]></tran_id__ref>");
processDynXmlString.append("<remarks><![CDATA[" + remarks + "]]></remarks>");
processDynXmlString.append("</Detail1>"); processDynXmlString.append("</Detail1>");
String msqlDet1Sql = "SELECT LINE_NO, ORA_STMNT, DB2_STMNT, STMNT_TYPE FROM sql_changes_det WHERE tran_id = ?"; String msqlDet1Sql = "SELECT LINE_NO, ORA_STMNT, DB2_STMNT, STMNT_TYPE FROM sql_changes_det WHERE tran_id = ?";
......
...@@ -79,6 +79,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{ ...@@ -79,6 +79,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{
//InitialContext ctx = null; //InitialContext ctx = null;
String retString = null; String retString = null;
String executionRights = ""; String executionRights = "";
String remarks = "";
Connection conn = null; Connection conn = null;
// MasterStatefulLocal masterStateful = null; // for ejb3 // MasterStatefulLocal masterStateful = null; // for ejb3
...@@ -189,7 +190,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{ ...@@ -189,7 +190,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{
String msqlDetSql = "SELECT TRAN_ID, TRAN_DATE, REQ_ID, REQ_DATE, CUST_CODE, EMP_CODE__GIVEN, EMP_CODE__MERGE, " String msqlDetSql = "SELECT TRAN_ID, TRAN_DATE, REQ_ID, REQ_DATE, CUST_CODE, EMP_CODE__GIVEN, EMP_CODE__MERGE, "
+ "EXECUTED, TRAN_ID__ORG, ACTIVE_YN, ITM_VER, CHG_USER, CHG_TERM, CHG_DATE, CONFIRMED, CONF_DATE, " + "EXECUTED, TRAN_ID__ORG, ACTIVE_YN, ITM_VER, CHG_USER, CHG_TERM, CHG_DATE, CONFIRMED, CONF_DATE, "
+ "EMP_CODE_APRV, ENTERPRISES, APPL_DB, EXEC_RIGHTS, TRAN_ID__REF " + "EMP_CODE_APRV, ENTERPRISES, APPL_DB, EXEC_RIGHTS, TRAN_ID__REF, REMARKS "
+ "FROM sql_changes where tran_id = ?"; + "FROM sql_changes where tran_id = ?";
mSqlPstmt = conn.prepareStatement(msqlDetSql); mSqlPstmt = conn.prepareStatement(msqlDetSql);
...@@ -215,6 +216,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{ ...@@ -215,6 +216,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{
applDb = checkNull(mSqlRs.getString("APPL_DB")); applDb = checkNull(mSqlRs.getString("APPL_DB"));
execRights = checkNull(mSqlRs.getString("EXEC_RIGHTS")); execRights = checkNull(mSqlRs.getString("EXEC_RIGHTS"));
tranIdRef = checkNull(mSqlRs.getString("TRAN_ID__REF")); tranIdRef = checkNull(mSqlRs.getString("TRAN_ID__REF"));
remarks = checkNull(mSqlRs.getString("REMARKS"));
// Do something with these values directly (e.g., use them in logic, or store in a collection) // Do something with these values directly (e.g., use them in logic, or store in a collection)
...@@ -235,6 +237,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{ ...@@ -235,6 +237,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{
"ENTERPRISES: " + enterprises + ", " + "ENTERPRISES: " + enterprises + ", " +
"APPL_DB: " + applDb + ", " + "APPL_DB: " + applDb + ", " +
"EXEC_RIGHTS: " + execRights + ", " + "EXEC_RIGHTS: " + execRights + ", " +
"REMARKS: " + remarks + ", " +
"TRAN_ID__REF: " + tranIdRef); "TRAN_ID__REF: " + tranIdRef);
} }
...@@ -283,6 +286,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{ ...@@ -283,6 +286,7 @@ public class ManageSqlReleaseToQC extends ActionHandlerEJB{
processDynXmlString.append("<appl_db><![CDATA[" + applDb + "]]></appl_db>"); processDynXmlString.append("<appl_db><![CDATA[" + applDb + "]]></appl_db>");
processDynXmlString.append("<exec_rights><![CDATA[{{executionRights}}]]></exec_rights>"); processDynXmlString.append("<exec_rights><![CDATA[{{executionRights}}]]></exec_rights>");
processDynXmlString.append("<tran_id__ref><![CDATA[" + tranId + "]]></tran_id__ref>"); processDynXmlString.append("<tran_id__ref><![CDATA[" + tranId + "]]></tran_id__ref>");
processDynXmlString.append("<remarks><![CDATA[" + remarks + "]]></remarks>");
processDynXmlString.append("</Detail1>"); processDynXmlString.append("</Detail1>");
String msqlDet1Sql = "SELECT LINE_NO, ORA_STMNT, DB2_STMNT, STMNT_TYPE FROM sql_changes_det WHERE tran_id = ?"; String msqlDet1Sql = "SELECT LINE_NO, ORA_STMNT, DB2_STMNT, STMNT_TYPE FROM sql_changes_det WHERE tran_id = ?";
......
...@@ -199,3 +199,123 @@ WHERE s.tran_id = ? ...@@ -199,3 +199,123 @@ WHERE s.tran_id = ?
) )
)' where error_cd = 'IV_PRRGTS'; )' where error_cd = 'IV_PRRGTS';
------------5th MAY---------------
-- 1. Profile Validation (Only MSDEVTL allowed)
INSERT INTO genmst (
fld_name,
mod_name,
descr,
error_cd,
blank_opt,
fld_type,
fld_min,
fld_max,
val_type,
chg_date,
chg_user,
chg_term,
val_table,
sql_input,
fld_width,
udf_usage_1,
udf_usage_2,
udf_usage_3,
val_stage,
obj_name,
form_no,
action,
user_id,
tran_id,
udf_str1_descr,
udf_str2_descr,
udf_str3_descr,
exec_seq
) VALUES (
'PROFILE_ID',
'W_SQL_CHANGES',
'Profile Validation',
'MSQLCNS',
'N',
'C',
'SELECT COUNT(1) FROM USERS WHERE PROFILE_ID = ''MSDEVTL'' AND CODE = :1',
'1',
'Q',
sysdate,
'SYSTEM',
'SYSTEM',
NULL,
':1.loginCode',
0,
NULL,
NULL,
NULL,
NULL,
NULL,
'1',
'SUBMIT',
NULL,
'zz000000000000000270',
NULL,
NULL,
NULL,
1
);
-- 2. Approval Level Check (aprv_level >= 1)
INSERT INTO GENMST
VALUES
('APRV_LEVEL','W_SQL_CHANGES','Approval Level Check','MSQLCNSBP','N','C',
'SELECT COUNT(1) FROM sql_changes WHERE NVL(aprv_level,0) >= 1 AND tran_id = ?',
'1','Q',SYSDATE,'SYSTEM','SYSTEM',NULL,':0.tran_id',0,
NULL,NULL,NULL,NULL,NULL,'1','SUBMIT',
NULL,'zz000000000000000271',NULL,NULL,NULL,2);
-- 3. Execution Approval Check (exec_aprv = Y)
INSERT INTO GENMST
VALUES
('EXEC_APRV','W_SQL_CHANGES','Execution Approval','MSQLEXAPN','N','C',
'SELECT COUNT(1) FROM sql_changes WHERE NVL(exec_aprv,''N'') = ''Y'' AND tran_id = ?',
'1','Q',SYSDATE,'SYSTEM','SYSTEM',NULL,':0.tran_id',0,
NULL,NULL,NULL,NULL,NULL,'1','SUBMIT',
NULL,'zz000000000000000272',NULL,NULL,NULL,3);
-- 4. Workflow Status Check (not S or A)
INSERT INTO GENMST
VALUES
('WF_STATUS','W_SQL_CHANGES','Workflow Status','VTCAN127','N','C',
'SELECT COUNT(1) FROM sql_changes WHERE NVL(wf_status,''X'') NOT IN (''S'',''A'') AND tran_id = ?',
'1','Q',SYSDATE,'SYSTEM','SYSTEM',NULL,':0.tran_id',0,
NULL,NULL,NULL,NULL,NULL,'1','SUBMIT',
NULL,'zz000000000000000273',NULL,NULL,NULL,4);
-- 5. Execution Rights Check (should NOT be A, P, C, Q)
INSERT INTO GENMST
VALUES
('EXEC_RIGHTS','W_SQL_CHANGES','Execution Rights Submit','MSQLNS','N','C',
'SELECT COUNT(1) FROM sql_changes WHERE NVL(exec_rights,''X'') NOT IN (''A'',''P'',''C'',''Q'') AND tran_id = ?',
'1','Q',SYSDATE,'SYSTEM','SYSTEM',NULL,':0.tran_id',0,
NULL,NULL,NULL,NULL,NULL,'1','SUBMIT',
NULL,'zz000000000000000274',NULL,NULL,NULL,5);
Insert into MESSAGES (MSG_NO,MSG_STR,MSG_DESCR,MSG_TYPE,MSG_OPT,MSG_TIME,ALARM,ERR_SOURCE,CHG_DATE,CHG_USER,CHG_TERM,OVERRIDE_INPUT,MAIL_OPTION) values
('MSQLCNSBP','The transaction has not been processed.','The transaction has not been processed. Please process it before Sumbitting the transaction.','E','Y',null,null,null,to_date('25-DEC-13','DD-MON-RR'),'BASE ','BASE',null,null);
Insert into MESSAGES (MSG_NO,MSG_STR,MSG_DESCR,MSG_TYPE,MSG_OPT,MSG_TIME,ALARM,ERR_SOURCE,CHG_DATE,CHG_USER,CHG_TERM,OVERRIDE_INPUT,MAIL_OPTION) values
('MSQLEXAPN','Transaction cannot be submitted.','Execution approval is No. Cannot submit.','E','Y',null,null,null,to_date('25-DEC-13','DD-MON-RR'),'BASE ','BASE',null,null);
update system_events set COMP_NAME = 'ibase.webitm.ejb.sys.ManageSql' where obj_name = 'sql_changes' and EVENT_CODE in ('post_item_change','pre_validate');
update system_events set COMP_NAME = 'ibase.webitm.ejb.sys.ManageSqlConf' where obj_name = 'sql_changes' and EVENT_CODE = 'pre_confirm';
update system_service_args set ARG_VALUE = 'ibase.webitm.ejb.sys.ManageSql' where service_code = 'poic_default_headerdetail_ejb' and line_no = '2';
update system_service_args set ARG_VALUE = 'ibase.webitm.ejb.sys.ManageSql' where service_code = 'prv_default_headerdetail_ejb' and line_no = '2';
update system_service_args set ARG_VALUE = 'ibase.webitm.ejb.sys.ManageSqlConf' where service_code = 'prcm_headerdetail' and line_no = '2';
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