Subversion Repositories SmartDukaan

Rev

Rev 30989 | Rev 31077 | 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
 
273
			for (BilledOrderListModel bl : billedOrderList) {
274
				List<Order> orders = orderRepository.selectByInvoiceNumber(bl.getInvoiceNumber());
275
 
276
				Provider provider = providerRepository.selectByName(bl.getLogisticsProviderName());
277
 
278
				if (provider == null) {
279
					throw new ProfitMandiBusinessException("Uploaded File", "", "Provider is not Available");
280
				}
281
				if (!orders.isEmpty()) {
29292 tejbeer 282
					dispatchNotication = logisticsService.markedOrderShippedDetail(orders, provider, dispatchNotication,
29222 tejbeer 283
							bl.getAirwayBillNumber());
284
 
285
				} else {
286
					throw new ProfitMandiBusinessException("Uploaded File", "", "No Order Found");
287
				}
288
 
29292 tejbeer 289
				LOGGER.info("dispatchNotication" + dispatchNotication);
290
			}
29222 tejbeer 291
 
29292 tejbeer 292
			if (!dispatchNotication.isEmpty()) {
29222 tejbeer 293
 
29292 tejbeer 294
				for (Entry<String, DispatchNotificationModel> dn : dispatchNotication.entrySet()) {
29222 tejbeer 295
 
29292 tejbeer 296
					Provider pr = providerRepository.selectById(dn.getValue().getProviderId());
29222 tejbeer 297
 
30989 tejbeer 298
					String title = "Order Shipped";
299
 
300
					com.spice.profitmandi.dao.entity.user.User user = userUserRepository
301
							.selectById(dn.getValue().getFofoId());
302
 
303
					Address address = addressRepository.selectById(user.getAddressId());
304
 
29292 tejbeer 305
					Set<String> invoiceNumber = new HashSet<>();
306
					invoiceNumber.addAll(dn.getValue().getInvoiceNumber());
30989 tejbeer 307
 
308
					String message = String.format("Dear partner, your items with Invoice Number "
29292 tejbeer 309
							+ String.join(",", invoiceNumber) + " worth Rs." + dn.getValue().getTotalAmount()
310
							+ " and qty " + dn.getValue().getTotalQty() + " has been shipped through " + pr.getName()
311
							+ " via your track id " + dn.getKey() + " and will be delivered by "
30989 tejbeer 312
							+ dn.getValue().getDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + ".");
313
 
314
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
315
					sendNotificationModel.setCampaignName("Order Shipped");
316
					sendNotificationModel.setTitle(title);
317
					sendNotificationModel.setMessage(message);
29292 tejbeer 318
					sendNotificationModel.setType("url");
319
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
320
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
321
					sendNotificationModel.setMessageType(MessageType.notification);
322
					int userId = userAccountRepository.selectUserIdByRetailerId(dn.getValue().getFofoId());
323
					sendNotificationModel.setUserIds(Arrays.asList(userId));
324
					notificationService.sendNotification(sendNotificationModel);
30989 tejbeer 325
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
29222 tejbeer 326
				}
327
 
328
			}
329
		}
330
 
331
		LOGGER.info("dispatchNotication" + dispatchNotication);
332
		LOGGER.info("billedOrderList" + billedOrderList);
333
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
334
		return "response";
335
 
336
	}
337
 
338
	private BilledOrderListModel createBilleOrder(CSVRecord record) {
339
		BilledOrderListModel bol = new BilledOrderListModel();
340
		bol.setInvoiceNumber(record.get(0));
341
		bol.setLogisticsProviderName(record.get(1));
342
		bol.setAirwayBillNumber(record.get(2));
343
 
344
		return bol;
345
	}
346
 
347
	@RequestMapping(value = "/provider", method = RequestMethod.GET)
348
	public String provider(HttpServletRequest request, Model model) throws Exception {
349
		List<Provider> providers = providerRepository.selectAll();
350
		List<Integer> providerIds = providers.stream().map(x -> x.getId()).collect(Collectors.toList());
351
		Map<Integer, ProviderDetails> providerDetails = providerDetailsRepository
352
				.selectByProviderIds(providerIds, DeliveryType.PREPAID, true).stream()
353
				.collect(Collectors.toMap(x -> x.getProviderId(), x -> x));
354
		model.addAttribute("providers", providers);
355
		model.addAttribute("providerDetails", providerDetails);
356
 
357
		model.addAttribute("deliveryTypes", DeliveryType.values());
358
 
359
		return "provider";
360
 
361
	}
362
 
363
	@RequestMapping(value = "/createProvider", method = RequestMethod.POST)
364
	public String createProvider(HttpServletRequest request, @RequestBody ProviderDetailModel providerDetailModel,
365
			Model model) throws Exception {
366
 
367
		Provider provider = new Provider();
368
		provider.setName(providerDetailModel.getName());
369
		provider.setActive(providerDetailModel.isProvideractive());
370
		provider.setBundleWeightLimit(0);
371
		provider.setGroupShipmentAllowed(true);
30220 amit.gupta 372
		provider.setPickupType(PickUpType.COURIER);
29222 tejbeer 373
		provider.setMaxCODLimit(0);
374
 
375
		providerRepository.persist(provider);
376
 
377
		ProviderDetails pd = new ProviderDetails();
378
		pd.setAccountNo(providerDetailModel.getAccountNo());
379
		pd.setEmail(providerDetailModel.getEmail());
380
		pd.setPhone(providerDetailModel.getMobile());
381
		pd.setProviderId(provider.getId());
382
		pd.setActive(true);
383
		pd.setType(DeliveryType.PREPAID);
384
		providerDetailsRepository.persist(pd);
385
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
386
 
387
		return "response";
388
 
389
	}
390
 
391
	@RequestMapping(value = "/providerTat", method = RequestMethod.GET)
392
	public String providerTat(HttpServletRequest request, Model model) throws Exception {
393
 
394
		List<Provider> providers = providerRepository.selectAll();
395
		model.addAttribute("providers", providers);
396
		return "provider-tat";
397
 
398
	}
399
 
400
	@RequestMapping(value = "/getProviderTat", method = RequestMethod.GET)
401
	public String getProviderTat(HttpServletRequest request, @RequestParam int providerId, Model model)
402
			throws Exception {
403
		List<ProviderTat> providerTat = providerTatRepository.selectByProviderId(providerId);
404
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
405
 
406
		providerTat = providerTat.stream().filter(x -> warehouseMap.containsKey(x.getWarehouseLocation()))
407
				.collect(Collectors.toList());
408
 
409
		Map<Integer, Provider> providerIdMap = new HashMap<>();
410
		Provider provider = providerRepository.selectById(providerId);
411
		providerIdMap.put(provider.getId(), provider);
412
 
413
		LOGGER.info("providerTat" + providerTat);
414
		model.addAttribute("providerTat", providerTat);
415
		model.addAttribute("warehouseMap", warehouseMap);
416
		model.addAttribute("providerIdMap", providerIdMap);
417
 
418
		return "provider-tat-detail";
419
 
420
	}
421
 
422
	@RequestMapping(value = "/providerTatFileUploader", method = RequestMethod.POST)
423
	public String providerTatFileUploader(HttpServletRequest request, Model model, HttpServletResponse response,
424
			@RequestPart MultipartFile file) throws Throwable {
425
 
426
		LOGGER.info("file" + file.toString());
427
		String fileName = file.getName();
428
 
429
		String fileNames = file.getOriginalFilename();
430
 
431
		LOGGER.info("fileName" + fileName);
432
		LOGGER.info("fileNames" + fileNames);
29598 tejbeer 433
		List<CSVRecord> records = FileUtil.readFile(file);
29250 tejbeer 434
 
435
		List<ProviderTatModel> providerTatList = new ArrayList<ProviderTatModel>();
436
		for (CSVRecord record : records) {
437
			ProviderTatModel sgr = createProviderTat(record);
438
			providerTatList.add(sgr);
439
 
440
		}
29222 tejbeer 441
		if (!providerTatList.isEmpty()) {
442
 
443
			for (ProviderTatModel pt : providerTatList) {
444
 
445
				LOGGER.info("ProviderTatModel" + pt);
446
 
447
				Provider provider = providerRepository.selectByName(pt.getProviderName());
448
 
449
				if (provider == null) {
450
					throw new ProfitMandiBusinessException("Uploaded File", "", "Provider is not Available");
451
				}
452
 
453
				Map<String, Integer> warehouseMap = ProfitMandiConstants.WAREHOUSE_NAME_MAP;
454
				ProviderTat providerTat = providerTatRepository.selectByProviderId(provider.getId(),
455
						warehouseMap.get(pt.getWarehouseName()), pt.getPincode());
456
 
457
				LOGGER.info("providerTat" + providerTat);
458
				if (providerTat == null) {
459
					LOGGER.info("providerTat" + providerTat);
460
					providerTat = new ProviderTat();
461
					providerTat.setDestinationPin(pt.getPincode());
462
					providerTat.setProviderId(provider.getId());
463
					providerTat.setWarehouseLocation(warehouseMap.get(pt.getWarehouseName()));
464
					providerTat.setDeliveryTime(pt.getTat());
465
					providerTatRepository.persist(providerTat);
466
				} else {
467
					LOGGER.info("providerTat else" + providerTat);
468
					providerTat.setDeliveryTime(pt.getTat());
469
				}
470
 
471
			}
472
		}
473
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
474
		return "response";
475
 
476
	}
477
 
478
	private ProviderTatModel createProviderTat(CSVRecord record) {
479
		ProviderTatModel ptm = new ProviderTatModel();
480
		ptm.setProviderName(record.get(0));
481
		ptm.setWarehouseName(record.get(1));
482
		ptm.setPincode(record.get(2));
483
		ptm.setTat(Integer.parseInt(record.get(3)));
484
 
485
		return ptm;
486
	}
487
 
488
	@RequestMapping(value = "/publicProviderHolidays", method = RequestMethod.GET)
489
	public String publicProviderHolidays(HttpServletRequest request, Model model) throws Exception {
490
 
491
		List<PublicHolidays> publicHolidays = publicHolidaysRepository
492
				.selectAllByDate(LocalDate.of(LocalDate.now().getYear(), 1, 1));
493
 
494
		model.addAttribute("publicHolidays", publicHolidays);
495
		return "public-provider-holiday";
496
 
497
	}
498
 
499
	@RequestMapping(value = "/createPublicHoliday", method = RequestMethod.POST)
500
	public String createPublicHoliday(HttpServletRequest request, @RequestParam LocalDate date,
501
			@RequestParam String occassion, Model model) throws Exception {
502
 
503
		PublicHolidays ph = new PublicHolidays();
504
		ph.setDate(date);
505
		ph.setHolidayDate(LocalDate.now().atStartOfDay());
506
		ph.setOccasion(occassion);
507
		publicHolidaysRepository.persist(ph);
508
 
509
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
510
		return "response";
511
	}
512
 
513
	@RequestMapping(value = "/downloadUploadShippingTemplate", method = RequestMethod.GET)
514
	public ResponseEntity<?> downloadUploadShippingTemplate(HttpServletRequest request, @RequestParam int warehouseId)
515
			throws Exception {
516
 
517
		List<List<?>> rows = new ArrayList<>();
518
 
519
		List<Order> orders = orderRepository.selectAllByWarehouseAndStatus(warehouseId, OrderStatus.BILLED);
520
 
521
		if (orders.isEmpty()) {
522
			throw new ProfitMandiBusinessException("Template File", "", "No order has been billed");
523
 
524
		}
525
		Set<String> invoiceNumbers = orders.stream().map(x -> x.getInvoiceNumber()).collect(Collectors.toSet());
526
 
527
		for (String invoicdNumber : invoiceNumbers) {
528
			rows.add(Arrays.asList(invoicdNumber));
529
 
530
		}
531
 
532
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
533
				.getCSVByteStream(Arrays.asList("Invoice Number", "Provider", "AWB"), rows);
534
 
535
		final HttpHeaders headers = new HttpHeaders();
536
		headers.set("Content-Type", "text/csv");
537
		headers.set("Content-disposition", "inline; filename=upload-shipping-template.csv");
538
		headers.setContentLength(baos.toByteArray().length);
539
 
540
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
541
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
542
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
543
 
544
	}
545
 
546
	private Map<Integer, String> getWarehouses(Set<CustomRetailer> positionRetailers) {
547
		Map<Integer, String> warehouses = new HashMap<>();
548
		positionRetailers.stream().forEach(x -> {
549
			if (x.getWarehouseId() != 0) {
550
				warehouses.put(x.getWarehouseId(), ProfitMandiConstants.WAREHOUSE_MAP.get(x.getWarehouseId()));
551
			}
552
		});
553
		return warehouses;
554
 
555
	}
556
 
557
	@RequestMapping(value = "/downloadProviderTatTemplate", method = RequestMethod.GET)
558
	public ResponseEntity<?> downloadProviderTatTemplate(HttpServletRequest request) throws Exception {
559
		List<List<?>> rows = new ArrayList<>();
560
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
561
		for (Entry<Integer, String> warehouse : warehouseMap.entrySet()) {
562
			rows.add(Arrays.asList("Delhivery", warehouse.getValue(), "110018", "-"));
563
		}
564
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
565
				Arrays.asList("Provider Name", "Source Warehouse", "Destination Pincode", "TAT in days"), rows);
566
 
567
		final HttpHeaders headers = new HttpHeaders();
568
		headers.set("Content-Type", "text/csv");
569
		headers.set("Content-disposition", "inline; filename=provider-tat-template.csv");
570
		headers.setContentLength(baos.toByteArray().length);
571
 
572
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
573
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
574
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
575
 
576
	}
577
 
29250 tejbeer 578
	@RequestMapping(value = "/downloadDelayDayTemplate", method = RequestMethod.GET)
579
	public ResponseEntity<?> downloadDelayDayTemplate(HttpServletRequest request) throws Exception {
580
		List<List<?>> rows = new ArrayList<>();
29440 tejbeer 581
		rows.add(Arrays.asList("-", "-", "Vehicle Delay"));
582
		rows.add(Arrays.asList("-", "-", "Vehicle Breakdown"));
29250 tejbeer 583
 
584
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
585
				.getCSVByteStream(Arrays.asList("AirwayBillNumber", "Delay Day", "Reason"), rows);
586
 
587
		final HttpHeaders headers = new HttpHeaders();
588
		headers.set("Content-Type", "text/csv");
589
		headers.set("Content-disposition", "inline; filename=delay-day-template.csv");
590
		headers.setContentLength(baos.toByteArray().length);
591
 
592
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
593
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
594
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
595
 
596
	}
597
 
598
	@RequestMapping(value = "/delayDayFileUpload", method = RequestMethod.POST)
599
	public String delayDayFileUpload(HttpServletRequest request, Model model, HttpServletResponse response,
600
			@RequestPart MultipartFile file) throws Throwable {
601
 
29598 tejbeer 602
		List<CSVRecord> records = FileUtil.readFile(file);
29250 tejbeer 603
 
604
		List<DelayDayModel> delayDayList = new ArrayList<>();
605
		for (CSVRecord record : records) {
606
			DelayDayModel ddm = createDelayDay(record);
607
			delayDayList.add(ddm);
608
 
609
		}
610
 
611
		if (!delayDayList.isEmpty()) {
612
 
613
			List<Order> vorders = orderRepository.selectByAirwayBillNumber(
614
					delayDayList.stream().map(x -> x.getAirwayBIllNumber()).collect(Collectors.toList()));
615
 
29411 tejbeer 616
			List<Order> filteredorders = vorders.stream().filter(x -> x.getStatus() != (OrderStatus.SHIPPED_FROM_WH))
617
					.collect(Collectors.toList());
29250 tejbeer 618
 
619
			if (!filteredorders.isEmpty()) {
620
				throw new ProfitMandiBusinessException("Upload File", "",
621
						"Order status should be shipped from warehouse");
622
 
623
			}
624
 
625
			Map<String, List<Order>> airwayBillOrderMap = vorders.stream()
626
					.collect(Collectors.groupingBy(Order::getAirwayBillNumber));
627
 
628
			for (DelayDayModel ddm : delayDayList) {
629
				List<Order> orders = airwayBillOrderMap.get(ddm.getAirwayBIllNumber());
630
 
631
				if (!orders.isEmpty()) {
632
 
633
					Double totalAmount = orders.stream().mapToDouble(x -> x.getTotalAmount()).sum();
634
 
635
					List<String> invoiceNumbers = orders.stream().map(x -> x.getInvoiceNumber())
636
							.collect(Collectors.toList());
637
 
638
					int totalQty = orders.stream().mapToInt(x -> x.getLineItem().getQuantity()).sum();
639
 
640
					Order order = orders.get(0);
641
					ProviderTat pt = providerTatRepository.selectByProviderId(order.getLogisticsProviderId(),
642
							order.getWarehouseId(), order.getRetailerPinCode());
643
 
644
					LocalDate deliveryDate = logisticsService.calculateDeliveryTimeline(
645
							order.getShippingTimestamp().toLocalDate(), pt, ddm.getDelayDay());
646
 
647
					orders.forEach(x -> x.setExpectedDeliveryTime(deliveryDate.atStartOfDay()));
30989 tejbeer 648
 
649
					String title = "Order Update";
650
					String message = String
29250 tejbeer 651
							.format("Dear partner, your items with Invoice Number " + String.join(",", invoiceNumbers)
652
									+ " worth Rs." + totalAmount + " and qty " + totalQty + " has been shipped through "
653
									+ providerRepository.selectById(order.getLogisticsProviderId()).getName()
29381 tejbeer 654
									+ " via your track id " + ddm.getAirwayBIllNumber() + " has been delayed due to "
29250 tejbeer 655
									+ ddm.getReason() + " and will be delivered by "
30989 tejbeer 656
									+ deliveryDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")))
657
							+ ".";
658
 
659
					com.spice.profitmandi.dao.entity.user.User user = userUserRepository
660
							.selectById(order.getRetailerId());
661
 
662
					Address address = addressRepository.selectById(user.getAddressId());
663
 
664
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
665
					sendNotificationModel.setCampaignName("Order Update");
666
					sendNotificationModel.setTitle(title);
667
					sendNotificationModel.setMessage(message);
29250 tejbeer 668
					sendNotificationModel.setType("url");
669
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
670
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
671
					sendNotificationModel.setMessageType(MessageType.notification);
672
					int userId = userAccountRepository.selectUserIdByRetailerId(order.getRetailerId());
673
					sendNotificationModel.setUserIds(Arrays.asList(userId));
674
					notificationService.sendNotification(sendNotificationModel);
30989 tejbeer 675
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
29250 tejbeer 676
				} else {
677
					throw new ProfitMandiBusinessException("Upload File", "",
678
							"No order available for " + ddm.getAirwayBIllNumber() + " airwaybill Number");
679
 
680
				}
681
			}
682
		}
683
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
684
		return "response";
685
 
686
	}
687
 
688
	private DelayDayModel createDelayDay(CSVRecord record) {
689
		DelayDayModel ddm = new DelayDayModel();
690
		ddm.setAirwayBIllNumber(record.get(0));
691
		ddm.setDelayDay(Integer.parseInt(record.get(1)));
692
		ddm.setReason(record.get(2));
693
		return ddm;
694
	}
695
 
696
	@RequestMapping(value = "/downloadMarkDeliveredTemplate", method = RequestMethod.GET)
697
	public ResponseEntity<?> downloadMarkDeliveredTemplate(HttpServletRequest request) throws Exception {
698
		List<List<?>> rows = new ArrayList<>();
699
 
700
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
701
				.getCSVByteStream(Arrays.asList("AirwayBillNumber", "Delivered On", "Delivered By"), rows);
702
 
703
		final HttpHeaders headers = new HttpHeaders();
704
		headers.set("Content-Type", "text/csv");
705
		headers.set("Content-disposition", "inline; filename=mark-delivered-template.csv");
706
		headers.setContentLength(baos.toByteArray().length);
707
 
708
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
709
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
710
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
711
 
712
	}
713
 
714
	@RequestMapping(value = "/markDeliveredFileUpload", method = RequestMethod.POST)
715
	public String markDeliveredFileUpload(HttpServletRequest request, Model model, HttpServletResponse response,
716
			@RequestPart MultipartFile file) throws Throwable {
717
 
29598 tejbeer 718
		List<CSVRecord> records = FileUtil.readFile(file);
29250 tejbeer 719
 
720
		List<MarkDeliveredModel> deliveredList = new ArrayList<>();
721
		for (CSVRecord record : records) {
722
			MarkDeliveredModel ddm = createMarkDeliveredModel(record);
723
			deliveredList.add(ddm);
724
 
725
		}
726
 
727
		if (!deliveredList.isEmpty()) {
728
 
729
			List<Order> vorders = orderRepository.selectByAirwayBillNumber(
730
					deliveredList.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toList()));
731
 
29411 tejbeer 732
			List<Order> filteredorders = vorders.stream().filter(x -> (x.getStatus() != (OrderStatus.SHIPPED_FROM_WH)
29412 tejbeer 733
					&& x.getStatus() != (OrderStatus.DELIVERY_SUCCESS))).collect(Collectors.toList());
29250 tejbeer 734
 
29411 tejbeer 735
			LOGGER.info("filteredOrder" + filteredorders);
736
 
29250 tejbeer 737
			if (!filteredorders.isEmpty()) {
738
				throw new ProfitMandiBusinessException("Upload File", "",
739
						"Order status should be shipped from warehouse");
740
 
741
			}
742
 
743
			Map<String, List<Order>> airwayBillOrderMap = vorders.stream()
744
					.collect(Collectors.groupingBy(Order::getAirwayBillNumber));
745
 
746
			for (MarkDeliveredModel dl : deliveredList) {
747
 
748
				List<Order> orders = airwayBillOrderMap.get(dl.getAirwayBillNumber());
749
				if (!orders.isEmpty()) {
750
 
751
					for (Order order : orders) {
752
						order.setDeliveryTimestamp(dl.getDeliveredOn());
753
						order.setStatus(OrderStatus.DELIVERY_SUCCESS);
29403 tejbeer 754
						order.setStatusDescription("Order Delivered");
29306 tejbeer 755
 
29250 tejbeer 756
					}
757
 
30989 tejbeer 758
					com.spice.profitmandi.dao.entity.user.User user = userUserRepository
759
							.selectById(orders.get(0).getRetailerId());
760
 
761
					Address address = addressRepository.selectById(user.getAddressId());
762
 
763
					String title = "Order Delivered";
764
 
29250 tejbeer 765
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
766
					sendNotificationModel.setCampaignName("Order Delivered");
30989 tejbeer 767
					sendNotificationModel.setTitle(title);
768
					sendNotificationModel.setMessage(String.format("Dear partner, your SmartDukaan Order "
29250 tejbeer 769
							+ dl.getAirwayBillNumber() + "has been delivered to you in a safe, sealed bag by "
770
							+ dl.getDeliveredBy() + "."));
771
					sendNotificationModel.setType("url");
772
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
773
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
774
					sendNotificationModel.setMessageType(MessageType.notification);
775
					int userId = userAccountRepository.selectUserIdByRetailerId(orders.get(0).getRetailerId());
776
					sendNotificationModel.setUserIds(Arrays.asList(userId));
777
					notificationService.sendNotification(sendNotificationModel);
30989 tejbeer 778
 
779
					String message = String.format("Dear partner, Your SmartDukaan Order " + dl.getAirwayBillNumber()
780
							+ " has been delivered to you in a safe sealed bag.");
781
 
782
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
783
 
29250 tejbeer 784
				} else {
785
					throw new ProfitMandiBusinessException("Upload File", "",
786
							"No order available for " + dl.getAirwayBillNumber() + " airwaybill Number");
787
 
788
				}
789
			}
790
		}
791
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
792
		return "response";
793
 
794
	}
795
 
796
	private MarkDeliveredModel createMarkDeliveredModel(CSVRecord record) {
797
		MarkDeliveredModel mdm = new MarkDeliveredModel();
798
		mdm.setAirwayBillNumber(record.get(0));
29342 tejbeer 799
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
800
		LOGGER.info(record.get(1));
801
		LocalDate dateTime = LocalDate.parse(record.get(1), formatter);
802
		mdm.setDeliveredOn(dateTime.atStartOfDay());
29250 tejbeer 803
		mdm.setDeliveredBy(record.get(2));
804
		return mdm;
805
	}
806
 
29346 tejbeer 807
	@RequestMapping(value = "/delayBillingTemplate", method = RequestMethod.GET)
808
	public ResponseEntity<?> delayBillingTemplate(HttpServletRequest request) throws Exception {
809
		List<List<?>> rows = new ArrayList<>();
29342 tejbeer 810
 
29440 tejbeer 811
		rows.add(Arrays.asList("-",
812
				"Shipment on hold, low invoice value, please ensure order value of minimum Rs. 40,000."));
813
 
814
		rows.add(Arrays.asList("-", "Order Billed,Shipping will be done tomorrow."));
815
 
29346 tejbeer 816
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
817
				.getCSVByteStream(Arrays.asList("Invoice Number", "Reason"), rows);
818
 
819
		final HttpHeaders headers = new HttpHeaders();
820
		headers.set("Content-Type", "text/csv");
821
		headers.set("Content-disposition", "inline; filename=delay-billing-template.csv");
822
		headers.setContentLength(baos.toByteArray().length);
823
 
824
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
825
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
826
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
827
 
828
	}
829
 
830
	@RequestMapping(value = "/getDelayBillingFileUploader", method = RequestMethod.POST)
831
	public String getDelayBillingFileUploader(HttpServletRequest request, Model model, HttpServletResponse response,
832
			@RequestPart MultipartFile file) throws Throwable {
833
 
834
		LOGGER.info("file" + file.toString());
835
		String fileName = file.getName();
836
 
837
		String fileNames = file.getOriginalFilename();
838
 
839
		LOGGER.info("fileName" + fileName);
840
		LOGGER.info("fileNames" + fileNames);
841
 
29598 tejbeer 842
		List<CSVRecord> records = FileUtil.readFile(file);
29346 tejbeer 843
 
844
		List<DelayBillingModel> delayBillingModel = new ArrayList<DelayBillingModel>();
845
		for (CSVRecord record : records) {
846
			DelayBillingModel dbm = new DelayBillingModel();
847
			dbm.setInvoiceNumber(record.get(0));
848
			dbm.setReason(record.get(1));
849
			delayBillingModel.add(dbm);
850
 
851
		}
852
 
853
		if (!delayBillingModel.isEmpty()) {
854
			for (DelayBillingModel delayBilling : delayBillingModel) {
855
 
856
				List<Order> orders = orderRepository.selectByInvoiceNumber(delayBilling.getInvoiceNumber());
857
 
858
				for (Order order : orders) {
859
					order.setDelayReasonText(delayBilling.getReason());
860
 
861
					if (!order.getStatus().equals(OrderStatus.BILLED)) {
862
						throw new ProfitMandiBusinessException("Upload File", "",
863
								"Order" + order.getInvoiceNumber() + "status should be Billed");
864
 
865
					}
866
				}
867
 
868
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
869
				sendNotificationModel.setCampaignName("Order Hold");
870
				sendNotificationModel.setTitle("Order Hold");
29750 tejbeer 871
				sendNotificationModel.setMessage(
872
						String.format("Dear partner, your SmartDukaan order " + delayBilling.getInvoiceNumber()
873
								+ " has been delayed due to" + delayBilling.getReason() + "."));
29346 tejbeer 874
				sendNotificationModel.setType("url");
875
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
876
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
877
				sendNotificationModel.setMessageType(MessageType.notification);
878
				int userId = userAccountRepository.selectUserIdByRetailerId(orders.get(0).getRetailerId());
879
				sendNotificationModel.setUserIds(Arrays.asList(userId));
880
				notificationService.sendNotification(sendNotificationModel);
881
			}
882
		}
883
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
884
 
885
		return "response";
886
	}
887
 
31043 tejbeer 888
	@RequestMapping(value = "/getAwbNumber", method = RequestMethod.GET)
889
	public String getAwbNumber(HttpServletRequest request, Model model) throws Exception {
890
 
891
		List<Order> orders = orderRepository.selectByInvoiceNumber("NSLCK7931");
892
 
893
		blueDartService.getAirwayBillNo(orders);
894
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
895
 
896
		return "response";
897
	}
29222 tejbeer 898
}