Subversion Repositories SmartDukaan

Rev

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