Subversion Repositories SmartDukaan

Rev

Rev 3166 | Rev 4141 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1631 ankur.sing 1
package in.shop2020.support.services;
2
 
3
import in.shop2020.model.v1.order.LineItem;
4
import in.shop2020.model.v1.order.Order;
2785 chandransh 5
import in.shop2020.model.v1.order.OrderStatus;
1631 ankur.sing 6
import in.shop2020.model.v1.order.TransactionServiceException;
2310 ankur.sing 7
import in.shop2020.payments.Attribute;
8
import in.shop2020.payments.Constants;
1631 ankur.sing 9
import in.shop2020.payments.Payment;
10
import in.shop2020.payments.PaymentException;
2061 ankur.sing 11
import in.shop2020.payments.PaymentGateway;
1631 ankur.sing 12
import in.shop2020.payments.PaymentStatus;
3125 rajveer 13
import in.shop2020.thrift.clients.PaymentClient;
14
import in.shop2020.thrift.clients.TransactionClient;
15
import in.shop2020.thrift.clients.UserClient;
1631 ankur.sing 16
 
17
import java.io.ByteArrayOutputStream;
18
import java.io.FileNotFoundException;
19
import java.io.FileOutputStream;
20
import java.io.IOException;
21
import java.text.DateFormat;
22
import java.text.ParseException;
23
import java.text.SimpleDateFormat;
24
import java.util.Calendar;
25
import java.util.Date;
2061 ankur.sing 26
import java.util.HashMap;
1631 ankur.sing 27
import java.util.List;
2061 ankur.sing 28
import java.util.Map;
1631 ankur.sing 29
 
30
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
31
import org.apache.poi.ss.usermodel.Cell;
32
import org.apache.poi.ss.usermodel.CellStyle;
1655 ankur.sing 33
import org.apache.poi.ss.usermodel.DataFormat;
1631 ankur.sing 34
import org.apache.poi.ss.usermodel.Font;
35
import org.apache.poi.ss.usermodel.Row;
36
import org.apache.poi.ss.usermodel.Sheet;
37
import org.apache.poi.ss.usermodel.Workbook;
38
import org.apache.poi.ss.util.CellRangeAddress;
39
import org.apache.thrift.TException;
3105 chandransh 40
import org.slf4j.Logger;
41
import org.slf4j.LoggerFactory;
1631 ankur.sing 42
 
43
public class PaymentDetailsGenerator {
3105 chandransh 44
 
45
    private static Logger logger = LoggerFactory.getLogger(PaymentDetailsGenerator.class);
46
 
3107 chandransh 47
    private static final int S_NO = 0, PAYMENT_ID = 1, GATEWAY = 2, PAYMENT_METHOD = 3, TXN_ID = 4, AMOUNT = 5, PAY_STATUS = 6, 
48
    PAY_STATUS_DESC = 7, TXN_STATUS = 8, REF_CODE = 9, TXN_TIME = 10, CUST_ID = 11, NAME = 12, 
49
    MOB_NO = 13, ADDR = 14, PINCODE = 15, CITY = 16, STATE = 17, EMAIL = 18, ORDER_ID = 19, ORDER_STATUS = 20, 
50
    ORDER_STATUS_DESC = 21, ITEM_ID = 22, PROD_GRP = 23, BRAND = 24, MOD_NAME = 25, MOD_NUM = 26, QTY = 27;
51
 
3125 rajveer 52
    TransactionClient tsc;
1660 ankur.sing 53
    in.shop2020.model.v1.order.TransactionService.Client tClient;
1631 ankur.sing 54
 
3125 rajveer 55
    PaymentClient psc;
1660 ankur.sing 56
    in.shop2020.payments.PaymentService.Client pClient;
1631 ankur.sing 57
 
3125 rajveer 58
    UserClient usc;
2061 ankur.sing 59
    in.shop2020.model.v1.user.UserContextService.Client uClient;
60
 
3107 chandransh 61
    Map<Long, PaymentGateway> gateWays = new HashMap<Long, PaymentGateway>(4);
2061 ankur.sing 62
 
1660 ankur.sing 63
    public PaymentDetailsGenerator() {
64
        try {
3125 rajveer 65
            tsc = new TransactionClient();
1660 ankur.sing 66
            tClient = tsc.getClient();
2061 ankur.sing 67
 
3125 rajveer 68
            psc = new PaymentClient();
1660 ankur.sing 69
            pClient = psc.getClient();
2061 ankur.sing 70
 
3125 rajveer 71
            usc = new UserClient();
2061 ankur.sing 72
            uClient = usc.getClient();
1660 ankur.sing 73
        } catch (Exception e) {
3105 chandransh 74
            logger.error("Error establishing connection to one of txn, payment or user service", e);
1660 ankur.sing 75
        }
76
    }
1631 ankur.sing 77
 
1660 ankur.sing 78
    /**
79
     * This method is used in PaymentDetailsController.
80
     * If any pending or failed payment exists between given date range, it returns ByteArrayOutputStream,
81
     * otherwise it returns null.
82
     * @param startDate
83
     * @param endDate
1881 ankur.sing 84
     * @param status 0 --> user input: Successful  1: Failed & pending
1660 ankur.sing 85
     * @return
86
     */
1881 ankur.sing 87
    public ByteArrayOutputStream generatePaymentDetailsReport(Date startDate, Date endDate, int status) {
1631 ankur.sing 88
 
1660 ankur.sing 89
        // Retrieving all the payments between start and end dates with status
90
        // as FAILED or INIT and for gateway Id = 1 (HDFC)
91
        List<Payment> payments = null;
3166 chandransh 92
        List<Payment> authorizedPayments = null;
1660 ankur.sing 93
        List<Payment> pendingPayments = null;
94
        try {
1881 ankur.sing 95
            if(status == 0) {
2061 ankur.sing 96
                payments = pClient.getPayments(startDate.getTime(), endDate.getTime(), PaymentStatus.SUCCESS, 0);
3166 chandransh 97
                authorizedPayments = pClient.getPayments(startDate.getTime(), endDate.getTime(), PaymentStatus.AUTHORIZED, 0);
98
                if(payments != null && authorizedPayments != null) {
99
                    payments.addAll(authorizedPayments);
100
                } else if(authorizedPayments != null){
101
                    payments = authorizedPayments;
102
                }
1881 ankur.sing 103
            } else {
2061 ankur.sing 104
                payments = pClient.getPayments(startDate.getTime(), endDate.getTime(), PaymentStatus.FAILED, 0);
105
                pendingPayments = pClient.getPayments(startDate.getTime(), endDate.getTime(), PaymentStatus.INIT, 0);
3166 chandransh 106
                if(payments != null && pendingPayments != null) {
1881 ankur.sing 107
                    payments.addAll(pendingPayments);
3166 chandransh 108
                } else if(pendingPayments != null){
1881 ankur.sing 109
                    payments = pendingPayments;
110
                }
111
            }
1660 ankur.sing 112
        } catch (PaymentException e) {
3105 chandransh 113
            logger.error("Error in payment service while getting payments", e);
1660 ankur.sing 114
        } catch (TException e) {
3105 chandransh 115
            logger.error("Error getting info from payment service", e);
1660 ankur.sing 116
        }
117
        if (payments == null || payments.isEmpty()) {
118
            return null;
119
        }
1631 ankur.sing 120
 
1660 ankur.sing 121
        // Preparing XLS file for output
122
        return getSpreadSheetData(payments);
1631 ankur.sing 123
 
1660 ankur.sing 124
    }
1631 ankur.sing 125
 
1660 ankur.sing 126
    // Prepares the XLS worksheet object and fills in the data with proper
127
    // formatting
128
    private ByteArrayOutputStream getSpreadSheetData(List<Payment> payments) {
129
        ByteArrayOutputStream baosXLS = new ByteArrayOutputStream();
1631 ankur.sing 130
 
1660 ankur.sing 131
        Workbook wb = new HSSFWorkbook();
1631 ankur.sing 132
 
1660 ankur.sing 133
        Font font = wb.createFont();
134
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);
135
        CellStyle style = wb.createCellStyle();
136
        style.setFont(font);
137
 
138
        CellStyle styleWT = wb.createCellStyle();
1655 ankur.sing 139
        styleWT.setWrapText(true);
1660 ankur.sing 140
 
1655 ankur.sing 141
        DataFormat format = wb.createDataFormat();
142
        CellStyle styleAmount = wb.createCellStyle();
143
        styleAmount.setDataFormat(format.getFormat("#,##0.00"));
1631 ankur.sing 144
 
1660 ankur.sing 145
        Sheet paymentSheet = wb.createSheet("Payment");
146
        short paymentSerialNo = 0;
1631 ankur.sing 147
 
1660 ankur.sing 148
        Row titleRow = paymentSheet.createRow(paymentSerialNo++);
149
        Cell titleCell = titleRow.createCell(0);
150
        titleCell.setCellValue("Payment Details");
151
        titleCell.setCellStyle(style);
1631 ankur.sing 152
 
1660 ankur.sing 153
        paymentSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));
1631 ankur.sing 154
 
1660 ankur.sing 155
        paymentSheet.createRow(paymentSerialNo++);
2310 ankur.sing 156
 
1660 ankur.sing 157
        Row headerRow = paymentSheet.createRow(paymentSerialNo++);
2310 ankur.sing 158
        headerRow.createCell(S_NO).setCellValue("S.No");
159
        headerRow.createCell(PAYMENT_ID).setCellValue("Payment Id");
160
        headerRow.createCell(GATEWAY).setCellValue("Gateway");
161
        headerRow.createCell(PAYMENT_METHOD).setCellValue("Payment Method");
162
        headerRow.getCell(PAYMENT_METHOD).setCellStyle(styleWT);
163
 
164
        headerRow.createCell(TXN_ID).setCellValue("Txn Id");
165
        headerRow.createCell(AMOUNT).setCellValue("Amount");
166
        headerRow.createCell(PAY_STATUS).setCellValue("Payment Status");
167
        headerRow.createCell(PAY_STATUS_DESC).setCellValue("Payment Status Description");
168
        headerRow.getCell(PAY_STATUS_DESC).setCellStyle(styleWT);
169
        headerRow.createCell(TXN_STATUS).setCellValue("Gateway Txn Status");
170
        headerRow.createCell(REF_CODE).setCellValue("Reference Code");
171
        headerRow.createCell(TXN_TIME).setCellValue("Transaction Time");
1631 ankur.sing 172
 
2310 ankur.sing 173
        headerRow.createCell(CUST_ID).setCellValue("Customer Id");
174
        headerRow.createCell(NAME).setCellValue("Name");
175
        headerRow.createCell(MOB_NO).setCellValue("MobileNo");
176
        headerRow.createCell(ADDR).setCellValue("Address");
177
        headerRow.getCell(ADDR).setCellStyle(styleWT);
178
        headerRow.createCell(PINCODE).setCellValue("Pincode");
179
        headerRow.createCell(CITY).setCellValue("City");
180
        headerRow.createCell(STATE).setCellValue("State");
181
        headerRow.createCell(EMAIL).setCellValue("Login Email");
1631 ankur.sing 182
 
2310 ankur.sing 183
        headerRow.createCell(ORDER_ID).setCellValue("Order Id");
184
        headerRow.createCell(ORDER_STATUS).setCellValue("Order Status");
185
        headerRow.createCell(ORDER_STATUS_DESC).setCellValue("Order Status Description");
1631 ankur.sing 186
 
2310 ankur.sing 187
        headerRow.createCell(ITEM_ID).setCellValue("Item Id");
188
        headerRow.createCell(PROD_GRP).setCellValue("Product Group");
189
        headerRow.createCell(BRAND).setCellValue("Brand");
190
        headerRow.createCell(MOD_NAME).setCellValue("Model Name");
191
        headerRow.createCell(MOD_NUM).setCellValue("Model Number");
192
        headerRow.createCell(QTY).setCellValue("Qty");
1631 ankur.sing 193
 
2310 ankur.sing 194
        int paymethodColWidth = 25, statusDescWidth = 25, addrColWidth = 35;
195
        paymentSheet.setColumnWidth(PAYMENT_METHOD, 256 * paymethodColWidth); // set width of payment method column
196
        paymentSheet.setColumnWidth(PAY_STATUS_DESC, 256 * statusDescWidth); // set width of payment status description column
197
        paymentSheet.setColumnWidth(ADDR, 256 * addrColWidth); // set width of address column
1660 ankur.sing 198
        List<Order> orders;
199
        long txnId;
200
        Row contentRow;
201
        Calendar calendar = Calendar.getInstance();
202
        DateFormat formatter = new SimpleDateFormat("EEE, dd-MMM-yyyy hh:mm a");
2310 ankur.sing 203
        float rowHeight = paymentSheet.getDefaultRowHeightInPoints();
204
        int sNo = 0;
1660 ankur.sing 205
        for (Payment payment : payments) {
2310 ankur.sing 206
            float newRowHeight = paymentSheet.getDefaultRowHeightInPoints();;
1660 ankur.sing 207
            try {
208
                paymentSerialNo++;
209
                contentRow = paymentSheet.createRow(paymentSerialNo);
2310 ankur.sing 210
                sNo++;
211
                contentRow.createCell(S_NO).setCellValue(sNo);
212
                contentRow.createCell(PAYMENT_ID).setCellValue(payment.getPaymentId());
2061 ankur.sing 213
 
2310 ankur.sing 214
                PaymentGateway gateway = gateWays.get(payment.getGatewayId());
2061 ankur.sing 215
                if(gateway == null) {
216
                    try {
217
                        gateway = pClient.getPaymentGateway(payment.getGatewayId());
218
                        gateWays.put(payment.getGatewayId(), gateway);
2492 ankur.sing 219
                    } catch (Exception e) {
3105 chandransh 220
                        logger.error("Error gerring payment gateway info from payment service", e);
2310 ankur.sing 221
                    }
2090 ankur.sing 222
                }
2310 ankur.sing 223
                contentRow.createCell(GATEWAY).setCellValue(gateway != null ? gateway.getName() : payment.getGatewayId()+"");
224
                //contentRow.createCell(GATEWAY).setCellValue(payment.getGatewayId());
225
 
226
                String paymentMethod = getPaymentMethod(payment.getAttributes());
227
                contentRow.createCell(PAYMENT_METHOD).setCellValue(paymentMethod);
228
                contentRow.getCell(PAYMENT_METHOD).setCellStyle(styleWT);
229
 
230
                if(paymentMethod.length() > paymethodColWidth) {
231
                    newRowHeight = Math.max(newRowHeight, (paymentMethod.length() / paymethodColWidth + 1) * rowHeight);
232
                }
233
 
234
                contentRow.createCell(TXN_ID).setCellValue(payment.getMerchantTxnId());
235
                contentRow.createCell(AMOUNT).setCellValue(payment.getAmount());
236
                contentRow.getCell(AMOUNT).setCellStyle(styleAmount);
237
                contentRow.createCell(PAY_STATUS).setCellValue(payment.getStatus().name());
238
                String desc = payment.getDescription();
239
                contentRow.createCell(PAY_STATUS_DESC).setCellValue(desc);
240
                contentRow.getCell(PAY_STATUS_DESC).setCellStyle(styleWT);
241
                if(desc != null && desc.length() > statusDescWidth) {
242
                    newRowHeight = Math.max(newRowHeight, (desc.length() / statusDescWidth + 1) * rowHeight);
243
                }
244
 
245
                contentRow.createCell(TXN_STATUS).setCellValue(payment.getGatewayTxnStatus());
246
                contentRow.createCell(REF_CODE).setCellValue(payment.getReferenceCode());
1660 ankur.sing 247
                calendar.setTimeInMillis(payment.getInitTimestamp());
2310 ankur.sing 248
                contentRow.createCell(TXN_TIME).setCellValue(formatter.format(calendar.getTime()));
1631 ankur.sing 249
 
3501 mandeep.dh 250
                txnId = payment.getMerchantTxnId();
1660 ankur.sing 251
                orders = tClient.getOrdersForTransaction(txnId, payment.getUserId());
252
                List<LineItem> lineItems;
1631 ankur.sing 253
 
1660 ankur.sing 254
                String address = "";
2310 ankur.sing 255
 
1660 ankur.sing 256
                if (orders == null || orders.isEmpty()) {
257
                    continue;
258
                }
2310 ankur.sing 259
                contentRow.createCell(CUST_ID).setCellValue(orders.get(0).getCustomer_id());
260
                contentRow.createCell(NAME).setCellValue(orders.get(0).getCustomer_name());
261
                contentRow.createCell(MOB_NO).setCellValue(orders.get(0).getCustomer_mobilenumber());
1660 ankur.sing 262
                address = orders.get(0).getCustomer_address1() + ", " + orders.get(0).getCustomer_address2();
2310 ankur.sing 263
                contentRow.createCell(ADDR).setCellValue(address);
264
                contentRow.getCell(ADDR).setCellStyle(styleWT);
265
 
266
                if(address.length() > addrColWidth) {
267
                    newRowHeight = Math.max(newRowHeight, (address.length() / addrColWidth + 1) * rowHeight);
268
                }
269
                contentRow.setHeightInPoints(newRowHeight);
270
 
271
                contentRow.createCell(PINCODE).setCellValue(orders.get(0).getCustomer_pincode());
272
                contentRow.createCell(CITY).setCellValue(orders.get(0).getCustomer_city());
273
                contentRow.createCell(STATE).setCellValue(orders.get(0).getCustomer_state());
274
                contentRow.createCell(EMAIL).setCellValue(orders.get(0).getCustomer_email());
275
 
276
                boolean firstOrder = true;
1660 ankur.sing 277
                for (Order o : orders) {
2785 chandransh 278
                    if(o.getStatus() == OrderStatus.SALES_RET_RESHIPPED || o.getStatus() == OrderStatus.DOA_RESHIPPED || o.getStatus() == OrderStatus.DOA_INVALID_RESHIPPED)
279
                        continue;
280
 
2310 ankur.sing 281
                    if(firstOrder) {
282
                        firstOrder = false;
283
                    } else {
284
                        paymentSerialNo++;
285
                        contentRow = paymentSheet.createRow(paymentSerialNo);
286
                    }
1631 ankur.sing 287
 
2310 ankur.sing 288
                    contentRow.createCell(ORDER_ID).setCellValue(o.getId());
289
                    contentRow.createCell(ORDER_STATUS).setCellValue(o.getStatus().name());
290
                    contentRow.createCell(ORDER_STATUS_DESC).setCellValue(o.getStatusDescription());
1631 ankur.sing 291
 
1660 ankur.sing 292
                    lineItems = tClient.getLineItemsForOrder(o.getId());
293
                    for (LineItem i : lineItems) {
294
                        /*
295
                         * Right now there can be only one line item in an
296
                         * order. So putting line item details in the same
297
                         * row as order details. Commenting below 2 lines
298
                         * for this.
299
                         */
300
                        // paymentSerialNo++;
301
                        // contentRow =
302
                        // paymentSheet.createRow(paymentSerialNo);
1631 ankur.sing 303
 
2310 ankur.sing 304
                        contentRow.createCell(ITEM_ID).setCellValue(i.getId());
305
                        contentRow.createCell(PROD_GRP).setCellValue(i.getProductGroup());
306
                        contentRow.createCell(BRAND).setCellValue(i.getBrand());
307
                        contentRow.createCell(MOD_NAME).setCellValue(i.getModel_name());
308
                        contentRow.createCell(MOD_NUM).setCellValue(i.getModel_number());
309
                        contentRow.createCell(QTY).setCellValue(i.getQuantity());
1660 ankur.sing 310
                    }
311
                }
312
            } catch (TransactionServiceException e) {
3105 chandransh 313
                logger.error("Error in transaction service while getting orders", e);
1660 ankur.sing 314
            } catch (TException e) {
3105 chandransh 315
                logger.error("Error getting info from transaction service", e);
1660 ankur.sing 316
            }
317
        }
318
 
2310 ankur.sing 319
        for (int i = 0; i <= QTY; i++) {
320
            if (i == PAYMENT_METHOD || i == PAY_STATUS_DESC || i == ADDR) // Address Column is of fixed size with wrap text style
1660 ankur.sing 321
                continue;
322
            paymentSheet.autoSizeColumn(i);
323
        }
324
 
325
        // Write the workbook to the output stream
326
        try {
327
            wb.write(baosXLS);
328
            baosXLS.close();
329
        } catch (IOException e) {
3105 chandransh 330
            logger.error("Error while streaming payment details report", e);
1660 ankur.sing 331
        }
332
        return baosXLS;
333
    }
2310 ankur.sing 334
 
335
    public String getPaymentMethod(List<Attribute> paymentAttributes) {
336
        String paymentMethod = null;
337
        if(paymentAttributes == null || paymentAttributes.isEmpty()) {
338
            return "N/A";
339
        }
340
        for(Attribute a : paymentAttributes) {
341
            if("payMethod".equals(a.getName())) {
342
                paymentMethod = Constants.PAYMENT_METHOD.get(a.getValue());
343
                break;
344
            }
345
        }
346
        return paymentMethod != null ? paymentMethod : "N/A";
347
    }
348
 
1660 ankur.sing 349
    public static void main(String[] args) {
350
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
351
        Date startDate = null, endDate = null;
352
        try {
353
            startDate = df.parse("01/01/2011");
2090 ankur.sing 354
            endDate = df.parse("06/30/2011");
1660 ankur.sing 355
            Calendar cal = Calendar.getInstance();
356
            cal.setTime(endDate);
357
            cal.add(Calendar.DATE, 1);
358
            endDate.setTime(cal.getTimeInMillis());
359
        } catch (ParseException pe) {
3105 chandransh 360
            logger.error("Error parsing the supplied date", pe);
1660 ankur.sing 361
        }
362
        PaymentDetailsGenerator pdg = new PaymentDetailsGenerator();
363
        try {
364
            String userHome = System.getProperty("user.home");
365
            FileOutputStream f = new FileOutputStream(userHome + "/payment-details-report.xls");
1881 ankur.sing 366
            ByteArrayOutputStream baosXLS = pdg.generatePaymentDetailsReport(startDate, endDate, 1);
1660 ankur.sing 367
            baosXLS.writeTo(f);
368
            f.close();
369
        } catch (FileNotFoundException e) {
3105 chandransh 370
            logger.error("Error creating payment details report", e);
1660 ankur.sing 371
        } catch (IOException e) {
3105 chandransh 372
            logger.error("IO error while creating payment details report", e);
1660 ankur.sing 373
        }
374
        System.out.println("Successfully generated the payment details report");
375
    }
1631 ankur.sing 376
}