Subversion Repositories SmartDukaan

Rev

Rev 31094 | Rev 31098 | 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()) {
31097 tejbeer 662
				throw new ProfitMandiBusinessException("Upload File", filteredorders,
29250 tejbeer 663
						"Order status should be shipped from warehouse");
664
 
665
			}
666
 
667
			Map<String, List<Order>> airwayBillOrderMap = vorders.stream()
668
					.collect(Collectors.groupingBy(Order::getAirwayBillNumber));
669
 
670
			for (DelayDayModel ddm : delayDayList) {
671
				List<Order> orders = airwayBillOrderMap.get(ddm.getAirwayBIllNumber());
672
 
673
				if (!orders.isEmpty()) {
674
 
675
					Double totalAmount = orders.stream().mapToDouble(x -> x.getTotalAmount()).sum();
676
 
677
					List<String> invoiceNumbers = orders.stream().map(x -> x.getInvoiceNumber())
678
							.collect(Collectors.toList());
679
 
680
					int totalQty = orders.stream().mapToInt(x -> x.getLineItem().getQuantity()).sum();
681
 
682
					Order order = orders.get(0);
683
					ProviderTat pt = providerTatRepository.selectByProviderId(order.getLogisticsProviderId(),
684
							order.getWarehouseId(), order.getRetailerPinCode());
685
 
686
					LocalDate deliveryDate = logisticsService.calculateDeliveryTimeline(
687
							order.getShippingTimestamp().toLocalDate(), pt, ddm.getDelayDay());
688
 
689
					orders.forEach(x -> x.setExpectedDeliveryTime(deliveryDate.atStartOfDay()));
30989 tejbeer 690
 
691
					String title = "Order Update";
692
					String message = String
29250 tejbeer 693
							.format("Dear partner, your items with Invoice Number " + String.join(",", invoiceNumbers)
694
									+ " worth Rs." + totalAmount + " and qty " + totalQty + " has been shipped through "
695
									+ providerRepository.selectById(order.getLogisticsProviderId()).getName()
29381 tejbeer 696
									+ " via your track id " + ddm.getAirwayBIllNumber() + " has been delayed due to "
29250 tejbeer 697
									+ ddm.getReason() + " and will be delivered by "
30989 tejbeer 698
									+ deliveryDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")))
699
							+ ".";
700
 
701
					com.spice.profitmandi.dao.entity.user.User user = userUserRepository
702
							.selectById(order.getRetailerId());
703
 
704
					Address address = addressRepository.selectById(user.getAddressId());
705
 
706
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
707
					sendNotificationModel.setCampaignName("Order Update");
708
					sendNotificationModel.setTitle(title);
709
					sendNotificationModel.setMessage(message);
29250 tejbeer 710
					sendNotificationModel.setType("url");
711
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
712
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
713
					sendNotificationModel.setMessageType(MessageType.notification);
714
					int userId = userAccountRepository.selectUserIdByRetailerId(order.getRetailerId());
715
					sendNotificationModel.setUserIds(Arrays.asList(userId));
716
					notificationService.sendNotification(sendNotificationModel);
30989 tejbeer 717
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
29250 tejbeer 718
				} else {
719
					throw new ProfitMandiBusinessException("Upload File", "",
720
							"No order available for " + ddm.getAirwayBIllNumber() + " airwaybill Number");
721
 
722
				}
723
			}
724
		}
725
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
726
		return "response";
727
 
728
	}
729
 
730
	private DelayDayModel createDelayDay(CSVRecord record) {
731
		DelayDayModel ddm = new DelayDayModel();
732
		ddm.setAirwayBIllNumber(record.get(0));
733
		ddm.setDelayDay(Integer.parseInt(record.get(1)));
734
		ddm.setReason(record.get(2));
735
		return ddm;
736
	}
737
 
738
	@RequestMapping(value = "/downloadMarkDeliveredTemplate", method = RequestMethod.GET)
739
	public ResponseEntity<?> downloadMarkDeliveredTemplate(HttpServletRequest request) throws Exception {
740
		List<List<?>> rows = new ArrayList<>();
741
 
742
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
743
				.getCSVByteStream(Arrays.asList("AirwayBillNumber", "Delivered On", "Delivered By"), rows);
744
 
745
		final HttpHeaders headers = new HttpHeaders();
746
		headers.set("Content-Type", "text/csv");
747
		headers.set("Content-disposition", "inline; filename=mark-delivered-template.csv");
748
		headers.setContentLength(baos.toByteArray().length);
749
 
750
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
751
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
752
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
753
 
754
	}
755
 
756
	@RequestMapping(value = "/markDeliveredFileUpload", method = RequestMethod.POST)
757
	public String markDeliveredFileUpload(HttpServletRequest request, Model model, HttpServletResponse response,
758
			@RequestPart MultipartFile file) throws Throwable {
759
 
29598 tejbeer 760
		List<CSVRecord> records = FileUtil.readFile(file);
29250 tejbeer 761
 
762
		List<MarkDeliveredModel> deliveredList = new ArrayList<>();
763
		for (CSVRecord record : records) {
764
			MarkDeliveredModel ddm = createMarkDeliveredModel(record);
765
			deliveredList.add(ddm);
766
 
767
		}
768
 
769
		if (!deliveredList.isEmpty()) {
770
 
771
			List<Order> vorders = orderRepository.selectByAirwayBillNumber(
772
					deliveredList.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toList()));
773
 
29411 tejbeer 774
			List<Order> filteredorders = vorders.stream().filter(x -> (x.getStatus() != (OrderStatus.SHIPPED_FROM_WH)
29412 tejbeer 775
					&& x.getStatus() != (OrderStatus.DELIVERY_SUCCESS))).collect(Collectors.toList());
29250 tejbeer 776
 
29411 tejbeer 777
			LOGGER.info("filteredOrder" + filteredorders);
778
 
29250 tejbeer 779
			if (!filteredorders.isEmpty()) {
31097 tejbeer 780
				throw new ProfitMandiBusinessException("Upload File", filteredorders,
29250 tejbeer 781
						"Order status should be shipped from warehouse");
782
 
783
			}
784
 
785
			Map<String, List<Order>> airwayBillOrderMap = vorders.stream()
786
					.collect(Collectors.groupingBy(Order::getAirwayBillNumber));
787
 
788
			for (MarkDeliveredModel dl : deliveredList) {
789
 
790
				List<Order> orders = airwayBillOrderMap.get(dl.getAirwayBillNumber());
791
				if (!orders.isEmpty()) {
792
 
793
					for (Order order : orders) {
794
						order.setDeliveryTimestamp(dl.getDeliveredOn());
795
						order.setStatus(OrderStatus.DELIVERY_SUCCESS);
29403 tejbeer 796
						order.setStatusDescription("Order Delivered");
29306 tejbeer 797
 
29250 tejbeer 798
					}
799
 
30989 tejbeer 800
					com.spice.profitmandi.dao.entity.user.User user = userUserRepository
801
							.selectById(orders.get(0).getRetailerId());
802
 
803
					Address address = addressRepository.selectById(user.getAddressId());
804
 
805
					String title = "Order Delivered";
806
 
29250 tejbeer 807
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
808
					sendNotificationModel.setCampaignName("Order Delivered");
30989 tejbeer 809
					sendNotificationModel.setTitle(title);
810
					sendNotificationModel.setMessage(String.format("Dear partner, your SmartDukaan Order "
29250 tejbeer 811
							+ dl.getAirwayBillNumber() + "has been delivered to you in a safe, sealed bag by "
812
							+ dl.getDeliveredBy() + "."));
813
					sendNotificationModel.setType("url");
814
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
815
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
816
					sendNotificationModel.setMessageType(MessageType.notification);
817
					int userId = userAccountRepository.selectUserIdByRetailerId(orders.get(0).getRetailerId());
818
					sendNotificationModel.setUserIds(Arrays.asList(userId));
819
					notificationService.sendNotification(sendNotificationModel);
30989 tejbeer 820
 
821
					String message = String.format("Dear partner, Your SmartDukaan Order " + dl.getAirwayBillNumber()
822
							+ " has been delivered to you in a safe sealed bag.");
823
 
824
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
825
 
29250 tejbeer 826
				} else {
827
					throw new ProfitMandiBusinessException("Upload File", "",
828
							"No order available for " + dl.getAirwayBillNumber() + " airwaybill Number");
829
 
830
				}
831
			}
832
		}
833
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
834
		return "response";
835
 
836
	}
837
 
838
	private MarkDeliveredModel createMarkDeliveredModel(CSVRecord record) {
839
		MarkDeliveredModel mdm = new MarkDeliveredModel();
840
		mdm.setAirwayBillNumber(record.get(0));
29342 tejbeer 841
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
842
		LOGGER.info(record.get(1));
843
		LocalDate dateTime = LocalDate.parse(record.get(1), formatter);
844
		mdm.setDeliveredOn(dateTime.atStartOfDay());
29250 tejbeer 845
		mdm.setDeliveredBy(record.get(2));
846
		return mdm;
847
	}
848
 
29346 tejbeer 849
	@RequestMapping(value = "/delayBillingTemplate", method = RequestMethod.GET)
850
	public ResponseEntity<?> delayBillingTemplate(HttpServletRequest request) throws Exception {
851
		List<List<?>> rows = new ArrayList<>();
29342 tejbeer 852
 
29440 tejbeer 853
		rows.add(Arrays.asList("-",
854
				"Shipment on hold, low invoice value, please ensure order value of minimum Rs. 40,000."));
855
 
856
		rows.add(Arrays.asList("-", "Order Billed,Shipping will be done tomorrow."));
857
 
29346 tejbeer 858
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
859
				.getCSVByteStream(Arrays.asList("Invoice Number", "Reason"), rows);
860
 
861
		final HttpHeaders headers = new HttpHeaders();
862
		headers.set("Content-Type", "text/csv");
863
		headers.set("Content-disposition", "inline; filename=delay-billing-template.csv");
864
		headers.setContentLength(baos.toByteArray().length);
865
 
866
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
867
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
868
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
869
 
870
	}
871
 
872
	@RequestMapping(value = "/getDelayBillingFileUploader", method = RequestMethod.POST)
873
	public String getDelayBillingFileUploader(HttpServletRequest request, Model model, HttpServletResponse response,
874
			@RequestPart MultipartFile file) throws Throwable {
875
 
876
		LOGGER.info("file" + file.toString());
877
		String fileName = file.getName();
878
 
879
		String fileNames = file.getOriginalFilename();
880
 
881
		LOGGER.info("fileName" + fileName);
882
		LOGGER.info("fileNames" + fileNames);
883
 
29598 tejbeer 884
		List<CSVRecord> records = FileUtil.readFile(file);
29346 tejbeer 885
 
886
		List<DelayBillingModel> delayBillingModel = new ArrayList<DelayBillingModel>();
887
		for (CSVRecord record : records) {
888
			DelayBillingModel dbm = new DelayBillingModel();
889
			dbm.setInvoiceNumber(record.get(0));
890
			dbm.setReason(record.get(1));
891
			delayBillingModel.add(dbm);
892
 
893
		}
894
 
895
		if (!delayBillingModel.isEmpty()) {
896
			for (DelayBillingModel delayBilling : delayBillingModel) {
897
 
898
				List<Order> orders = orderRepository.selectByInvoiceNumber(delayBilling.getInvoiceNumber());
899
 
900
				for (Order order : orders) {
901
					order.setDelayReasonText(delayBilling.getReason());
902
 
903
					if (!order.getStatus().equals(OrderStatus.BILLED)) {
904
						throw new ProfitMandiBusinessException("Upload File", "",
905
								"Order" + order.getInvoiceNumber() + "status should be Billed");
906
 
907
					}
908
				}
909
 
910
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
911
				sendNotificationModel.setCampaignName("Order Hold");
912
				sendNotificationModel.setTitle("Order Hold");
29750 tejbeer 913
				sendNotificationModel.setMessage(
914
						String.format("Dear partner, your SmartDukaan order " + delayBilling.getInvoiceNumber()
915
								+ " has been delayed due to" + delayBilling.getReason() + "."));
29346 tejbeer 916
				sendNotificationModel.setType("url");
917
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
918
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
919
				sendNotificationModel.setMessageType(MessageType.notification);
920
				int userId = userAccountRepository.selectUserIdByRetailerId(orders.get(0).getRetailerId());
921
				sendNotificationModel.setUserIds(Arrays.asList(userId));
922
				notificationService.sendNotification(sendNotificationModel);
923
			}
924
		}
925
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
926
 
927
		return "response";
928
	}
929
 
31043 tejbeer 930
	@RequestMapping(value = "/getAwbNumber", method = RequestMethod.GET)
931
	public String getAwbNumber(HttpServletRequest request, Model model) throws Exception {
932
 
933
		List<Order> orders = orderRepository.selectByInvoiceNumber("NSLCK7931");
934
 
31077 tejbeer 935
		// blueDartService.getAirwayBillNo(orders.2);
31043 tejbeer 936
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
937
 
938
		return "response";
939
	}
29222 tejbeer 940
}