Subversion Repositories SmartDukaan

Rev

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