Subversion Repositories SmartDukaan

Rev

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