Subversion Repositories SmartDukaan

Rev

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