Commit 65da8abd authored by dpawar's avatar dpawar

added new functionality for pending qty


git-svn-id: http://15.206.35.175/svn/proteus/business-java/trunk@95232 ce508802-f39f-4f6c-b175-0d175dae99d5
parent 22ba514d
//OLD
package ibase.webitm.ejb.dis;
import ibase.system.config.ConnDriver;
......@@ -35,6 +36,7 @@ import org.w3c.dom.NodeList;
//import com.sun.jmx.snmp.Timestamp;
@Stateless
public class PODProcess extends ProcessEJB implements PODProcessLocal,PODProcessRemote
{
String siteCodeG="",invTypeG="",xtraParamsG="",schemeCodeG="",multipleScheme="";
......@@ -228,90 +230,43 @@ public String process(Document dom, Document dom2, String windowName, String xtr
pstmt.close();
pstmt=null;
System.out.println("Size of arrayList inv45dayList----->>["+inv45dayList.size()+"]");
if(inv45dayList.size() > 0){
//if(inv45dayList.size() > 0){
System.out.println("Data found for process---------------");
/*podProcessInvIDList=getDoneInvoiceIdHDR( conn, inv45dayList);
if(podProcessInvIDList.contains("Error")){
//handle error if array list contain error.
errCode="VTPRCNCP";
errorString =itmdbAccess.getErrorString("", errCode, "", "", conn);
return errorString;
}
System.out.println("podProcessInvIDList---->>["+podProcessInvIDList+"]");
System.out.println("Size of podProcessInvIDList---->>["+podProcessInvIDList.size()+"]");
podNotConfList=getNotConfirmedInvIdFromHdr(conn);
if(podNotConfList.contains("Error")){
errCode="VTPRCNCP";
errorString =itmdbAccess.getErrorString("", errCode, "", "", conn);
return errorString;
}
System.out.println("podNotConfList---->>["+podNotConfList+"]");
System.out.println("Size of podNotConfList---->>["+podNotConfList.size()+"]");
//check in podNotConfList if invoice id in podProcessInvIDList present or not.
//if present then remove from podProcessInvIDList.
if(podNotConfList.size() > 0 && podProcessInvIDList.size() > 0)
{
Iterator<String> it = podProcessInvIDList.iterator();
while (it.hasNext()) {
String id=it.next();
if(podNotConfList.contains(id))
{
System.out.println("id removed------>>["+id+"]");
it.remove();
podProcessInvIDList.remove(id);
}
}
}
*/
// inv45dayList.clear();
// inv45dayList.add("618ID00047");
// inv45dayList.add("618ID00032");
System.out.println("inv45dayList-->>["+inv45dayList+"]");
PodHdrInvList=getDoneInvoiceIDFromPODHdr(conn,inv45dayList);
System.out.println("POD header123---->>["+PodHdrInvList+"]");
if(PodHdrInvList.contains("Error")){
miscDrCrInvList=getDoneInvoiceIDFromMiscDrCrRcp(conn, inv45dayList);
System.out.println("miscDrCrInvList11121---->>["+miscDrCrInvList+"]");
if(miscDrCrInvList.contains("Error")){
errCode="VTPRCNCP";
errorString = itmdbAccess.getErrorString("", errCode, "", "", conn);
return errorString;
}
/*Iterator<String> it1 = podProcessInvIDList.iterator();
if(miscDrCrInvList.size() > 0){
while (it1.hasNext()) {
String podPrcId=it1.next();
if(miscDrCrInvList.contains(podPrcId) && !(podObject.isPartialyInvoiceChk(conn, podPrcId, "PRC"))){
System.out.println("---in misc arrayList------"+podPrcId);
it1.remove();
podProcessInvIDList.remove(podPrcId);
}
//PodHdrInvList=getDoneInvoiceIDFromPODHdr(conn,miscDrCrInvList);
//System.out.println("POD header123---->>["+PodHdrInvList+"]");
PodHdrInvList.addAll(miscDrCrInvList);
}
}*/
if(PodHdrInvList.size() > 0){
miscDrCrInvList=getDoneInvoiceIDFromMiscDrCrRcp(conn, PodHdrInvList);
System.out.println("miscDrCrInvList---->>["+miscDrCrInvList+"]");
}else{
errCode="VTDNFIN"; //Data not found
errorString = itmdbAccess.getErrorString("", errCode, "", "", conn);
return errorString;
}
if(miscDrCrInvList.contains("Error")){
errCode="VTPRCNCP";
errorString = itmdbAccess.getErrorString("", errCode, "", "", conn);
return errorString;
podProcessInvIDList.addAll(PodHdrInvList);
}
//podProcessInvIDList.clear();
System.out.println("miscDrCrInvList size-->>["+miscDrCrInvList.size()+"]");
if(miscDrCrInvList.size() > 0){
podProcessInvIDList.addAll(miscDrCrInvList);
}else{
System.out.println("Final partialInvoiceMapG---->>["+partialInvoiceMapG+"]");
System.out.println("final podProcessInvIDList---->>["+podProcessInvIDList+"]");
if(podProcessInvIDList.size()<=0 && partialInvoiceMapG.size() <= 0){
errCode="VTDNFIN"; //Data not found
errorString = itmdbAccess.getErrorString("", errCode, "", "", conn);
return errorString;
}
//podProcessInvIDList.clear();
//podProcessInvIDList.add("618ID00047");
System.out.println("Final invoice Id ready for debit note12---->>["+podProcessInvIDList+"]");
......@@ -333,13 +288,15 @@ public String process(Document dom, Document dom2, String windowName, String xtr
errorString = itmdbAccess.getErrorString("", errCode, "", "", conn);
return errorString;
}
}
/* }
else{
errCode="VTDNFIN"; //Data not found
errorString = itmdbAccess.getErrorString("", errCode, "", "", conn);
return errorString;
}// inv45dayList.size end
*/
}
}//end try
catch(Exception e)
......@@ -400,6 +357,8 @@ private String generateDebitNote(Connection conn,ArrayList<String> podProcessInv
System.out.println("priceListL123------>>["+priceListL+"]");
totalInvoice=podProcessInvIDListL.size();
System.out.println("total invoice for process------>>["+totalInvoice+"]");
System.out.println("total partialInvoiceMapG for process------>>["+partialInvoiceMapG.size()+"]");
if(totalInvoice > 0 || partialInvoiceMapG.size() > 0){
if(totalInvoice > 0){
for(String invoiceId :podProcessInvIDListL)
{
......@@ -624,6 +583,7 @@ private String generateDebitNote(Connection conn,ArrayList<String> podProcessInv
}
} //end invoice id for loop
}
}else{
errCode="VTDNFFP"; //No data found for processing
......@@ -633,7 +593,7 @@ private String generateDebitNote(Connection conn,ArrayList<String> podProcessInv
}
System.out.println("errString before partial method--->>["+errString+"]");
System.out.println("partialInvoiceMapG before partial mrthod--->>["+partialInvoiceMapG+"]");
if(errString.length() > 0 && partialInvoiceMapG.size() > 0){
if(partialInvoiceMapG.size() > 0){
errString =actualQtyPODProcessPartial(conn); //partialInvoiceMapV
System.out.println("Returing STring from actualQtyPODProcessPartial-->>["+errString+"]");
if((errString != null ) && errString.indexOf("CONFSUCCES") > -1){
......@@ -1253,7 +1213,8 @@ private ArrayList<String> getDoneInvoiceIDFromPODHdr(Connection conn,ArrayList<S
System.out.println("------in getDoneInvoiceIDFromPODHdr------");
PreparedStatement pstmt=null,pstmt1=null;
ResultSet rs=null,rs1=null;
String sql="",remarks="",subInvId="",TranId="",sql1="",itemCode="",itemCodeM="",confirmed="";
String sql="",remarks="",subInvId="",TranId="",sql1="",itemCode="",itemCodeM="",confirmed="",
lotNo="",lotSl="",lotNoM="",lotSlM="",lineNoTraceI="";
int lineNoTrace=0,lineNoTraceM=0,deleteId=0;
double sumQuantityMisc=0,sumQuantityInv=0,qty=0,qtyM=0;
HashSet<String> unqInvID=new HashSet <String>();
......@@ -1271,7 +1232,8 @@ private ArrayList<String> getDoneInvoiceIDFromPODHdr(Connection conn,ArrayList<S
confirmed=confirmed==null ? "N" :confirmed.trim();
System.out.println("confirmed-->["+confirmed+"] invID-->["+id+"]");
if("Y".equalsIgnoreCase(confirmed)){
sql="select sum(quantity),item_code from invoice_trace where invoice_id = ? group by item_code,invoice_id";
sql="select sum(quantity),item_code,lot_no,lot_sl,inv_line_no from invoice_trace where invoice_id = ? "
+ "group by item_code,lot_no, lot_sl,inv_line_no";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, id);
rs=pstmt.executeQuery();
......@@ -1279,13 +1241,20 @@ private ArrayList<String> getDoneInvoiceIDFromPODHdr(Connection conn,ArrayList<S
//lineNoTrace=rs.getInt(1);
qty=rs.getDouble(1);
itemCode=rs.getString(2);
lotNo=rs.getString(3);
lotSl=rs.getString(4);
lineNoTraceI=rs.getString(5);
itemCode=itemCode==null ? "" :itemCode.trim();
lotNo=lotNo==null ? "" :lotNo.trim();
lotSl=lotSl==null ? "" :lotSl.trim();
/* sql1="seleline_no__invtracect d.,d.item_code,d.quantity,h.remarks from "
+ "misc_drcr_rcp h,misc_drcr_rdet d where h.tran_id=d.tran_id and h.remarks "
+ "like ? order by line_no__invtrace";*/
sql1="select sum(nvl(d.quantity__resale,0)),d.item_code from spl_sales_por_hdr h,spl_sales_por_det d "
+ "where h.tran_id = d.tran_id and h.invoice_id = ? group by d.item_code";
sql1="select sum(nvl(d.quantity__resale,0)),d.item_code,d.lot_no,d.lot_sl,d.line_no__trace "
+ "from spl_sales_por_hdr h,spl_sales_por_det d "
+ "where h.tran_id = d.tran_id and h.invoice_id = ? "
+ "group by d.item_code,d.lot_no,d.lot_sl,d.line_no__trace";
pstmt1=conn.prepareStatement(sql1);
pstmt1.setString(1, id);
rs1=pstmt1.executeQuery();
......@@ -1293,15 +1262,21 @@ private ArrayList<String> getDoneInvoiceIDFromPODHdr(Connection conn,ArrayList<S
//lineNoTraceM=rs1.getInt(1);
qtyM=rs1.getDouble(1);
itemCodeM=rs1.getString(2);
lotNoM=rs1.getString(3);
lotSlM=rs1.getString(4);
itemCodeM=itemCodeM==null ? "" :itemCodeM.trim();
lotNoM=lotNoM==null ? "" :lotNoM.trim();
lotSlM=lotSlM==null ? "" :lotSlM.trim();
System.out.println("itemCode-->>["+itemCode+"] itemCodeM-->["+itemCodeM+"]");
System.out.println("qtyM-->>["+qtyM+"] qty-->["+qty+"]");
if(qtyM < qty && itemCode.equalsIgnoreCase(itemCodeM)){
System.out.println("lotNo-->>["+lotNo+"] lotNoM-->["+lotNoM+"]");
System.out.println("lotSl-->>["+lotSl+"] lotSlM-->["+lotSlM+"]");
System.out.println("qty-->>["+qty+"] qtyM-->["+qtyM+"]");
if(qtyM < qty && itemCode.equalsIgnoreCase(itemCodeM) && lotNoM.equalsIgnoreCase(lotNo) && lotSlM.equalsIgnoreCase(lotSl)){
InvIDTemp.add(id);
partialInvoiceMapG.put(id+":"+itemCode.trim(), qty- qtyM);
partialInvoiceMapG.put(id+":"+itemCode+":"+lotNoM+":"+lotSlM, qty- qtyM);
System.out.println("partial map11111----->>["+partialInvoiceMapG+"]");
}else{
System.out.println("deleted ID--------->>["+deleteId+"]");
if(deleteId==1){
......@@ -1360,115 +1335,116 @@ private ArrayList<String> getDoneInvoiceIDFromPODHdr(Connection conn,ArrayList<S
}
private ArrayList<String> getDoneInvoiceIDFromMiscDrCrRcp(Connection conn,ArrayList<String>inv45dayListL)
{
System.out.println("------in getDoneInvoiceIDFromMiscDrCrRcp1234------");
PreparedStatement pstmt=null,pstmt1=null;
System.out.println("------in getDoneInvoiceIDFromMiscDrCrRcp12345678------");
ResultSet rs=null,rs1=null;
String sql="",remarks="",subInvId="",TranId="",sql1="",itemCode="",itemCodeM="",confirmed="";
int lineNoTrace=0,lineNoTraceM=0;
double sumQuantityMisc=0,sumQuantityInv=0,qty=0,qtyM=0;
HashSet<String> unqInvID=new HashSet <String>();
ArrayList<String> tranIDList=new ArrayList <String>();
ArrayList<String> InvIDList=new ArrayList <String>();
ArrayList<String> InvIDTemp=new ArrayList <String>();
ProofOfDelivery podL=ProofOfDelivery.getInstance();
boolean isDuplicate=false,isDuplicate1=false;
PreparedStatement pstmt=null,pstmt1=null;
String sql="",sql1="",itemCodeT="",lotNoT="",lotSlT="",lineNoT="",itemCodeM="",lotNoM="",lotSlM="",lineNoM="";
String invoiceId="";
double quantityT=0,quantityM=0;
int listSize=0,count =0,noOfRecordMatched=0,noOfRecords=0;
HashSet<String> partialInvID=new HashSet <String>();
try{
Iterator<String> it=inv45dayListL.iterator();
while(it.hasNext())
{
String id=it.next();
/*confirmed=podL.getColumnDescr(conn,"confirmed","spl_sales_por_hdr","invoice_id",id);
confirmed=confirmed==null ? "N" :confirmed.trim();
System.out.println("confirmed-->["+confirmed+" invID-->["+id+"]");*/
sql="select sum(quantity),item_code from invoice_trace where invoice_id = ? group by item_code,invoice_id";
for(int i=0;i< inv45dayListL.size();i++){
invoiceId=inv45dayListL.get(i);
System.out.println("invoiceId in for---->>["+invoiceId+"]");
sql="select sum(quantity),item_code,lot_no,lot_sl,inv_line_no from invoice_trace where invoice_id = ? "
+ "group by item_code,lot_no,lot_sl,inv_line_no";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(1, invoiceId);
rs=pstmt.executeQuery();
while(rs.next()){
//lineNoTrace=rs.getInt(1);
isDuplicate=false;
qty=rs.getDouble(1);
itemCode=rs.getString(2);
count++;
quantityT=rs.getDouble(1);
itemCodeT=rs.getString(2) == null ? "" : rs.getString(2).trim();
lotNoT=rs.getString(3) == null ? "" : rs.getString(3).trim();
lotSlT=rs.getString(4) == null ? "" : rs.getString(4).trim();
lineNoT=rs.getString(5) == null ? "" : rs.getString(5).trim();
sql1="select sum(d.quantity) as Quantity,d.item_code,d.lot_no,d.lot_sl,d.line_no__invtrace from misc_drcr_rcp h,misc_drcr_rdet d "
+ "where h.tran_id = d.tran_id and h.remarks like ? and quantity is not null "
+ "group by d.item_code,d.lot_no,d.lot_sl,d.line_no__invtrace";
sql1="select sum(nvl(d.quantity,0)) as Quantity,d.item_code"
+" from misc_drcr_rcp h,misc_drcr_rdet d where h.tran_id=d.tran_id and h.remarks"
+" like ? and Quantity <> 0 group by d.item_code";
/*sql1="select sum(nvl(d.quantity__resale,0)),d.item_code from spl_sales_por_hdr h,spl_sales_por_det d "
+ "where h.tran_id = d.tran_id and h.invoice_id = ? group by d.item_code";*/
pstmt1=conn.prepareStatement(sql1);
pstmt1.setString(1, "%POD%"+id);
pstmt1.setString(1, "%POD%"+invoiceId.trim());
rs1=pstmt1.executeQuery();
while(rs1.next()){
//lineNoTraceM=rs1.getInt(1);
qtyM=rs1.getDouble(1);
itemCodeM=rs1.getString(2);
quantityM=rs1.getDouble(1);
itemCodeM=rs1.getString(2) == null ? "" : rs1.getString(2).trim();
lotNoM=rs1.getString(3) == null ? "" : rs1.getString(3).trim();
lotSlM=rs1.getString(4) == null ? "" : rs1.getString(4).trim();
lineNoM=rs1.getString(5) == null ? "" : rs1.getString(5).trim();
System.out.println("count1--------------->>["+count+"]");
System.out.println("quantityT--->>["+quantityT+"] quantityM-->["+quantityM+"]");
System.out.println("itemCodeT--->>["+itemCodeT+"] itemCodeM-->["+itemCodeM+"]");
System.out.println("lotNoT--->>["+lotNoT+"] lotNoM-->["+lotNoM+"]");
System.out.println("lotSlT--->>["+lotSlT+"] lotSlM-->["+lotSlM+"]");
System.out.println("lineNoT--->>["+lineNoT+"] lineNoM-->["+lineNoM+"]");
System.out.println("itemCodeM-->>["+itemCodeM+" itemCodeM-->["+itemCodeM+"]");
System.out.println("qtyMisc-->>["+qtyM+" qtyInvoice-->["+qty+"]");
if(qtyM < qty && itemCode.equalsIgnoreCase(itemCodeM)){
InvIDTemp.add(id);
partialInvoiceMapG.put(id+":"+itemCode.trim(), qty- qtyM);
}else{
it.remove();
inv45dayListL.remove(id);
isDuplicate=true;
break;
if(itemCodeT.equalsIgnoreCase(itemCodeM) && lotNoT.equalsIgnoreCase(lotNoM)){
if(lotSlT.equalsIgnoreCase(lotSlM) && lineNoT.equalsIgnoreCase(lineNoM)){
if(quantityM < quantityT )
{
System.out.println("record matched........at count "+count);
partialInvID.add(invoiceId);
partialInvoiceMapG.put(invoiceId+":"+itemCodeT+":"+lotNoT+":"+lotSlT, quantityT - quantityM);
noOfRecordMatched++;
}
if(quantityM == quantityT )
{
System.out.println("Quantity matched for inv id....."+invoiceId);
partialInvID.add(invoiceId);
}
}
if(isDuplicate){
System.out.println("isDuplicate continue......isDuplicate true");
isDuplicate1=true;
break;
}
if(rs1!=null){
} //end while misc
if(rs1 != null){
rs1.close();
rs1=null;
}
}
System.out.println("InvTemp --->>["+InvIDTemp+"]");
if(isDuplicate1){
System.out.println("isDuplicate1 continue......isDuplicate true");
continue;
if(pstmt1 != null){
pstmt1.close();
pstmt1=null;
}
}
System.out.println("unqInvID addAll--->>["+unqInvID+"]");
System.out.println("InvIDTemp --->>["+InvIDTemp+"]");
if(InvIDTemp.size() > 0){
unqInvID.addAll(InvIDTemp);
InvIDList.clear();
InvIDList.addAll(unqInvID);
System.out.println("InvIDList addAll--->>["+InvIDList+"]");
//partialInvoice.addAll(InvIDList);
}
System.out.println("partialInvoiceMapG --->>["+partialInvoiceMapG+"]");
if(inv45dayListL.size() > 0){
Iterator <String>it1=InvIDList.iterator();
while (it1.hasNext()) {
String podPrcId=it1.next();
if(inv45dayListL.contains(podPrcId))
System.out.println("---in misc arrayList------"+podPrcId);
it1.remove();
inv45dayListL.remove(podPrcId);
} //end while trace
}//end for loop
if(rs != null){
rs.close();
rs=null;
}
if(pstmt != null){
pstmt.close();
pstmt=null;
}
System.out.println("outside for partialInvoiceMapG-->>["+partialInvoiceMapG+"]");
System.out.println("outside for partialInvID-->>["+partialInvID+"]");
if(inv45dayListL.size() > 0){
Iterator<String>itr=inv45dayListL.iterator();
while(itr.hasNext()){
String id=itr.next();
if(partialInvID.contains(id)){
System.out.println("Invoice id removed--->["+id+"]");
itr.remove();
inv45dayListL.remove(id);
continue;
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
catch(Exception e){
System.out.println("Exception : "+e.getMessage());
inv45dayListL.clear();
inv45dayListL.add("Error");
e.printStackTrace();
}
System.out.println("inv45dayListL addAll--->>["+inv45dayListL+"]");
return inv45dayListL;
}
private String newErrorMessage(String errString,String invid)
......@@ -1549,6 +1525,8 @@ public String actualQtyPODProcessPartial(Connection conn) //partialInvoiceMap
Map<String,String>partialMap=new HashMap();
Set<String>partialID=new HashSet();
ArrayList<String>partialItem=new ArrayList();
ArrayList<String>partialLotNo=new ArrayList();
ArrayList<String>partialLotSl=new ArrayList();
Map<String,String> invoiceDetailsMap=null;
HashMap<String,String> podTraceMap=new HashMap();
HashMap<String,String> schemeMap=new HashMap();
......@@ -1562,7 +1540,7 @@ public String actualQtyPODProcessPartial(Connection conn) //partialInvoiceMap
ProofOfDelivery pod=ProofOfDelivery.getInstance();
ProofOfDelivery podObject=ProofOfDelivery.getInstance();
ProofOfDeliveryConf podC=ProofOfDeliveryConf.getInstance();
int count=0,cnt1=1,cnt2=0,itemCnt=0;
int count=0,cnt1=0,cnt2=0,itemCnt=0;
Connection conn1=null;
ConnDriver connDriver1 = new ConnDriver();
try{
......@@ -1574,20 +1552,28 @@ public String actualQtyPODProcessPartial(Connection conn) //partialInvoiceMap
for (String id :partialInvoiceMapG.keySet())
{
String [] invID =id.split(":");
partialID.add(invID[cnt2]);
partialID.add(invID[cnt1]);
cnt1++;
partialItem.add(invID[cnt1]);
cnt1++;
partialLotNo.add(invID[cnt1]);
cnt1++;
partialLotSl.add(invID[cnt1]);
cnt1=0;
}
}
System.out.println("partialID set--->>["+partialID+"]");
System.out.println("partialItem--->>["+partialItem+"]");
System.out.println("partialLotNO--->>["+partialLotNo+"]");
System.out.println("partialLotSl--->>["+partialLotSl+"]");
totalInvoice=partialID.size();
System.out.println("totalInvoice--->>["+totalInvoice+"]");
System.out.println("totalInvoice partial--->>["+totalInvoice+"]");
for (String invIdPartial : partialID)
{
//itemCode=partialItem.get(itemCnt)==null ? "" :partialItem.get(itemCnt).trim();
//invQty=partialInvoiceMapG.get(invIdPartial+":"+itemCode);
detail2xmlString="";
sql1="select rate,lot_no,lot_sl,discount,item_code from invoice_trace "
sql1="select rate,lot_no,lot_sl,discount,item_code,inv_line_no from invoice_trace "
+ "where invoice_id = ?";
pstmt=conn.prepareStatement(sql1);
......@@ -1596,10 +1582,11 @@ public String actualQtyPODProcessPartial(Connection conn) //partialInvoiceMap
rs=pstmt.executeQuery();
while(rs.next()){
invRate=rs.getDouble(1);
lotNo=rs.getString(2);;
lotNo=rs.getString(2);
lotSl=rs.getString(3);
discount=rs.getDouble(4);
itemCode=rs.getString(5);
lineNotrace=rs.getInt(6);
itemCode=itemCode==null ? "" :itemCode.trim();
lotNo=lotNo==null ? "" :lotNo.trim();
......@@ -1610,8 +1597,8 @@ public String actualQtyPODProcessPartial(Connection conn) //partialInvoiceMap
invRate=invRate - (invRate * discount/100);
System.out.println("Discount for invoice id--->>["+invIdPartial+"]"+"inv Rate-->>["+invRate+"]");
}
if(partialItem.contains(itemCode)){
invQty=partialInvoiceMapG.get(invIdPartial+":"+itemCode);
if(partialItem.contains(itemCode) && partialLotNo.contains(lotNo) && partialLotSl.contains(lotSl)){
invQty=partialInvoiceMapG.get(invIdPartial+":"+itemCode+":"+lotNo+":"+lotSl);
System.out.println("Remain111 inv qty--->>["+invQty+"] inv id--->["+invIdPartial+"]");
}else{
System.out.println("in continue.......partial112.........");
......
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