Subversion Repositories SmartDukaan

Rev

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