Subversion Repositories SmartDukaan

Rev

Rev 30253 | Rev 30326 | 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;
30274 amit.gupta 553
		} else if (!isAdmin) {
554
			date = LocalDate.now();
27876 amit.gupta 555
		}
26802 tejbeer 556
 
23343 ashik.ali 557
		List<Scheme> schemes = null;
28796 tejbeer 558
		List<SchemeInOut> schemeInOut = null;
559
 
30122 amit.gupta 560
		boolean fullAccess = this.getAccess(loginDetails.getEmailId());
29608 amit.gupta 561
 
30122 amit.gupta 562
		model.addAttribute("fullAccess", fullAccess);
563
		model.addAttribute("searchImei", searchImei);
564
		model.addAttribute("isAdmin", isAdmin);
565
		model.addAttribute("searchModel", searchModel);
566
		model.addAttribute("searchScheme", searchScheme);
567
		model.addAttribute("partnerType", partnerType);
568
		model.addAttribute("date", date);
29608 amit.gupta 569
 
30122 amit.gupta 570
		final LocalDate date1 = date;
571
		if (searchScheme > 0) {
572
			schemes = Arrays.asList(schemeRepository.selectById(searchScheme));
573
			this.setSchemeAmountModel(schemes);
27876 amit.gupta 574
			if (schemes.size() > 0) {
26802 tejbeer 575
				model.addAttribute("schemes", schemes);
30122 amit.gupta 576
				return "schemes";
30043 amit.gupta 577
			} else {
30122 amit.gupta 578
				throw new ProfitMandiBusinessException("SchemeId", searchScheme, "SchemeId Not Found");
26802 tejbeer 579
			}
30122 amit.gupta 580
		} else if (searchModel > 0) {
581
			Item item = itemRepository.selectAllByCatalogItemId(searchModel).get(0);
30253 amit.gupta 582
			TagListing tagListing = tagListingRepository.selectByItemId(item.getId());
28134 tejbeer 583
			if (tagListing != null) {
584
				model.addAttribute("dp", tagListing.getSellingPrice());
585
				model.addAttribute("mop", tagListing.getMop());
26802 tejbeer 586
			}
30253 amit.gupta 587
			model.addAttribute("modelName", item.getItemDescriptionNoColor());
588
			if (isAdmin) {
589
				schemes = schemeService.selectSchemeByPartnerType(partnerType, date, searchModel, isAdmin, offset, limit)
590
						.stream().filter(x -> {
591
							return (x.getId() != 411 && x.getId() != 612) || date1.isBefore(LocalDate.of(2021, 12, 1));
592
						}).collect(Collectors.toList());
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();
880
		LocalDateTime currentMonthEnd = lastMonthStart.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
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
887
				.selectLastMonthFrontEndImei(loginDetails.getFofoId(), catalogItemId, lastMonthStart, currentMonthEnd);
888
		List<LastMonthImeiModel> lmpi = schemeInOutRepository.selectLastMonthPurchaseInImei(loginDetails.getFofoId(),
889
				catalogItemId, lastMonthStart, currentMonthEnd);
890
		List<LastMonthImeiModel> lmci = schemeInOutRepository.selectLastMonthCreditedImei(loginDetails.getFofoId(),
891
				catalogItemId, lastMonthStart, currentMonthEnd);
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,
897
						currentMonthEnd)
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
 
1031
		model.addAttribute("month", month);
1032
		LocalDateTime lastMonthStart = LocalDate.now().minusMonths(month).withDayOfMonth(1).atStartOfDay();
1033
		LocalDateTime currentMonthEnd = lastMonthStart.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
1034
 
1035
		List<LastMonthBrandWiseIncomeModel> lastMonthModelWiseIncomes = null;
30235 tejbeer 1036
		List<LastMonthFrontEndBrandWiseIncome> modelWiseFrontIncomes = null;
30053 manish 1037
		List<LastMonthBrandWiseIncomeModel> purchaseInModelWiseIncomes = null;
1038
 
1039
		boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), YearMonth.now());
1040
 
1041
		LOGGER.info("partnerType" + partnerType);
1042
 
1043
		Map<String, Double> categoryUpradeBrandModelMap = new HashMap<>();
1044
 
1045
		if (partnerType) {
1046
			categoryUpradeBrandModelMap = schemeInOutRepository
1047
					.selectLastMonthCategoryUpgradeMarginByBrandModel(loginDetails.getFofoId(), brand, lastMonthStart,
1048
							currentMonthEnd)
1049
					.stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1050
		}
1051
		LOGGER.info("partnerType {}", partnerType);
1052
		LOGGER.info("categoryUpradeBrandModelMap {}", categoryUpradeBrandModelMap);
1053
 
1054
 
30253 amit.gupta 1055
		lastMonthModelWiseIncomes = schemeInOutRepository.selectLastMonthBrandWiseIncome(loginDetails.getFofoId(),
1056
				brand, lastMonthStart, currentMonthEnd);
1057
		modelWiseFrontIncomes = schemeInOutRepository.selectFrontIncomeBrandWise(loginDetails.getFofoId(), brand,
1058
				lastMonthStart, currentMonthEnd);
1059
		purchaseInModelWiseIncomes = schemeInOutRepository.selectLastMonthPurchaseBrandWiseIncome(
1060
				loginDetails.getFofoId(), brand, lastMonthStart, currentMonthEnd);
1061
 
1062
		LOGGER.info("modelWiseFrontIncomes {}", modelWiseFrontIncomes);
1063
		LOGGER.info("lastMonthModelWiseIncomes {}", lastMonthModelWiseIncomes);
1064
		LOGGER.info("purchaseInModelWiseIncomes {}", purchaseInModelWiseIncomes);
1065
		Map<String, LastMonthBrandWiseIncomeModel> modelWiseMap = lastMonthModelWiseIncomes.stream()
1066
				.collect(Collectors.toMap(x -> x.getModelNumber(), x -> x));
1067
 
1068
 
1069
		LOGGER.info("modelWiseMap1" + modelWiseMap);
1070
		Map<String, LastMonthBrandWiseIncomeModel> purchaseWiseMap = purchaseInModelWiseIncomes.stream()
1071
				.collect(Collectors.toMap(x -> x.getModelNumber(), x -> x));
1072
 
30235 tejbeer 1073
		Map<String, Double> modelWiseTotalAmount = new HashMap<>();
30253 amit.gupta 1074
 
30235 tejbeer 1075
		modelWiseFrontIncomes.stream().forEach(x -> {
30253 amit.gupta 1076
			LastMonthBrandWiseIncomeModel lmbwi = modelWiseMap.get(x.getModelNumber());
30235 tejbeer 1077
			if (modelWiseMap.containsKey(x.getModelNumber())) {
30053 manish 1078
 
30253 amit.gupta 1079
 
1080
				lmbwi.setAmount(x.getAmount() + lmbwi.getAmount());
1081
 
30235 tejbeer 1082
				modelWiseMap.put(x.getModelNumber(), lmbwi);
30253 amit.gupta 1083
			} else {
30235 tejbeer 1084
				LastMonthBrandWiseIncomeModel lmbwIncomeModel = new LastMonthBrandWiseIncomeModel();
1085
				lmbwIncomeModel.setAmount(x.getAmount());
1086
				lmbwIncomeModel.setModelName(x.getModelName());
1087
				lmbwIncomeModel.setModelNumber(x.getModelNumber());
1088
				lmbwIncomeModel.setBrand(x.getBrand());
1089
				lmbwIncomeModel.setCatalogItemId(x.getCatalogItemId());
1090
				lmbwIncomeModel.setPendingSaleAmount(x.getPendingSaleAmount());
1091
				lmbwIncomeModel.setQty(x.getQty());
1092
				lmbwIncomeModel.setStatus(SchemePayoutStatus.CREDITED);
1093
				modelWiseMap.put(lmbwIncomeModel.getModelNumber(), lmbwIncomeModel);
1094
			}
30253 amit.gupta 1095
 
30235 tejbeer 1096
			if (modelWiseTotalAmount.containsKey(x.getModelNumber())) {
30053 manish 1097
 
30235 tejbeer 1098
				double amount = x.getAmount() + modelWiseTotalAmount.get(x.getModelNumber());
1099
				modelWiseTotalAmount.put(x.getModelNumber(), amount);
1100
			} else {
30253 amit.gupta 1101
 
30235 tejbeer 1102
				double amount = modelWiseMap.get(x.getModelNumber()).getAmount();
1103
				modelWiseTotalAmount.put(x.getModelNumber(), amount);
1104
			}
30253 amit.gupta 1105
		});
1106
 
30235 tejbeer 1107
		for (LastMonthBrandWiseIncomeModel pmi : purchaseInModelWiseIncomes) {
30053 manish 1108
 
30235 tejbeer 1109
			if (!modelWiseMap.containsKey(pmi.getModelNumber())) {
1110
				modelWiseMap.put(pmi.getModelNumber(), null);
1111
			}
1112
			if (modelWiseTotalAmount.containsKey(pmi.getModelNumber())) {
30053 manish 1113
 
30235 tejbeer 1114
				double amount = pmi.getAmount() + modelWiseTotalAmount.get(pmi.getModelNumber());
1115
				modelWiseTotalAmount.put(pmi.getModelNumber(), amount);
1116
			} else {
1117
				modelWiseTotalAmount.put(pmi.getModelNumber(), pmi.getAmount());
1118
			}
30053 manish 1119
 
30235 tejbeer 1120
		}
30253 amit.gupta 1121
		LOGGER.info("modelWiseTotalAmount" + modelWiseTotalAmount);
1122
 
1123
		lastMonthModelWiseIncomes.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING) && x.getPendingSaleAmount() != 0.0).forEach(x -> {
1124
 
1125
			if (modelWiseTotalAmount.containsKey(x.getModelNumber())) {
1126
				double amount = modelWiseTotalAmount.get(x.getModelNumber()) + x.getPendingSaleAmount();
30235 tejbeer 1127
				modelWiseTotalAmount.put(x.getModelNumber(), amount);
30253 amit.gupta 1128
 
1129
				LOGGER.info("modelWiseTotalAmoun111t" + amount);
1130
			} else {
1131
				LOGGER.info("modelWiseTotalAmou2222t" + x.getPendingSaleAmount());
30235 tejbeer 1132
				modelWiseTotalAmount.put(x.getModelNumber(), x.getPendingSaleAmount());
1133
			}
30253 amit.gupta 1134
 
30235 tejbeer 1135
		});
30253 amit.gupta 1136
		LOGGER.info("modelWiseMap" + modelWiseMap);
30053 manish 1137
 
30253 amit.gupta 1138
		model.addAttribute("purchaseWiseMap", purchaseWiseMap);
1139
		model.addAttribute("categoryUpradeBrandModelMap", categoryUpradeBrandModelMap);
1140
		model.addAttribute("modelWiseMap", modelWiseMap);
1141
		model.addAttribute("modelWiseTotalAmount", modelWiseTotalAmount);
30053 manish 1142
 
1143
		return "montly-brand-wise-income";
1144
 
1145
	}
1146
 
1147
	@RequestMapping(value = "/monthWisePartnerIncome/{yearMonth}", method = RequestMethod.GET)
1148
	public String publishedOffersOnMonthBefore(HttpServletRequest request, @PathVariable int yearMonth, Model model)
1149
			throws ProfitMandiBusinessException {
1150
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1151
 
1152
		LocalDateTime lastMonthStart = LocalDate.now().minusMonths(yearMonth).withDayOfMonth(1).atStartOfDay();
1153
		LocalDateTime currentMonthEnd = lastMonthStart.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
1154
 
1155
		YearMonth monthYear = YearMonth.now();
1156
 
1157
		boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), monthYear);
1158
 
1159
		LOGGER.info("partnerType" + partnerType);
1160
 
1161
		Map<String, Double> lastMonthCategoryUpgradeMarginMap = new HashMap<>();
1162
 
1163
		if (partnerType) {
1164
			lastMonthCategoryUpgradeMarginMap = schemeInOutRepository
1165
					.selectLastMonthCategoryUpgradeMarginByBrand(loginDetails.getFofoId(), lastMonthStart,
1166
							currentMonthEnd)
1167
					.stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1168
		}
1169
 
1170
		String status = "CREDITED";
1171
		LOGGER.info("lastMonthStart" + lastMonthStart);
1172
		LOGGER.info("currentMonthEnd" + currentMonthEnd);
1173
 
1174
		List<LastMonthCreditedIncomeModel> lastMonthCreditedIncomeModels = schemeInOutRepository
1175
				.selectLastMonthCreditedIncomeByFofoId(loginDetails.getFofoId(), lastMonthStart, currentMonthEnd);
1176
 
1177
		List<LastMonthCreditedIncomeModel> lastMonthPurchaseInMargins = schemeInOutRepository
1178
				.selectLastMonthPurchaseInMarginByFofoId(loginDetails.getFofoId(), lastMonthStart, currentMonthEnd);
1179
 
1180
		List<LastMonthCreditedIncomeModel> lastMonthFrontEndIncomes = schemeInOutRepository
1181
				.selectFrontIncomeByBrand(loginDetails.getFofoId(), lastMonthStart, currentMonthEnd);
1182
 
1183
		LOGGER.info("lastMonthCreditedIncomeModels" + lastMonthCreditedIncomeModels);
1184
		LOGGER.info("lastMonthFrontEndIncomes" + lastMonthFrontEndIncomes);
1185
		LOGGER.info("lastMonthPurchaseInMargins" + lastMonthPurchaseInMargins);
1186
 
1187
		Map<String, LastMonthCreditedIncomeModel> lastMonthPurchaseInMarginMap = new HashMap<>();
1188
 
1189
		lastMonthPurchaseInMarginMap = lastMonthPurchaseInMargins.stream()
1190
				.collect(Collectors.toMap(x -> x.getBrand(), x -> x));
1191
 
1192
		Map<String, LastMonthCreditedIncomeModel> lastMonthSaleMarginMap = lastMonthCreditedIncomeModels.stream()
1193
				.collect(Collectors.toMap(x -> x.getBrand(), x -> x));
1194
 
1195
		lastMonthFrontEndIncomes.stream().forEach(x -> {
1196
			if (lastMonthSaleMarginMap.containsKey(x.getBrand())) {
1197
				x.setAmount(lastMonthSaleMarginMap.get(x.getBrand()).getAmount() + x.getAmount());
1198
 
1199
				lastMonthSaleMarginMap.put(x.getBrand(), x);
1200
			} else {
1201
				lastMonthSaleMarginMap.put(x.getBrand(), x);
1202
			}
1203
 
1204
		});
1205
		Map<String, Float> totalAmountMap = lastMonthSaleMarginMap.entrySet().stream()
1206
				.collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().getAmount()));
1207
		Set<String> keySet = new HashSet<String>();
1208
		keySet.addAll(lastMonthPurchaseInMarginMap.keySet());
1209
		keySet.addAll(lastMonthSaleMarginMap.keySet());
1210
 
1211
		lastMonthPurchaseInMarginMap.entrySet().stream().forEach(x -> {
1212
			String brand = x.getKey();
1213
			float amount = x.getValue().getAmount();
1214
			if (!totalAmountMap.containsKey(brand)) {
1215
				totalAmountMap.put(brand, 0f);
1216
			}
1217
			totalAmountMap.put(brand, totalAmountMap.get(brand) + amount);
1218
 
1219
		});
1220
 
1221
		Map<Integer, String> monthValueMap = new HashMap<>();
1222
		for (int i = 0; i <= 5; i++) {
1223
			LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
1224
			monthValueMap.put(i, startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
1225
		}
1226
		model.addAttribute("monthValueMap", monthValueMap);
1227
 
1228
		model.addAttribute("keySet", keySet);
1229
		model.addAttribute("lastMonthPurchaseInMarginMap", lastMonthPurchaseInMarginMap);
1230
		model.addAttribute("lastMonthSaleMarginMap", lastMonthSaleMarginMap);
1231
 
1232
		model.addAttribute("totalAmountMap", totalAmountMap);
1233
		model.addAttribute("status", status);
1234
		model.addAttribute("month", yearMonth);
1235
		model.addAttribute("lastMonthCategoryUpgradeMarginMap", lastMonthCategoryUpgradeMarginMap);
1236
		LOGGER.info("totalAmountMap {}", totalAmountMap);
1237
		LOGGER.info("lastMonthSaleMarginMap {}", lastMonthSaleMarginMap);
1238
 
1239
		return "last-month-credited-income";
1240
	}
1241
 
26802 tejbeer 1242
 
23020 ashik.ali 1243
	@RequestMapping(value = "/schemes/downloadPage", method = RequestMethod.GET)
23786 amit.gupta 1244
	public String downloadPage(HttpServletRequest request, Model model) {
23020 ashik.ali 1245
		return "schemes-download";
1246
	}
23786 amit.gupta 1247
 
23020 ashik.ali 1248
	@RequestMapping(value = "/schemes/download", method = RequestMethod.GET)
23786 amit.gupta 1249
	public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request,
30122 amit.gupta 1250
																  @RequestParam(name = ProfitMandiConstants.START_DATE_TIME) String startDateTimeString,
1251
																  @RequestParam(name = ProfitMandiConstants.END_DATE_TIME) String endDateTimeString, Model model)
23786 amit.gupta 1252
			throws ProfitMandiBusinessException {
23914 govind 1253
		LocalDateTime startDateTime = StringUtils.toDateTime(startDateTimeString,
24406 amit.gupta 1254
				DateTimePattern.DD_MM_yyyy_T_HH_MM_SS);
1255
		LocalDateTime endDateTime = StringUtils.toDateTime(endDateTimeString, DateTimePattern.DD_MM_yyyy_T_HH_MM_SS);
23914 govind 1256
 
23020 ashik.ali 1257
		List<SchemeModel> schemeModels = schemeService.getAllSchemeModels(startDateTime, endDateTime);
23786 amit.gupta 1258
 
23020 ashik.ali 1259
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
1260
		ExcelUtils.writeSchemeModels(schemeModels, byteArrayOutputStream);
23786 amit.gupta 1261
 
1262
		final HttpHeaders headers = new HttpHeaders();
1263
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
23020 ashik.ali 1264
		headers.set("Content-disposition", "inline; filename=SchemesReport.xlsx");
23786 amit.gupta 1265
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
1266
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
1267
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1268
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
23020 ashik.ali 1269
	}
23786 amit.gupta 1270
 
22860 ashik.ali 1271
	@RequestMapping(value = "/getSchemeById", method = RequestMethod.GET)
23786 amit.gupta 1272
	public String getSchemeById(HttpServletRequest request,
30122 amit.gupta 1273
								@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId, Model model)
23786 amit.gupta 1274
			throws ProfitMandiBusinessException {
23343 ashik.ali 1275
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29899 tejbeer 1276
 
1277
		boolean fullAccess = this.getAccess(loginDetails.getEmailId());
22860 ashik.ali 1278
		Scheme scheme = schemeService.getSchemeById(schemeId);
29899 tejbeer 1279
		model.addAttribute("fullAccess", fullAccess);
22860 ashik.ali 1280
		model.addAttribute("scheme", scheme);
24445 amit.gupta 1281
		model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
22860 ashik.ali 1282
		return "scheme-details";
1283
	}
23786 amit.gupta 1284
 
22860 ashik.ali 1285
	@RequestMapping(value = "/activeSchemeById", method = RequestMethod.PUT)
23786 amit.gupta 1286
	public String activeSchemeById(HttpServletRequest request,
30122 amit.gupta 1287
								   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
1288
								   @RequestParam(name = "offset", defaultValue = "0") int offset,
1289
								   @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
23786 amit.gupta 1290
			throws ProfitMandiBusinessException {
22860 ashik.ali 1291
		schemeService.activeSchemeById(schemeId);
1292
		List<Scheme> schemes = schemeRepository.selectAll(offset, limit);
30064 amit.gupta 1293
		for (Scheme scheme : schemes) {
1294
			if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
1295
				scheme.setAmountModel(scheme.getAmount() + "%");
1296
			} else {
1297
				scheme.setAmountModel(scheme.getAmount() + "");
1298
			}
1299
		}
30122 amit.gupta 1300
		return "schemes";
22860 ashik.ali 1301
	}
23786 amit.gupta 1302
 
22860 ashik.ali 1303
	@RequestMapping(value = "/expireSchemeById", method = RequestMethod.PUT)
23786 amit.gupta 1304
	public String expireSchemeById(HttpServletRequest request,
30122 amit.gupta 1305
								   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
1306
								   @RequestParam(name = ProfitMandiConstants.EXPIRE_TIMESTAMP) LocalDateTime expiryTimestamp,
1307
								   Model model)
23786 amit.gupta 1308
			throws ProfitMandiBusinessException {
28924 amit.gupta 1309
		expiryTimestamp = LocalDateTime.of(expiryTimestamp.toLocalDate(), Utils.MAX_TIME);
25069 amit.gupta 1310
		schemeService.expireSchemeById(schemeId, expiryTimestamp);
30122 amit.gupta 1311
		return getDefaultSchemes(request, model);
22860 ashik.ali 1312
	}
23786 amit.gupta 1313
 
23784 ashik.ali 1314
	@RequestMapping(value = "/getSchemesJson", method = RequestMethod.GET)
23786 amit.gupta 1315
	public ResponseEntity<?> getSchemesJson(HttpServletRequest request,
30122 amit.gupta 1316
											@RequestParam(name = "offset", defaultValue = "0") int offset,
1317
											@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
23786 amit.gupta 1318
			throws ProfitMandiBusinessException {
23784 ashik.ali 1319
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1320
		return responseSender.ok(schemeService.getSchemes(loginDetails.getRoleIds(), offset, limit));
1321
	}
26802 tejbeer 1322
 
1323
 
29707 tejbeer 1324
	@RequestMapping(value = "/getCustomerOffer", method = RequestMethod.GET)
1325
	public String getCustomerOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1326
 
1327
		List<CustomerOffer> customerOffers = customerOfferRepository.selectAll();
1328
 
1329
		model.addAttribute("customerOffers", customerOffers);
1330
		return "customer-offer";
1331
 
1332
	}
1333
 
1334
	@RequestMapping(value = "/createCustomerOffer", method = RequestMethod.POST)
1335
	public String createCustomerOffer(HttpServletRequest request, @RequestParam String offerName,
30122 amit.gupta 1336
									  @RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, Model model) throws Exception {
29707 tejbeer 1337
 
1338
		CustomerOffer co = new CustomerOffer();
1339
		co.setOfferName(offerName);
1340
		co.setStartDate(startDate);
1341
		co.setEndDate(endDate);
1342
		co.setCreatedTimestamp(LocalDateTime.now());
1343
		co.setUpdatedTimestamp(LocalDateTime.now());
1344
		customerOfferRepository.persist(co);
1345
 
1346
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
1347
 
1348
		return "response";
1349
 
1350
	}
1351
 
1352
	@RequestMapping(value = "/customerOffer/downloadTemplate", method = RequestMethod.GET)
1353
	public ResponseEntity<?> downloadCustomerOfferTemplate(HttpServletRequest request) throws Exception {
1354
		List<List<?>> rows = new ArrayList<>();
1355
 
1356
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1357
				.getCSVByteStream(Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout"), rows);
1358
 
1359
		final HttpHeaders headers = new HttpHeaders();
1360
		headers.set("Content-Type", "text/csv");
1361
		headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1362
		headers.setContentLength(baos.toByteArray().length);
1363
 
1364
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1365
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1366
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1367
 
1368
	}
1369
 
1370
	@RequestMapping(value = "/customerOfferItem/upload", method = RequestMethod.POST)
1371
	public String uploadCustomerOfferItem(HttpServletRequest request, Model model, @RequestParam int offerId,
30122 amit.gupta 1372
										  HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {
29707 tejbeer 1373
 
1374
		List<CSVRecord> records = FileUtil.readFile(file);
1375
 
1376
		for (CSVRecord record : records) {
1377
			if (Integer.parseInt(record.get(0)) == 0) {
1378
				CustomerOfferItem coi = new CustomerOfferItem();
1379
				coi.setCatalogId(Integer.parseInt(record.get(1)));
1380
				coi.setSchemePayout(Integer.parseInt(record.get(2)));
1381
				coi.setDealerPayout(Integer.parseInt(record.get(3)));
1382
				coi.setCustomerOfferId(offerId);
1383
				coi.setUpdatedTimestamp(LocalDateTime.now());
1384
				coi.setCreatedTimestamp(LocalDateTime.now());
1385
				customerOfferItemRepository.persist(coi);
1386
 
1387
			} else {
1388
				CustomerOfferItem coi = customerOfferItemRepository.selectById(Integer.parseInt(record.get(0)));
1389
				coi.setSchemePayout(Integer.parseInt(record.get(2)));
1390
				coi.setDealerPayout(Integer.parseInt(record.get(3)));
1391
				coi.setUpdatedTimestamp(LocalDateTime.now());
1392
 
1393
			}
1394
 
1395
		}
1396
 
1397
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
1398
 
1399
		return "response";
1400
 
1401
	}
1402
 
1403
	@RequestMapping(value = "/customerOfferItem/download", method = RequestMethod.GET)
1404
	public ResponseEntity<?> downloadOfferItem(HttpServletRequest request, @RequestParam int offerId) throws Exception {
1405
 
1406
		List<CustomerOfferItem> cois = customerOfferItemRepository.selectByOfferId(offerId);
1407
		List<List<?>> rows = new ArrayList<>();
1408
 
1409
		for (CustomerOfferItem coi : cois) {
1410
			rows.add(Arrays.asList(coi.getId(), coi.getCatalogId(), coi.getSchemePayout(), coi.getDealerPayout()));
1411
 
1412
		}
1413
 
1414
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1415
				.getCSVByteStream(Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout"), rows);
1416
 
1417
		final HttpHeaders headers = new HttpHeaders();
1418
		headers.set("Content-Type", "text/csv");
1419
		headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1420
		headers.setContentLength(baos.toByteArray().length);
1421
 
1422
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1423
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1424
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1425
 
1426
	}
1427
 
1428
	@RequestMapping(value = "/extendCustomerOffer", method = RequestMethod.POST)
1429
	public String extendCustomerOffer(HttpServletRequest request, @RequestParam int id,
30122 amit.gupta 1430
									  @RequestParam LocalDateTime endDate, Model model) throws ProfitMandiBusinessException {
29707 tejbeer 1431
 
1432
		CustomerOffer co = customerOfferRepository.selectById(id);
1433
		co.setEndDate(endDate);
1434
		co.setUpdatedTimestamp(LocalDateTime.now());
1435
 
1436
		model.addAttribute("co", co);
1437
 
1438
		return "customer-index-offer";
1439
 
1440
	}
1441
 
1442
	@RequestMapping(value = "/getSamsungUpgradeOffer", method = RequestMethod.GET)
1443
	public String getSamsungUpgradeOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1444
 
1445
		List<UpgradeOfferStatus> uos = UpgradeOfferStatus.offerStatus;
1446
		List<SamsungUpgradeOffer> samsungUpgradeOffers = samsungUpgradeOfferRepository.selectByStatus(
1447
				uos.stream().filter(x -> !x.equals(UpgradeOfferStatus.rejected)).collect(Collectors.toList()));
1448
 
1449
		model.addAttribute("samsungUpgradeOffers", samsungUpgradeOffers);
1450
		return "samsung-upgrade-offer";
1451
 
1452
	}
1453
 
1454
	@RequestMapping(value = "/approveSamsungUpgradeOffer", method = RequestMethod.POST)
1455
	public String approveSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1456
			throws ProfitMandiBusinessException {
1457
 
1458
		SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1459
		suo.setStatus(UpgradeOfferStatus.approved);
1460
		suo.setApprovedTimestamp(LocalDateTime.now());
1461
		model.addAttribute("suo", suo);
1462
		return "samsung-upgrade-offer-index";
1463
 
1464
	}
1465
 
1466
	@RequestMapping(value = "/rejectSamsungUpgradeOffer", method = RequestMethod.POST)
1467
	public String rejectSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1468
			throws ProfitMandiBusinessException {
1469
 
1470
		SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1471
		suo.setStatus(UpgradeOfferStatus.rejected);
1472
 
1473
		model.addAttribute("suo", suo);
1474
		return "samsung-upgrade-offer-index";
1475
 
1476
	}
22860 ashik.ali 1477
}