Subversion Repositories SmartDukaan

Rev

Rev 35458 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
29349 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
31117 tejbeer 3
import java.io.IOException;
29418 tejbeer 4
import java.time.LocalDate;
5
import java.time.LocalDateTime;
6
import java.time.temporal.ChronoUnit;
29349 tejbeer 7
import java.util.ArrayList;
29419 tejbeer 8
import java.util.Arrays;
29349 tejbeer 9
import java.util.List;
10
 
11
import javax.servlet.http.HttpServletRequest;
12
import javax.servlet.http.HttpServletResponse;
13
 
31117 tejbeer 14
import org.apache.http.conn.HttpHostConnectException;
29349 tejbeer 15
import org.apache.logging.log4j.LogManager;
16
import org.apache.logging.log4j.Logger;
29418 tejbeer 17
import org.apache.thrift.TException;
29349 tejbeer 18
import org.json.JSONArray;
19
import org.json.JSONObject;
31117 tejbeer 20
import org.json.XML;
29349 tejbeer 21
import org.springframework.beans.factory.annotation.Autowired;
22
import org.springframework.beans.factory.annotation.Value;
23
import org.springframework.http.MediaType;
24
import org.springframework.http.ResponseEntity;
25
import org.springframework.stereotype.Controller;
26
import org.springframework.transaction.annotation.Transactional;
27
import org.springframework.web.bind.annotation.RequestMapping;
28
import org.springframework.web.bind.annotation.RequestMethod;
29
import org.springframework.web.bind.annotation.RequestParam;
30
 
31117 tejbeer 31
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
29418 tejbeer 32
import com.spice.profitmandi.common.model.CustomOrder;
31117 tejbeer 33
import com.spice.profitmandi.common.model.ProfitMandiConstants;
29420 tejbeer 34
import com.spice.profitmandi.common.model.TrackingModel;
31117 tejbeer 35
import com.spice.profitmandi.common.web.client.RestClient;
29349 tejbeer 36
import com.spice.profitmandi.common.web.util.ResponseSender;
29418 tejbeer 37
import com.spice.profitmandi.dao.entity.logistics.Provider;
38
import com.spice.profitmandi.dao.entity.logistics.ProviderTat;
29349 tejbeer 39
import com.spice.profitmandi.dao.entity.transaction.Order;
29418 tejbeer 40
import com.spice.profitmandi.dao.model.ProductPojo;
41
import com.spice.profitmandi.dao.repository.logistics.ProviderRepository;
42
import com.spice.profitmandi.dao.repository.logistics.ProviderTatRepository;
43
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
44
import com.spice.profitmandi.dao.util.ContentPojoPopulator;
29349 tejbeer 45
import com.spice.profitmandi.model.tracking.ScannedDetailModel;
46
import com.spice.profitmandi.model.tracking.TrackingDetailModel;
29418 tejbeer 47
import com.spice.profitmandi.service.LogisticsService;
29349 tejbeer 48
 
29418 tejbeer 49
import in.shop2020.model.v1.order.OrderStatusGroups;
29349 tejbeer 50
import io.swagger.annotations.ApiImplicitParam;
51
import io.swagger.annotations.ApiImplicitParams;
52
 
53
@Controller
35458 amit 54
@Transactional(rollbackFor = Throwable.class)
29349 tejbeer 55
public class TrackingController {
56
 
57
	@Value("${delhivery.tracking.token}")
58
	private String token;
59
 
60
	@Autowired
61
	private ResponseSender<?> responseSender;
62
 
29418 tejbeer 63
	@Autowired
64
	private OrderRepository orderRepository;
65
 
66
	@Autowired
67
	private ProviderRepository providerRepository;
68
 
69
	@Autowired
70
	private ContentPojoPopulator contentPojoPopulator;
71
 
72
	@Autowired
73
	private ProviderTatRepository providerTatRepository;
74
 
75
	@Autowired
76
	private LogisticsService logisticsService;
31087 tejbeer 77
 
78
	@Value("#{'${prod}'=='true' ? 'DEL81122' : 'DEL95932'}")
79
	private String loginId;
80
 
81
	@Value("#{'${prod}'=='true' ? '9sjnjt61hghmtjuvjio0osqkmujkphlt' : 'poehq2kiqjnllkrote9hxglo4teptfqf'}")
82
	private String licencekey;
83
 
31117 tejbeer 84
	@Autowired
85
	private RestClient restClient;
86
 
29349 tejbeer 87
	private static final Logger LOGGER = LogManager.getLogger(TrackingController.class);
88
 
89
	@RequestMapping(value = "/order/tracking", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
90
	@ApiImplicitParams({
91
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
29418 tejbeer 92
	public ResponseEntity<?> getDeliveryOrder(HttpServletRequest request, HttpServletResponse response,
29349 tejbeer 93
			@RequestParam String airwayBillNo) throws Throwable {
94
 
31117 tejbeer 95
		List<Order> orders = orderRepository.selectByAirwayBillNumber(airwayBillNo);
96
 
97
		int providerId = orders.get(0).getLogisticsProviderId();
98
		TrackingDetailModel tdm = null;
99
 
100
		if (providerId == ProfitMandiConstants.DELHIVERY_PROVIDERID) {
101
 
102
			tdm = getDelhiveryTracking(airwayBillNo);
103
 
104
		} else if (providerId == ProfitMandiConstants.BLUEDART_PROVIDERID) {
105
 
106
			tdm = getBlueDartTracking(airwayBillNo);
107
 
108
		}
109
 
110
		LOGGER.info("tdm" + tdm);
111
 
112
		return responseSender.ok(tdm);
113
	}
114
 
36418 amit 115
	private TrackingDetailModel getDelhiveryTracking(String airwayBillNo) throws Exception {
116
		String fullUrl = "https://track.delhivery.com/api/v1/packages/json/?waybill="
117
				+ String.join(",", airwayBillNo) + "&token=" + token;
118
		LOGGER.info("delhivery tracking url {}", fullUrl);
119
		String responseBody = restClient.get(fullUrl, null, null);
120
		JSONObject jsonObj = new JSONObject(responseBody);
29349 tejbeer 121
 
122
		LOGGER.info("jsonObj" + jsonObj);
123
 
124
		JSONArray shipmentData = jsonObj.getJSONArray("ShipmentData");
125
 
126
		TrackingDetailModel tdm = new TrackingDetailModel();
127
 
128
		List<ScannedDetailModel> sdms = new ArrayList<>();
129
 
130
		for (int i = 0; i < shipmentData.length(); i++) {
131
			JSONObject jsonObject = shipmentData.getJSONObject(i);
132
			JSONObject shipment = jsonObject.getJSONObject("Shipment");
133
 
134
			JSONArray scans = shipment.getJSONArray("Scans");
135
 
136
			for (int j = 0; j < scans.length(); j++) {
137
				JSONObject scanObject = scans.getJSONObject(j);
138
 
31117 tejbeer 139
				JSONObject scandetail = scanObject.getJSONObject("ScanDetail");
29349 tejbeer 140
 
141
				ScannedDetailModel sdm = new ScannedDetailModel();
31117 tejbeer 142
				sdm.setStatusDateTime(scandetail.getString("ScanDateTime"));
143
				sdm.setStatusLocation(scandetail.getString("ScannedLocation"));
144
				sdm.setInstruction(scandetail.getString("Instructions"));
29349 tejbeer 145
				sdms.add(sdm);
146
 
147
			}
148
 
149
			tdm.setExpectedDelivery(shipment.getString("ExpectedDeliveryDate"));
150
			tdm.setAwb(shipment.getString("AWB"));
151
 
152
		}
153
 
154
		tdm.setSdm(sdms);
31117 tejbeer 155
		return tdm;
29349 tejbeer 156
	}
157
 
31117 tejbeer 158
	private TrackingDetailModel getBlueDartTracking(String airwayBillNo)
159
			throws ProfitMandiBusinessException, HttpHostConnectException {
31087 tejbeer 160
 
31117 tejbeer 161
		String loginId = "DEL81122";
31087 tejbeer 162
 
31117 tejbeer 163
		String licencekey = "uhfhlg2jpmnqfhfrlsgzfr1nhu1qfvel";
164
 
31114 tejbeer 165
		String url = "https://api.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery";
31087 tejbeer 166
 
31117 tejbeer 167
		String response = restClient.get(url + "&loginid=" + loginId + "&awb=awb&numbers="
168
				+ String.join(",", airwayBillNo) + "&format=xml&lickey=" + licencekey + "&verno=1.3&scan=1", null,
169
				null);
31087 tejbeer 170
 
31117 tejbeer 171
		JSONObject updateJson = XML.toJSONObject(response);
31087 tejbeer 172
 
31117 tejbeer 173
		TrackingDetailModel tdm = new TrackingDetailModel();
31087 tejbeer 174
 
31117 tejbeer 175
		List<ScannedDetailModel> sdms = new ArrayList<>();
31087 tejbeer 176
 
31117 tejbeer 177
		JSONObject shipmentData = updateJson.getJSONObject("ShipmentData");
178
		JSONObject shipment = shipmentData.getJSONObject("Shipment");
179
		JSONObject scan = shipment.getJSONObject("Scans");
31087 tejbeer 180
 
31117 tejbeer 181
		JSONArray scandetails = scan.getJSONArray("ScanDetail");
31087 tejbeer 182
 
31117 tejbeer 183
		for (int j = 0; j < scandetails.length(); j++) {
184
			JSONObject scanDetail = scandetails.getJSONObject(j);
185
 
186
			ScannedDetailModel sdm = new ScannedDetailModel();
187
			sdm.setStatusDateTime(scanDetail.getString("ScanDate"));
188
			sdm.setStatusLocation(scanDetail.getString("ScannedLocation"));
189
			sdm.setInstruction(scanDetail.getString("Scan"));
190
			sdms.add(sdm);
191
 
192
		}
193
 
194
		tdm.setExpectedDelivery(shipment.getString("ExpectedDeliveryDate"));
31119 tejbeer 195
		tdm.setAwb(shipment.getNumber("WaybillNo").toString());
31117 tejbeer 196
 
197
		tdm.setSdm(sdms);
198
		LOGGER.info("tdm" + tdm);
199
		return tdm;
200
 
31087 tejbeer 201
	}
202
 
29418 tejbeer 203
	@RequestMapping(value = "/order/detail", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
204
	@ApiImplicitParams({
205
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
206
	public ResponseEntity<?> getOrderDetails(HttpServletRequest request, HttpServletResponse response,
29419 tejbeer 207
			@RequestParam String airwayBillNo, @RequestParam int orderId) throws Throwable {
208
 
209
		LOGGER.info("airwayBillNo" + airwayBillNo);
210
		List<Order> orders = null;
211
		if (!airwayBillNo.equals("NaN")) {
212
			orders = orderRepository.selectByAirwayBillNumber(airwayBillNo);
213
		} else {
214
			orders = orderRepository.selectByOrderIds(Arrays.asList(orderId));
215
		}
29418 tejbeer 216
		List<CustomOrder> customOrders = new ArrayList<CustomOrder>();
217
 
218
		for (Order order : orders) {
219
			CustomOrder co = null;
220
 
221
			try {
222
				co = toCustomOrder(order);
223
			} catch (Exception e) {
224
				continue;
225
			}
226
			customOrders.add(co);
227
		}
228
 
229
		return responseSender.ok(customOrders);
230
 
231
	}
232
 
233
	private CustomOrder toCustomOrder(Order order) throws Exception {
234
		CustomOrder co = new CustomOrder();
235
		co.setId(order.getId());
236
		co.setRetailerName(order.getRetailerName());
237
		co.setExpectedDeliveryTime(order.getExpectedDeliveryTime());
238
		co.setPromisedDeliveryTime(order.getPromisedDeliveryTime());
239
		co.setRetailerPinCode(order.getRetailerPinCode());
240
		co.setRetailerAddress1(order.getRetailerAddress1());
241
		co.setRetailerCity(order.getRetailerCity());
242
		co.setStatusDescription(order.getStatusDescription());
243
		co.setStatus(order.getStatus());
244
		co.setBrand(order.getLineItem().getBrand());
245
		co.setTransactionId(order.getTransactionId());
246
		co.setExtraInfo(order.getLineItem().getExtraInfo());
247
		co.setItemId(order.getLineItem().getItemId());
248
		co.setQuantity(order.getLineItem().getQuantity());
249
		co.setTotalAmount(order.getTotalAmount());
250
		co.setColor(order.getLineItem().getColor());
251
		co.setShippingCost(order.getShippingCost());
252
		co.setCreateTimestamp(order.getCreateTimestamp());
253
		co.setModelName(order.getLineItem().getModelName());
254
		co.setModelNumber(order.getLineItem().getModelNumber());
255
		co.setDeliveryTimestamp(order.getDeliveryTimestamp());
256
		co.setImageUrl(getImageUrl(order));
257
		co.setCancellable(getCancellableRequest(order));
258
		co.setProviderId(order.getLogisticsProviderId());
259
		co.setDelayReason(order.getDelayReasonText());
260
		Provider provider = providerRepository.selectById(order.getLogisticsProviderId());
261
		co.setProviderName(provider.getName());
262
		co.setAirwayBillNo(order.getAirwayBillNumber());
263
		co.setCancellationTimestamp(order.getRefundTimestamp());
264
		co.setBillingTimestamp(order.getBillingTimestamp());
265
		co.setShippingTimestamp(order.getShippingTimestamp());
266
		co.setInvoiceNumber(order.getInvoiceNumber());
29420 tejbeer 267
		co.setExpectedShipping(order.getExpectedShippingTime());
29418 tejbeer 268
		if (order.getShippingTimestamp() != null) {
269
			ProviderTat pt = providerTatRepository.selectByProviderId(order.getLogisticsProviderId(),
270
					order.getWarehouseId(), order.getRetailerPinCode());
271
			LocalDateTime shipping = order.getShippingTimestamp();
272
 
273
			LocalDate deliveryTime = logisticsService.calculateDeliveryTimeline(shipping.toLocalDate(), pt, 0);
274
			LOGGER.info("deliveryTime" + deliveryTime);
275
			LocalDateTime expected = order.getExpectedDeliveryTime();
276
			LOGGER.info("expected" + expected);
277
 
278
			long noOfDaysBetween = ChronoUnit.DAYS.between(expected, deliveryTime.atStartOfDay());
279
 
280
			co.setDelayAfterShipping((int) noOfDaysBetween);
281
 
282
		}
29420 tejbeer 283
		TrackingModel tm = new TrackingModel();
284
		if (co.getBillingTimestamp() != null) {
285
			tm.setActualBilling(co.getBillingTimestamp());
286
			tm.setInTransitBilling(false);
287
		} else {
288
			tm.setInTransitBilling(true);
289
		}
29418 tejbeer 290
 
29420 tejbeer 291
		if (co.getShippingTimestamp() != null) {
292
			tm.setActualShipping(co.getShippingTimestamp());
293
			tm.setInTransitShipping(false);
294
		} else {
29422 tejbeer 295
			if (co.getBillingTimestamp() != null) {
296
				co.setExpectedShipping(co.getBillingTimestamp());
297
 
298
				if (LocalDate.now().isAfter(co.getExpectedShipping().toLocalDate())) {
31087 tejbeer 299
					long noOfDaysBetween = ChronoUnit.DAYS.between(co.getExpectedShipping(),
300
							LocalDate.now().atStartOfDay());
29429 tejbeer 301
 
31087 tejbeer 302
					co.setExpectedShipping(co.getBillingTimestamp().plusDays(noOfDaysBetween + 1));
29422 tejbeer 303
				}
304
			}
29420 tejbeer 305
			tm.setExpectedShipping(co.getExpectedShipping());
29421 tejbeer 306
			if (tm.isInTransitBilling()) {
307
				tm.setInTransitShipping(false);
308
			} else {
309
				tm.setInTransitShipping(true);
310
			}
29420 tejbeer 311
		}
312
 
313
		if (co.getDeliveryTimestamp() != null) {
314
			tm.setActualDelivered(co.getDeliveryTimestamp());
315
			tm.setInTransitDelivered(false);
316
		} else {
29423 tejbeer 317
			tm.setExpectedDelivered(co.getExpectedDeliveryTime());
29424 tejbeer 318
			if (tm.isInTransitBilling()) {
29421 tejbeer 319
				tm.setInTransitDelivered(false);
29424 tejbeer 320
			}
321
 
322
			else if (tm.isInTransitShipping()) {
323
				tm.setInTransitDelivered(false);
29421 tejbeer 324
			} else {
325
				tm.setInTransitDelivered(true);
326
			}
29420 tejbeer 327
		}
328
		co.setTrackingModel(tm);
29418 tejbeer 329
		return co;
330
	}
331
 
332
	private String getImageUrl(Order order) throws TException {
333
 
334
		ProductPojo pp = contentPojoPopulator.getShortContent(order.getLineItem().getItem().getCatalogItemId());
335
		String imageUrl = "";
336
		LOGGER.info("pp {}", pp);
337
		if (pp != null) {
338
			imageUrl = pp.getImageUrl();
339
		}
340
 
341
		return imageUrl;
342
	}
343
 
344
	private Boolean getCancellableRequest(Order order) throws Exception {
345
		OrderStatusGroups orderStatusGroups = new OrderStatusGroups();
346
		if (order.isCod() == null) {
347
			throw new Exception("Invalid order");
348
		}
349
		if (order.isCod()) {
350
			if (orderStatusGroups.getCodCancellable().contains(order.getStatus())) {
351
				return true;
352
			} else {
353
				return false;
354
			}
355
		} else {
356
			if (orderStatusGroups.getPrepaidCancellableBeforeBilled().contains(order.getStatus())) {
357
				return true;
358
			} else if (orderStatusGroups.getPrepaidCancellableAfterBilled().contains(order.getStatus())) {
359
				return true;
360
			} else {
361
				return false;
362
			}
363
		}
364
	}
365
 
29349 tejbeer 366
}