Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
493 rajveer 1
package in.shop2020.hotspot.dashbaord.server;
2
 
3
import in.shop2020.hotspot.dashbaord.shared.actions.Order;
4
import in.shop2020.hotspot.dashbaord.shared.actions.OrderType;
2697 chandransh 5
import in.shop2020.hotspot.dashbaord.shared.actions.ReturnOrder;
5945 mandeep.dh 6
import in.shop2020.model.v1.inventory.InventoryType;
5110 mandeep.dh 7
import in.shop2020.model.v1.catalog.Item;
8
import in.shop2020.model.v1.catalog.ItemType;
5945 mandeep.dh 9
import in.shop2020.model.v1.inventory.Warehouse;
914 chandransh 10
import in.shop2020.model.v1.order.LineItem;
493 rajveer 11
import in.shop2020.model.v1.order.OrderStatus;
12
import in.shop2020.model.v1.order.TransactionService.Client;
5110 mandeep.dh 13
import in.shop2020.thrift.clients.CatalogClient;
3132 rajveer 14
import in.shop2020.thrift.clients.TransactionClient;
493 rajveer 15
 
4411 rajveer 16
import java.io.ByteArrayOutputStream;
17
import java.io.File;
18
import java.io.FileNotFoundException;
19
import java.io.FileOutputStream;
20
import java.io.IOException;
493 rajveer 21
import java.util.ArrayList;
4411 rajveer 22
import java.util.Calendar;
493 rajveer 23
import java.util.Date;
4411 rajveer 24
import java.util.GregorianCalendar;
25
import java.util.HashMap;
493 rajveer 26
import java.util.List;
4411 rajveer 27
import java.util.Map;
493 rajveer 28
 
4411 rajveer 29
import org.slf4j.Logger;
30
import org.slf4j.LoggerFactory;
31
 
2449 chandransh 32
/**
33
 * This class is a facade to the Transaction service and should be used to
4133 chandransh 34
 * access all order specific data which requires some kind of transformation.
2449 chandransh 35
 * 
36
 * @author Chandranshu
37
 * 
38
 */
493 rajveer 39
public class TransactionUtils {
4411 rajveer 40
	private static String courierDetailsPath = "/CourierDetailReports";
41
	private static Logger logger = LoggerFactory.getLogger(TransactionUtils.class);
42
 
2449 chandransh 43
	/**
44
	 * The human user is concerned only with a consolidated view of actionable
45
	 * orders. Orders with different statuses in the database can be part of the
46
	 * same consolidated view. This method uses a mapping of <i>type</i> to
47
	 * <i>status</i> to get all such orders and return them as order beans.
48
	 * 
49
	 * @param type
50
	 *            The type of orders to return.
4133 chandransh 51
	 * @param offset
52
	 *            Offset to start from
53
	 * @param limit
54
	 *            No. of orders to return
2449 chandransh 55
	 * @param warehouseId
56
	 *            The warehouse for which the orders should be queried.
57
	 * @return A list of orders of the given type to be fulfilled from the given
58
	 *         warehouse
59
	 */
4133 chandransh 60
	public static List<Order> getOrders(OrderType type, long offset, long limit, long warehouseId){
2449 chandransh 61
		List<OrderStatus> statuses = getStatuses(type);
493 rajveer 62
 
63
		List<Order> orders = new ArrayList<Order>();
64
		try{
4133 chandransh 65
			TransactionClient txnClient = new TransactionClient();
66
			Client client = txnClient.getClient();
493 rajveer 67
 
68
			List<in.shop2020.model.v1.order.Order> t_orders = new ArrayList<in.shop2020.model.v1.order.Order>();
4133 chandransh 69
			t_orders.addAll(client.getOrdersInBatch(statuses, offset, limit, warehouseId));
493 rajveer 70
 
71
			for (in.shop2020.model.v1.order.Order t_order: t_orders){
671 chandransh 72
				Order o = getOrderFromThriftOrder(t_order);
493 rajveer 73
				orders.add(o);
74
			}
75
		}catch(Exception e){
2449 chandransh 76
			e.printStackTrace();
493 rajveer 77
		}
78
		return orders;
79
	}
80
 
2449 chandransh 81
	/**
4133 chandransh 82
	 * Wrapper around the method of same name in the transaction service. This
83
	 * method uses a mapping of <i>type</i> to <i>status</i> to get the count of
84
	 * all orders with a given status.
85
	 * 
86
	 * @param type
87
	 *            The type of orders to return.
88
	 * @param warehouseId
89
	 *            The warehouse for which the orders should be queried.
90
	 * @return The count of orders of the given type assigned to the given
91
	 *         warehouse.
92
	 */
93
	public static int getOrderCount(OrderType type, long warehouseId){
94
		List<OrderStatus> statuses = getStatuses(type);
95
 
96
		int count = 0;
97
		try{
98
			TransactionClient txnClient = new TransactionClient();
99
			Client client = txnClient.getClient();
100
			count += client.getOrderCount(statuses, warehouseId);
101
		}catch(Exception e){
102
			e.printStackTrace();
103
		}
104
		return count;
105
	}
106
 
107
	/**
2449 chandransh 108
	 * Calls the same method of the transaction service and returns the status
109
	 * returned. Catches all exceptions that are raised and returns false in
110
	 * that case.
111
	 * 
112
	 * @param warehouseId
113
	 *            The warehouse for which the orders should be marked as
114
	 *            manifested.
115
	 * @param providerId
116
	 *            The provider for which the orders should be marked as
117
	 *            manifested.
3065 chandransh 118
	 * @param cod
119
	 *             Whether cod orders have to be marked as manifested
2449 chandransh 120
	 * @return True if everything goes fine, false otherwise.
121
	 */
5769 rajveer 122
	public static Map<Long, Long> getBilledOrders(long warehouseId, String providerId, boolean cod){
123
		Map<Long, Long> orders = new HashMap<Long, Long>();
760 chandransh 124
		try {
125
			long provider_id = Long.parseLong(providerId);
3132 rajveer 126
			TransactionClient client = new TransactionClient();
760 chandransh 127
			Client c = client.getClient();
4790 rajveer 128
 
129
			List<OrderStatus> statuses = new ArrayList<OrderStatus>();
130
			statuses.add(OrderStatus.BILLED);
131
			List<in.shop2020.model.v1.order.Order> torders = c.getOrdersInBatch(statuses, 0, 0, warehouseId);
132
			for(in.shop2020.model.v1.order.Order torder: torders){
5556 rajveer 133
				if(torder.getLogistics_provider_id() == provider_id && torder.isLogisticsCod() == cod){
5769 rajveer 134
					orders.put(torder.getId(), torder.getPickupStoreId());
4790 rajveer 135
				}
4411 rajveer 136
			}
137
 
760 chandransh 138
		}catch(Exception e){
139
			e.printStackTrace();
140
		}
4790 rajveer 141
		return orders;
760 chandransh 142
	}
2449 chandransh 143
 
4790 rajveer 144
	public static boolean generateCourierDetailsFile(List<Long> orderIds, long providerId, long warehouseId, boolean isCod){
4411 rajveer 145
		Calendar date = new GregorianCalendar();
146
		int year = date.get(Calendar.YEAR);
147
		int month = date.get(Calendar.MONTH) +1;
148
		int day = date.get(Calendar.DAY_OF_MONTH);
149
 
150
		String fileNameSuffix = "-" + warehouseId + "-"+ providerId + "-" + year + "-" + month + "-" + day;
151
		if(isCod){
152
		    fileNameSuffix = "cod" + fileNameSuffix ;
153
		}
154
		else{
155
		    fileNameSuffix = "prepaid" + fileNameSuffix;
156
		}
157
 
158
		try {
4790 rajveer 159
			String fileName = courierDetailsPath + "/courier-details-" + fileNameSuffix + "-temp.xls";
4415 rajveer 160
			FileOutputStream f = new FileOutputStream(fileName);
4411 rajveer 161
			CourierDetailsGenerator courierDetailsGenerator = new CourierDetailsGenerator();
4790 rajveer 162
			ByteArrayOutputStream baosXLS = courierDetailsGenerator.generateCourierDetails(orderIds, warehouseId, providerId, isCod);
4411 rajveer 163
			baosXLS.writeTo(f);
164
			f.close();
165
		} catch (FileNotFoundException e) {
166
			logger.error("Unable to create the courier details file", e);
167
		} catch (IOException e) {
168
			logger.error("Unable to create the courier details file", e);
169
		}
170
 
171
		CourierDetailsReportMerger merger = new CourierDetailsReportMerger();
172
		try {
173
			Map<Long, String> warehouseIdFileNames = new HashMap<Long, String>();
4790 rajveer 174
			String fName;
175
			fName = courierDetailsPath + "/courier-details-" + fileNameSuffix + "-temp.xls";
176
			if((new File(fName)).exists()){
177
				warehouseIdFileNames.put(0L, fName);
4411 rajveer 178
			}
4790 rajveer 179
			fName = courierDetailsPath + "/courier-details-" + fileNameSuffix + ".xls";
180
			if((new File(fName)).exists()){
181
				warehouseIdFileNames.put(1L, fName);
4411 rajveer 182
			}
4790 rajveer 183
			ByteArrayOutputStream binXLS = merger.mergeCourierDetailsReports(warehouseIdFileNames);
184
			FileOutputStream f = new FileOutputStream(courierDetailsPath + "/courier-details-" + fileNameSuffix + ".xls");
4411 rajveer 185
			binXLS.writeTo(f);
186
			f.close();
4790 rajveer 187
			File tempFile = new File(courierDetailsPath + "/courier-details-" + fileNameSuffix + "-temp.xls");
188
			if(tempFile.exists()){
189
				tempFile.delete();
190
			}
4411 rajveer 191
		} catch (FileNotFoundException e) {
192
			logger.error("Error while creating the Courier Details report", e);
193
		} catch (IOException e) {
194
			logger.error("IO error while writing the Courier Details report", e);
195
		}
196
		return true;
197
	}
198
 
671 chandransh 199
	/**
2449 chandransh 200
	 * 
671 chandransh 201
	 * @param t_order
2449 chandransh 202
	 *            A thrift order object with line items.
203
	 * @return an Order bean which can be used for rendering on the client side.
671 chandransh 204
	 */
205
	public static Order getOrderFromThriftOrder(in.shop2020.model.v1.order.Order t_order) {
914 chandransh 206
		LineItem lineItem = t_order.getLineitems().get(0);
5110 mandeep.dh 207
		String pickFromWarehouse = null;
208
		Item item = null;
209
 
210
        try {
5945 mandeep.dh 211
            in.shop2020.model.v1.catalog.CatalogService.Client client = new CatalogClient().getClient();
5110 mandeep.dh 212
            item = client.getItem(lineItem.getItem_id());
213
            pickFromWarehouse = CatalogUtils.getWarehousesForBillingWarehouse(t_order.getWarehouse_id())
214
                                    .get(t_order.getFulfilmentWarehouseId());
215
 
216
            if (pickFromWarehouse == null) {
217
                Warehouse warehouse = client.getWarehouse(t_order.getFulfilmentWarehouseId());
218
                pickFromWarehouse = client.getWarehouses(null, InventoryType.GOOD, warehouse.getVendor().getId(), t_order.getWarehouse_id(), 0).get(0).getDisplayName();
219
            }
220
		}
221
        catch (Exception e) {
222
            logger.error("Error looking up warehouse: " + t_order.getVendorId(), e);
223
        }
224
 
3553 chandransh 225
		String delayReason = null;
226
		if(t_order.getDelayReason() != null)
227
		    delayReason = t_order.getDelayReason().name(); 
228
 
966 chandransh 229
		Order order = new Order(t_order.getId(),
230
				t_order.getCustomer_id(),
231
				t_order.getCustomer_name(),
232
				t_order.getCustomer_mobilenumber(),
233
				t_order.getCustomer_pincode(),
234
				t_order.getCustomer_address1(),
235
				t_order.getCustomer_address2(),
236
				t_order.getCustomer_city(),
237
				t_order.getCustomer_state(),
238
				t_order.getCustomer_email(),
239
				t_order.getCreated_timestamp(),
4004 chandransh 240
				t_order.getShipping_timestamp(),
241
				t_order.getVerification_timestamp(),
966 chandransh 242
				t_order.getExpected_delivery_time(),
3994 chandransh 243
				t_order.getPromised_delivery_time(),
4004 chandransh 244
				t_order.getExpected_shipping_time(),
4666 rajveer 245
				t_order.getPromised_shipping_time(),
966 chandransh 246
				t_order.getStatus().getValue(),
247
				t_order.getStatusDescription(),
5527 anupam.sin 248
				t_order.getOrderType().name(),
966 chandransh 249
				lineItem.getItem_id(),
250
				lineItem.getProductGroup(),
251
				lineItem.getBrand(),
252
				lineItem.getModel_name(),
253
				lineItem.getModel_number(),
254
				lineItem.getColor(),
255
				lineItem.getExtra_info(),
4172 rajveer 256
				lineItem.getDealText(),
5387 rajveer 257
				lineItem.getQuantity(),
2782 chandransh 258
				t_order.getTotal_amount(),
259
				t_order.getTotal_weight(),
260
				t_order.getAirwaybill_no(),
261
				t_order.getBilled_by(),
262
				t_order.getInvoice_number(),
263
				t_order.getJacket_number(),
264
				lineItem.getItem_number(),
4659 mandeep.dh 265
				lineItem.getSerial_number(),
3065 chandransh 266
				t_order.getBatchNo(),
267
				t_order.getSerialNo(),
2509 chandransh 268
				t_order.isDoaFlag(),
3065 chandransh 269
				t_order.getPickupRequestNo(),
5556 rajveer 270
				t_order.isLogisticsCod(),
5110 mandeep.dh 271
				delayReason,
272
				pickFromWarehouse,
273
				ItemType.SERIALIZED.equals(item.getType()),
5530 mandeep.dh 274
				item.isHasItemNo(),
5769 rajveer 275
				t_order.getFulfilmentWarehouseId(),
276
				t_order.getPickupStoreId());
966 chandransh 277
		return order;
671 chandransh 278
	}
279
 
2449 chandransh 280
	/**
2697 chandransh 281
	 * Queries the transction server to get the list of all return orders that
282
	 * have to be processed.
283
	 * 
284
	 * @return A list of all return orders to be processed.
285
	 */
286
	public static List<ReturnOrder> getReturnOrders(long warehouseId){
287
		List<ReturnOrder> retOrders = new ArrayList<ReturnOrder>();
288
		try{
3132 rajveer 289
			TransactionClient client = new TransactionClient();
2697 chandransh 290
			Client c = client.getClient();
291
			List<in.shop2020.model.v1.order.ReturnOrder> tRetOrders =  c.getReturnOrders(warehouseId, 0L, new Date().getTime());
292
			for(in.shop2020.model.v1.order.ReturnOrder retOrder : tRetOrders){
293
				retOrders.add(getReturnOrderFromThriftRO(retOrder));
294
			}
295
		}catch(Exception e){
296
			e.printStackTrace();
297
		}
298
		return retOrders;
299
	}
300
 
2700 chandransh 301
	public static ReturnOrder getReturnOrderFromThriftRO(in.shop2020.model.v1.order.ReturnOrder tRetOrder){
302
		ReturnOrder retOrder = new ReturnOrder(tRetOrder.getOrderId(),
303
				tRetOrder.getWarehouseId(),
304
				tRetOrder.getItemId(),
305
				tRetOrder.getProductGroup(),
306
				tRetOrder.getBrand(),
307
				tRetOrder.getModelName(),
308
				tRetOrder.getModelNumber(),
309
				tRetOrder.getColor(),
310
				tRetOrder.getInvoiceNumber(),
311
				tRetOrder.getJacketNumber(),
312
				tRetOrder.getTotalPrice(),
313
				tRetOrder.getTransferPrice(),
314
				false,
315
				tRetOrder.getCreatedAt());
2697 chandransh 316
		return retOrder;
317
	}
318
 
319
	/**
2449 chandransh 320
	 * This method maps a given type to a list of statuses.
321
	 * 
322
	 * @param type
323
	 *            The type of orders to fetch.
324
	 * @return The list of Thrift statuses associated with a particular order
325
	 *         type.
326
	 */
4361 rajveer 327
	public static List<OrderStatus> getStatuses(OrderType type) {
2449 chandransh 328
		List<OrderStatus> statuses = new ArrayList<OrderStatus>();
329
 
330
		switch (type) {
331
		case ACCEPTED:
332
			statuses.add(OrderStatus.ACCEPTED);
333
			break;
334
 
4361 rajveer 335
		case ALL_PENDING:
336
			statuses.add(OrderStatus.SUBMITTED_FOR_PROCESSING);
4421 mandeep.dh 337
			statuses.add(OrderStatus.CAPTURE_IN_PROCESS);
4361 rajveer 338
			statuses.add(OrderStatus.INVENTORY_LOW);
339
			statuses.add(OrderStatus.LOW_INV_PO_RAISED);
340
			statuses.add(OrderStatus.LOW_INV_REVERSAL_IN_PROCESS);
341
			statuses.add(OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT);
2449 chandransh 342
			break;
343
 
344
		case NEW:
345
			statuses.add(OrderStatus.SUBMITTED_FOR_PROCESSING);
4421 mandeep.dh 346
			statuses.add(OrderStatus.CAPTURE_IN_PROCESS);
2449 chandransh 347
			break;
348
 
349
		case BILLED:
350
			statuses.add(OrderStatus.BILLED);
351
			break;
352
 
4308 rajveer 353
		case LOW_INVENTORY:
2449 chandransh 354
			statuses.add(OrderStatus.INVENTORY_LOW);
355
			break;
4248 rajveer 356
 
4308 rajveer 357
		case PO_RAISED:
358
			statuses.add(OrderStatus.LOW_INV_PO_RAISED);
359
			break;
360
 
361
		case REVERSAL_INITIATED:
362
			statuses.add(OrderStatus.LOW_INV_REVERSAL_IN_PROCESS);
363
			break;
364
 
365
		case NOT_AVAILABLE:
366
			statuses.add(OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT);
367
			break;
368
 
4248 rajveer 369
		case CANCEL_CONFIRMED:
370
			statuses.add(OrderStatus.CANCEL_REQUEST_CONFIRMED);
371
			break;
2449 chandransh 372
 
4459 rajveer 373
		case DOA_REQUEST_AUTHORIZED:
374
			statuses.add(OrderStatus.DOA_REQUEST_AUTHORIZED);
4515 mandeep.dh 375
			statuses.add(OrderStatus.DOA_PICKUP_REQUEST_RAISED);
4459 rajveer 376
			break;
377
 
4666 rajveer 378
		case LOST_IN_TRANSIT:
379
			statuses.add(OrderStatus.LOST_IN_TRANSIT);
380
			break;
381
 
4459 rajveer 382
		case DOA_LOST_IN_TRANSIT:
383
			statuses.add(OrderStatus.DOA_LOST_IN_TRANSIT);
4478 rajveer 384
			break;
385
 
386
		case DOA_RECEIVED_DAMAGED:
4459 rajveer 387
			statuses.add(OrderStatus.DOA_RECEIVED_DAMAGED);
388
			break;
4495 rajveer 389
 
390
		case RET_REQUEST_AUTHORIZED:
391
			statuses.add(OrderStatus.RET_REQUEST_AUTHORIZED);
4515 mandeep.dh 392
			statuses.add(OrderStatus.RET_PICKUP_REQUEST_RAISED);
4495 rajveer 393
			break;
394
 
395
		case RET_AWAITED:
396
			statuses.add(OrderStatus.RET_RETURN_IN_TRANSIT);
4515 mandeep.dh 397
			statuses.add(OrderStatus.RET_PICKUP_CONFIRMED);
4495 rajveer 398
			break;
4459 rajveer 399
 
4495 rajveer 400
		case RET_RECEIVED_PRESTINE:
401
			statuses.add(OrderStatus.RET_RECEIVED_PRESTINE);
4515 mandeep.dh 402
			statuses.add(OrderStatus.RET_PRODUCT_USABLE);
4495 rajveer 403
			break;
404
 
405
		case RET_LOST_IN_TRANSIT:
406
			statuses.add(OrderStatus.RET_LOST_IN_TRANSIT);
407
			break;
408
 
409
		case RET_RECEIVED_DAMAGED:
410
			statuses.add(OrderStatus.RET_RECEIVED_DAMAGED);
4515 mandeep.dh 411
			statuses.add(OrderStatus.RET_PRODUCT_UNUSABLE);
4495 rajveer 412
			break;
413
 
2449 chandransh 414
		case REJECTED:
415
			statuses.add(OrderStatus.REJECTED);
416
			break;
417
 
418
		case SHIPPED:
419
			statuses.add(OrderStatus.SHIPPED_FROM_WH);
420
			statuses.add(OrderStatus.SHIPPED_TO_LOGST);
5016 phani.kuma 421
			statuses.add(OrderStatus.SHIPPED_TO_DESTINATION_CITY);
422
			statuses.add(OrderStatus.REACHED_DESTINATION_CITY);
423
			statuses.add(OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE);
2449 chandransh 424
			break;
425
 
426
		case DELIVERED:
427
			statuses.add(OrderStatus.DELIVERY_SUCCESS);
4452 rajveer 428
			statuses.add(OrderStatus.DOA_PICKUP_REQUEST_RAISED);
2449 chandransh 429
			break;
2610 chandransh 430
 
431
		case DOA_AWAITED:
4452 rajveer 432
			statuses.add(OrderStatus.DOA_PICKUP_CONFIRMED);
2610 chandransh 433
			statuses.add(OrderStatus.DOA_RETURN_IN_TRANSIT);
4452 rajveer 434
			statuses.add(OrderStatus.DOA_RECEIVED_PRESTINE);
2610 chandransh 435
			break;
2449 chandransh 436
 
4495 rajveer 437
		case RTO_AWAITED:
4484 rajveer 438
			statuses.add(OrderStatus.RTO_IN_TRANSIT);
2509 chandransh 439
			break;
440
 
4515 mandeep.dh 441
        case RTO_RECEIVED_DAMAGED:
442
            statuses.add(OrderStatus.RTO_RECEIVED_DAMAGED);
443
            break;
444
 
445
        case DOA_RECEIVED_PRESTINE:
2610 chandransh 446
			statuses.add(OrderStatus.DOA_CERT_VALID);
4515 mandeep.dh 447
			statuses.add(OrderStatus.DOA_CERT_INVALID);
2610 chandransh 448
			break;
449
 
4495 rajveer 450
		case RTO_RETURNED:
4484 rajveer 451
			statuses.add(OrderStatus.RTO_RECEIVED_PRESTINE);
2509 chandransh 452
			break;
453
 
2628 chandransh 454
		case RESHIPPED:
4484 rajveer 455
			statuses.add(OrderStatus.RTO_RESHIPPED);
2628 chandransh 456
			statuses.add(OrderStatus.DOA_INVALID_RESHIPPED);
4452 rajveer 457
			statuses.add(OrderStatus.DOA_VALID_RESHIPPED);
2628 chandransh 458
			break;
459
 
460
		case REFUNDED:
4682 rajveer 461
		    statuses.add(OrderStatus.COD_VERIFICATION_FAILED);
4484 rajveer 462
			statuses.add(OrderStatus.RTO_REFUNDED);
2628 chandransh 463
			statuses.add(OrderStatus.DOA_INVALID_REFUNDED);
464
			statuses.add(OrderStatus.DOA_VALID_REFUNDED);
4682 rajveer 465
			statuses.add(OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY);
2628 chandransh 466
			break;
2509 chandransh 467
 
3065 chandransh 468
		case VERIFICATION_PENDING:
4664 rajveer 469
		    statuses.add(OrderStatus.COD_VERIFICATION_PENDING);
3065 chandransh 470
		    break;
2449 chandransh 471
		default:
472
			break;
473
		}
474
		return statuses;
475
	}
493 rajveer 476
}