Subversion Repositories SmartDukaan

Rev

Rev 30220 | Rev 31043 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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