Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
22860 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
23020 ashik.ali 3
import com.spice.profitmandi.common.enumuration.DateTimePattern;
29585 manish 4
import com.spice.profitmandi.common.enumuration.ReporticoProject;
22860 ashik.ali 5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
30148 amit.gupta 6
import com.spice.profitmandi.common.model.CustomRetailer;
7
import com.spice.profitmandi.common.model.ProfitMandiConstants;
8
import com.spice.profitmandi.common.model.SchemeItems;
9
import com.spice.profitmandi.common.model.SchemeModel;
29585 manish 10
import com.spice.profitmandi.common.services.ReporticoService;
30064 amit.gupta 11
import com.spice.profitmandi.common.util.*;
23784 ashik.ali 12
import com.spice.profitmandi.common.web.util.ResponseSender;
30064 amit.gupta 13
import com.spice.profitmandi.dao.entity.catalog.*;
14
import com.spice.profitmandi.dao.entity.fofo.*;
28795 tejbeer 15
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
16
import com.spice.profitmandi.dao.entity.transaction.PriceDropIMEI;
27389 amit.gupta 17
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
28491 amit.gupta 18
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
29707 tejbeer 19
import com.spice.profitmandi.dao.enumuration.catalog.UpgradeOfferStatus;
29899 tejbeer 20
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
29585 manish 21
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
30064 amit.gupta 22
import com.spice.profitmandi.dao.model.*;
23
import com.spice.profitmandi.dao.repository.catalog.*;
29899 tejbeer 24
import com.spice.profitmandi.dao.repository.cs.CsService;
26588 tejbeer 25
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
26
import com.spice.profitmandi.dao.repository.dtr.Mongo;
30064 amit.gupta 27
import com.spice.profitmandi.dao.repository.fofo.*;
28795 tejbeer 28
import com.spice.profitmandi.dao.repository.transaction.PriceDropIMEIRepository;
29
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
23798 amit.gupta 30
import com.spice.profitmandi.service.authentication.RoleManager;
23020 ashik.ali 31
import com.spice.profitmandi.service.inventory.InventoryService;
27876 amit.gupta 32
import com.spice.profitmandi.service.offers.OfferService;
22860 ashik.ali 33
import com.spice.profitmandi.service.scheme.SchemeService;
26588 tejbeer 34
import com.spice.profitmandi.service.user.RetailerService;
29585 manish 35
import com.spice.profitmandi.service.wallet.WalletService;
22860 ashik.ali 36
import com.spice.profitmandi.web.model.LoginDetails;
37
import com.spice.profitmandi.web.util.CookiesProcessor;
23570 amit.gupta 38
import com.spice.profitmandi.web.util.MVCResponseSender;
29585 manish 39
import in.shop2020.model.v1.order.WalletReferenceType;
30064 amit.gupta 40
import org.apache.commons.csv.CSVRecord;
41
import org.apache.logging.log4j.LogManager;
42
import org.apache.logging.log4j.Logger;
43
import org.springframework.beans.factory.annotation.Autowired;
44
import org.springframework.beans.factory.annotation.Qualifier;
45
import org.springframework.core.io.InputStreamResource;
46
import org.springframework.http.HttpHeaders;
47
import org.springframework.http.HttpStatus;
48
import org.springframework.http.ResponseEntity;
49
import org.springframework.stereotype.Controller;
50
import org.springframework.ui.Model;
51
import org.springframework.web.bind.annotation.*;
52
import org.springframework.web.multipart.MultipartFile;
29585 manish 53
 
30064 amit.gupta 54
import javax.servlet.http.HttpServletRequest;
55
import javax.servlet.http.HttpServletResponse;
56
import javax.transaction.Transactional;
57
import java.io.ByteArrayInputStream;
58
import java.io.ByteArrayOutputStream;
59
import java.io.InputStream;
60
import java.time.*;
61
import java.time.format.DateTimeFormatter;
62
import java.util.*;
63
import java.util.stream.Collectors;
64
 
22860 ashik.ali 65
@Controller
25369 amit.gupta 66
@Transactional(rollbackOn = Throwable.class)
22860 ashik.ali 67
public class SchemeController {
68
 
23568 govind 69
	private static final Logger LOGGER = LogManager.getLogger(SchemeController.class);
22860 ashik.ali 70
 
71
	@Autowired
22927 ashik.ali 72
	private SchemeService schemeService;
27897 amit.gupta 73
 
27876 amit.gupta 74
	@Autowired
75
	private OfferService offerService;
23786 amit.gupta 76
 
22860 ashik.ali 77
	@Autowired
27389 amit.gupta 78
	private StateGstRateRepository stateGstRateRepository;
27612 tejbeer 79
 
27389 amit.gupta 80
	@Autowired
27416 amit.gupta 81
	private ItemRepository itemRepository;
29608 amit.gupta 82
 
29585 manish 83
	@Autowired
84
	private ReporticoService reporticoService;
27612 tejbeer 85
 
27416 amit.gupta 86
	@Autowired
22927 ashik.ali 87
	private SchemeRepository schemeRepository;
22860 ashik.ali 88
 
89
	@Autowired
23556 amit.gupta 90
	private SchemeItemRepository schemeItemRepository;
23786 amit.gupta 91
 
23556 amit.gupta 92
	@Autowired
23570 amit.gupta 93
	private MVCResponseSender mvcResponseSender;
23786 amit.gupta 94
 
23570 amit.gupta 95
	@Autowired
22927 ashik.ali 96
	private CookiesProcessor cookiesProcessor;
23786 amit.gupta 97
 
23020 ashik.ali 98
	@Autowired
23784 ashik.ali 99
	@Qualifier("fofoInventoryService")
23020 ashik.ali 100
	private InventoryService inventoryService;
23556 amit.gupta 101
 
102
	@Autowired
103
	private TagListingRepository tagListingRepository;
23914 govind 104
 
23798 amit.gupta 105
	@Autowired
106
	private RoleManager roleManager;
23786 amit.gupta 107
 
23506 amit.gupta 108
	@Autowired
27394 amit.gupta 109
	private ResponseSender<?> responseSender;
23786 amit.gupta 110
 
23784 ashik.ali 111
	@Autowired
27394 amit.gupta 112
	private FofoStoreRepository fofoStoreRepository;
23786 amit.gupta 113
 
23784 ashik.ali 114
	@Autowired
27394 amit.gupta 115
	private RetailerService retailerService;
22860 ashik.ali 116
 
27394 amit.gupta 117
	@Autowired
118
	private Mongo mongoClient;
29608 amit.gupta 119
 
29585 manish 120
	@Autowired
121
	WalletService walletService;
26588 tejbeer 122
 
123
	@Autowired
29585 manish 124
	PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
125
 
126
	@Autowired
26674 tejbeer 127
	private PartnerTypeChangeService partnerTypeChangeService;
128
 
28795 tejbeer 129
	@Autowired
130
	InventoryItemRepository inventoryItemRepository;
131
 
132
	@Autowired
133
	PriceDropIMEIRepository priceDropIMEIRepository;
134
 
135
	@Autowired
136
	PriceDropRepository priceDropRepository;
137
 
138
	@Autowired
139
	SchemeInOutRepository schemeInOutRepository;
140
 
29707 tejbeer 141
	@Autowired
142
	private CustomerOfferRepository customerOfferRepository;
143
 
144
	@Autowired
145
	private CustomerOfferItemRepository customerOfferItemRepository;
146
 
147
	@Autowired
148
	private SamsungUpgradeOfferRepository samsungUpgradeOfferRepository;
149
 
29899 tejbeer 150
	@Autowired
151
	private CsService csService;
152
 
153
	List<String> adminEmail = Arrays.asList("tarun.verma@smartdukaan.com", "neeraj.gupta@smartdukaan.com",
154
			"amit.gupta@shop2020.in", "manish.tiwari@smartdukaan.com", "tejbeer.kaur@shop2020.in");
155
 
22860 ashik.ali 156
	@RequestMapping(value = "/createScheme", method = RequestMethod.GET)
29899 tejbeer 157
	public String createScheme(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
158
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29608 amit.gupta 159
 
29585 manish 160
		LocalDate currentdate = LocalDate.now();
161
		Month month = currentdate.getMonth().minus(1);
162
		model.addAttribute("month", month);
29608 amit.gupta 163
 
23786 amit.gupta 164
		// Map<Integer, String> itemIdItemDescriptionMap =
165
		// inventoryService.getAllItemIdItemDescriptionMap();
166
		// model.addAttribute("itemIdItemDescriptionMap", itemIdItemDescriptionMap);
29899 tejbeer 167
 
25368 amit.gupta 168
		Set<String> brands = inventoryService.getAllTagListingBrands(ProfitMandiConstants.MOBILE_CATEGORY_ID);
29899 tejbeer 169
 
25368 amit.gupta 170
		brands.addAll(inventoryService.getAllTagListingBrands(14206));
29899 tejbeer 171
 
172
		boolean fullAccesss = this.getAccess(loginDetails.getEmailId());
173
 
174
		model.addAttribute("fullAccesss", fullAccesss);
175
 
25368 amit.gupta 176
		model.addAttribute("brands", brands);
25505 amit.gupta 177
		model.addAttribute("retailerTypes", PartnerType.values());
22860 ashik.ali 178
		return "create-scheme";
179
	}
23786 amit.gupta 180
 
29899 tejbeer 181
	private boolean getAccess(String emailId) {
182
 
183
		boolean fullAccesss = false;
184
		List<String> emails = csService
29926 amit.gupta 185
				.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, EscalationType.L3).stream()
29899 tejbeer 186
				.map(x -> x.getEmailId()).collect(Collectors.toList());
187
 
188
		emails.addAll(
29926 amit.gupta 189
				csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, EscalationType.L2)
29899 tejbeer 190
						.stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
191
 
192
		if (adminEmail.contains(emailId)) {
193
			fullAccesss = true;
194
		}
195
 
196
		if (emails.contains(emailId)) {
197
			fullAccesss = false;
198
		}
199
 
200
		return fullAccesss;
201
 
202
	}
203
 
30148 amit.gupta 204
	@RequestMapping(value = "/getCatalogDescriptionByBrands", method = RequestMethod.POST)
205
	public String getTagListingItemsByBrand(HttpServletRequest request, @RequestBody List<String> brands, Model model) throws Exception {
206
		Map<Integer, String> catalogIdItemDescriptionMap = inventoryService
207
				.getModelDescriptionMap(new HashSet<>(brands));
208
		model.addAttribute("catalogIdItemDescriptionMap", catalogIdItemDescriptionMap);
23786 amit.gupta 209
		// model.addAttribute("brands", inventoryService.getAllBrands());
23914 govind 210
 
23419 ashik.ali 211
		return "tag-listing-items-description";
23020 ashik.ali 212
	}
23556 amit.gupta 213
 
214
	@RequestMapping(value = "/schemes/update-schemes-page", method = RequestMethod.GET)
215
	public String updateShcemes(HttpServletRequest request) throws ProfitMandiBusinessException {
216
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23799 amit.gupta 217
		if (!roleManager.isAdmin(loginDetails.getRoleIds())) {
23556 amit.gupta 218
			throw new ProfitMandiBusinessException("User", loginDetails.getEmailId(), "Unauthorised access");
219
		}
220
		return "update-schemes-page";
221
	}
29608 amit.gupta 222
 
29585 manish 223
	@RequestMapping(value = "/payMonthlyInvestment", method = RequestMethod.POST)
224
	public void payMonthlyInvestment(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
29608 amit.gupta 225
 
29585 manish 226
		LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
227
		LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
228
		int referenceId = Integer.parseInt(FormattingUtils.getYearMonth(startOfPreviousMonth.atStartOfDay()));
229
		LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
230
		List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
231
				.selectAll(startOfPreviousMonth, lastOfPreviousMonth);
232
		Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
233
				.filter(x -> x.getShortPercentage() <= 10)
234
				.collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
235
		LOGGER.info("investmentMaintainedDaysMap {}", investmentMaintainedDaysMap);
236
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAllPending(SchemeType.INVESTMENT,
237
				startOfPreviousMonth.atStartOfDay(), firstDateOfCurrentMonth.atStartOfDay());
29608 amit.gupta 238
 
239
		if (schemeInOuts.isEmpty()) {
240
			throw new ProfitMandiBusinessException("Investment Payout", "", "No data Found");
29585 manish 241
		}
29608 amit.gupta 242
 
29585 manish 243
		Map<Integer, List<SchemeInOut>> inventoryItemIdSchemeMap = schemeInOuts.stream()
244
				.collect(Collectors.groupingBy(x -> x.getInventoryItemId()));
245
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIdSchemeMap.keySet());
246
		Map<Integer, List<Integer>> retailerInventoryItemIdMap = inventoryItems.stream().collect(
247
				Collectors.groupingBy(x -> x.getFofoId(), Collectors.mapping(x -> x.getId(), Collectors.toList())));
248
		System.out.println("Fofo Id\tInvestment Maintained Days\tEligible payout");
249
		for (Map.Entry<Integer, List<Integer>> retailerEntry : retailerInventoryItemIdMap.entrySet()) {
250
			int fofoId = retailerEntry.getKey();
251
			long investmentMaintainedDays = investmentMaintainedDaysMap.get(fofoId) == null ? 0
252
					: investmentMaintainedDaysMap.get(fofoId);
25256 amit.gupta 253
 
29585 manish 254
			List<SchemeInOut> schemeInouts = retailerEntry.getValue().stream().map(x -> inventoryItemIdSchemeMap.get(x))
255
					.flatMap(List::stream).filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.toList());
256
			float totalAmount = 0;
29608 amit.gupta 257
			for (SchemeInOut sio : schemeInouts) {
258
 
29585 manish 259
				if (investmentMaintainedDays < 8) {
260
					sio.setStatus(SchemePayoutStatus.REJECTED);
29608 amit.gupta 261
					// sio.setRolledBackTimestamp(LocalDateTime.now());
29585 manish 262
					sio.setStatusDescription("Investment maintained for " + investmentMaintainedDays + "(< 8) days");
263
				} else if (investmentMaintainedDays < 12) {
264
					sio.setStatus(SchemePayoutStatus.CREDITED);
29608 amit.gupta 265
					sio.setAmount(sio.getAmount() / 2);
29585 manish 266
					sio.setCreditTimestamp(LocalDateTime.now());
267
					sio.setStatusDescription("Investment maintained for " + investmentMaintainedDays + "(< 12) days");
268
					totalAmount += sio.getAmount();
269
				} else {
270
					sio.setStatus(SchemePayoutStatus.CREDITED);
271
					sio.setCreditTimestamp(LocalDateTime.now());
272
					totalAmount += sio.getAmount();
273
				}
274
			}
29608 amit.gupta 275
			if (totalAmount > 0) {
276
				String description = "Investment margin paid for "
277
						+ FormattingUtils.formatYearMonth(startOfPreviousMonth.atStartOfDay());
278
				if (investmentMaintainedDays < 12) {
279
					description += ", as maintained for " + investmentMaintainedDays + "(< 12) days";
29585 manish 280
				}
29608 amit.gupta 281
				walletService.addAmountToWallet(fofoId, referenceId, WalletReferenceType.INVESTMENT_PAYOUT, description,
282
						totalAmount, lastOfPreviousMonth.atTime(LocalTime.MAX));
29585 manish 283
			}
284
			System.out.printf("%d\t%d\t%f%n", fofoId, investmentMaintainedDays, totalAmount);
285
		}
29608 amit.gupta 286
 
29585 manish 287
	}
29608 amit.gupta 288
 
29585 manish 289
	@RequestMapping(value = "/evaluateActualInvestmentPayout", method = RequestMethod.GET)
29663 manish 290
	public ResponseEntity<?> evaluateActualInvestmentPayout(HttpServletRequest request, Model model) throws Exception {
291
 
292
		List<List<?>> rows = new ArrayList<>();
293
		LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
294
		LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
295
		LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
296
		List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
297
				.selectAll(startOfPreviousMonth, lastOfPreviousMonth);
298
		Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
299
				.filter(x -> x.getShortPercentage() <= 10)
300
				.collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
301
		LOGGER.info("investmentMaintainedDaysMap {}", investmentMaintainedDaysMap);
302
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAllPending(SchemeType.INVESTMENT,
303
				startOfPreviousMonth.atStartOfDay(), firstDateOfCurrentMonth.atStartOfDay());
304
		Map<Integer, List<SchemeInOut>> inventoryItemIdSchemeMap = schemeInOuts.stream()
305
				.collect(Collectors.groupingBy(x -> x.getInventoryItemId()));
306
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIdSchemeMap.keySet());
307
		Map<Integer, List<Integer>> retailerInventoryItemIdMap = inventoryItems.stream().collect(
308
				Collectors.groupingBy(x -> x.getFofoId(), Collectors.mapping(x -> x.getId(), Collectors.toList())));
309
		System.out.println("Fofo Id\tInvestment Maintained Days\tEligible payout");
310
		for (Map.Entry<Integer, List<Integer>> retailerEntry : retailerInventoryItemIdMap.entrySet()) {
311
			int fofoId = retailerEntry.getKey();
312
			List<SchemeInOut> schemeInouts = retailerEntry.getValue().stream().map(x -> inventoryItemIdSchemeMap.get(x))
313
					.flatMap(List::stream).collect(Collectors.toList());
314
			double totalAmount = schemeInouts.stream().filter(x -> x.getRolledBackTimestamp() == null)
315
					.collect(Collectors.summingDouble(x -> x.getAmount()));
316
			long investmentMaintainedDays = investmentMaintainedDaysMap.get(fofoId) == null ? 0
317
					: investmentMaintainedDaysMap.get(fofoId);
318
			if (investmentMaintainedDays < 8) {
319
				totalAmount = 0;
320
			} else if (investmentMaintainedDays < 12) {
321
				totalAmount = totalAmount / 2;
29585 manish 322
			}
29663 manish 323
			System.out.printf("%d\t%d\t%f%n", fofoId, investmentMaintainedDays, totalAmount);
324
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
29608 amit.gupta 325
 
29663 manish 326
			rows.add(Arrays.asList(fofoId, customRetailer.getBusinessName(), customRetailer.getCode(),
327
					investmentMaintainedDays, totalAmount));
29585 manish 328
		}
329
 
29663 manish 330
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
331
				Arrays.asList("fofoId", "Name", "Code", "investmentMaintainedDays", "totalAmount"), rows);
332
 
333
		final HttpHeaders headers = new HttpHeaders();
334
		headers.set("Content-Type", "text/csv");
335
		headers.set("Content-disposition", "inline; filename=investmentMaintainedDays.csv");
336
		headers.setContentLength(baos.toByteArray().length);
337
 
338
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
339
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
340
 
341
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
342
 
343
	}
344
 
29585 manish 345
	@RequestMapping(value = "/processInvestmentDryRun", method = RequestMethod.GET)
29608 amit.gupta 346
	public ResponseEntity<?> processInvestmentDryRun(HttpServletRequest request, Model model) throws Exception {
347
 
29585 manish 348
		LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
349
		LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
350
		LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
351
		List<List<?>> rows = new ArrayList<>();
352
 
29608 amit.gupta 353
		Map<String, String> params = new HashMap<>();
29585 manish 354
 
29608 amit.gupta 355
		params.put("MANUAL_datesBetween_FROMDATE", firstDateOfCurrentMonth.toString());
356
		params.put("MANUAL_datesBetween_TODATE", firstDateOfCurrentMonth.plusDays(9).toString());
29585 manish 357
 
29608 amit.gupta 358
		params.put("type", "INVESTMENT");
29585 manish 359
 
29608 amit.gupta 360
		List<EvaluateSchemeInvestmentPayoutModel> evaluateSchemeInvestmentPayouts = reporticoService.getReports(
361
				EvaluateSchemeInvestmentPayoutModel.class, ReporticoProject.FOCO, "schemepayout.xml", params);
362
		LOGGER.info("reportResponse {}", evaluateSchemeInvestmentPayouts);
363
 
364
		int referenceId = Integer.parseInt(FormattingUtils.getYearMonth(startOfPreviousMonth.atStartOfDay()));
365
		List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
366
				.selectAll(startOfPreviousMonth, lastOfPreviousMonth);
367
		Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
368
				.filter(x -> x.getShortPercentage() <= 10)
369
				.collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
370
 
371
		for (EvaluateSchemeInvestmentPayoutModel esip : evaluateSchemeInvestmentPayouts) {
372
 
373
			long investmentMaintainedDays = investmentMaintainedDaysMap.get(esip.getFofoId()) == null ? 0
374
					: investmentMaintainedDaysMap.get(esip.getFofoId());
375
 
376
			esip.setInvestmentDays(investmentMaintainedDays);
377
 
378
			float processAmount = esip.getPaidAmount() / 2;
379
 
380
			esip.setProcessAmount(processAmount);
381
 
382
			rows.add(Arrays.asList(esip.getCode(), esip.getStoreName(), esip.getFofoId(), esip.getItemId(),
383
					esip.getBrand(), esip.getModelName(), esip.getModelNumber(), esip.getColor(), esip.getSchemeInDp(),
384
					esip.getSchemeOutDp(), esip.getSchemeId(), esip.getName(), esip.getType(), esip.getPartnerType(),
385
					esip.getAmountType(), esip.getAmount(), esip.getPurchaseInvoice(), esip.getSaleInovoice(),
386
					esip.getPaidAmount(), esip.getCreateTimestamp(), esip.getRolledBackTimestamp(),
387
					esip.getSerialNumber(), esip.getInRef(), esip.getOutRef(), esip.getBusinessDate(), esip.getStatus(),
388
					esip.getDescription(), esip.getProcessAmount(), esip.getInvestmentDays()));
29585 manish 389
		}
390
 
29608 amit.gupta 391
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
392
				.getCSVByteStream(Arrays.asList("Code", "Store Name", "Fofo Id", "Item Id", "Brand", "Model Name",
393
						"Model Number", "Color", "Scheme In Dp", "Scheme Out Dp", "Scheme Id", "Name", "Type",
394
						"Partner Type", "Amount Type", "Amount", "Purchase Invoice", "Sale Inovoice", "Paid Amount",
395
						"Create Timestamp", "Rolled Back Timestamp", "Serial Number", "In Ref", "Out Ref",
396
						"Business Date", "Status", "Description", "Process Amount", "Investment Days"), rows);
397
 
398
		final HttpHeaders headers = new HttpHeaders();
399
		headers.set("Content-Type", "text/csv");
400
		headers.set("Content-disposition", "inline; filename=schemePayout.csv");
401
		headers.setContentLength(baos.toByteArray().length);
402
 
403
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
404
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
405
 
406
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
407
 
408
	}
409
 
23556 amit.gupta 410
	@RequestMapping(value = "/schemes/update", method = RequestMethod.POST)
23786 amit.gupta 411
	public String updateShcemes(HttpServletRequest request, @RequestBody SchemeItems schemeItems, Model model)
412
			throws Exception {
413
		for (int schemeId : schemeItems.getSchemeIds()) {
23928 govind 414
			if (schemeRepository.selectById(schemeId) != null)
30122 amit.gupta 415
				for (int catalogId : schemeItems.getCatalogIds()) {
30151 amit.gupta 416
					if (tagListingRepository.selectAllByCatalogIds(Arrays.asList(catalogId)).size() > 0) {
23928 govind 417
						SchemeItem si = new SchemeItem();
30122 amit.gupta 418
						si.setCatalogId(catalogId);
23928 govind 419
						si.setSchemeId(schemeId);
29608 amit.gupta 420
						si.setCreateTimestamp(LocalDateTime.now());
23928 govind 421
						try {
422
							schemeItemRepository.persist(si);
423
						} catch (Exception e) {
424
							LOGGER.info("Scheme aleady exist");
425
						}
426
						model.addAttribute("response", mvcResponseSender.createResponseString(true));
427
					} else {
428
						model.addAttribute("response", mvcResponseSender.createResponseString(false));
30122 amit.gupta 429
						throw new ProfitMandiBusinessException("Catalog Id ", catalogId, "Invalid Catalog Id");
23928 govind 430
					}
431
				}
432
		}
433
		return "response";
434
	}
25256 amit.gupta 435
 
23928 govind 436
	@RequestMapping(value = "/addItemToScheme", method = RequestMethod.POST)
437
	public String updateScheme(HttpServletRequest request, @RequestBody SchemeItems schemeItems, Model model)
438
			throws Exception {
439
		for (int schemeId : schemeItems.getSchemeIds()) {
30122 amit.gupta 440
			List<Integer> catalogIds = schemeItemRepository.selectCatalogIdsBySchemeId(schemeId);
23786 amit.gupta 441
			if (schemeRepository.selectById(schemeId) != null)
30122 amit.gupta 442
				for (int catalogId : schemeItems.getCatalogIds()) {
443
					if (!(catalogIds.contains(catalogId))) {
23786 amit.gupta 444
						SchemeItem si = new SchemeItem();
30122 amit.gupta 445
						si.setCatalogId(catalogId);
23786 amit.gupta 446
						si.setSchemeId(schemeId);
29608 amit.gupta 447
						si.setCreateTimestamp(LocalDateTime.now());
23786 amit.gupta 448
						try {
449
							schemeItemRepository.persist(si);
450
						} catch (Exception e) {
23914 govind 451
							LOGGER.info("Scheme already exist");
23786 amit.gupta 452
						}
453
						model.addAttribute("response", mvcResponseSender.createResponseString(true));
454
					} else {
30122 amit.gupta 455
						throw new ProfitMandiBusinessException("Catalog exist for scheme", "SchemeId= " + schemeId + ", CatalogId= " + catalogId, "Catalog exist for scheme");
23556 amit.gupta 456
					}
457
				}
458
		}
459
		return "response";
460
	}
23914 govind 461
 
462
	@RequestMapping(value = "/schemes/delete", method = RequestMethod.DELETE)
463
	public String deleteShcemes(HttpServletRequest request,
30122 amit.gupta 464
								@RequestParam(name = "schemeId", required = false, defaultValue = "0") int schemeId,
465
								@RequestParam(name = "catalogId", required = false, defaultValue = "0") int catalogId, Model model)
23819 govind 466
			throws Exception {
23914 govind 467
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30122 amit.gupta 468
		if (schemeId > 0 && catalogId > 0) {
469
			schemeItemRepository.deleteByCatalogIdsAndSchemeIds(catalogId, schemeId);
23914 govind 470
 
471
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
472
 
473
			model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
474
 
475
		}
476
		return "response";
477
	}
478
 
479
	@RequestMapping(value = "/extendAllSchemes", method = RequestMethod.POST)
480
	public String extendAllScheme(HttpServletRequest request, @RequestBody LocalDateTime extendDatetime, Model model)
481
			throws Exception {
28924 amit.gupta 482
		extendDatetime = LocalDateTime.of(extendDatetime.toLocalDate(), Utils.MAX_TIME);
23914 govind 483
		List<Scheme> schemes = schemeRepository.selectActiveAll();
484
		if (schemes.size() > 0) {
485
			for (Scheme scheme : schemes) {
25261 amit.gupta 486
				if (scheme.getExpireTimestamp() == null) {
23914 govind 487
					scheme.setEndDateTime(extendDatetime);
488
					schemeRepository.persist(scheme);
23819 govind 489
				}
490
			}
23914 govind 491
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
492
			return "response";
23819 govind 493
		}
23914 govind 494
		model.addAttribute("response", mvcResponseSender.createResponseString(false));
23819 govind 495
		return "response";
496
	}
23786 amit.gupta 497
 
23914 govind 498
	@RequestMapping(value = "/extendSchemeById", method = RequestMethod.POST)
499
	public String extendSchemeById(HttpServletRequest request,
23819 govind 500
 
30122 amit.gupta 501
								   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
502
								   @RequestBody LocalDateTime extendDatetime, Model model) throws Exception {
28924 amit.gupta 503
		extendDatetime = LocalDateTime.of(extendDatetime.toLocalDate(), Utils.MAX_TIME);
23914 govind 504
		Scheme scheme = schemeRepository.selectById(schemeId);
505
		if ((!(scheme.getActiveTimestamp() == null)) && scheme.getExpireTimestamp() == null) {
506
			scheme.setEndDateTime(extendDatetime);
507
			schemeRepository.persist(scheme);
508
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
509
			return "response";
510
		}
511
		model.addAttribute("response", mvcResponseSender.createResponseString(false));
512
		return "response";
513
	}
514
 
22860 ashik.ali 515
	@RequestMapping(value = "/createScheme", method = RequestMethod.POST)
30122 amit.gupta 516
	public String createScheme(HttpServletRequest request, @RequestBody CreateSchemeRequest createSchemeRequest, Model model)
23715 govind 517
			throws ProfitMandiBusinessException {
22927 ashik.ali 518
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
22860 ashik.ali 519
		LOGGER.info("CreateSchemeRequest {}", createSchemeRequest);
22927 ashik.ali 520
		schemeService.saveScheme(loginDetails.getFofoId(), createSchemeRequest);
30122 amit.gupta 521
		return getDefaultSchemes(request, model);
522
	}
29899 tejbeer 523
 
30122 amit.gupta 524
	private String getDefaultSchemes(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
525
		return getSchemes(request, 0, null, 30, 0, 0, PartnerType.ALL, "", model);
526
	}
527
 
528
	private List<Scheme> setSchemeAmountModel(List<Scheme> schemes) {
529
		for (Scheme scheme : schemes) {
530
			if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
531
				scheme.setAmountModel(scheme.getAmount() + "%");
532
			} else {
533
				scheme.setAmountModel(scheme.getAmount() + "");
29899 tejbeer 534
			}
535
		}
30122 amit.gupta 536
		return schemes;
22860 ashik.ali 537
	}
23786 amit.gupta 538
 
30122 amit.gupta 539
	//Show 20 recents
22860 ashik.ali 540
	@RequestMapping(value = "/getSchemes", method = RequestMethod.GET)
23715 govind 541
	public String getSchemes(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset,
30122 amit.gupta 542
							 @RequestParam(required = false) LocalDate date,
543
							 @RequestParam(name = "limit", required = false, defaultValue = "30") int limit,
544
							 @RequestParam(name = "searchModel", required = false, defaultValue = "0") int searchModel,
545
							 @RequestParam(name = "searchScheme", required = false, defaultValue = "0") int searchScheme,
546
							 @RequestParam(name = "partnerType", required = false, defaultValue = "ALL") PartnerType partnerType,
547
							 @RequestParam(name = "searchImei", required = false, defaultValue = "") String searchImei, Model model)
28795 tejbeer 548
			throws ProfitMandiBusinessException {
23343 ashik.ali 549
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
26802 tejbeer 550
		boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
30122 amit.gupta 551
		if (date != null) {
552
			date = date.isAfter(LocalDate.now()) ? LocalDate.now() : date;
27876 amit.gupta 553
		}
26802 tejbeer 554
 
23343 ashik.ali 555
		List<Scheme> schemes = null;
28796 tejbeer 556
		List<SchemeInOut> schemeInOut = null;
557
 
30122 amit.gupta 558
		boolean fullAccess = this.getAccess(loginDetails.getEmailId());
29608 amit.gupta 559
 
30122 amit.gupta 560
		model.addAttribute("fullAccess", fullAccess);
561
		model.addAttribute("searchImei", searchImei);
562
		model.addAttribute("isAdmin", isAdmin);
563
		model.addAttribute("searchModel", searchModel);
564
		model.addAttribute("searchScheme", searchScheme);
565
		model.addAttribute("partnerType", partnerType);
566
		model.addAttribute("date", date);
29608 amit.gupta 567
 
30122 amit.gupta 568
		final LocalDate date1 = date;
569
		if (searchScheme > 0) {
570
			schemes = Arrays.asList(schemeRepository.selectById(searchScheme));
571
			this.setSchemeAmountModel(schemes);
27876 amit.gupta 572
			if (schemes.size() > 0) {
26802 tejbeer 573
				model.addAttribute("schemes", schemes);
30122 amit.gupta 574
				return "schemes";
30043 amit.gupta 575
			} else {
30122 amit.gupta 576
				throw new ProfitMandiBusinessException("SchemeId", searchScheme, "SchemeId Not Found");
26802 tejbeer 577
			}
30122 amit.gupta 578
		} else if (searchModel > 0) {
579
			Item item = itemRepository.selectAllByCatalogItemId(searchModel).get(0);
30253 amit.gupta 580
			TagListing tagListing = tagListingRepository.selectByItemId(item.getId());
28134 tejbeer 581
			if (tagListing != null) {
582
				model.addAttribute("dp", tagListing.getSellingPrice());
583
				model.addAttribute("mop", tagListing.getMop());
26802 tejbeer 584
			}
30253 amit.gupta 585
			model.addAttribute("modelName", item.getItemDescriptionNoColor());
586
			if (isAdmin) {
587
				schemes = schemeService.selectSchemeByPartnerType(partnerType, date, searchModel, isAdmin, offset, limit)
588
						.stream().filter(x -> {
589
							return (x.getId() != 411 && x.getId() != 612) || date1.isBefore(LocalDate.of(2021, 12, 1));
590
						}).collect(Collectors.toList());
591
				// Remove 411 and 612
592
				this.setSchemeAmountModel(schemes);
593
				model.addAttribute("schemes", schemes);
594
				// For 7720(HR) remove investment
595
				//int nlc = this.getNlc(item, loginDetails.getFofoId(), schemes, tagListing, searchModel);
596
				//model.addAttribute("nlc", Math.round(nlc));
597
				return "schemes";
598
			} else {
599
				partnerType = partnerTypeChangeService.getTypeOnDate(loginDetails.getFofoId(), date);
600
				schemes = schemeService.selectSchemeByPartnerType(partnerType, date, searchModel, isAdmin, offset, limit)
601
						.stream().filter(x -> {
602
							return (x.getId() != 411 && x.getId() != 612) || date1.isBefore(LocalDate.of(2021, 12, 1));
603
						}).collect(Collectors.toList());
604
				// Remove 411 and 612
605
				//this.setSchemeAmountModel(schemes);
606
				int nlc = this.getNlc(item, loginDetails.getFofoId(), schemes, tagListing);
607
				// For 7720(HR) remove investment
608
				model.addAttribute("schemes", schemes);
609
				model.addAttribute("nlc", Math.round(nlc));
610
				model.addAttribute("fofoId", loginDetails.getFofoId());
611
				return "schemes-partner";
28795 tejbeer 612
 
30253 amit.gupta 613
			}
614
 
30122 amit.gupta 615
		} else if (org.apache.commons.lang3.StringUtils.isNotEmpty(searchImei)) {
616
 
28795 tejbeer 617
			LOGGER.info("searchImei" + searchImei);
618
 
30122 amit.gupta 619
			InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumber(searchImei);
28802 tejbeer 620
			Item item = itemRepository.selectById(inventoryItem.getItemId());
28795 tejbeer 621
			Map<Integer, Scheme> schemeMap = new HashMap<>();
622
			if (inventoryItem != null) {
623
 
624
				LOGGER.info("inventoryItem" + inventoryItem);
625
 
626
				schemeInOut = schemeInOutRepository
627
						.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
628
 
629
				LOGGER.info("schemeInOut" + schemeInOut);
630
 
631
				if (!schemeInOut.isEmpty()) {
632
 
633
					List<Integer> schemeIds = schemeInOut.stream().map(x -> x.getSchemeId())
634
							.collect(Collectors.toList());
635
 
636
					schemes = schemeRepository.selectBySchemeIds(schemeIds);
637
					for (Scheme scheme : schemes) {
638
						if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
639
							scheme.setAmountModel(scheme.getAmount() + "%");
640
						} else {
641
							scheme.setAmountModel(scheme.getAmount() + "");
642
						}
643
					}
644
 
645
					schemeMap = schemes.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
646
				}
647
			}
30253 amit.gupta 648
			model.addAttribute("fofoId", loginDetails.getFofoId());
28795 tejbeer 649
			model.addAttribute("schemeMap", schemeMap);
28802 tejbeer 650
			model.addAttribute("item", item);
30122 amit.gupta 651
			model.addAttribute("schemeInOut", schemeInOut);
652
			return "schemes-partner";
28796 tejbeer 653
		}
28795 tejbeer 654
 
29899 tejbeer 655
		if (isAdmin) {
30122 amit.gupta 656
			schemes = schemeRepository.selectAll(0, 30);
657
			this.setSchemeAmountModel(schemes);
658
			model.addAttribute("schemes", schemes);
27876 amit.gupta 659
			return "schemes";
29899 tejbeer 660
		} else {
30043 amit.gupta 661
			List<CreateOfferRequest> offers = null;
29883 amit.gupta 662
			Map<Integer, Map<Integer, Long>> offerSlabPayoutMap = new HashMap<>();
28795 tejbeer 663
			List<PriceDropIMEI> priceDropImeis = new ArrayList<>();
30122 amit.gupta 664
			if (searchModel > 0) {
665
				offers = offerService.getPublishedOffers(date, loginDetails.getFofoId(), searchModel);
29899 tejbeer 666
				for (CreateOfferRequest createOfferRequest : offers) {
30148 amit.gupta 667
					Map<Integer, Map<Integer, Long>> catalogSlabPayoutMap = offerService
29899 tejbeer 668
							.getSlabPayoutMap(createOfferRequest);
30148 amit.gupta 669
					Map<Integer, Long> slabPayoutMap = catalogSlabPayoutMap.get(searchModel);
29883 amit.gupta 670
					offerSlabPayoutMap.put(createOfferRequest.getId(), slabPayoutMap);
671
				}
30043 amit.gupta 672
			} else {
673
				offers = new ArrayList<>();
27897 amit.gupta 674
			}
30122 amit.gupta 675
			if (org.apache.commons.lang3.StringUtils.isNotEmpty(searchImei)) {
28795 tejbeer 676
				InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumberFofoId(searchImei,
677
						loginDetails.getFofoId());
678
 
679
				priceDropImeis = priceDropIMEIRepository.selectByFofoIdImei(loginDetails.getFofoId(), searchImei);
680
				for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
681
					int priceDropId = priceDropIMEI.getPriceDropId();
682
					PriceDrop pd = priceDropRepository.selectById(priceDropId);
683
 
684
					priceDropIMEI.setPriceDrop(pd);
685
				}
686
			}
28136 tejbeer 687
			FofoStore fs = fofoStoreRepository.selectByRetailerId(loginDetails.getFofoId());
688
 
27876 amit.gupta 689
			model.addAttribute("offers", offers);
29883 amit.gupta 690
			model.addAttribute("offerSlabPayoutMap", offerSlabPayoutMap);
30122 amit.gupta 691
			model.addAttribute("searchModel", searchModel);
692
			model.addAttribute("searchScheme", searchScheme);
693
			model.addAttribute("searchImei", searchImei);
28136 tejbeer 694
			model.addAttribute("partnerCode", fs.getCode());
28795 tejbeer 695
			model.addAttribute("fofoId", fs.getId());
696
			model.addAttribute("priceDropImeis", priceDropImeis);
27876 amit.gupta 697
			return "schemes-partner";
698
		}
29899 tejbeer 699
 
22860 ashik.ali 700
	}
23786 amit.gupta 701
 
30253 amit.gupta 702
	private int getNlc(Item item, int fofoId, List<Scheme> schemes, TagListing tagListing)
28795 tejbeer 703
			throws ProfitMandiBusinessException {
30253 amit.gupta 704
		int itemId = item.getId();
28795 tejbeer 705
		if (item.getBrand().equals("Vivo") && fofoStoreRepository.getWarehousePartnerMap().get(7720).stream()
706
				.filter(x -> x.getId() == fofoId).count() > 0) {
707
			schemes = schemes.stream().filter(x -> !x.getType().equals(SchemeType.INVESTMENT))
708
					.collect(Collectors.toList());
709
		}
710
		float nlc = tagListing.getSellingPrice();
711
		for (Scheme scheme : schemes) {
712
			if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
713
				if (tagListing != null) {
714
					float taxRate = stateGstRateRepository.getIgstTaxRate(Arrays.asList(itemId)).get(itemId);
715
					float taxableSellingPrice = tagListing.getSellingPrice() / (1 + taxRate / 100);
716
					float amount = taxableSellingPrice * scheme.getAmount() / 100;
30053 manish 717
					scheme.setAmountModel(FormattingUtils.formatDecimal(amount) + " (" + scheme.getAmount() + "%)");
28795 tejbeer 718
					nlc -= amount;
30043 amit.gupta 719
				} else {
28795 tejbeer 720
					scheme.setAmountModel(scheme.getAmount() + "%");
721
				}
722
			} else {
723
				scheme.setAmountModel(scheme.getAmount() + "");
724
				nlc -= scheme.getAmount();
725
			}
726
		}
727
 
728
		return Math.round(nlc);
729
 
730
	}
731
 
30053 manish 732
	@RequestMapping(value = "/getLastMonthCreditIncome", method = RequestMethod.GET)
733
	public String getLastMonthCreditIncome(HttpServletRequest request, Model model) throws Exception {
734
 
735
		String status = "CREDITED";
736
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
737
 
738
		LocalDateTime currentStartMonth = LocalDate.now().atStartOfDay().withDayOfMonth(1);
739
		LocalDateTime currentDate = LocalDate.now().atStartOfDay();
740
 
741
		YearMonth yearMonth = YearMonth.now();
742
		LOGGER.info("yearMonth" + yearMonth);
743
 
744
		boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), yearMonth);
745
 
746
		LOGGER.info("partnerType" + partnerType);
747
 
748
		Map<String, Double> lastMonthCategoryUpgradeMarginMap = new HashMap<>();
749
 
750
		if (partnerType) {
751
			lastMonthCategoryUpgradeMarginMap = schemeInOutRepository
752
					.selectLastMonthCategoryUpgradeMarginByBrand(loginDetails.getFofoId(), currentStartMonth,
753
							currentDate)
754
					.stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
755
		}
756
		List<LastMonthCreditedIncomeModel> lastMonthCreditedIncomeModels = schemeInOutRepository
757
				.selectLastMonthCreditedIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
758
 
759
		List<LastMonthCreditedIncomeModel> lastMonthPurchaseInMargins = schemeInOutRepository
760
				.selectLastMonthPurchaseInMarginByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
761
 
762
		List<LastMonthCreditedIncomeModel> lastMonthFrontEndIncomes = schemeInOutRepository
763
				.selectFrontIncomeByBrand(loginDetails.getFofoId(), currentStartMonth, currentDate);
764
 
30253 amit.gupta 765
 
766
		Map<String, LastMonthCreditedIncomeModel> lastMonthPendingIncomeMap = schemeInOutRepository
767
				.selectLastMonthPendingIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate).stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x));
768
 
769
 
30053 manish 770
		LOGGER.info("lastMonthCreditedIncomeModels" + lastMonthCreditedIncomeModels);
771
		LOGGER.info("lastMonthFrontEndIncomes" + lastMonthFrontEndIncomes);
772
		LOGGER.info("lastMonthPurchaseInMargins" + lastMonthPurchaseInMargins);
773
		LOGGER.info("lastMonthCategoryUpgradeMarginMap" + lastMonthCategoryUpgradeMarginMap);
774
 
775
		Map<String, LastMonthCreditedIncomeModel> lastMonthPurchaseInMarginMap = new HashMap<>();
776
 
30235 tejbeer 777
 
30053 manish 778
		lastMonthPurchaseInMarginMap = lastMonthPurchaseInMargins.stream()
779
				.collect(Collectors.toMap(x -> x.getBrand(), x -> x));
780
 
781
		Map<String, LastMonthCreditedIncomeModel> lastMonthSaleMarginMap = lastMonthCreditedIncomeModels.stream()
782
				.collect(Collectors.toMap(x -> x.getBrand(), x -> x));
783
 
784
		lastMonthFrontEndIncomes.stream().forEach(x -> {
785
			if (lastMonthSaleMarginMap.containsKey(x.getBrand())) {
786
				x.setAmount(lastMonthSaleMarginMap.get(x.getBrand()).getAmount() + x.getAmount());
787
				lastMonthSaleMarginMap.put(x.getBrand(), x);
788
			} else {
789
				lastMonthSaleMarginMap.put(x.getBrand(), x);
790
			}
791
 
792
		});
793
		Map<String, Float> totalAmountMap = lastMonthSaleMarginMap.entrySet().stream()
794
				.collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().getAmount()));
795
 
796
		Set<String> keySet = new HashSet<String>();
797
		keySet.addAll(lastMonthPurchaseInMarginMap.keySet());
798
		keySet.addAll(lastMonthSaleMarginMap.keySet());
30235 tejbeer 799
		keySet.addAll(lastMonthPendingIncomeMap.keySet());
30053 manish 800
 
801
		lastMonthPurchaseInMarginMap.entrySet().stream().forEach(x -> {
802
			String brand = x.getKey();
803
			float amount = x.getValue().getAmount();
804
			if (!totalAmountMap.containsKey(brand)) {
805
				totalAmountMap.put(brand, 0f);
806
			}
807
			totalAmountMap.put(brand, totalAmountMap.get(brand) + amount);
808
 
809
		});
30253 amit.gupta 810
 
30235 tejbeer 811
		lastMonthPendingIncomeMap.entrySet().stream().forEach(x -> {
812
			String brand = x.getKey();
813
			float amount = x.getValue().getAmount();
814
			if (!totalAmountMap.containsKey(brand)) {
815
				totalAmountMap.put(brand, 0f);
816
			}
817
			totalAmountMap.put(brand, totalAmountMap.get(brand) + amount);
30053 manish 818
 
30235 tejbeer 819
		});
820
 
30053 manish 821
		Map<Integer, String> monthValueMap = new HashMap<>();
822
		for (int i = 0; i <= 5; i++) {
823
			LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
824
			monthValueMap.put(i, startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
825
		}
826
		model.addAttribute("month", 0);
827
		model.addAttribute("monthValueMap", monthValueMap);
828
		model.addAttribute("keySet", keySet);
30235 tejbeer 829
		model.addAttribute("lastMonthPendingIncomeMap", lastMonthPendingIncomeMap);
30053 manish 830
 
831
		model.addAttribute("lastMonthCategoryUpgradeMarginMap", lastMonthCategoryUpgradeMarginMap);
832
		model.addAttribute("lastMonthPurchaseInMarginMap", lastMonthPurchaseInMarginMap);
833
		model.addAttribute("lastMonthSaleMarginMap", lastMonthSaleMarginMap);
834
		model.addAttribute("status", status);
835
		model.addAttribute("totalAmountMap", totalAmountMap);
836
 
837
		return "last-month-credited-income";
838
	}
839
 
840
	@RequestMapping(value = "/getLastMonthPendingIncome", method = RequestMethod.GET)
841
	public String getLastMonthPendingIncome(HttpServletRequest request, Model model) throws Exception {
842
 
843
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
844
 
845
		LocalDateTime currentStartMonth = LocalDate.now().atStartOfDay().withDayOfMonth(1);
846
		LocalDateTime currentDate = LocalDate.now().atStartOfDay();
847
		String status = "PENDING";
848
 
849
		LOGGER.info("currentStartMonth" + currentStartMonth);
850
		LOGGER.info("currentDate" + currentDate);
851
 
852
		List<LastMonthCreditedIncomeModel> lastMonthPendingIncomeModels = schemeInOutRepository
853
				.selectLastMonthPendingIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
854
 
855
		Map<String, LastMonthCreditedIncomeModel> lastMonthMarginMap = new HashMap<>();
856
 
857
		for (LastMonthCreditedIncomeModel lastMonthPendingIncomeModel : lastMonthPendingIncomeModels) {
858
 
859
			lastMonthMarginMap.put(lastMonthPendingIncomeModel.getBrand(), lastMonthPendingIncomeModel);
860
		}
861
		LOGGER.info("lastMonthPendingIncomeModel" + lastMonthPendingIncomeModels);
862
		LOGGER.info("lastMonthMarginMap" + lastMonthMarginMap);
863
		model.addAttribute("lastMonthCreditedIncomeModels", lastMonthPendingIncomeModels);
864
		model.addAttribute("lastMonthMarginMap", lastMonthMarginMap);
865
		model.addAttribute("status", status);
866
 
867
		return "last-month-credited-income";
868
	}
869
 
870
	@RequestMapping(value = "/getLastMonthImeiWiseIncome", method = RequestMethod.GET)
871
	public String getLastMonthImeiWiseIncome(HttpServletRequest request,
30122 amit.gupta 872
											 @RequestParam(name = "catalogItemId", required = false, defaultValue = "") int catalogItemId,
873
											 @RequestParam(name = "month", required = false, defaultValue = "") int month, Model model)
30053 manish 874
			throws Exception {
875
 
876
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
877
 
878
		LocalDateTime lastMonthStart = LocalDate.now().minusMonths(month).withDayOfMonth(1).atStartOfDay();
879
		LocalDateTime currentMonthEnd = lastMonthStart.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
880
 
881
		HashSet<String> allImeiSet = new LinkedHashSet<>();
882
		HashSet<String> purchaseSet = new LinkedHashSet<>();
883
		HashSet<String> saleSet = new LinkedHashSet<>();
884
 
885
		List<LastMonthFrontEndImeiModel> lmfi = schemeInOutRepository
886
				.selectLastMonthFrontEndImei(loginDetails.getFofoId(), catalogItemId, lastMonthStart, currentMonthEnd);
887
		List<LastMonthImeiModel> lmpi = schemeInOutRepository.selectLastMonthPurchaseInImei(loginDetails.getFofoId(),
888
				catalogItemId, lastMonthStart, currentMonthEnd);
889
		List<LastMonthImeiModel> lmci = schemeInOutRepository.selectLastMonthCreditedImei(loginDetails.getFofoId(),
890
				catalogItemId, lastMonthStart, currentMonthEnd);
30253 amit.gupta 891
 
30235 tejbeer 892
		LOGGER.info("lmci {}", lmci);
30053 manish 893
 
894
		Map<String, Double> lastmonthCategoryUpgradeMargin = schemeInOutRepository
895
				.selectLastMonthCategoryUpgradeMarginByImei(loginDetails.getFofoId(), catalogItemId, lastMonthStart,
896
						currentMonthEnd)
897
				.stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
898
 
899
		allImeiSet.addAll(lmpi.stream().map(x -> x.getImei()).collect(Collectors.toList()));
900
		allImeiSet.addAll(lmci.stream().map(x -> x.getImei()).collect(Collectors.toList()));
901
		allImeiSet.addAll(lmfi.stream().map(x -> x.getImei()).collect(Collectors.toList()));
902
 
903
		List<String> allImeiList = new ArrayList<>(allImeiSet);
904
 
905
		LOGGER.info("allImeiList" + allImeiList);
906
		LOGGER.info("lmcm" + lastmonthCategoryUpgradeMargin);
30253 amit.gupta 907
 
30053 manish 908
		List<LastMonthFrontEndImeiModel> lastMonthFrontEndImeis = schemeInOutRepository
909
				.selectLastMonthFrontEndByImei(loginDetails.getFofoId(), allImeiList);
910
		List<LastMonthImeiModel> lastMonthPurchaseInImeis = schemeInOutRepository
911
				.selectLastMonthPurchaseInByImei(loginDetails.getFofoId(), allImeiList);
912
		List<LastMonthImeiModel> lastMonthCreditedImeis = schemeInOutRepository
913
				.selectLastMonthCreditedByImei(loginDetails.getFofoId(), allImeiList);
30253 amit.gupta 914
 
915
 
30053 manish 916
		LOGGER.info("lastMonthFrontEndImei {}", lastMonthFrontEndImeis);
917
		LOGGER.info("lastMonthPurchaseInImei {}", lastMonthPurchaseInImeis);
918
		LOGGER.info("lastMonthCreditedImei {}", lastMonthCreditedImeis);
30253 amit.gupta 919
 
920
		Map<String, Float> imeiWisePendingSaleAmount = lastMonthCreditedImeis.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING)).collect(Collectors.toMap(x -> x.getImei(), x -> x.getPendingSaleAmount()));
921
 
922
 
30053 manish 923
		Map<IncomeImeiDate, Map<String, Double>> lastMonthPurchaseInMapPairMap = lastMonthPurchaseInImeis.stream()
924
				.collect(Collectors.groupingBy(x -> new IncomeImeiDate(x.getImei(), x.getCreateTimeStamp()),
925
						Collectors.groupingBy(x -> x.getDescription(), Collectors.summingDouble(x -> x.getAmount()))));
926
 
927
		Map<IncomeImeiDate, Map<String, Double>> lastMonthCreditedMapPairMap = lastMonthCreditedImeis.stream()
928
				.collect(Collectors.groupingBy(x -> new IncomeImeiDate(x.getImei(), x.getCreateTimeStamp()),
929
						Collectors.groupingBy(x -> x.getDescription(), Collectors.summingDouble(x -> x.getAmount()))));
930
		// descriptionSet.add("")
931
		purchaseSet.addAll(lastMonthPurchaseInImeis.stream().map(x -> x.getDescription()).collect(Collectors.toList()));
932
		saleSet.addAll(lastMonthCreditedImeis.stream().map(x -> x.getDescription()).collect(Collectors.toList()));
933
 
934
		List<String> purchaseList = new ArrayList<>(purchaseSet);
935
		List<String> saleList = new ArrayList<>(saleSet);
30253 amit.gupta 936
 
30053 manish 937
		Map<IncomeImeiDate, ImeiWiseIncomePairAndMapModel> imeiWiseIncomeMapOfMap = new HashMap<>();
30253 amit.gupta 938
 
30053 manish 939
		for (Map.Entry<IncomeImeiDate, Map<String, Double>> entry : lastMonthPurchaseInMapPairMap.entrySet()) {
940
 
941
			IncomeImeiDate imeiDate = entry.getKey();
942
			Map<String, Double> descriptionAmountMap = entry.getValue();
943
 
944
			ImeiWiseIncomePairAndMapModel modelImeiMap = new ImeiWiseIncomePairAndMapModel(imeiDate.getImei(),
945
					imeiDate.getLocalDateTime(), null, descriptionAmountMap);
946
			imeiWiseIncomeMapOfMap.put(imeiDate, modelImeiMap);
947
			double totalAmount = imeiWiseIncomeMapOfMap.get(imeiDate).getDescriptionAmountMap().entrySet().stream()
948
					.collect(Collectors.summingDouble(x -> x.getValue()));
949
			imeiWiseIncomeMapOfMap.get(imeiDate).setTotalIncome(totalAmount);
950
		}
951
 
952
		for (Map.Entry<IncomeImeiDate, Map<String, Double>> entry : lastMonthCreditedMapPairMap.entrySet()) {
953
			IncomeImeiDate imeiDate = entry.getKey();
954
			Map<String, Double> descriptionAmountMap = entry.getValue();
955
			if (!imeiWiseIncomeMapOfMap.containsKey(imeiDate)) {
956
				ImeiWiseIncomePairAndMapModel modelImeiMap = new ImeiWiseIncomePairAndMapModel(imeiDate.getImei(), null,
957
						imeiDate.getLocalDateTime(), descriptionAmountMap);
958
				imeiWiseIncomeMapOfMap.put(imeiDate, modelImeiMap);
959
 
960
			} else {
961
				ImeiWiseIncomePairAndMapModel modelImeiMap = imeiWiseIncomeMapOfMap.get(imeiDate);
962
				modelImeiMap.setSaleDate(imeiDate.getLocalDateTime());
963
				modelImeiMap.getDescriptionAmountMap().putAll(descriptionAmountMap);
964
 
965
			}
966
			double totalAmount = descriptionAmountMap.entrySet().stream()
967
					.collect(Collectors.summingDouble(x -> x.getValue()));
968
			imeiWiseIncomeMapOfMap.get(imeiDate)
969
					.setTotalIncome(totalAmount + imeiWiseIncomeMapOfMap.get(imeiDate).getTotalIncome());
970
		}
971
 
972
		lastMonthFrontEndImeis.stream().forEach(x -> {
973
			IncomeImeiDate incomeImeiDate = new IncomeImeiDate(x.getImei(), null);
974
			if (imeiWiseIncomeMapOfMap.containsKey(incomeImeiDate)) {
975
				ImeiWiseIncomePairAndMapModel imeiWiseIncomePairAndMapModel = imeiWiseIncomeMapOfMap
976
						.get(incomeImeiDate);
977
				double totalAmount = imeiWiseIncomePairAndMapModel.getTotalIncome() + x.getAmount();
978
				imeiWiseIncomePairAndMapModel.setTotalIncome(totalAmount);
979
				imeiWiseIncomePairAndMapModel.setFrontMargin(x.getAmount());
980
			}
981
		});
982
 
30235 tejbeer 983
		lastMonthCreditedImeis.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING)).forEach(x -> {
984
			IncomeImeiDate incomeImeiDate = new IncomeImeiDate(x.getImei(), x.getCreateTimeStamp());
985
			if (imeiWiseIncomeMapOfMap.containsKey(incomeImeiDate)) {
986
				ImeiWiseIncomePairAndMapModel imeiWiseIncomePairAndMapModel = imeiWiseIncomeMapOfMap
987
						.get(incomeImeiDate);
988
 
989
				double totalAmount = imeiWiseIncomePairAndMapModel.getTotalIncome() + x.getPendingSaleAmount();
990
				imeiWiseIncomePairAndMapModel.setTotalIncome(totalAmount);
991
 
992
			} else {
993
 
994
				ImeiWiseIncomePairAndMapModel newObjectImeiWiseIncomePairAndMapModel = new ImeiWiseIncomePairAndMapModel();
995
 
996
				newObjectImeiWiseIncomePairAndMapModel.setSerialNumber(x.getImei());
997
				newObjectImeiWiseIncomePairAndMapModel.setPurchseDate(x.getCreateTimeStamp());
998
				newObjectImeiWiseIncomePairAndMapModel.setTotalIncome(x.getPendingSaleAmount());
999
			}
1000
 
1001
		});
1002
 
1003
		model.addAttribute("imeiWisePendingSaleAmount", imeiWisePendingSaleAmount);
30053 manish 1004
		model.addAttribute("month", month);
1005
		model.addAttribute("purchaseList", purchaseList);
1006
		model.addAttribute("saleList", saleList);
1007
		model.addAttribute("lastMonthPurchaseInMapPairMap", lastMonthPurchaseInMapPairMap);
1008
		model.addAttribute("lastMonthCreditedMapPairMap", lastMonthCreditedMapPairMap);
1009
		model.addAttribute("imeiWiseIncomeMapOfMap", imeiWiseIncomeMapOfMap);
1010
		model.addAttribute("lastmonthCategoryUpgradeMargin", lastmonthCategoryUpgradeMargin);
1011
 
1012
		LOGGER.info("lastMonthPurchaseInMapPairMap {}", lastMonthPurchaseInMapPairMap);
1013
		LOGGER.info("lastMonthCreditedMapPairMap {}", lastMonthCreditedMapPairMap);
1014
		LOGGER.info("imeiWiseIncomeMapOfMap {}", imeiWiseIncomeMapOfMap);
1015
 
1016
		return "last-month-imei-wise-income";
1017
	}
1018
 
1019
	@RequestMapping(value = "/brandWiseIncome", method = RequestMethod.GET)
1020
	public String getBrandWiseIncome(HttpServletRequest request,
30253 amit.gupta 1021
									 @RequestParam(name = "brand", required = false, defaultValue = "") String brand,
1022
									 @RequestParam(name = "status", required = false, defaultValue = "") String status,
1023
									 @RequestParam(name = "month", required = false, defaultValue = "") int month, Model model)
30053 manish 1024
			throws ProfitMandiBusinessException {
1025
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1026
		LOGGER.info("loginDetails {}", loginDetails);
1027
		LOGGER.info("brand" + brand);
1028
		LOGGER.info("month {}", month);
1029
 
1030
		model.addAttribute("month", month);
1031
		LocalDateTime lastMonthStart = LocalDate.now().minusMonths(month).withDayOfMonth(1).atStartOfDay();
1032
		LocalDateTime currentMonthEnd = lastMonthStart.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
1033
 
1034
		List<LastMonthBrandWiseIncomeModel> lastMonthModelWiseIncomes = null;
30235 tejbeer 1035
		List<LastMonthFrontEndBrandWiseIncome> modelWiseFrontIncomes = null;
30053 manish 1036
		List<LastMonthBrandWiseIncomeModel> purchaseInModelWiseIncomes = null;
1037
 
1038
		boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), YearMonth.now());
1039
 
1040
		LOGGER.info("partnerType" + partnerType);
1041
 
1042
		Map<String, Double> categoryUpradeBrandModelMap = new HashMap<>();
1043
 
1044
		if (partnerType) {
1045
			categoryUpradeBrandModelMap = schemeInOutRepository
1046
					.selectLastMonthCategoryUpgradeMarginByBrandModel(loginDetails.getFofoId(), brand, lastMonthStart,
1047
							currentMonthEnd)
1048
					.stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1049
		}
1050
		LOGGER.info("partnerType {}", partnerType);
1051
		LOGGER.info("categoryUpradeBrandModelMap {}", categoryUpradeBrandModelMap);
1052
 
1053
 
30253 amit.gupta 1054
		lastMonthModelWiseIncomes = schemeInOutRepository.selectLastMonthBrandWiseIncome(loginDetails.getFofoId(),
1055
				brand, lastMonthStart, currentMonthEnd);
1056
		modelWiseFrontIncomes = schemeInOutRepository.selectFrontIncomeBrandWise(loginDetails.getFofoId(), brand,
1057
				lastMonthStart, currentMonthEnd);
1058
		purchaseInModelWiseIncomes = schemeInOutRepository.selectLastMonthPurchaseBrandWiseIncome(
1059
				loginDetails.getFofoId(), brand, lastMonthStart, currentMonthEnd);
1060
 
1061
		LOGGER.info("modelWiseFrontIncomes {}", modelWiseFrontIncomes);
1062
		LOGGER.info("lastMonthModelWiseIncomes {}", lastMonthModelWiseIncomes);
1063
		LOGGER.info("purchaseInModelWiseIncomes {}", purchaseInModelWiseIncomes);
1064
		Map<String, LastMonthBrandWiseIncomeModel> modelWiseMap = lastMonthModelWiseIncomes.stream()
1065
				.collect(Collectors.toMap(x -> x.getModelNumber(), x -> x));
1066
 
1067
 
1068
		LOGGER.info("modelWiseMap1" + modelWiseMap);
1069
		Map<String, LastMonthBrandWiseIncomeModel> purchaseWiseMap = purchaseInModelWiseIncomes.stream()
1070
				.collect(Collectors.toMap(x -> x.getModelNumber(), x -> x));
1071
 
30235 tejbeer 1072
		Map<String, Double> modelWiseTotalAmount = new HashMap<>();
30253 amit.gupta 1073
 
30235 tejbeer 1074
		modelWiseFrontIncomes.stream().forEach(x -> {
30253 amit.gupta 1075
			LastMonthBrandWiseIncomeModel lmbwi = modelWiseMap.get(x.getModelNumber());
30235 tejbeer 1076
			if (modelWiseMap.containsKey(x.getModelNumber())) {
30053 manish 1077
 
30253 amit.gupta 1078
 
1079
				lmbwi.setAmount(x.getAmount() + lmbwi.getAmount());
1080
 
30235 tejbeer 1081
				modelWiseMap.put(x.getModelNumber(), lmbwi);
30253 amit.gupta 1082
			} else {
30235 tejbeer 1083
				LastMonthBrandWiseIncomeModel lmbwIncomeModel = new LastMonthBrandWiseIncomeModel();
1084
				lmbwIncomeModel.setAmount(x.getAmount());
1085
				lmbwIncomeModel.setModelName(x.getModelName());
1086
				lmbwIncomeModel.setModelNumber(x.getModelNumber());
1087
				lmbwIncomeModel.setBrand(x.getBrand());
1088
				lmbwIncomeModel.setCatalogItemId(x.getCatalogItemId());
1089
				lmbwIncomeModel.setPendingSaleAmount(x.getPendingSaleAmount());
1090
				lmbwIncomeModel.setQty(x.getQty());
1091
				lmbwIncomeModel.setStatus(SchemePayoutStatus.CREDITED);
1092
				modelWiseMap.put(lmbwIncomeModel.getModelNumber(), lmbwIncomeModel);
1093
			}
30253 amit.gupta 1094
 
30235 tejbeer 1095
			if (modelWiseTotalAmount.containsKey(x.getModelNumber())) {
30053 manish 1096
 
30235 tejbeer 1097
				double amount = x.getAmount() + modelWiseTotalAmount.get(x.getModelNumber());
1098
				modelWiseTotalAmount.put(x.getModelNumber(), amount);
1099
			} else {
30253 amit.gupta 1100
 
30235 tejbeer 1101
				double amount = modelWiseMap.get(x.getModelNumber()).getAmount();
1102
				modelWiseTotalAmount.put(x.getModelNumber(), amount);
1103
			}
30253 amit.gupta 1104
		});
1105
 
30235 tejbeer 1106
		for (LastMonthBrandWiseIncomeModel pmi : purchaseInModelWiseIncomes) {
30053 manish 1107
 
30235 tejbeer 1108
			if (!modelWiseMap.containsKey(pmi.getModelNumber())) {
1109
				modelWiseMap.put(pmi.getModelNumber(), null);
1110
			}
1111
			if (modelWiseTotalAmount.containsKey(pmi.getModelNumber())) {
30053 manish 1112
 
30235 tejbeer 1113
				double amount = pmi.getAmount() + modelWiseTotalAmount.get(pmi.getModelNumber());
1114
				modelWiseTotalAmount.put(pmi.getModelNumber(), amount);
1115
			} else {
1116
				modelWiseTotalAmount.put(pmi.getModelNumber(), pmi.getAmount());
1117
			}
30053 manish 1118
 
30235 tejbeer 1119
		}
30253 amit.gupta 1120
		LOGGER.info("modelWiseTotalAmount" + modelWiseTotalAmount);
1121
 
1122
		lastMonthModelWiseIncomes.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING) && x.getPendingSaleAmount() != 0.0).forEach(x -> {
1123
 
1124
			if (modelWiseTotalAmount.containsKey(x.getModelNumber())) {
1125
				double amount = modelWiseTotalAmount.get(x.getModelNumber()) + x.getPendingSaleAmount();
30235 tejbeer 1126
				modelWiseTotalAmount.put(x.getModelNumber(), amount);
30253 amit.gupta 1127
 
1128
				LOGGER.info("modelWiseTotalAmoun111t" + amount);
1129
			} else {
1130
				LOGGER.info("modelWiseTotalAmou2222t" + x.getPendingSaleAmount());
30235 tejbeer 1131
				modelWiseTotalAmount.put(x.getModelNumber(), x.getPendingSaleAmount());
1132
			}
30253 amit.gupta 1133
 
30235 tejbeer 1134
		});
30253 amit.gupta 1135
		LOGGER.info("modelWiseMap" + modelWiseMap);
30053 manish 1136
 
30253 amit.gupta 1137
		model.addAttribute("purchaseWiseMap", purchaseWiseMap);
1138
		model.addAttribute("categoryUpradeBrandModelMap", categoryUpradeBrandModelMap);
1139
		model.addAttribute("modelWiseMap", modelWiseMap);
1140
		model.addAttribute("modelWiseTotalAmount", modelWiseTotalAmount);
30053 manish 1141
 
1142
		return "montly-brand-wise-income";
1143
 
1144
	}
1145
 
1146
	@RequestMapping(value = "/monthWisePartnerIncome/{yearMonth}", method = RequestMethod.GET)
1147
	public String publishedOffersOnMonthBefore(HttpServletRequest request, @PathVariable int yearMonth, Model model)
1148
			throws ProfitMandiBusinessException {
1149
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1150
 
1151
		LocalDateTime lastMonthStart = LocalDate.now().minusMonths(yearMonth).withDayOfMonth(1).atStartOfDay();
1152
		LocalDateTime currentMonthEnd = lastMonthStart.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
1153
 
1154
		YearMonth monthYear = YearMonth.now();
1155
 
1156
		boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), monthYear);
1157
 
1158
		LOGGER.info("partnerType" + partnerType);
1159
 
1160
		Map<String, Double> lastMonthCategoryUpgradeMarginMap = new HashMap<>();
1161
 
1162
		if (partnerType) {
1163
			lastMonthCategoryUpgradeMarginMap = schemeInOutRepository
1164
					.selectLastMonthCategoryUpgradeMarginByBrand(loginDetails.getFofoId(), lastMonthStart,
1165
							currentMonthEnd)
1166
					.stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1167
		}
1168
 
1169
		String status = "CREDITED";
1170
		LOGGER.info("lastMonthStart" + lastMonthStart);
1171
		LOGGER.info("currentMonthEnd" + currentMonthEnd);
1172
 
1173
		List<LastMonthCreditedIncomeModel> lastMonthCreditedIncomeModels = schemeInOutRepository
1174
				.selectLastMonthCreditedIncomeByFofoId(loginDetails.getFofoId(), lastMonthStart, currentMonthEnd);
1175
 
1176
		List<LastMonthCreditedIncomeModel> lastMonthPurchaseInMargins = schemeInOutRepository
1177
				.selectLastMonthPurchaseInMarginByFofoId(loginDetails.getFofoId(), lastMonthStart, currentMonthEnd);
1178
 
1179
		List<LastMonthCreditedIncomeModel> lastMonthFrontEndIncomes = schemeInOutRepository
1180
				.selectFrontIncomeByBrand(loginDetails.getFofoId(), lastMonthStart, currentMonthEnd);
1181
 
1182
		LOGGER.info("lastMonthCreditedIncomeModels" + lastMonthCreditedIncomeModels);
1183
		LOGGER.info("lastMonthFrontEndIncomes" + lastMonthFrontEndIncomes);
1184
		LOGGER.info("lastMonthPurchaseInMargins" + lastMonthPurchaseInMargins);
1185
 
1186
		Map<String, LastMonthCreditedIncomeModel> lastMonthPurchaseInMarginMap = new HashMap<>();
1187
 
1188
		lastMonthPurchaseInMarginMap = lastMonthPurchaseInMargins.stream()
1189
				.collect(Collectors.toMap(x -> x.getBrand(), x -> x));
1190
 
1191
		Map<String, LastMonthCreditedIncomeModel> lastMonthSaleMarginMap = lastMonthCreditedIncomeModels.stream()
1192
				.collect(Collectors.toMap(x -> x.getBrand(), x -> x));
1193
 
1194
		lastMonthFrontEndIncomes.stream().forEach(x -> {
1195
			if (lastMonthSaleMarginMap.containsKey(x.getBrand())) {
1196
				x.setAmount(lastMonthSaleMarginMap.get(x.getBrand()).getAmount() + x.getAmount());
1197
 
1198
				lastMonthSaleMarginMap.put(x.getBrand(), x);
1199
			} else {
1200
				lastMonthSaleMarginMap.put(x.getBrand(), x);
1201
			}
1202
 
1203
		});
1204
		Map<String, Float> totalAmountMap = lastMonthSaleMarginMap.entrySet().stream()
1205
				.collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().getAmount()));
1206
		Set<String> keySet = new HashSet<String>();
1207
		keySet.addAll(lastMonthPurchaseInMarginMap.keySet());
1208
		keySet.addAll(lastMonthSaleMarginMap.keySet());
1209
 
1210
		lastMonthPurchaseInMarginMap.entrySet().stream().forEach(x -> {
1211
			String brand = x.getKey();
1212
			float amount = x.getValue().getAmount();
1213
			if (!totalAmountMap.containsKey(brand)) {
1214
				totalAmountMap.put(brand, 0f);
1215
			}
1216
			totalAmountMap.put(brand, totalAmountMap.get(brand) + amount);
1217
 
1218
		});
1219
 
1220
		Map<Integer, String> monthValueMap = new HashMap<>();
1221
		for (int i = 0; i <= 5; i++) {
1222
			LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
1223
			monthValueMap.put(i, startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
1224
		}
1225
		model.addAttribute("monthValueMap", monthValueMap);
1226
 
1227
		model.addAttribute("keySet", keySet);
1228
		model.addAttribute("lastMonthPurchaseInMarginMap", lastMonthPurchaseInMarginMap);
1229
		model.addAttribute("lastMonthSaleMarginMap", lastMonthSaleMarginMap);
1230
 
1231
		model.addAttribute("totalAmountMap", totalAmountMap);
1232
		model.addAttribute("status", status);
1233
		model.addAttribute("month", yearMonth);
1234
		model.addAttribute("lastMonthCategoryUpgradeMarginMap", lastMonthCategoryUpgradeMarginMap);
1235
		LOGGER.info("totalAmountMap {}", totalAmountMap);
1236
		LOGGER.info("lastMonthSaleMarginMap {}", lastMonthSaleMarginMap);
1237
 
1238
		return "last-month-credited-income";
1239
	}
1240
 
26802 tejbeer 1241
 
23020 ashik.ali 1242
	@RequestMapping(value = "/schemes/downloadPage", method = RequestMethod.GET)
23786 amit.gupta 1243
	public String downloadPage(HttpServletRequest request, Model model) {
23020 ashik.ali 1244
		return "schemes-download";
1245
	}
23786 amit.gupta 1246
 
23020 ashik.ali 1247
	@RequestMapping(value = "/schemes/download", method = RequestMethod.GET)
23786 amit.gupta 1248
	public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request,
30122 amit.gupta 1249
																  @RequestParam(name = ProfitMandiConstants.START_DATE_TIME) String startDateTimeString,
1250
																  @RequestParam(name = ProfitMandiConstants.END_DATE_TIME) String endDateTimeString, Model model)
23786 amit.gupta 1251
			throws ProfitMandiBusinessException {
23914 govind 1252
		LocalDateTime startDateTime = StringUtils.toDateTime(startDateTimeString,
24406 amit.gupta 1253
				DateTimePattern.DD_MM_yyyy_T_HH_MM_SS);
1254
		LocalDateTime endDateTime = StringUtils.toDateTime(endDateTimeString, DateTimePattern.DD_MM_yyyy_T_HH_MM_SS);
23914 govind 1255
 
23020 ashik.ali 1256
		List<SchemeModel> schemeModels = schemeService.getAllSchemeModels(startDateTime, endDateTime);
23786 amit.gupta 1257
 
23020 ashik.ali 1258
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
1259
		ExcelUtils.writeSchemeModels(schemeModels, byteArrayOutputStream);
23786 amit.gupta 1260
 
1261
		final HttpHeaders headers = new HttpHeaders();
1262
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
23020 ashik.ali 1263
		headers.set("Content-disposition", "inline; filename=SchemesReport.xlsx");
23786 amit.gupta 1264
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
1265
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
1266
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1267
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
23020 ashik.ali 1268
	}
23786 amit.gupta 1269
 
22860 ashik.ali 1270
	@RequestMapping(value = "/getSchemeById", method = RequestMethod.GET)
23786 amit.gupta 1271
	public String getSchemeById(HttpServletRequest request,
30122 amit.gupta 1272
								@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId, Model model)
23786 amit.gupta 1273
			throws ProfitMandiBusinessException {
23343 ashik.ali 1274
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29899 tejbeer 1275
 
1276
		boolean fullAccess = this.getAccess(loginDetails.getEmailId());
22860 ashik.ali 1277
		Scheme scheme = schemeService.getSchemeById(schemeId);
29899 tejbeer 1278
		model.addAttribute("fullAccess", fullAccess);
22860 ashik.ali 1279
		model.addAttribute("scheme", scheme);
24445 amit.gupta 1280
		model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
22860 ashik.ali 1281
		return "scheme-details";
1282
	}
23786 amit.gupta 1283
 
22860 ashik.ali 1284
	@RequestMapping(value = "/activeSchemeById", method = RequestMethod.PUT)
23786 amit.gupta 1285
	public String activeSchemeById(HttpServletRequest request,
30122 amit.gupta 1286
								   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
1287
								   @RequestParam(name = "offset", defaultValue = "0") int offset,
1288
								   @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
23786 amit.gupta 1289
			throws ProfitMandiBusinessException {
22860 ashik.ali 1290
		schemeService.activeSchemeById(schemeId);
1291
		List<Scheme> schemes = schemeRepository.selectAll(offset, limit);
30064 amit.gupta 1292
		for (Scheme scheme : schemes) {
1293
			if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
1294
				scheme.setAmountModel(scheme.getAmount() + "%");
1295
			} else {
1296
				scheme.setAmountModel(scheme.getAmount() + "");
1297
			}
1298
		}
30122 amit.gupta 1299
		return "schemes";
22860 ashik.ali 1300
	}
23786 amit.gupta 1301
 
22860 ashik.ali 1302
	@RequestMapping(value = "/expireSchemeById", method = RequestMethod.PUT)
23786 amit.gupta 1303
	public String expireSchemeById(HttpServletRequest request,
30122 amit.gupta 1304
								   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
1305
								   @RequestParam(name = ProfitMandiConstants.EXPIRE_TIMESTAMP) LocalDateTime expiryTimestamp,
1306
								   Model model)
23786 amit.gupta 1307
			throws ProfitMandiBusinessException {
28924 amit.gupta 1308
		expiryTimestamp = LocalDateTime.of(expiryTimestamp.toLocalDate(), Utils.MAX_TIME);
25069 amit.gupta 1309
		schemeService.expireSchemeById(schemeId, expiryTimestamp);
30122 amit.gupta 1310
		return getDefaultSchemes(request, model);
22860 ashik.ali 1311
	}
23786 amit.gupta 1312
 
23784 ashik.ali 1313
	@RequestMapping(value = "/getSchemesJson", method = RequestMethod.GET)
23786 amit.gupta 1314
	public ResponseEntity<?> getSchemesJson(HttpServletRequest request,
30122 amit.gupta 1315
											@RequestParam(name = "offset", defaultValue = "0") int offset,
1316
											@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
23786 amit.gupta 1317
			throws ProfitMandiBusinessException {
23784 ashik.ali 1318
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1319
		return responseSender.ok(schemeService.getSchemes(loginDetails.getRoleIds(), offset, limit));
1320
	}
26802 tejbeer 1321
 
1322
 
29707 tejbeer 1323
	@RequestMapping(value = "/getCustomerOffer", method = RequestMethod.GET)
1324
	public String getCustomerOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1325
 
1326
		List<CustomerOffer> customerOffers = customerOfferRepository.selectAll();
1327
 
1328
		model.addAttribute("customerOffers", customerOffers);
1329
		return "customer-offer";
1330
 
1331
	}
1332
 
1333
	@RequestMapping(value = "/createCustomerOffer", method = RequestMethod.POST)
1334
	public String createCustomerOffer(HttpServletRequest request, @RequestParam String offerName,
30122 amit.gupta 1335
									  @RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, Model model) throws Exception {
29707 tejbeer 1336
 
1337
		CustomerOffer co = new CustomerOffer();
1338
		co.setOfferName(offerName);
1339
		co.setStartDate(startDate);
1340
		co.setEndDate(endDate);
1341
		co.setCreatedTimestamp(LocalDateTime.now());
1342
		co.setUpdatedTimestamp(LocalDateTime.now());
1343
		customerOfferRepository.persist(co);
1344
 
1345
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
1346
 
1347
		return "response";
1348
 
1349
	}
1350
 
1351
	@RequestMapping(value = "/customerOffer/downloadTemplate", method = RequestMethod.GET)
1352
	public ResponseEntity<?> downloadCustomerOfferTemplate(HttpServletRequest request) throws Exception {
1353
		List<List<?>> rows = new ArrayList<>();
1354
 
1355
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1356
				.getCSVByteStream(Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout"), rows);
1357
 
1358
		final HttpHeaders headers = new HttpHeaders();
1359
		headers.set("Content-Type", "text/csv");
1360
		headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1361
		headers.setContentLength(baos.toByteArray().length);
1362
 
1363
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1364
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1365
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1366
 
1367
	}
1368
 
1369
	@RequestMapping(value = "/customerOfferItem/upload", method = RequestMethod.POST)
1370
	public String uploadCustomerOfferItem(HttpServletRequest request, Model model, @RequestParam int offerId,
30122 amit.gupta 1371
										  HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {
29707 tejbeer 1372
 
1373
		List<CSVRecord> records = FileUtil.readFile(file);
1374
 
1375
		for (CSVRecord record : records) {
1376
			if (Integer.parseInt(record.get(0)) == 0) {
1377
				CustomerOfferItem coi = new CustomerOfferItem();
1378
				coi.setCatalogId(Integer.parseInt(record.get(1)));
1379
				coi.setSchemePayout(Integer.parseInt(record.get(2)));
1380
				coi.setDealerPayout(Integer.parseInt(record.get(3)));
1381
				coi.setCustomerOfferId(offerId);
1382
				coi.setUpdatedTimestamp(LocalDateTime.now());
1383
				coi.setCreatedTimestamp(LocalDateTime.now());
1384
				customerOfferItemRepository.persist(coi);
1385
 
1386
			} else {
1387
				CustomerOfferItem coi = customerOfferItemRepository.selectById(Integer.parseInt(record.get(0)));
1388
				coi.setSchemePayout(Integer.parseInt(record.get(2)));
1389
				coi.setDealerPayout(Integer.parseInt(record.get(3)));
1390
				coi.setUpdatedTimestamp(LocalDateTime.now());
1391
 
1392
			}
1393
 
1394
		}
1395
 
1396
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
1397
 
1398
		return "response";
1399
 
1400
	}
1401
 
1402
	@RequestMapping(value = "/customerOfferItem/download", method = RequestMethod.GET)
1403
	public ResponseEntity<?> downloadOfferItem(HttpServletRequest request, @RequestParam int offerId) throws Exception {
1404
 
1405
		List<CustomerOfferItem> cois = customerOfferItemRepository.selectByOfferId(offerId);
1406
		List<List<?>> rows = new ArrayList<>();
1407
 
1408
		for (CustomerOfferItem coi : cois) {
1409
			rows.add(Arrays.asList(coi.getId(), coi.getCatalogId(), coi.getSchemePayout(), coi.getDealerPayout()));
1410
 
1411
		}
1412
 
1413
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1414
				.getCSVByteStream(Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout"), rows);
1415
 
1416
		final HttpHeaders headers = new HttpHeaders();
1417
		headers.set("Content-Type", "text/csv");
1418
		headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1419
		headers.setContentLength(baos.toByteArray().length);
1420
 
1421
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1422
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1423
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1424
 
1425
	}
1426
 
1427
	@RequestMapping(value = "/extendCustomerOffer", method = RequestMethod.POST)
1428
	public String extendCustomerOffer(HttpServletRequest request, @RequestParam int id,
30122 amit.gupta 1429
									  @RequestParam LocalDateTime endDate, Model model) throws ProfitMandiBusinessException {
29707 tejbeer 1430
 
1431
		CustomerOffer co = customerOfferRepository.selectById(id);
1432
		co.setEndDate(endDate);
1433
		co.setUpdatedTimestamp(LocalDateTime.now());
1434
 
1435
		model.addAttribute("co", co);
1436
 
1437
		return "customer-index-offer";
1438
 
1439
	}
1440
 
1441
	@RequestMapping(value = "/getSamsungUpgradeOffer", method = RequestMethod.GET)
1442
	public String getSamsungUpgradeOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1443
 
1444
		List<UpgradeOfferStatus> uos = UpgradeOfferStatus.offerStatus;
1445
		List<SamsungUpgradeOffer> samsungUpgradeOffers = samsungUpgradeOfferRepository.selectByStatus(
1446
				uos.stream().filter(x -> !x.equals(UpgradeOfferStatus.rejected)).collect(Collectors.toList()));
1447
 
1448
		model.addAttribute("samsungUpgradeOffers", samsungUpgradeOffers);
1449
		return "samsung-upgrade-offer";
1450
 
1451
	}
1452
 
1453
	@RequestMapping(value = "/approveSamsungUpgradeOffer", method = RequestMethod.POST)
1454
	public String approveSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1455
			throws ProfitMandiBusinessException {
1456
 
1457
		SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1458
		suo.setStatus(UpgradeOfferStatus.approved);
1459
		suo.setApprovedTimestamp(LocalDateTime.now());
1460
		model.addAttribute("suo", suo);
1461
		return "samsung-upgrade-offer-index";
1462
 
1463
	}
1464
 
1465
	@RequestMapping(value = "/rejectSamsungUpgradeOffer", method = RequestMethod.POST)
1466
	public String rejectSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1467
			throws ProfitMandiBusinessException {
1468
 
1469
		SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1470
		suo.setStatus(UpgradeOfferStatus.rejected);
1471
 
1472
		model.addAttribute("suo", suo);
1473
		return "samsung-upgrade-offer-index";
1474
 
1475
	}
22860 ashik.ali 1476
}