Subversion Repositories SmartDukaan

Rev

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