Commit 3424af19 authored by prane's avatar prane

added SorderGroupSchemeAct EJB for D17IBAS001

git-svn-id: http://15.206.35.175/svn/proteus/business-java/trunk@176506 ce508802-f39f-4f6c-b175-0d175dae99d5
parent 68e82065
package ibase.webitm.ejb.dis;
import ibase.system.config.ConnDriver;
import ibase.utility.E12GenericUtility;
import ibase.webitm.ejb.ActionHandlerEJB;
import ibase.webitm.ejb.ITMDBAccessEJB;
import ibase.webitm.ejb.dis.DistCommon;
import ibase.webitm.ejb.fin.FinCommon;
import ibase.webitm.ejb.sys.UtilMethods;
import ibase.webitm.utility.ITMException;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import javax.ejb.Stateless;
@Stateless
public class SorderGroupSchemeAct extends ActionHandlerEJB implements SorderGroupSchemeActRemote, SorderGroupSchemeActLocal
{
E12GenericUtility genericUtility= new E12GenericUtility();
FinCommon finCommon = new FinCommon();
DistCommon disCommon= new DistCommon();
UtilMethods utilMethod = new UtilMethods();
public String actionHandler(String saleOrder, String xtraParams, String forcedFlag)throws RemoteException, ITMException
{
StringBuffer msgAppStrinrg = new StringBuffer("");
StringBuffer msgNotAppString = new StringBuffer("");
System.out.println(">>>>>>>>>>>>>>>>>>SorderGroupSchemeAct called>>>>>>>>>>>>>>>>>>>");
Connection conn = null;
String sql="", sql1="" , sql2="", sql3="", sql4="", sql5="";
PreparedStatement pstmt = null, pstmt1 = null, pstmt2 = null, pstmt3 = null, pstmt4 = null, pstmt5 = null;
ResultSet rs = null, rs1 = null, rs2 = null, rs3 = null, rs4 = null;
int cnt = 0, cnt1 = 0, cnt2 = 0, count = 0;
String errString = null;
ITMDBAccessEJB itmDBAccessLocal = new ITMDBAccessEJB();
double qty = 0.0, rate;
String schAttr = "" , itemCodeOrd="" ,nature = "" , schAttr1 = "", ordType = "", custCode = "", schmDesc = "", schmCode = "";
String ordtype = "", schemeCode="", itemCodeParent="" , curScheme = "", prevScheme = "", custSchemeCode = "";
String siteCode="", StateCodeDlv = "", CountCodeDlv="", lstype = "", lineNo = "";
Timestamp ordDate = null;
String applyCustList = "", noApplyCustList = "" , applicableOrdTypes = "", mainStr="", msgApplied="", msgNotApplied="", itemCode1="";
boolean proceed = false;
String lineNo1 = "", nature1 = "";
double qty1 = 0.0, totalQty = 0.0, chargeAmt = 0.0 , freeDiscount = 0.0;
int no=0;
try
{
ConnDriver connDriver = null;
//connDriver = new ConnDriver();
//conn = connDriver.getConnectDB("DriverITM");
conn = getConnection();
conn.setAutoCommit(false);
System.out.println("saleOrder...["+saleOrder+"]");
if (saleOrder != null && saleOrder.trim().length() > 0)
{
//sql = " select SCH_ATTR from SORDDET where sale_order = ?;";
/*sql = " select count(*) from SORDDET where sale_order = ? and sch_attr = 'Y'";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, saleOrder);
rs = pstmt.executeQuery();
if (rs.next())
{
cnt = rs.getInt(1);
}
//System.out.println("schAttr..["+schAttr+"]");
rs.close();
rs = null;
pstmt.close();
pstmt = null;
System.out.println("@@70..cnt is..["+cnt+"]");
if (cnt == 0)
{
errString = itmDBAccessLocal.getErrorString("", "VTNOSCHEME", "");
return errString;
}
*/
sql = " SELECT A.ITEM_CODE__ORD, A.QUANTITY, A.NATURE, A.SCH_ATTR, B.ORDER_TYPE, B.ORDER_DATE, A.SITE_CODE, B.STATE_CODE__DLV, B.COUNT_CODE__DLV, B.ORDER_TYPE, B.CUST_CODE, A.LINE_NO, A.RATE " +
"FROM SORDDET A, SORDER B " +
"WHERE A.SALE_ORDER = B.SALE_ORDER and A.SALE_ORDER = ? and A.SCH_ATTR = 'Y' and A.NATURE = 'C' AND (CASE WHEN A.SPEC_REASON IS NULL THEN ' ' ELSE TRIM(A.SPEC_REASON) END) != 'P'";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, saleOrder);
rs = pstmt.executeQuery();
while (rs.next())
{
itemCodeOrd = checkNull(rs.getString(1));
qty = rs.getDouble(2);
nature = checkNull(rs.getString(3));
schAttr1 = checkNull(rs.getString(4));
ordtype = checkNull(rs.getString(5));
ordDate = rs.getTimestamp(6);
siteCode = checkNull(rs.getString(7));
StateCodeDlv = checkNull(rs.getString(8));
CountCodeDlv = checkNull(rs.getString(9));
ordType = checkNull(rs.getString(10));
custCode = checkNull(rs.getString(11));
lineNo = checkNull(rs.getString(12));
rate = rs.getDouble(13);
System.out.println("itemCodeOrd["+itemCodeOrd+"]");
System.out.println("qty["+qty+"]");
System.out.println("nature["+nature+"]");
System.out.println("schAttr1["+schAttr1+"]");
System.out.println("ordtype["+ordtype+"]");
System.out.println("ordDate["+ordDate+"]");
System.out.println("siteCode["+siteCode+"]");
System.out.println("StateCodeDlv["+StateCodeDlv+"]");
System.out.println("CountCodeDlv["+CountCodeDlv+"]");
System.out.println("ordType["+ordType+"]");
System.out.println("lineNo["+lineNo+"]");
sql2 = "SELECT COUNT(*) FROM SORDDET WHERE LINE_NO = ? AND SALE_ORDER = ? AND NATURE = 'F'";
pstmt2 = conn.prepareStatement(sql2);
pstmt2.setString(1, lineNo);
pstmt2.setString(2, saleOrder);
rs2 = pstmt2.executeQuery();
if (rs2.next())
{
cnt = rs2.getInt(1);
}
rs2.close();
rs2 = null;
pstmt2.close();
pstmt2 = null;
System.out.println("128## cnt...["+cnt+"]");
if(cnt > 0)
{
continue;
}
sql2 = "select bom_code,item_stru from item where item_code = ?";
pstmt2 = conn.prepareStatement(sql2);
pstmt2.setString(1, itemCodeOrd);
rs2 = pstmt2.executeQuery();
if (rs2.next())
{
schemeCode = checkNull(rs2.getString("bom_code"));
lstype = checkNull(rs2.getString("item_stru"));
}
rs2.close();
rs2 = null;
pstmt2.close();
pstmt2 = null;
System.out.println("schemeCode[BOM]::["+schemeCode+"] lstype::["+lstype+"]");
if (!"C".equalsIgnoreCase(lstype))
{
sql3 = "select a.scheme_code from scheme_applicability a,scheme_applicability_det b"
+ " where a.scheme_code= b.scheme_code and (a.item_code= ? or (a.item_code in (select (case when product_code is null then ' ' else product_code end ) from item where item_code = ? )))"
+ " and a.app_from<= ? and a.valid_upto>= ?"
+ " and (b.site_code= ? or b.state_code= ? or b.count_code =? ) and a.PROD_SCH = 'Y' ";
pstmt3 = conn.prepareStatement(sql3);
pstmt3.setString(1, itemCodeOrd);
pstmt3.setString(2, itemCodeOrd);
pstmt3.setTimestamp(3, ordDate);
pstmt3.setTimestamp(4, ordDate);
pstmt3.setString(5, siteCode);
pstmt3.setString(6, StateCodeDlv);
pstmt3.setString(7, CountCodeDlv);
rs3 = pstmt3.executeQuery();
while (rs3.next())
{
curScheme = checkNull(rs3.getString("scheme_code"));
System.out.println("curScheme...["+curScheme+"]");
if (curScheme != null || curScheme.trim().length() == 0)
{
sql1 = "select item_code__parent from item where item_code =?";
pstmt1 = conn.prepareStatement(sql1);
pstmt1.setString(1, itemCodeOrd);
rs1 = pstmt1.executeQuery();
if (rs1.next())
{
itemCodeParent = checkNull(rs1.getString("item_code__parent"));
}
rs1.close();
rs1 = null;
pstmt1.close();
pstmt1 = null;
System.out.println("itemCodeParent::["+itemCodeParent+"]");
if (itemCodeParent == null || itemCodeParent.trim().length() == 0)
{
sql1 = "select count(1) as cnt from item where item_code__parent =?";
pstmt1 = conn.prepareStatement(sql1);
pstmt1.setString(1, itemCodeOrd);
rs1 = pstmt1.executeQuery();
if (rs1.next())
{
cnt1 = rs1.getInt("cnt");
}
rs1.close();
rs1 = null;
pstmt1.close();
pstmt1 = null;
}
System.out.println("cnt1 is..["+cnt1+"]");
if (cnt1 > 0)
{
break;
}
}
sql1 = "Select count(1) as cnt From scheme_applicability A, bom b Where A.scheme_code = b.bom_code And B.bom_code= ?" + " And(? between case when b.min_qty is null then 0 else b.min_qty end" + " And case when b.max_qty is null then 0 else b.max_qty end) and B.promo_term is null";
pstmt1 = conn.prepareStatement(sql1);
pstmt1.setString(1, curScheme);
pstmt1.setDouble(2, qty);
rs1 = pstmt1.executeQuery();
if (rs1.next())
{
cnt1 = rs1.getInt("cnt");
}
rs1.close();
rs1 = null;
pstmt1.close();
pstmt1 = null;
System.out.println("cnt1 from scheme_applicability..["+cnt1+"]");
if(cnt1 == 0)
continue;
sql1 = "select (case when apply_cust_list is null then ' ' else apply_cust_list end) as ls_apply_cust_list, "
+ " (case when noapply_cust_list is null then ' ' else noapply_cust_list end) as ls_noapply_cust_list, order_type "
+ " from scheme_applicability where scheme_code = ? ";
pstmt1 = conn.prepareStatement(sql1);
pstmt1.setString(1, curScheme);
rs1 = pstmt1.executeQuery();
if (rs1.next())
{
applyCustList = checkNull(rs1.getString("ls_apply_cust_list"));
noApplyCustList = checkNull(rs1.getString("ls_noapply_cust_list"));
applicableOrdTypes = checkNull(rs1.getString("order_type"));
}
rs1.close();
rs1 = null;
pstmt1.close();
pstmt1 = null;
System.out.println("applyCustList["+applyCustList+"]noApplyCustList["+noApplyCustList+"][applicableOrdTypes["+applicableOrdTypes+"]");
System.out.println("ordType..["+ordType+"]");
if ("NE".equalsIgnoreCase(ordType) && (applicableOrdTypes == null || applicableOrdTypes.trim().length() == 0))
{
// goto Nextrec
} else if (applicableOrdTypes != null && applicableOrdTypes.trim().length() > 0)
{ System.out.println("PAVAN R Inside If *****applicableOrdTypes***");
proceed = false;
String applicableOrdTypesArr[] = applicableOrdTypes.split(",");
System.out.println("applicableOrdTypesArr Length::["+applicableOrdTypesArr.length+"]");
ArrayList<String> appliOrdTyplist= new ArrayList<String>(Arrays.asList(applicableOrdTypesArr));
if(appliOrdTyplist.contains(ordType))
{
System.out.println("lbProceed"+proceed);
proceed = true;
//break;
}
if (!proceed)
{
System.out.println("Inside lbproceed");
continue;
// goto Nextrec
}
}
prevScheme = schemeCode;
schemeCode = curScheme;
System.out.println("250@@@ schemeCode["+schemeCode+"]curScheme["+curScheme+"]");
if (applyCustList.trim().length() > 0)
{
schemeCode = null;
System.out.println("schemeCode:::::::1"+schemeCode);
//lsCustCode = checkNull(genericUtility.getColumnValue("cust_code", dom1));
System.out.println("custCode"+custCode);
String noapplyCustListArr[] = applyCustList.split(",");
ArrayList<String> applyCustList1 = new ArrayList<String>(Arrays.asList(noapplyCustListArr));
if(applyCustList1.contains(custCode.trim()))
{
System.out.println("Inside applycustList1.........");
schemeCode = curScheme;
custSchemeCode = curScheme;
System.out.println("schemeCode::"+schemeCode+" custSchemeCode::"+curScheme);
// break;
}
System.out.println("applyCustList1...["+applyCustList1+"]");
}
if (noApplyCustList.trim().length() > 0 && schemeCode != null)
{
//custCode12 = checkNull(genericUtility.getColumnValue("cust_code", dom));
String noApplyCustListArr[] = noApplyCustList.split(",");
ArrayList<String> noapplyCustList= new ArrayList<String>(Arrays.asList(noApplyCustListArr));
if(noapplyCustList.contains(custCode))//cusstCode12 from dom
{
schemeCode = "";
break;
}
}
cnt1 = 0;
if (schemeCode != null)
{
cnt2++;
} else if (cnt2 == 1)
{
schemeCode = prevScheme;
System.out.println("lsSchemeCode:::::::2"+schemeCode);
}
}
rs3.close();
rs3 = null;
pstmt3.close();
pstmt3 = null;
System.out.println("outside while..schemeCode..["+schemeCode+"]");
/*if (cnt2 > 1)
{
schemeCode = "";
} else*/
if (custSchemeCode.trim().length() > 0)
{
System.out.println("lsSchemeCode:::::::3"+schemeCode);
schemeCode = custSchemeCode;
}
String schemeType = "";
int PurcBase = 0, SchAllowence = 0;
double freeQty = 0.0;
//To Get Offer aginst scheme
sql3 = "SELECT DESCR, SCHEME_TYPE, PURC_BASE, SCH_ALLOWENCE FROM SCH_GROUP_DEF where SCHEME_CODE= ?";
pstmt3 = conn.prepareStatement(sql3);
pstmt3.setString(1, schemeCode);
rs3 = pstmt3.executeQuery();
if (rs3.next())
{
schmDesc = checkNull(rs3.getString(1));
schemeType = checkNull(rs3.getString(2));
PurcBase = rs3.getInt(3);
SchAllowence = rs3.getInt(4);
}
rs3.close();
rs3 = null;
pstmt3.close();
pstmt3 = null;
System.out.println("schmDesc"+schmDesc+"]");
sql3 ="select count (*) as cnt from sch_pur_items where SCHEME_CODE =? and item_code=?";
pstmt3 = conn.prepareStatement(sql3);
pstmt3.setString(1, schemeCode);
pstmt3.setString(2, itemCodeOrd);
rs3 = pstmt3.executeQuery();
if (rs3.next())
{
cnt2 = rs3.getInt(1);
}
rs3.close();
rs3 = null;
pstmt3.close();
pstmt3 = null;
if (cnt2 == 0)
{
schemeCode = "";
continue;
}
//To Check offer againts Scheme code...
//sql3 = "SELECT count(1) FROM SCH_OFFER_ITEMS where SCHEME_CODE= ?";
sql3 = "SELECT count(*) FROM SORDDET WHERE ITEM_CODE IN " +
"(SELECT ITEM_CODE FROM SCH_OFFER_ITEMS WHERE SCHEME_CODE=?) AND SCH_ATTR = 'Y' AND RATE != 0 AND SALE_ORDER = ? ";
pstmt3 = conn.prepareStatement(sql3);
pstmt3.setString(1, schemeCode);
pstmt3.setString(2, saleOrder);
rs3 = pstmt3.executeQuery();
if (rs3.next())
{
count = rs3.getInt(1);
}
rs3.close();
rs3 = null;
pstmt3.close();
pstmt3 = null;
System.out.println("count...["+count+"]");
if (count == 0)
{
mainStr="Line No:"+lineNo+" Item Code:"+itemCodeOrd+" Scheme:"+schemeCode; //+" Description:"+schmDesc;
msgNotAppString = msgNotAppString.append(mainStr);
System.out.println("--msgNotAppString--"+msgNotAppString);
}else
{
sql3 = "SELECT LINE_NO, QUANTITY, NATURE, ITEM_CODE FROM SORDDET WHERE ITEM_CODE IN " +
"(SELECT ITEM_CODE FROM SCH_OFFER_ITEMS WHERE SCHEME_CODE = ?) AND SALE_ORDER = ? AND SCH_ATTR = 'Y'AND RATE != 0 ";
pstmt3 = conn.prepareStatement(sql3);
pstmt3.setString(1, schemeCode);
pstmt3.setString(2, saleOrder);
rs3 = pstmt3.executeQuery();
if("0".equalsIgnoreCase(schemeType))
{
freeQty = ((qty * SchAllowence) / PurcBase);
}
else if("1".equalsIgnoreCase(schemeType))
{
chargeAmt = (qty * rate);
if(chargeAmt >= PurcBase)
{
freeQty = roundValue(((((qty * rate)* SchAllowence) / PurcBase)), 0);
}
}else if("2".equalsIgnoreCase(schemeType))
{
chargeAmt = (qty * rate);
if(chargeAmt >= PurcBase)
{
freeDiscount = SchAllowence;
}
}
while (rs3.next())
{
lineNo1 = checkNull(rs3.getString(1));
qty1 = rs3.getDouble(2);
nature1 = checkNull(rs3.getString(3));
itemCode1 = checkNull(rs3.getString(4));
if("2".equalsIgnoreCase(schemeType))
{
sql4 = "UPDATE SORDDET SET DISCOUNT = ? WHERE SALE_ORDER = ? AND LINE_NO = ?";
pstmt4 = conn.prepareStatement(sql4);
pstmt4.setDouble(1, freeDiscount);
pstmt4.setString(2, saleOrder);
pstmt4.setString(2, lineNo1);
no = pstmt4.executeUpdate();
System.out.println("419...no...1..["+no+"]");
pstmt4.close();
pstmt4 = null;
if(no > 0)
{
sql5 = "UPDATE SORDDET SET SPEC_REASON='P' WHERE SALE_ORDER = ? AND LINE_NO = ?";
pstmt5 = conn.prepareStatement(sql5);
pstmt5.setString(1, saleOrder);
pstmt5.setString(2, lineNo);
int nos2 = pstmt5.executeUpdate();
System.out.println("452...nos2...["+nos2+"]");
pstmt5.close();
pstmt5 = null;
System.out.println("totalQty::["+totalQty+"]");
//Scheme applied msg
mainStr="\nLine No"+lineNo+" Item Code:"+itemCodeOrd+" Scheme:"+schemeCode; //+" Description:"+schmDesc;
msgAppStrinrg = msgAppStrinrg.append(mainStr);
System.out.println("--msgString--"+msgAppStrinrg);
}
}
if(qty1 <= freeQty && totalQty <= freeQty)
{
sql4 = "UPDATE SORDDET SET NATURE = 'F', RATE = 0, RATE__STDUOM = 0 WHERE SALE_ORDER = ? AND LINE_NO = ?";
pstmt4 = conn.prepareStatement(sql4);
pstmt4.setString(1, saleOrder);
pstmt4.setString(2, lineNo1);
no = pstmt4.executeUpdate();
System.out.println("471...no...["+no+"]");
pstmt4.close();
pstmt4 = null;
if(no > 0)
{
sql5 = "UPDATE SORDDET SET SPEC_REASON='P' WHERE SALE_ORDER = ? AND LINE_NO = ?";
pstmt5 = conn.prepareStatement(sql5);
pstmt5.setString(1, saleOrder);
pstmt5.setString(2, lineNo);
int nos2 = pstmt5.executeUpdate();
System.out.println("430...nos2...["+nos2+"]");
pstmt5.close();
pstmt5 = null;
System.out.println("totalQty::["+totalQty+"]");
//Scheme applied msg
mainStr="Line No:"+lineNo+" Item Code:"+itemCodeOrd+" Scheme:"+schemeCode; //+"// Description:"+schmDesc;
msgAppStrinrg = msgAppStrinrg.append(mainStr);
System.out.println("**msgString**"+msgAppStrinrg);
}
}
totalQty = totalQty + qty1;
if(totalQty == freeQty)
{
break;
}
System.out.println("totalQty::["+totalQty+"]");
/*//Scheme applied msg
String mainStr="Line No:"+lineNo+" Item Code:"+itemCodeOrd+" Scheme:"+schemeCode+" Description:"+schmDesc;
msgString = msgString.append(mainStr);
System.out.println("--msgString--"+msgString);
*/
if(totalQty == freeQty)
{
continue;
}
}
rs3.close();
rs3 = null;
pstmt3.close();
pstmt3 = null;
//errString = msgString+"\n~~~Scheme Item But Offer Not Selected.~~~\n"+msgString;
}
}
/*
if(!("Y".equalsIgnoreCase(schAttr)))
{
errString = itmDBAccessLocal.getErrorString("", "VTMCONF20", "");
return errString;
}else if(!"P".equalsIgnoreCase(""))
{
errString = itmDBAccessLocal.getErrorString("", "VTSOSTAT", "Sales order is not in pending status");
return errString;
} */
}
rs.close();
rs = null;
pstmt.close();
pstmt = null;
//errString = msgString+"\n~~~Scheme Item But Offer Not Selected.~~~\n"+msgString;
//mainStr="Scheme Not Applied On Following item:\nLine No:"+lineNo+" Item Code:"+itemCodeOrd+" Scheme:"+schemeCode+" Description:"+schmDesc;
errString = itmDBAccessLocal.getErrorString("", "VTNOOFSCH", "");
String begPart = errString.substring( 0, errString.indexOf("<trace>") + 7 );
String endPart = errString.substring( errString.indexOf("</trace>"));
//mainStr="Line NO: "+lineNo+"\n Item Code: "+itemCodeOrd+"\n Scheme: "+schemeCode+"\n Description: "+schmDesc;
//mainStr=begPart+msgString;
if(msgNotAppString != null && msgNotAppString.length() > 0)
{
msgNotApplied="Following Scheme Item, Free Item Not define :";
}
else
{
msgNotApplied = " ";
}
if(msgAppStrinrg != null && msgAppStrinrg.length() > 0)
{
msgApplied="Scheme Applied On Following item:";
}else
{
msgApplied = " ";
}
System.out.println("C"+msgNotAppString+"]");
System.out.println("msgAppStrinrg-----["+msgAppStrinrg+"]");
String mainString = begPart+"\n"+msgNotApplied+"\n"+checkNull(msgNotAppString.toString())+"\n"+msgApplied+"\n"+checkNull(msgAppStrinrg.toString());
if(mainString.trim().length()==0)
{
mainStr = begPart;
}
mainString = mainString + endPart;
System.out.println("mainString...["+mainString+"]");
errString = mainString;
System.out.println("----------["+errString+"]");
return errString;
}//end if saleOrder != null
} catch (Exception e)
{
if(conn!=null)
{
try {
conn.rollback();
} catch (SQLException ex) {
e.printStackTrace();
throw new ITMException(e);
}
}
e.printStackTrace();
throw new ITMException(e);
}
finally
{
try
{
conn.commit();
System.out.println("-- commited--");
if(conn != null)
{
conn.close();
conn = null;
}
if(rs != null)
{
rs.close();
rs = null;
}
if(pstmt != null)
{
pstmt.close();
pstmt = null;
}
}
catch(Exception e)
{
System.out.println("Exception : "+e);e.printStackTrace();
throw new ITMException(e);
}
}
return errString;
}
private String checkNull(String str)
{
if(str == null)
{
return "";
}
else
{
return str ;
}
}
private double roundValue(double round, int scale)
{
return Math.round(round * Math.pow(10, scale)) / Math.pow(10, scale);
}
}
package ibase.webitm.ejb.dis;
import java.rmi.RemoteException;
import ibase.webitm.ejb.ActionHandlerLocal;
import ibase.webitm.utility.ITMException;
import javax.ejb.Local;
@Local
public interface SorderGroupSchemeActLocal extends ActionHandlerLocal
{
public String actionHandler(String tranId, String xtraParams, String forcedFlag) throws RemoteException,ITMException;
}
package ibase.webitm.ejb.dis;
import java.rmi.RemoteException;
import ibase.webitm.ejb.ActionHandlerRemote;
import ibase.webitm.utility.ITMException;
import javax.ejb.Remote;
@Remote
public interface SorderGroupSchemeActRemote extends ActionHandlerRemote
{
public String actionHandler(String tranId, String xtraParams, String forcedFlag) throws RemoteException,ITMException;
}
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