Subversion Repositories SmartDukaan

Rev

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