Subversion Repositories SmartDukaan

Rev

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