Subversion Repositories SmartDukaan

Rev

Rev 31098 | Rev 31107 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
29222 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
31043 tejbeer 3
import java.io.ByteArrayInputStream;
4
import java.io.InputStream;
5
import java.time.LocalDate;
6
import java.time.LocalDateTime;
7
import java.time.format.DateTimeFormatter;
8
import java.util.ArrayList;
9
import java.util.Arrays;
10
import java.util.HashMap;
11
import java.util.HashSet;
12
import java.util.List;
13
import java.util.Map;
14
import java.util.Map.Entry;
15
import java.util.Set;
16
import java.util.stream.Collectors;
17
 
18
import javax.servlet.http.HttpServletRequest;
19
import javax.servlet.http.HttpServletResponse;
20
import javax.transaction.Transactional;
21
 
22
import org.apache.commons.csv.CSVRecord;
23
import org.apache.logging.log4j.LogManager;
24
import org.apache.logging.log4j.Logger;
25
import org.json.JSONArray;
26
import org.json.JSONObject;
27
import org.springframework.beans.factory.annotation.Autowired;
28
import org.springframework.core.io.InputStreamResource;
29
import org.springframework.http.HttpHeaders;
30
import org.springframework.http.HttpStatus;
31
import org.springframework.http.ResponseEntity;
32
import org.springframework.stereotype.Controller;
33
import org.springframework.ui.Model;
34
import org.springframework.web.bind.annotation.RequestBody;
35
import org.springframework.web.bind.annotation.RequestMapping;
36
import org.springframework.web.bind.annotation.RequestMethod;
37
import org.springframework.web.bind.annotation.RequestParam;
38
import org.springframework.web.bind.annotation.RequestPart;
39
import org.springframework.web.multipart.MultipartFile;
40
 
29222 tejbeer 41
import com.google.gson.Gson;
42
import com.spice.profitmandi.common.enumuration.MessageType;
43
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
44
import com.spice.profitmandi.common.model.CustomRetailer;
45
import com.spice.profitmandi.common.model.ProfitMandiConstants;
46
import com.spice.profitmandi.common.model.SendNotificationModel;
47
import com.spice.profitmandi.common.util.FileUtil;
48
import com.spice.profitmandi.dao.entity.auth.AuthUser;
49
import com.spice.profitmandi.dao.entity.cs.Position;
50
import com.spice.profitmandi.dao.entity.logistics.Provider;
51
import com.spice.profitmandi.dao.entity.logistics.ProviderDetails;
52
import com.spice.profitmandi.dao.entity.logistics.ProviderTat;
53
import com.spice.profitmandi.dao.entity.logistics.PublicHolidays;
54
import com.spice.profitmandi.dao.entity.transaction.Order;
30989 tejbeer 55
import com.spice.profitmandi.dao.entity.user.Address;
31043 tejbeer 56
import com.spice.profitmandi.dao.model.BilledOrderListModel;
57
import com.spice.profitmandi.dao.model.DelayBillingModel;
58
import com.spice.profitmandi.dao.model.DelayDayModel;
59
import com.spice.profitmandi.dao.model.DispatchNotificationModel;
60
import com.spice.profitmandi.dao.model.MarkDeliveredModel;
61
import com.spice.profitmandi.dao.model.ProviderDetailModel;
62
import com.spice.profitmandi.dao.model.ProviderTatModel;
29222 tejbeer 63
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
64
import com.spice.profitmandi.dao.repository.cs.CsService;
65
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
66
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
67
import com.spice.profitmandi.dao.repository.logistics.ProviderDetailsRepository;
68
import com.spice.profitmandi.dao.repository.logistics.ProviderRepository;
69
import com.spice.profitmandi.dao.repository.logistics.ProviderTatRepository;
70
import com.spice.profitmandi.dao.repository.logistics.PublicHolidaysRepository;
71
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
30989 tejbeer 72
import com.spice.profitmandi.dao.repository.user.AddressRepository;
73
import com.spice.profitmandi.dao.repository.user.UserRepository;
31043 tejbeer 74
import com.spice.profitmandi.dao.service.biuedart.BluedartService;
29222 tejbeer 75
import com.spice.profitmandi.service.LogisticsService;
76
import com.spice.profitmandi.service.NotificationService;
77
import com.spice.profitmandi.web.model.LoginDetails;
78
import com.spice.profitmandi.web.util.CookiesProcessor;
79
import com.spice.profitmandi.web.util.MVCResponseSender;
31043 tejbeer 80
 
29222 tejbeer 81
import in.shop2020.logistics.DeliveryType;
30220 amit.gupta 82
import in.shop2020.logistics.PickUpType;
29222 tejbeer 83
import in.shop2020.model.v1.order.OrderStatus;
84
 
85
@Controller
86
@Transactional(rollbackOn = Throwable.class)
87
public class LogisticsController {
88
 
89
	@Autowired
90
	private OrderRepository orderRepository;
91
 
92
	@Autowired
93
	private ProviderRepository providerRepository;
94
 
95
	@Autowired
96
	private ProviderDetailsRepository providerDetailsRepository;
97
 
98
	@Autowired
99
	private MVCResponseSender mvcResponseSender;
100
 
101
	@Autowired
102
	private ProviderTatRepository providerTatRepository;
103
 
104
	@Autowired
105
	private PublicHolidaysRepository publicHolidaysRepository;
106
 
107
	@Autowired
108
	private LogisticsService logisticsService;
109
 
110
	@Autowired
111
	private UserAccountRepository userAccountRepository;
112
 
113
	@Autowired
114
	private NotificationService notificationService;
115
 
116
	@Autowired
117
	private AuthRepository authRepository;
118
 
119
	@Autowired
120
	private PositionRepository positionRepository;
121
 
122
	@Autowired
123
	private CookiesProcessor cookiesProcessor;
124
 
125
	@Autowired
126
	CsService csService;
127
 
128
	@Autowired
129
	private Gson gson;
130
 
30989 tejbeer 131
	@Autowired
132
	private AddressRepository addressRepository;
133
 
134
	@Autowired
135
	private UserRepository userUserRepository;
136
 
31043 tejbeer 137
	@Autowired
138
	private BluedartService blueDartService;
139
 
29222 tejbeer 140
	private static final Logger LOGGER = LogManager.getLogger(LogisticsController.class);
141
 
142
	@RequestMapping(value = "/logistics", method = RequestMethod.GET)
143
	public String logistics(HttpServletRequest request, Model model) throws Exception {
144
		ProviderTat pt = providerTatRepository.selectByProviderId(1, 7678, "110018");
145
 
146
		return "logistics";
147
 
148
	}
149
 
150
	@RequestMapping(value = "/authorisedWarehouses")
151
	public String authorisedWarehouses(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
152
 
153
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
154
		String email = loginDetails.getEmailId();
155
 
156
		AuthUser authUser = authRepository.selectByEmailOrMobile(email);
157
		List<Position> positions = positionRepository.selectAll(authUser.getId());
158
 
159
		List<Position> warehousePositions = positions.stream()
160
				.filter(x -> x.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_WAREHOUSE)
161
				.collect(Collectors.toList());
162
		Set<CustomRetailer> positionRetailers = new HashSet<>();
163
		csService.getPositionCustomRetailerMap(warehousePositions).values().forEach(customRetailers -> {
164
			positionRetailers.addAll(customRetailers);
165
 
166
		});
167
 
168
		Map<Integer, String> warehouseMap = this.getWarehouses(positionRetailers);
169
		JSONArray response = new JSONArray();
170
 
171
		warehouseMap.keySet().stream().filter(x -> warehouseMap.get(x) != null).forEach(x -> {
172
			response.put(new JSONObject().put("id", x).put("name", warehouseMap.get(x)));
173
		});
174
 
175
		LOGGER.info("response", response.toString());
176
 
177
		model.addAttribute("response", response.toString());
178
 
179
		return "response";
180
	}
181
 
182
	@RequestMapping(value = "/billedOrderFileUploader", method = RequestMethod.POST)
183
	public String getBilledOrderFileUploader(HttpServletRequest request, Model model, HttpServletResponse response,
184
			@RequestPart MultipartFile file) throws Throwable {
185
 
186
		LOGGER.info("file" + file.toString());
187
		String fileName = file.getName();
188
 
189
		String fileNames = file.getOriginalFilename();
190
 
191
		LOGGER.info("fileName" + fileName);
192
		LOGGER.info("fileNames" + fileNames);
193
 
29598 tejbeer 194
		List<CSVRecord> records = FileUtil.readFile(file);
29222 tejbeer 195
 
29250 tejbeer 196
		List<BilledOrderListModel> billedOrderList = new ArrayList<BilledOrderListModel>();
197
		for (CSVRecord record : records) {
198
			BilledOrderListModel blm = createBilleOrder(record);
199
			billedOrderList.add(blm);
200
			LOGGER.info("records" + record.get(1));
201
		}
202
 
29222 tejbeer 203
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
204
		String email = loginDetails.getEmailId();
205
 
206
		AuthUser authUser = authRepository.selectByEmailOrMobile(email);
207
		List<Position> positions = positionRepository.selectAll(authUser.getId());
208
 
209
		List<Position> warehousePositions = positions.stream()
210
				.filter(x -> x.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_WAREHOUSE)
211
				.collect(Collectors.toList());
212
		Set<CustomRetailer> positionRetailers = new HashSet<>();
213
		csService.getPositionCustomRetailerMap(warehousePositions).values().forEach(customRetailers -> {
214
			positionRetailers.addAll(customRetailers);
215
 
216
		});
217
 
218
		LOGGER.info("positionRetailers" + positionRetailers);
219
		List<Integer> fofoIds = new ArrayList<>();
220
		List<Integer> warehouseIds = new ArrayList<>();
221
		if (!positionRetailers.isEmpty()) {
222
			fofoIds.addAll(positionRetailers.stream().map(x -> x.getPartnerId()).collect(Collectors.toList()));
223
 
224
			warehouseIds = this.getWarehouses(positionRetailers).entrySet().stream().map(x -> x.getKey())
225
					.collect(Collectors.toList());
226
 
227
		}
228
 
229
		LOGGER.info("fofoIds" + fofoIds);
230
 
231
		Map<String, DispatchNotificationModel> dispatchNotication = new HashMap<>();
232
 
233
		if (!billedOrderList.isEmpty()) {
234
			List<Order> ords = orderRepository.selectByInvoiceNumbers(
235
					billedOrderList.stream().map(x -> x.getInvoiceNumber()).collect(Collectors.toList()));
236
 
237
			List<Integer> shippingWarehouseIds = ords.stream().map(x -> x.getWarehouseId())
238
					.collect(Collectors.toList());
239
 
240
			if (!warehouseIds.containsAll(shippingWarehouseIds)) {
241
				throw new ProfitMandiBusinessException("Uploaded File", "",
242
						"Partners are not belong to the same warehouse");
243
 
244
			}
245
 
246
			Map<String, Set<Integer>> invoicefofoIdmap = ords.stream().collect(Collectors.groupingBy(
247
					x -> x.getInvoiceNumber(), Collectors.mapping(Order::getRetailerId, Collectors.toSet())));
248
 
29292 tejbeer 249
			LOGGER.info("invoicefofoIdmap" + invoicefofoIdmap);
250
 
29222 tejbeer 251
			Map<String, Set<String>> airbillInvoiceNumberMap = billedOrderList.stream()
252
					.collect(Collectors.groupingBy(x -> x.getAirwayBillNumber(),
253
							Collectors.mapping(BilledOrderListModel::getInvoiceNumber, Collectors.toSet())));
254
 
29292 tejbeer 255
			LOGGER.info("airbillInvoiceNumberMap" + airbillInvoiceNumberMap);
256
 
29222 tejbeer 257
			for (Entry<String, Set<String>> aim : airbillInvoiceNumberMap.entrySet()) {
258
				Set<String> InvoceNumbers = aim.getValue();
259
				Set<Integer> fofoId = new HashSet<>();
260
				for (String InvoceNumber : InvoceNumbers) {
29292 tejbeer 261
					if (invoicefofoIdmap.get(InvoceNumber) != null) {
262
						fofoId.addAll(invoicefofoIdmap.get(InvoceNumber));
263
					}
29222 tejbeer 264
				}
265
				LOGGER.info("fofoId" + fofoId);
266
 
267
				if (fofoId.size() > 1) {
268
					throw new ProfitMandiBusinessException("Uploaded File", "",
269
							"Waybill " + aim.getKey() + " number cannot have invoices with different Retailers");
270
				}
271
			}
272
 
31077 tejbeer 273
			Map<String, List<BilledOrderListModel>> blueDartAirbillBilledOrderMap = billedOrderList.stream()
274
					.filter(x -> x.getLogisticsProviderName().equals("BlueDart"))
275
					.collect(Collectors.groupingBy(x -> x.getAirwayBillNumber(), Collectors.toList()));
276
 
277
			List<BilledOrderListModel> orderList = billedOrderList.stream()
278
					.filter(x -> !x.getLogisticsProviderName().equals("BlueDart")).collect(Collectors.toList());
279
 
280
			if (!blueDartAirbillBilledOrderMap.isEmpty()) {
281
				List<BilledOrderListModel> blueDartorderList = billedOrderList.stream()
282
						.filter(x -> x.getLogisticsProviderName().equals("BlueDart")).collect(Collectors.toList());
283
 
284
				List<Integer> unserviceablePincode = new ArrayList<>();
285
 
286
				for (BilledOrderListModel billedOrder : blueDartorderList) {
287
 
288
					Provider provider = providerRepository.selectByName(billedOrder.getLogisticsProviderName());
289
 
290
					List<Order> orders = orderRepository.selectByInvoiceNumber(billedOrder.getInvoiceNumber());
291
 
292
					for (Order order : orders) {
293
						ProviderTat providerTat = providerTatRepository.selectByProviderId(provider.getId(),
294
								order.getWarehouseId(), order.getRetailerPinCode());
295
						if (providerTat == null) {
296
							unserviceablePincode.add(order.getId());
297
						}
298
					}
299
 
300
				}
301
 
302
				if (!unserviceablePincode.isEmpty()) {
303
					throw new ProfitMandiBusinessException("Uploaded File", "",
304
							"Orders " + unserviceablePincode + " Unserviceable Pincode");
305
 
306
				}
307
 
308
				List<BilledOrderListModel> blueDartOrders = blueDartService
309
						.getAirwayBillNo(blueDartAirbillBilledOrderMap, authUser.getEmailId());
310
 
311
				orderList.addAll(blueDartOrders);
312
			}
313
 
314
			for (BilledOrderListModel bl : orderList) {
29222 tejbeer 315
				List<Order> orders = orderRepository.selectByInvoiceNumber(bl.getInvoiceNumber());
316
 
317
				Provider provider = providerRepository.selectByName(bl.getLogisticsProviderName());
318
 
319
				if (provider == null) {
320
					throw new ProfitMandiBusinessException("Uploaded File", "", "Provider is not Available");
321
				}
322
				if (!orders.isEmpty()) {
29292 tejbeer 323
					dispatchNotication = logisticsService.markedOrderShippedDetail(orders, provider, dispatchNotication,
29222 tejbeer 324
							bl.getAirwayBillNumber());
325
 
326
				} else {
327
					throw new ProfitMandiBusinessException("Uploaded File", "", "No Order Found");
328
				}
329
 
29292 tejbeer 330
				LOGGER.info("dispatchNotication" + dispatchNotication);
331
			}
29222 tejbeer 332
 
29292 tejbeer 333
			if (!dispatchNotication.isEmpty()) {
29222 tejbeer 334
 
29292 tejbeer 335
				for (Entry<String, DispatchNotificationModel> dn : dispatchNotication.entrySet()) {
29222 tejbeer 336
 
29292 tejbeer 337
					Provider pr = providerRepository.selectById(dn.getValue().getProviderId());
29222 tejbeer 338
 
30989 tejbeer 339
					String title = "Order Shipped";
340
 
341
					com.spice.profitmandi.dao.entity.user.User user = userUserRepository
342
							.selectById(dn.getValue().getFofoId());
343
 
344
					Address address = addressRepository.selectById(user.getAddressId());
345
 
29292 tejbeer 346
					Set<String> invoiceNumber = new HashSet<>();
347
					invoiceNumber.addAll(dn.getValue().getInvoiceNumber());
30989 tejbeer 348
 
349
					String message = String.format("Dear partner, your items with Invoice Number "
29292 tejbeer 350
							+ String.join(",", invoiceNumber) + " worth Rs." + dn.getValue().getTotalAmount()
351
							+ " and qty " + dn.getValue().getTotalQty() + " has been shipped through " + pr.getName()
352
							+ " via your track id " + dn.getKey() + " and will be delivered by "
30989 tejbeer 353
							+ dn.getValue().getDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + ".");
354
 
355
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
356
					sendNotificationModel.setCampaignName("Order Shipped");
357
					sendNotificationModel.setTitle(title);
358
					sendNotificationModel.setMessage(message);
29292 tejbeer 359
					sendNotificationModel.setType("url");
360
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
361
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
362
					sendNotificationModel.setMessageType(MessageType.notification);
363
					int userId = userAccountRepository.selectUserIdByRetailerId(dn.getValue().getFofoId());
364
					sendNotificationModel.setUserIds(Arrays.asList(userId));
365
					notificationService.sendNotification(sendNotificationModel);
30989 tejbeer 366
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
29222 tejbeer 367
				}
368
 
369
			}
370
		}
371
 
372
		LOGGER.info("dispatchNotication" + dispatchNotication);
373
		LOGGER.info("billedOrderList" + billedOrderList);
374
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
375
		return "response";
376
 
377
	}
378
 
379
	private BilledOrderListModel createBilleOrder(CSVRecord record) {
380
		BilledOrderListModel bol = new BilledOrderListModel();
381
		bol.setInvoiceNumber(record.get(0));
382
		bol.setLogisticsProviderName(record.get(1));
383
		bol.setAirwayBillNumber(record.get(2));
31077 tejbeer 384
		bol.setWeight(Double.valueOf(record.get(3)));
29222 tejbeer 385
 
386
		return bol;
387
	}
388
 
389
	@RequestMapping(value = "/provider", method = RequestMethod.GET)
390
	public String provider(HttpServletRequest request, Model model) throws Exception {
391
		List<Provider> providers = providerRepository.selectAll();
392
		List<Integer> providerIds = providers.stream().map(x -> x.getId()).collect(Collectors.toList());
393
		Map<Integer, ProviderDetails> providerDetails = providerDetailsRepository
394
				.selectByProviderIds(providerIds, DeliveryType.PREPAID, true).stream()
395
				.collect(Collectors.toMap(x -> x.getProviderId(), x -> x));
396
		model.addAttribute("providers", providers);
397
		model.addAttribute("providerDetails", providerDetails);
398
 
399
		model.addAttribute("deliveryTypes", DeliveryType.values());
400
 
401
		return "provider";
402
 
403
	}
404
 
405
	@RequestMapping(value = "/createProvider", method = RequestMethod.POST)
406
	public String createProvider(HttpServletRequest request, @RequestBody ProviderDetailModel providerDetailModel,
407
			Model model) throws Exception {
408
 
409
		Provider provider = new Provider();
410
		provider.setName(providerDetailModel.getName());
411
		provider.setActive(providerDetailModel.isProvideractive());
412
		provider.setBundleWeightLimit(0);
413
		provider.setGroupShipmentAllowed(true);
30220 amit.gupta 414
		provider.setPickupType(PickUpType.COURIER);
29222 tejbeer 415
		provider.setMaxCODLimit(0);
416
 
417
		providerRepository.persist(provider);
418
 
419
		ProviderDetails pd = new ProviderDetails();
420
		pd.setAccountNo(providerDetailModel.getAccountNo());
421
		pd.setEmail(providerDetailModel.getEmail());
422
		pd.setPhone(providerDetailModel.getMobile());
423
		pd.setProviderId(provider.getId());
424
		pd.setActive(true);
425
		pd.setType(DeliveryType.PREPAID);
426
		providerDetailsRepository.persist(pd);
427
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
428
 
429
		return "response";
430
 
431
	}
432
 
433
	@RequestMapping(value = "/providerTat", method = RequestMethod.GET)
434
	public String providerTat(HttpServletRequest request, Model model) throws Exception {
435
 
436
		List<Provider> providers = providerRepository.selectAll();
437
		model.addAttribute("providers", providers);
438
		return "provider-tat";
439
 
440
	}
441
 
442
	@RequestMapping(value = "/getProviderTat", method = RequestMethod.GET)
443
	public String getProviderTat(HttpServletRequest request, @RequestParam int providerId, Model model)
444
			throws Exception {
445
		List<ProviderTat> providerTat = providerTatRepository.selectByProviderId(providerId);
446
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
447
 
448
		providerTat = providerTat.stream().filter(x -> warehouseMap.containsKey(x.getWarehouseLocation()))
449
				.collect(Collectors.toList());
450
 
451
		Map<Integer, Provider> providerIdMap = new HashMap<>();
452
		Provider provider = providerRepository.selectById(providerId);
453
		providerIdMap.put(provider.getId(), provider);
454
 
455
		LOGGER.info("providerTat" + providerTat);
456
		model.addAttribute("providerTat", providerTat);
457
		model.addAttribute("warehouseMap", warehouseMap);
458
		model.addAttribute("providerIdMap", providerIdMap);
459
 
460
		return "provider-tat-detail";
461
 
462
	}
463
 
464
	@RequestMapping(value = "/providerTatFileUploader", method = RequestMethod.POST)
465
	public String providerTatFileUploader(HttpServletRequest request, Model model, HttpServletResponse response,
466
			@RequestPart MultipartFile file) throws Throwable {
467
 
468
		LOGGER.info("file" + file.toString());
469
		String fileName = file.getName();
470
 
471
		String fileNames = file.getOriginalFilename();
472
 
473
		LOGGER.info("fileName" + fileName);
474
		LOGGER.info("fileNames" + fileNames);
29598 tejbeer 475
		List<CSVRecord> records = FileUtil.readFile(file);
29250 tejbeer 476
 
477
		List<ProviderTatModel> providerTatList = new ArrayList<ProviderTatModel>();
478
		for (CSVRecord record : records) {
479
			ProviderTatModel sgr = createProviderTat(record);
480
			providerTatList.add(sgr);
481
 
482
		}
29222 tejbeer 483
		if (!providerTatList.isEmpty()) {
484
 
485
			for (ProviderTatModel pt : providerTatList) {
486
 
487
				LOGGER.info("ProviderTatModel" + pt);
488
 
489
				Provider provider = providerRepository.selectByName(pt.getProviderName());
490
 
491
				if (provider == null) {
492
					throw new ProfitMandiBusinessException("Uploaded File", "", "Provider is not Available");
493
				}
494
 
495
				Map<String, Integer> warehouseMap = ProfitMandiConstants.WAREHOUSE_NAME_MAP;
496
				ProviderTat providerTat = providerTatRepository.selectByProviderId(provider.getId(),
497
						warehouseMap.get(pt.getWarehouseName()), pt.getPincode());
498
 
499
				LOGGER.info("providerTat" + providerTat);
500
				if (providerTat == null) {
501
					LOGGER.info("providerTat" + providerTat);
502
					providerTat = new ProviderTat();
503
					providerTat.setDestinationPin(pt.getPincode());
504
					providerTat.setProviderId(provider.getId());
505
					providerTat.setWarehouseLocation(warehouseMap.get(pt.getWarehouseName()));
506
					providerTat.setDeliveryTime(pt.getTat());
507
					providerTatRepository.persist(providerTat);
508
				} else {
509
					LOGGER.info("providerTat else" + providerTat);
510
					providerTat.setDeliveryTime(pt.getTat());
511
				}
512
 
513
			}
514
		}
515
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
516
		return "response";
517
 
518
	}
519
 
520
	private ProviderTatModel createProviderTat(CSVRecord record) {
521
		ProviderTatModel ptm = new ProviderTatModel();
522
		ptm.setProviderName(record.get(0));
523
		ptm.setWarehouseName(record.get(1));
524
		ptm.setPincode(record.get(2));
525
		ptm.setTat(Integer.parseInt(record.get(3)));
526
 
527
		return ptm;
528
	}
529
 
530
	@RequestMapping(value = "/publicProviderHolidays", method = RequestMethod.GET)
531
	public String publicProviderHolidays(HttpServletRequest request, Model model) throws Exception {
532
 
533
		List<PublicHolidays> publicHolidays = publicHolidaysRepository
534
				.selectAllByDate(LocalDate.of(LocalDate.now().getYear(), 1, 1));
535
 
536
		model.addAttribute("publicHolidays", publicHolidays);
537
		return "public-provider-holiday";
538
 
539
	}
540
 
541
	@RequestMapping(value = "/createPublicHoliday", method = RequestMethod.POST)
542
	public String createPublicHoliday(HttpServletRequest request, @RequestParam LocalDate date,
543
			@RequestParam String occassion, Model model) throws Exception {
544
 
545
		PublicHolidays ph = new PublicHolidays();
546
		ph.setDate(date);
547
		ph.setHolidayDate(LocalDate.now().atStartOfDay());
548
		ph.setOccasion(occassion);
549
		publicHolidaysRepository.persist(ph);
550
 
551
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
552
		return "response";
553
	}
554
 
555
	@RequestMapping(value = "/downloadUploadShippingTemplate", method = RequestMethod.GET)
556
	public ResponseEntity<?> downloadUploadShippingTemplate(HttpServletRequest request, @RequestParam int warehouseId)
557
			throws Exception {
558
 
559
		List<List<?>> rows = new ArrayList<>();
560
 
561
		List<Order> orders = orderRepository.selectAllByWarehouseAndStatus(warehouseId, OrderStatus.BILLED);
562
 
563
		if (orders.isEmpty()) {
564
			throw new ProfitMandiBusinessException("Template File", "", "No order has been billed");
565
 
566
		}
567
		Set<String> invoiceNumbers = orders.stream().map(x -> x.getInvoiceNumber()).collect(Collectors.toSet());
568
 
31077 tejbeer 569
		for (String invoiceNumber : invoiceNumbers) {
570
			rows.add(Arrays.asList(invoiceNumber));
29222 tejbeer 571
 
572
		}
573
 
574
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
31094 tejbeer 575
				.getCSVByteStream(Arrays.asList("Invoice Number", "Provider", "AWB", "Weight(Kg)"), rows);
29222 tejbeer 576
 
577
		final HttpHeaders headers = new HttpHeaders();
578
		headers.set("Content-Type", "text/csv");
579
		headers.set("Content-disposition", "inline; filename=upload-shipping-template.csv");
580
		headers.setContentLength(baos.toByteArray().length);
581
 
582
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
583
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
584
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
585
 
586
	}
587
 
588
	private Map<Integer, String> getWarehouses(Set<CustomRetailer> positionRetailers) {
589
		Map<Integer, String> warehouses = new HashMap<>();
590
		positionRetailers.stream().forEach(x -> {
591
			if (x.getWarehouseId() != 0) {
592
				warehouses.put(x.getWarehouseId(), ProfitMandiConstants.WAREHOUSE_MAP.get(x.getWarehouseId()));
593
			}
594
		});
595
		return warehouses;
596
 
597
	}
598
 
599
	@RequestMapping(value = "/downloadProviderTatTemplate", method = RequestMethod.GET)
600
	public ResponseEntity<?> downloadProviderTatTemplate(HttpServletRequest request) throws Exception {
601
		List<List<?>> rows = new ArrayList<>();
602
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
603
		for (Entry<Integer, String> warehouse : warehouseMap.entrySet()) {
604
			rows.add(Arrays.asList("Delhivery", warehouse.getValue(), "110018", "-"));
605
		}
606
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
607
				Arrays.asList("Provider Name", "Source Warehouse", "Destination Pincode", "TAT in days"), rows);
608
 
609
		final HttpHeaders headers = new HttpHeaders();
610
		headers.set("Content-Type", "text/csv");
611
		headers.set("Content-disposition", "inline; filename=provider-tat-template.csv");
612
		headers.setContentLength(baos.toByteArray().length);
613
 
614
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
615
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
616
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
617
 
618
	}
619
 
29250 tejbeer 620
	@RequestMapping(value = "/downloadDelayDayTemplate", method = RequestMethod.GET)
621
	public ResponseEntity<?> downloadDelayDayTemplate(HttpServletRequest request) throws Exception {
622
		List<List<?>> rows = new ArrayList<>();
29440 tejbeer 623
		rows.add(Arrays.asList("-", "-", "Vehicle Delay"));
624
		rows.add(Arrays.asList("-", "-", "Vehicle Breakdown"));
29250 tejbeer 625
 
626
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
627
				.getCSVByteStream(Arrays.asList("AirwayBillNumber", "Delay Day", "Reason"), rows);
628
 
629
		final HttpHeaders headers = new HttpHeaders();
630
		headers.set("Content-Type", "text/csv");
631
		headers.set("Content-disposition", "inline; filename=delay-day-template.csv");
632
		headers.setContentLength(baos.toByteArray().length);
633
 
634
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
635
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
636
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
637
 
638
	}
639
 
640
	@RequestMapping(value = "/delayDayFileUpload", method = RequestMethod.POST)
641
	public String delayDayFileUpload(HttpServletRequest request, Model model, HttpServletResponse response,
642
			@RequestPart MultipartFile file) throws Throwable {
643
 
29598 tejbeer 644
		List<CSVRecord> records = FileUtil.readFile(file);
29250 tejbeer 645
 
646
		List<DelayDayModel> delayDayList = new ArrayList<>();
647
		for (CSVRecord record : records) {
648
			DelayDayModel ddm = createDelayDay(record);
649
			delayDayList.add(ddm);
650
 
651
		}
652
 
653
		if (!delayDayList.isEmpty()) {
654
 
655
			List<Order> vorders = orderRepository.selectByAirwayBillNumber(
656
					delayDayList.stream().map(x -> x.getAirwayBIllNumber()).collect(Collectors.toList()));
657
 
29411 tejbeer 658
			List<Order> filteredorders = vorders.stream().filter(x -> x.getStatus() != (OrderStatus.SHIPPED_FROM_WH))
659
					.collect(Collectors.toList());
29250 tejbeer 660
 
661
			if (!filteredorders.isEmpty()) {
31099 tejbeer 662
				throw new ProfitMandiBusinessException("Upload File",
663
						String.join(",",
664
								filteredorders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toList())),
29250 tejbeer 665
						"Order status should be shipped from warehouse");
666
 
667
			}
668
 
669
			Map<String, List<Order>> airwayBillOrderMap = vorders.stream()
670
					.collect(Collectors.groupingBy(Order::getAirwayBillNumber));
671
 
672
			for (DelayDayModel ddm : delayDayList) {
673
				List<Order> orders = airwayBillOrderMap.get(ddm.getAirwayBIllNumber());
674
 
675
				if (!orders.isEmpty()) {
676
 
677
					Double totalAmount = orders.stream().mapToDouble(x -> x.getTotalAmount()).sum();
678
 
679
					List<String> invoiceNumbers = orders.stream().map(x -> x.getInvoiceNumber())
680
							.collect(Collectors.toList());
681
 
682
					int totalQty = orders.stream().mapToInt(x -> x.getLineItem().getQuantity()).sum();
683
 
684
					Order order = orders.get(0);
685
					ProviderTat pt = providerTatRepository.selectByProviderId(order.getLogisticsProviderId(),
686
							order.getWarehouseId(), order.getRetailerPinCode());
687
 
688
					LocalDate deliveryDate = logisticsService.calculateDeliveryTimeline(
689
							order.getShippingTimestamp().toLocalDate(), pt, ddm.getDelayDay());
690
 
691
					orders.forEach(x -> x.setExpectedDeliveryTime(deliveryDate.atStartOfDay()));
30989 tejbeer 692
 
693
					String title = "Order Update";
694
					String message = String
29250 tejbeer 695
							.format("Dear partner, your items with Invoice Number " + String.join(",", invoiceNumbers)
696
									+ " worth Rs." + totalAmount + " and qty " + totalQty + " has been shipped through "
697
									+ providerRepository.selectById(order.getLogisticsProviderId()).getName()
29381 tejbeer 698
									+ " via your track id " + ddm.getAirwayBIllNumber() + " has been delayed due to "
29250 tejbeer 699
									+ ddm.getReason() + " and will be delivered by "
30989 tejbeer 700
									+ deliveryDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")))
701
							+ ".";
702
 
703
					com.spice.profitmandi.dao.entity.user.User user = userUserRepository
704
							.selectById(order.getRetailerId());
705
 
706
					Address address = addressRepository.selectById(user.getAddressId());
707
 
708
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
709
					sendNotificationModel.setCampaignName("Order Update");
710
					sendNotificationModel.setTitle(title);
711
					sendNotificationModel.setMessage(message);
29250 tejbeer 712
					sendNotificationModel.setType("url");
713
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
714
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
715
					sendNotificationModel.setMessageType(MessageType.notification);
716
					int userId = userAccountRepository.selectUserIdByRetailerId(order.getRetailerId());
717
					sendNotificationModel.setUserIds(Arrays.asList(userId));
718
					notificationService.sendNotification(sendNotificationModel);
30989 tejbeer 719
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
29250 tejbeer 720
				} else {
721
					throw new ProfitMandiBusinessException("Upload File", "",
722
							"No order available for " + ddm.getAirwayBIllNumber() + " airwaybill Number");
723
 
724
				}
725
			}
726
		}
727
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
728
		return "response";
729
 
730
	}
731
 
732
	private DelayDayModel createDelayDay(CSVRecord record) {
733
		DelayDayModel ddm = new DelayDayModel();
734
		ddm.setAirwayBIllNumber(record.get(0));
735
		ddm.setDelayDay(Integer.parseInt(record.get(1)));
736
		ddm.setReason(record.get(2));
737
		return ddm;
738
	}
739
 
740
	@RequestMapping(value = "/downloadMarkDeliveredTemplate", method = RequestMethod.GET)
741
	public ResponseEntity<?> downloadMarkDeliveredTemplate(HttpServletRequest request) throws Exception {
742
		List<List<?>> rows = new ArrayList<>();
743
 
744
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
745
				.getCSVByteStream(Arrays.asList("AirwayBillNumber", "Delivered On", "Delivered By"), rows);
746
 
747
		final HttpHeaders headers = new HttpHeaders();
748
		headers.set("Content-Type", "text/csv");
749
		headers.set("Content-disposition", "inline; filename=mark-delivered-template.csv");
750
		headers.setContentLength(baos.toByteArray().length);
751
 
752
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
753
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
754
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
755
 
756
	}
757
 
758
	@RequestMapping(value = "/markDeliveredFileUpload", method = RequestMethod.POST)
759
	public String markDeliveredFileUpload(HttpServletRequest request, Model model, HttpServletResponse response,
760
			@RequestPart MultipartFile file) throws Throwable {
761
 
29598 tejbeer 762
		List<CSVRecord> records = FileUtil.readFile(file);
29250 tejbeer 763
 
764
		List<MarkDeliveredModel> deliveredList = new ArrayList<>();
765
		for (CSVRecord record : records) {
766
			MarkDeliveredModel ddm = createMarkDeliveredModel(record);
767
			deliveredList.add(ddm);
768
 
769
		}
770
 
771
		if (!deliveredList.isEmpty()) {
772
 
773
			List<Order> vorders = orderRepository.selectByAirwayBillNumber(
774
					deliveredList.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toList()));
775
 
29411 tejbeer 776
			List<Order> filteredorders = vorders.stream().filter(x -> (x.getStatus() != (OrderStatus.SHIPPED_FROM_WH)
29412 tejbeer 777
					&& x.getStatus() != (OrderStatus.DELIVERY_SUCCESS))).collect(Collectors.toList());
29250 tejbeer 778
 
29411 tejbeer 779
			LOGGER.info("filteredOrder" + filteredorders);
780
 
29250 tejbeer 781
			if (!filteredorders.isEmpty()) {
31098 tejbeer 782
				throw new ProfitMandiBusinessException("Upload File",
783
						String.join(",",
784
								filteredorders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toList())),
29250 tejbeer 785
						"Order status should be shipped from warehouse");
786
 
787
			}
788
 
789
			Map<String, List<Order>> airwayBillOrderMap = vorders.stream()
790
					.collect(Collectors.groupingBy(Order::getAirwayBillNumber));
791
 
792
			for (MarkDeliveredModel dl : deliveredList) {
793
 
794
				List<Order> orders = airwayBillOrderMap.get(dl.getAirwayBillNumber());
795
				if (!orders.isEmpty()) {
796
 
797
					for (Order order : orders) {
798
						order.setDeliveryTimestamp(dl.getDeliveredOn());
799
						order.setStatus(OrderStatus.DELIVERY_SUCCESS);
29403 tejbeer 800
						order.setStatusDescription("Order Delivered");
29306 tejbeer 801
 
29250 tejbeer 802
					}
803
 
30989 tejbeer 804
					com.spice.profitmandi.dao.entity.user.User user = userUserRepository
805
							.selectById(orders.get(0).getRetailerId());
806
 
807
					Address address = addressRepository.selectById(user.getAddressId());
808
 
809
					String title = "Order Delivered";
810
 
29250 tejbeer 811
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
812
					sendNotificationModel.setCampaignName("Order Delivered");
30989 tejbeer 813
					sendNotificationModel.setTitle(title);
814
					sendNotificationModel.setMessage(String.format("Dear partner, your SmartDukaan Order "
29250 tejbeer 815
							+ dl.getAirwayBillNumber() + "has been delivered to you in a safe, sealed bag by "
816
							+ dl.getDeliveredBy() + "."));
817
					sendNotificationModel.setType("url");
818
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
819
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
820
					sendNotificationModel.setMessageType(MessageType.notification);
821
					int userId = userAccountRepository.selectUserIdByRetailerId(orders.get(0).getRetailerId());
822
					sendNotificationModel.setUserIds(Arrays.asList(userId));
823
					notificationService.sendNotification(sendNotificationModel);
30989 tejbeer 824
 
825
					String message = String.format("Dear partner, Your SmartDukaan Order " + dl.getAirwayBillNumber()
826
							+ " has been delivered to you in a safe sealed bag.");
827
 
828
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
829
 
29250 tejbeer 830
				} else {
831
					throw new ProfitMandiBusinessException("Upload File", "",
832
							"No order available for " + dl.getAirwayBillNumber() + " airwaybill Number");
833
 
834
				}
835
			}
836
		}
837
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
838
		return "response";
839
 
840
	}
841
 
842
	private MarkDeliveredModel createMarkDeliveredModel(CSVRecord record) {
843
		MarkDeliveredModel mdm = new MarkDeliveredModel();
844
		mdm.setAirwayBillNumber(record.get(0));
29342 tejbeer 845
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
846
		LOGGER.info(record.get(1));
847
		LocalDate dateTime = LocalDate.parse(record.get(1), formatter);
848
		mdm.setDeliveredOn(dateTime.atStartOfDay());
29250 tejbeer 849
		mdm.setDeliveredBy(record.get(2));
850
		return mdm;
851
	}
852
 
29346 tejbeer 853
	@RequestMapping(value = "/delayBillingTemplate", method = RequestMethod.GET)
854
	public ResponseEntity<?> delayBillingTemplate(HttpServletRequest request) throws Exception {
855
		List<List<?>> rows = new ArrayList<>();
29342 tejbeer 856
 
29440 tejbeer 857
		rows.add(Arrays.asList("-",
858
				"Shipment on hold, low invoice value, please ensure order value of minimum Rs. 40,000."));
859
 
860
		rows.add(Arrays.asList("-", "Order Billed,Shipping will be done tomorrow."));
861
 
29346 tejbeer 862
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
863
				.getCSVByteStream(Arrays.asList("Invoice Number", "Reason"), rows);
864
 
865
		final HttpHeaders headers = new HttpHeaders();
866
		headers.set("Content-Type", "text/csv");
867
		headers.set("Content-disposition", "inline; filename=delay-billing-template.csv");
868
		headers.setContentLength(baos.toByteArray().length);
869
 
870
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
871
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
872
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
873
 
874
	}
875
 
876
	@RequestMapping(value = "/getDelayBillingFileUploader", method = RequestMethod.POST)
877
	public String getDelayBillingFileUploader(HttpServletRequest request, Model model, HttpServletResponse response,
878
			@RequestPart MultipartFile file) throws Throwable {
879
 
880
		LOGGER.info("file" + file.toString());
881
		String fileName = file.getName();
882
 
883
		String fileNames = file.getOriginalFilename();
884
 
885
		LOGGER.info("fileName" + fileName);
886
		LOGGER.info("fileNames" + fileNames);
887
 
29598 tejbeer 888
		List<CSVRecord> records = FileUtil.readFile(file);
29346 tejbeer 889
 
890
		List<DelayBillingModel> delayBillingModel = new ArrayList<DelayBillingModel>();
891
		for (CSVRecord record : records) {
892
			DelayBillingModel dbm = new DelayBillingModel();
893
			dbm.setInvoiceNumber(record.get(0));
894
			dbm.setReason(record.get(1));
895
			delayBillingModel.add(dbm);
896
 
897
		}
898
 
899
		if (!delayBillingModel.isEmpty()) {
900
			for (DelayBillingModel delayBilling : delayBillingModel) {
901
 
902
				List<Order> orders = orderRepository.selectByInvoiceNumber(delayBilling.getInvoiceNumber());
903
 
904
				for (Order order : orders) {
905
					order.setDelayReasonText(delayBilling.getReason());
906
 
907
					if (!order.getStatus().equals(OrderStatus.BILLED)) {
908
						throw new ProfitMandiBusinessException("Upload File", "",
909
								"Order" + order.getInvoiceNumber() + "status should be Billed");
910
 
911
					}
912
				}
913
 
914
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
915
				sendNotificationModel.setCampaignName("Order Hold");
916
				sendNotificationModel.setTitle("Order Hold");
29750 tejbeer 917
				sendNotificationModel.setMessage(
918
						String.format("Dear partner, your SmartDukaan order " + delayBilling.getInvoiceNumber()
919
								+ " has been delayed due to" + delayBilling.getReason() + "."));
29346 tejbeer 920
				sendNotificationModel.setType("url");
921
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
922
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
923
				sendNotificationModel.setMessageType(MessageType.notification);
924
				int userId = userAccountRepository.selectUserIdByRetailerId(orders.get(0).getRetailerId());
925
				sendNotificationModel.setUserIds(Arrays.asList(userId));
926
				notificationService.sendNotification(sendNotificationModel);
927
			}
928
		}
929
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
930
 
931
		return "response";
932
	}
933
 
31043 tejbeer 934
	@RequestMapping(value = "/getAwbNumber", method = RequestMethod.GET)
935
	public String getAwbNumber(HttpServletRequest request, Model model) throws Exception {
936
 
937
		List<Order> orders = orderRepository.selectByInvoiceNumber("NSLCK7931");
938
 
31077 tejbeer 939
		// blueDartService.getAirwayBillNo(orders.2);
31043 tejbeer 940
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
941
 
942
		return "response";
943
	}
29222 tejbeer 944
}