Subversion Repositories SmartDukaan

Rev

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