Subversion Repositories SmartDukaan

Rev

Rev 29927 | Rev 30053 | 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;
29927 amit.gupta 6
import com.spice.profitmandi.common.model.*;
29585 manish 7
import com.spice.profitmandi.common.services.ReporticoService;
29927 amit.gupta 8
import com.spice.profitmandi.common.util.*;
23784 ashik.ali 9
import com.spice.profitmandi.common.web.util.ResponseSender;
29927 amit.gupta 10
import com.spice.profitmandi.dao.entity.catalog.*;
11
import com.spice.profitmandi.dao.entity.fofo.*;
28795 tejbeer 12
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
13
import com.spice.profitmandi.dao.entity.transaction.PriceDropIMEI;
27389 amit.gupta 14
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
28491 amit.gupta 15
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
29707 tejbeer 16
import com.spice.profitmandi.dao.enumuration.catalog.UpgradeOfferStatus;
29899 tejbeer 17
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
29585 manish 18
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
27876 amit.gupta 19
import com.spice.profitmandi.dao.model.CreateOfferRequest;
25505 amit.gupta 20
import com.spice.profitmandi.dao.model.CreateSchemeRequest;
29927 amit.gupta 21
import com.spice.profitmandi.dao.repository.catalog.*;
29899 tejbeer 22
import com.spice.profitmandi.dao.repository.cs.CsService;
26588 tejbeer 23
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
24
import com.spice.profitmandi.dao.repository.dtr.Mongo;
29927 amit.gupta 25
import com.spice.profitmandi.dao.repository.fofo.*;
28795 tejbeer 26
import com.spice.profitmandi.dao.repository.transaction.PriceDropIMEIRepository;
27
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
23798 amit.gupta 28
import com.spice.profitmandi.service.authentication.RoleManager;
23020 ashik.ali 29
import com.spice.profitmandi.service.inventory.InventoryService;
27876 amit.gupta 30
import com.spice.profitmandi.service.offers.OfferService;
22860 ashik.ali 31
import com.spice.profitmandi.service.scheme.SchemeService;
26588 tejbeer 32
import com.spice.profitmandi.service.user.RetailerService;
29585 manish 33
import com.spice.profitmandi.service.wallet.WalletService;
22860 ashik.ali 34
import com.spice.profitmandi.web.model.LoginDetails;
35
import com.spice.profitmandi.web.util.CookiesProcessor;
23570 amit.gupta 36
import com.spice.profitmandi.web.util.MVCResponseSender;
29585 manish 37
import in.shop2020.model.v1.order.WalletReferenceType;
29927 amit.gupta 38
import org.apache.commons.csv.CSVRecord;
39
import org.apache.logging.log4j.LogManager;
40
import org.apache.logging.log4j.Logger;
41
import org.springframework.beans.factory.annotation.Autowired;
42
import org.springframework.beans.factory.annotation.Qualifier;
43
import org.springframework.core.io.InputStreamResource;
44
import org.springframework.http.HttpHeaders;
45
import org.springframework.http.HttpStatus;
46
import org.springframework.http.ResponseEntity;
47
import org.springframework.stereotype.Controller;
48
import org.springframework.ui.Model;
49
import org.springframework.web.bind.annotation.*;
50
import org.springframework.web.multipart.MultipartFile;
29585 manish 51
 
29927 amit.gupta 52
import javax.servlet.http.HttpServletRequest;
53
import javax.servlet.http.HttpServletResponse;
54
import javax.transaction.Transactional;
55
import java.io.ByteArrayInputStream;
56
import java.io.ByteArrayOutputStream;
57
import java.io.InputStream;
58
import java.time.*;
59
import java.util.*;
60
import java.util.stream.Collectors;
61
 
22860 ashik.ali 62
@Controller
25369 amit.gupta 63
@Transactional(rollbackOn = Throwable.class)
22860 ashik.ali 64
public class SchemeController {
65
 
23568 govind 66
	private static final Logger LOGGER = LogManager.getLogger(SchemeController.class);
22860 ashik.ali 67
 
68
	@Autowired
22927 ashik.ali 69
	private SchemeService schemeService;
27897 amit.gupta 70
 
27876 amit.gupta 71
	@Autowired
72
	private OfferService offerService;
23786 amit.gupta 73
 
22860 ashik.ali 74
	@Autowired
27389 amit.gupta 75
	private StateGstRateRepository stateGstRateRepository;
27612 tejbeer 76
 
27389 amit.gupta 77
	@Autowired
27416 amit.gupta 78
	private ItemRepository itemRepository;
29608 amit.gupta 79
 
29585 manish 80
	@Autowired
81
	private ReporticoService reporticoService;
27612 tejbeer 82
 
27416 amit.gupta 83
	@Autowired
22927 ashik.ali 84
	private SchemeRepository schemeRepository;
22860 ashik.ali 85
 
86
	@Autowired
23556 amit.gupta 87
	private SchemeItemRepository schemeItemRepository;
23786 amit.gupta 88
 
23556 amit.gupta 89
	@Autowired
23570 amit.gupta 90
	private MVCResponseSender mvcResponseSender;
23786 amit.gupta 91
 
23570 amit.gupta 92
	@Autowired
22927 ashik.ali 93
	private CookiesProcessor cookiesProcessor;
23786 amit.gupta 94
 
23020 ashik.ali 95
	@Autowired
23784 ashik.ali 96
	@Qualifier("fofoInventoryService")
23020 ashik.ali 97
	private InventoryService inventoryService;
23556 amit.gupta 98
 
99
	@Autowired
100
	private TagListingRepository tagListingRepository;
23914 govind 101
 
23798 amit.gupta 102
	@Autowired
103
	private RoleManager roleManager;
23786 amit.gupta 104
 
23506 amit.gupta 105
	@Autowired
27394 amit.gupta 106
	private ResponseSender<?> responseSender;
23786 amit.gupta 107
 
23784 ashik.ali 108
	@Autowired
27394 amit.gupta 109
	private FofoStoreRepository fofoStoreRepository;
23786 amit.gupta 110
 
23784 ashik.ali 111
	@Autowired
27394 amit.gupta 112
	private RetailerService retailerService;
22860 ashik.ali 113
 
27394 amit.gupta 114
	@Autowired
115
	private Mongo mongoClient;
29608 amit.gupta 116
 
29585 manish 117
	@Autowired
118
	WalletService walletService;
26588 tejbeer 119
 
120
	@Autowired
29585 manish 121
	PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
122
 
123
	@Autowired
26674 tejbeer 124
	private PartnerTypeChangeService partnerTypeChangeService;
125
 
28795 tejbeer 126
	@Autowired
127
	InventoryItemRepository inventoryItemRepository;
128
 
129
	@Autowired
130
	PriceDropIMEIRepository priceDropIMEIRepository;
131
 
132
	@Autowired
133
	PriceDropRepository priceDropRepository;
134
 
135
	@Autowired
136
	SchemeInOutRepository schemeInOutRepository;
137
 
29707 tejbeer 138
	@Autowired
139
	private CustomerOfferRepository customerOfferRepository;
140
 
141
	@Autowired
142
	private CustomerOfferItemRepository customerOfferItemRepository;
143
 
144
	@Autowired
145
	private SamsungUpgradeOfferRepository samsungUpgradeOfferRepository;
146
 
29899 tejbeer 147
	@Autowired
148
	private CsService csService;
149
 
150
	List<String> adminEmail = Arrays.asList("tarun.verma@smartdukaan.com", "neeraj.gupta@smartdukaan.com",
151
			"amit.gupta@shop2020.in", "manish.tiwari@smartdukaan.com", "tejbeer.kaur@shop2020.in");
152
 
22860 ashik.ali 153
	@RequestMapping(value = "/createScheme", method = RequestMethod.GET)
29899 tejbeer 154
	public String createScheme(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
155
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29608 amit.gupta 156
 
29585 manish 157
		LocalDate currentdate = LocalDate.now();
158
		Month month = currentdate.getMonth().minus(1);
159
		model.addAttribute("month", month);
29608 amit.gupta 160
 
23786 amit.gupta 161
		// Map<Integer, String> itemIdItemDescriptionMap =
162
		// inventoryService.getAllItemIdItemDescriptionMap();
163
		// model.addAttribute("itemIdItemDescriptionMap", itemIdItemDescriptionMap);
29899 tejbeer 164
 
25368 amit.gupta 165
		Set<String> brands = inventoryService.getAllTagListingBrands(ProfitMandiConstants.MOBILE_CATEGORY_ID);
29899 tejbeer 166
 
25368 amit.gupta 167
		brands.addAll(inventoryService.getAllTagListingBrands(14206));
29899 tejbeer 168
 
169
		boolean fullAccesss = this.getAccess(loginDetails.getEmailId());
170
 
171
		model.addAttribute("fullAccesss", fullAccesss);
172
 
25368 amit.gupta 173
		model.addAttribute("brands", brands);
25505 amit.gupta 174
		model.addAttribute("retailerTypes", PartnerType.values());
22860 ashik.ali 175
		return "create-scheme";
176
	}
23786 amit.gupta 177
 
29899 tejbeer 178
	private boolean getAccess(String emailId) {
179
 
180
		boolean fullAccesss = false;
181
		List<String> emails = csService
29926 amit.gupta 182
				.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, EscalationType.L3).stream()
29899 tejbeer 183
				.map(x -> x.getEmailId()).collect(Collectors.toList());
184
 
185
		emails.addAll(
29926 amit.gupta 186
				csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, EscalationType.L2)
29899 tejbeer 187
						.stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
188
 
189
		if (adminEmail.contains(emailId)) {
190
			fullAccesss = true;
191
		}
192
 
193
		if (emails.contains(emailId)) {
194
			fullAccesss = false;
195
		}
196
 
197
		return fullAccesss;
198
 
199
	}
200
 
23914 govind 201
	@RequestMapping(value = "/getTagListingItemsByBrand", method = RequestMethod.POST)
202
	public String getTagListingItemsByBrand(HttpServletRequest request, @RequestBody List<String> brands, Model model) {
203
		Map<Integer, String> itemIdItemDescriptionMap = new HashMap<>();
204
		LOGGER.info("brands" + brands);
205
 
206
		List<MapWrapper<Integer, String>> itemIdItemDescriptionMaplist = inventoryService
207
				.getAllTagListingItemIdItemDescriptionMap(new HashSet<>(brands));
208
		for (MapWrapper<Integer, String> mapWrapper : itemIdItemDescriptionMaplist) {
209
			itemIdItemDescriptionMap.put(mapWrapper.getKey(), mapWrapper.getValue());
210
		}
23020 ashik.ali 211
		model.addAttribute("itemIdItemDescriptionMap", itemIdItemDescriptionMap);
23786 amit.gupta 212
		// model.addAttribute("brands", inventoryService.getAllBrands());
23914 govind 213
 
23419 ashik.ali 214
		return "tag-listing-items-description";
23020 ashik.ali 215
	}
23556 amit.gupta 216
 
217
	@RequestMapping(value = "/schemes/update-schemes-page", method = RequestMethod.GET)
218
	public String updateShcemes(HttpServletRequest request) throws ProfitMandiBusinessException {
219
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23799 amit.gupta 220
		if (!roleManager.isAdmin(loginDetails.getRoleIds())) {
23556 amit.gupta 221
			throw new ProfitMandiBusinessException("User", loginDetails.getEmailId(), "Unauthorised access");
222
		}
223
		return "update-schemes-page";
224
	}
29608 amit.gupta 225
 
29585 manish 226
	@RequestMapping(value = "/payMonthlyInvestment", method = RequestMethod.POST)
227
	public void payMonthlyInvestment(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
29608 amit.gupta 228
 
29585 manish 229
		LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
230
		LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
231
		int referenceId = Integer.parseInt(FormattingUtils.getYearMonth(startOfPreviousMonth.atStartOfDay()));
232
		LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
233
		List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
234
				.selectAll(startOfPreviousMonth, lastOfPreviousMonth);
235
		Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
236
				.filter(x -> x.getShortPercentage() <= 10)
237
				.collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
238
		LOGGER.info("investmentMaintainedDaysMap {}", investmentMaintainedDaysMap);
239
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAllPending(SchemeType.INVESTMENT,
240
				startOfPreviousMonth.atStartOfDay(), firstDateOfCurrentMonth.atStartOfDay());
29608 amit.gupta 241
 
242
		if (schemeInOuts.isEmpty()) {
243
			throw new ProfitMandiBusinessException("Investment Payout", "", "No data Found");
29585 manish 244
		}
29608 amit.gupta 245
 
29585 manish 246
		Map<Integer, List<SchemeInOut>> inventoryItemIdSchemeMap = schemeInOuts.stream()
247
				.collect(Collectors.groupingBy(x -> x.getInventoryItemId()));
248
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIdSchemeMap.keySet());
249
		Map<Integer, List<Integer>> retailerInventoryItemIdMap = inventoryItems.stream().collect(
250
				Collectors.groupingBy(x -> x.getFofoId(), Collectors.mapping(x -> x.getId(), Collectors.toList())));
251
		System.out.println("Fofo Id\tInvestment Maintained Days\tEligible payout");
252
		for (Map.Entry<Integer, List<Integer>> retailerEntry : retailerInventoryItemIdMap.entrySet()) {
253
			int fofoId = retailerEntry.getKey();
254
			long investmentMaintainedDays = investmentMaintainedDaysMap.get(fofoId) == null ? 0
255
					: investmentMaintainedDaysMap.get(fofoId);
25256 amit.gupta 256
 
29585 manish 257
			List<SchemeInOut> schemeInouts = retailerEntry.getValue().stream().map(x -> inventoryItemIdSchemeMap.get(x))
258
					.flatMap(List::stream).filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.toList());
259
			float totalAmount = 0;
29608 amit.gupta 260
			for (SchemeInOut sio : schemeInouts) {
261
 
29585 manish 262
				if (investmentMaintainedDays < 8) {
263
					sio.setStatus(SchemePayoutStatus.REJECTED);
29608 amit.gupta 264
					// sio.setRolledBackTimestamp(LocalDateTime.now());
29585 manish 265
					sio.setStatusDescription("Investment maintained for " + investmentMaintainedDays + "(< 8) days");
266
				} else if (investmentMaintainedDays < 12) {
267
					sio.setStatus(SchemePayoutStatus.CREDITED);
29608 amit.gupta 268
					sio.setAmount(sio.getAmount() / 2);
29585 manish 269
					sio.setCreditTimestamp(LocalDateTime.now());
270
					sio.setStatusDescription("Investment maintained for " + investmentMaintainedDays + "(< 12) days");
271
					totalAmount += sio.getAmount();
272
				} else {
273
					sio.setStatus(SchemePayoutStatus.CREDITED);
274
					sio.setCreditTimestamp(LocalDateTime.now());
275
					totalAmount += sio.getAmount();
276
				}
277
			}
29608 amit.gupta 278
			if (totalAmount > 0) {
279
				String description = "Investment margin paid for "
280
						+ FormattingUtils.formatYearMonth(startOfPreviousMonth.atStartOfDay());
281
				if (investmentMaintainedDays < 12) {
282
					description += ", as maintained for " + investmentMaintainedDays + "(< 12) days";
29585 manish 283
				}
29608 amit.gupta 284
				walletService.addAmountToWallet(fofoId, referenceId, WalletReferenceType.INVESTMENT_PAYOUT, description,
285
						totalAmount, lastOfPreviousMonth.atTime(LocalTime.MAX));
29585 manish 286
			}
287
			System.out.printf("%d\t%d\t%f%n", fofoId, investmentMaintainedDays, totalAmount);
288
		}
29608 amit.gupta 289
 
29585 manish 290
	}
29608 amit.gupta 291
 
29585 manish 292
	@RequestMapping(value = "/evaluateActualInvestmentPayout", method = RequestMethod.GET)
29663 manish 293
	public ResponseEntity<?> evaluateActualInvestmentPayout(HttpServletRequest request, Model model) throws Exception {
294
 
295
		List<List<?>> rows = new ArrayList<>();
296
		LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
297
		LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
298
		LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
299
		List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
300
				.selectAll(startOfPreviousMonth, lastOfPreviousMonth);
301
		Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
302
				.filter(x -> x.getShortPercentage() <= 10)
303
				.collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
304
		LOGGER.info("investmentMaintainedDaysMap {}", investmentMaintainedDaysMap);
305
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAllPending(SchemeType.INVESTMENT,
306
				startOfPreviousMonth.atStartOfDay(), firstDateOfCurrentMonth.atStartOfDay());
307
		Map<Integer, List<SchemeInOut>> inventoryItemIdSchemeMap = schemeInOuts.stream()
308
				.collect(Collectors.groupingBy(x -> x.getInventoryItemId()));
309
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIdSchemeMap.keySet());
310
		Map<Integer, List<Integer>> retailerInventoryItemIdMap = inventoryItems.stream().collect(
311
				Collectors.groupingBy(x -> x.getFofoId(), Collectors.mapping(x -> x.getId(), Collectors.toList())));
312
		System.out.println("Fofo Id\tInvestment Maintained Days\tEligible payout");
313
		for (Map.Entry<Integer, List<Integer>> retailerEntry : retailerInventoryItemIdMap.entrySet()) {
314
			int fofoId = retailerEntry.getKey();
315
			List<SchemeInOut> schemeInouts = retailerEntry.getValue().stream().map(x -> inventoryItemIdSchemeMap.get(x))
316
					.flatMap(List::stream).collect(Collectors.toList());
317
			double totalAmount = schemeInouts.stream().filter(x -> x.getRolledBackTimestamp() == null)
318
					.collect(Collectors.summingDouble(x -> x.getAmount()));
319
			long investmentMaintainedDays = investmentMaintainedDaysMap.get(fofoId) == null ? 0
320
					: investmentMaintainedDaysMap.get(fofoId);
321
			if (investmentMaintainedDays < 8) {
322
				totalAmount = 0;
323
			} else if (investmentMaintainedDays < 12) {
324
				totalAmount = totalAmount / 2;
29585 manish 325
			}
29663 manish 326
			System.out.printf("%d\t%d\t%f%n", fofoId, investmentMaintainedDays, totalAmount);
327
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
29608 amit.gupta 328
 
29663 manish 329
			rows.add(Arrays.asList(fofoId, customRetailer.getBusinessName(), customRetailer.getCode(),
330
					investmentMaintainedDays, totalAmount));
29585 manish 331
		}
332
 
29663 manish 333
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
334
				Arrays.asList("fofoId", "Name", "Code", "investmentMaintainedDays", "totalAmount"), rows);
335
 
336
		final HttpHeaders headers = new HttpHeaders();
337
		headers.set("Content-Type", "text/csv");
338
		headers.set("Content-disposition", "inline; filename=investmentMaintainedDays.csv");
339
		headers.setContentLength(baos.toByteArray().length);
340
 
341
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
342
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
343
 
344
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
345
 
346
	}
347
 
29585 manish 348
	@RequestMapping(value = "/processInvestmentDryRun", method = RequestMethod.GET)
29608 amit.gupta 349
	public ResponseEntity<?> processInvestmentDryRun(HttpServletRequest request, Model model) throws Exception {
350
 
29585 manish 351
		LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
352
		LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
353
		LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
354
		List<List<?>> rows = new ArrayList<>();
355
 
29608 amit.gupta 356
		Map<String, String> params = new HashMap<>();
29585 manish 357
 
29608 amit.gupta 358
		params.put("MANUAL_datesBetween_FROMDATE", firstDateOfCurrentMonth.toString());
359
		params.put("MANUAL_datesBetween_TODATE", firstDateOfCurrentMonth.plusDays(9).toString());
29585 manish 360
 
29608 amit.gupta 361
		params.put("type", "INVESTMENT");
29585 manish 362
 
29608 amit.gupta 363
		List<EvaluateSchemeInvestmentPayoutModel> evaluateSchemeInvestmentPayouts = reporticoService.getReports(
364
				EvaluateSchemeInvestmentPayoutModel.class, ReporticoProject.FOCO, "schemepayout.xml", params);
365
		LOGGER.info("reportResponse {}", evaluateSchemeInvestmentPayouts);
366
 
367
		int referenceId = Integer.parseInt(FormattingUtils.getYearMonth(startOfPreviousMonth.atStartOfDay()));
368
		List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
369
				.selectAll(startOfPreviousMonth, lastOfPreviousMonth);
370
		Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
371
				.filter(x -> x.getShortPercentage() <= 10)
372
				.collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
373
 
374
		for (EvaluateSchemeInvestmentPayoutModel esip : evaluateSchemeInvestmentPayouts) {
375
 
376
			long investmentMaintainedDays = investmentMaintainedDaysMap.get(esip.getFofoId()) == null ? 0
377
					: investmentMaintainedDaysMap.get(esip.getFofoId());
378
 
379
			esip.setInvestmentDays(investmentMaintainedDays);
380
 
381
			float processAmount = esip.getPaidAmount() / 2;
382
 
383
			esip.setProcessAmount(processAmount);
384
 
385
			rows.add(Arrays.asList(esip.getCode(), esip.getStoreName(), esip.getFofoId(), esip.getItemId(),
386
					esip.getBrand(), esip.getModelName(), esip.getModelNumber(), esip.getColor(), esip.getSchemeInDp(),
387
					esip.getSchemeOutDp(), esip.getSchemeId(), esip.getName(), esip.getType(), esip.getPartnerType(),
388
					esip.getAmountType(), esip.getAmount(), esip.getPurchaseInvoice(), esip.getSaleInovoice(),
389
					esip.getPaidAmount(), esip.getCreateTimestamp(), esip.getRolledBackTimestamp(),
390
					esip.getSerialNumber(), esip.getInRef(), esip.getOutRef(), esip.getBusinessDate(), esip.getStatus(),
391
					esip.getDescription(), esip.getProcessAmount(), esip.getInvestmentDays()));
29585 manish 392
		}
393
 
29608 amit.gupta 394
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
395
				.getCSVByteStream(Arrays.asList("Code", "Store Name", "Fofo Id", "Item Id", "Brand", "Model Name",
396
						"Model Number", "Color", "Scheme In Dp", "Scheme Out Dp", "Scheme Id", "Name", "Type",
397
						"Partner Type", "Amount Type", "Amount", "Purchase Invoice", "Sale Inovoice", "Paid Amount",
398
						"Create Timestamp", "Rolled Back Timestamp", "Serial Number", "In Ref", "Out Ref",
399
						"Business Date", "Status", "Description", "Process Amount", "Investment Days"), rows);
400
 
401
		final HttpHeaders headers = new HttpHeaders();
402
		headers.set("Content-Type", "text/csv");
403
		headers.set("Content-disposition", "inline; filename=schemePayout.csv");
404
		headers.setContentLength(baos.toByteArray().length);
405
 
406
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
407
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
408
 
409
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
410
 
411
	}
412
 
23556 amit.gupta 413
	@RequestMapping(value = "/schemes/update", method = RequestMethod.POST)
23786 amit.gupta 414
	public String updateShcemes(HttpServletRequest request, @RequestBody SchemeItems schemeItems, Model model)
415
			throws Exception {
416
		for (int schemeId : schemeItems.getSchemeIds()) {
23928 govind 417
			if (schemeRepository.selectById(schemeId) != null)
418
				for (int itemId : schemeItems.getItemIds()) {
419
					if (tagListingRepository.selectByItemIdsAndTagIds(new HashSet<>(Arrays.asList(itemId)),
420
							new HashSet<>(Arrays.asList(4, 7))).size() > 0) {
421
						SchemeItem si = new SchemeItem();
422
						si.setItemId(itemId);
423
						si.setSchemeId(schemeId);
29608 amit.gupta 424
						si.setCreateTimestamp(LocalDateTime.now());
23928 govind 425
						try {
426
							schemeItemRepository.persist(si);
427
						} catch (Exception e) {
428
							LOGGER.info("Scheme aleady exist");
429
						}
430
						model.addAttribute("response", mvcResponseSender.createResponseString(true));
431
					} else {
432
						model.addAttribute("response", mvcResponseSender.createResponseString(false));
433
						throw new ProfitMandiBusinessException("ItemId", itemId, "Invalid Item Id");
434
					}
435
				}
436
		}
437
		return "response";
438
	}
25256 amit.gupta 439
 
23928 govind 440
	@RequestMapping(value = "/addItemToScheme", method = RequestMethod.POST)
441
	public String updateScheme(HttpServletRequest request, @RequestBody SchemeItems schemeItems, Model model)
442
			throws Exception {
443
		for (int schemeId : schemeItems.getSchemeIds()) {
23914 govind 444
			List<Integer> itemIds = schemeItemRepository.selectItemIdsBySchemeId(schemeId);
23786 amit.gupta 445
			if (schemeRepository.selectById(schemeId) != null)
446
				for (int itemId : schemeItems.getItemIds()) {
447
					if (tagListingRepository.selectByItemIdsAndTagIds(new HashSet<>(Arrays.asList(itemId)),
23914 govind 448
							new HashSet<>(Arrays.asList(4, 7))).size() > 0 && (!(itemIds.contains(itemId)))) {
23786 amit.gupta 449
						SchemeItem si = new SchemeItem();
450
						si.setItemId(itemId);
451
						si.setSchemeId(schemeId);
29608 amit.gupta 452
						si.setCreateTimestamp(LocalDateTime.now());
23786 amit.gupta 453
						try {
454
							schemeItemRepository.persist(si);
455
						} catch (Exception e) {
23914 govind 456
							LOGGER.info("Scheme already exist");
23786 amit.gupta 457
						}
458
						model.addAttribute("response", mvcResponseSender.createResponseString(true));
459
					} else {
460
						model.addAttribute("response", mvcResponseSender.createResponseString(false));
23556 amit.gupta 461
					}
462
				}
463
		}
464
		return "response";
465
	}
23914 govind 466
 
467
	@RequestMapping(value = "/schemes/delete", method = RequestMethod.DELETE)
468
	public String deleteShcemes(HttpServletRequest request,
30043 amit.gupta 469
								@RequestParam(name = "schemeId", required = false, defaultValue = "0") int schemeId,
470
								@RequestParam(name = "itemId", required = false, defaultValue = "0") int itemId, Model model)
23819 govind 471
			throws Exception {
23914 govind 472
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
473
		if (!(schemeId == 0 && itemId == 0) || (!(schemeId == 0 || itemId == 0))) {
474
			schemeItemRepository.deletebyItemIdsandSchemeIds(itemId, schemeId);
475
 
476
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
477
 
478
			model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
479
 
480
		}
481
		return "response";
482
	}
483
 
484
	@RequestMapping(value = "/extendAllSchemes", method = RequestMethod.POST)
485
	public String extendAllScheme(HttpServletRequest request, @RequestBody LocalDateTime extendDatetime, Model model)
486
			throws Exception {
28924 amit.gupta 487
		extendDatetime = LocalDateTime.of(extendDatetime.toLocalDate(), Utils.MAX_TIME);
23914 govind 488
		List<Scheme> schemes = schemeRepository.selectActiveAll();
489
		if (schemes.size() > 0) {
490
			for (Scheme scheme : schemes) {
25261 amit.gupta 491
				if (scheme.getExpireTimestamp() == null) {
23914 govind 492
					scheme.setEndDateTime(extendDatetime);
493
					schemeRepository.persist(scheme);
23819 govind 494
				}
495
			}
23914 govind 496
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
497
			return "response";
23819 govind 498
		}
23914 govind 499
		model.addAttribute("response", mvcResponseSender.createResponseString(false));
23819 govind 500
		return "response";
501
	}
23786 amit.gupta 502
 
23914 govind 503
	@RequestMapping(value = "/extendSchemeById", method = RequestMethod.POST)
504
	public String extendSchemeById(HttpServletRequest request,
23819 govind 505
 
30043 amit.gupta 506
								   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
507
								   @RequestBody LocalDateTime extendDatetime, Model model) throws Exception {
28924 amit.gupta 508
		extendDatetime = LocalDateTime.of(extendDatetime.toLocalDate(), Utils.MAX_TIME);
23914 govind 509
		Scheme scheme = schemeRepository.selectById(schemeId);
510
		if ((!(scheme.getActiveTimestamp() == null)) && scheme.getExpireTimestamp() == null) {
511
			scheme.setEndDateTime(extendDatetime);
512
			schemeRepository.persist(scheme);
513
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
514
			return "response";
515
		}
516
		model.addAttribute("response", mvcResponseSender.createResponseString(false));
517
		return "response";
518
	}
519
 
22860 ashik.ali 520
	@RequestMapping(value = "/createScheme", method = RequestMethod.POST)
23715 govind 521
	public String createScheme(HttpServletRequest request, @RequestBody CreateSchemeRequest createSchemeRequest,
30043 amit.gupta 522
							   @RequestParam(name = "offset", defaultValue = "0") int offset,
523
							   @RequestParam(name = "limit", defaultValue = "10") int limit,
524
							   @RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem,
525
							   @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model)
23715 govind 526
			throws ProfitMandiBusinessException {
22927 ashik.ali 527
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
22860 ashik.ali 528
		LOGGER.info("CreateSchemeRequest {}", createSchemeRequest);
22927 ashik.ali 529
		schemeService.saveScheme(loginDetails.getFofoId(), createSchemeRequest);
530
		LOGGER.info("Scheme saved successfully");
23271 ashik.ali 531
		long size = schemeRepository.selectAllCount();
22927 ashik.ali 532
		List<Scheme> schemes = schemeRepository.selectAll(offset, limit);
29899 tejbeer 533
 
534
		if (!schemes.isEmpty()) {
535
			for (Scheme scheme : schemes) {
536
				if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
537
					scheme.setAmountModel(scheme.getAmount() + "%");
538
				} else {
539
					scheme.setAmountModel(scheme.getAmount() + "");
540
				}
541
			}
542
		}
22927 ashik.ali 543
		model.addAttribute("schemes", schemes);
544
		model.addAttribute("start", offset + 1);
23271 ashik.ali 545
		model.addAttribute("size", size);
23752 govind 546
		model.addAttribute("searchItem", searchItem);
547
		model.addAttribute("searchTerm", searchTerm);
23914 govind 548
		model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
23715 govind 549
		if (schemes.size() < limit) {
22927 ashik.ali 550
			model.addAttribute("end", offset + schemes.size());
23786 amit.gupta 551
		} else {
22927 ashik.ali 552
			model.addAttribute("end", offset + limit);
553
		}
554
		return "schemes";
23786 amit.gupta 555
 
22860 ashik.ali 556
	}
23786 amit.gupta 557
 
22860 ashik.ali 558
	@RequestMapping(value = "/getSchemes", method = RequestMethod.GET)
23715 govind 559
	public String getSchemes(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset,
30043 amit.gupta 560
							 @RequestParam(required = false) LocalDate date,
561
							 @RequestParam(name = "limit", defaultValue = "10") int limit,
562
							 @RequestParam(name = "searchItem", required = false, defaultValue = "0") int searchItem,
563
							 @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm,
564
							 @RequestParam(name = "partnerType", required = false, defaultValue = "") PartnerType partnerType,
565
							 @RequestParam(name = "searchImei", required = false, defaultValue = "") String searchImei, Model model)
28795 tejbeer 566
			throws ProfitMandiBusinessException {
23343 ashik.ali 567
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
26802 tejbeer 568
		boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
27876 amit.gupta 569
		if (date == null) {
570
			date = LocalDate.now();
571
		}
572
		model.addAttribute("date", date);
26802 tejbeer 573
 
23343 ashik.ali 574
		List<Scheme> schemes = null;
28796 tejbeer 575
		List<SchemeInOut> schemeInOut = null;
576
 
23343 ashik.ali 577
		long size = 0;
28980 amit.gupta 578
		date = date.isAfter(LocalDate.now()) ? LocalDate.now() : date;
29649 amit.gupta 579
		final LocalDate date1 = date;
26802 tejbeer 580
		if (partnerType == null) {
29608 amit.gupta 581
			// TODO - SCHEME
582
 
583
			partnerType = partnerTypeChangeService.getTypeOnMonth(loginDetails.getFofoId(), YearMonth.from(date));
584
 
585
			// partnerType =
586
			// partnerTypeChangeService.getTypeOnDate(loginDetails.getFofoId(), date);
23343 ashik.ali 587
		}
27394 amit.gupta 588
		if (!(searchTerm.equals(""))) {
26802 tejbeer 589
			schemes = schemeRepository.selectBySearchTerm(searchTerm, offset, limit);
27612 tejbeer 590
			for (Scheme scheme : schemes) {
591
				if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
27394 amit.gupta 592
					scheme.setAmountModel(scheme.getAmount() + "%");
593
				} else {
594
					scheme.setAmountModel(scheme.getAmount() + "");
595
				}
596
			}
27876 amit.gupta 597
			if (schemes.size() > 0) {
26802 tejbeer 598
				size = schemeRepository.selectAllCount();
599
				LOGGER.info("schemes" + schemes);
600
				model.addAttribute("schemes", schemes);
601
				model.addAttribute("start", offset + 1);
602
				model.addAttribute("size", size);
603
				if (schemes.size() < limit) {
604
					model.addAttribute("end", offset + schemes.size());
27876 amit.gupta 605
				} else {
26802 tejbeer 606
					model.addAttribute("end", offset + limit);
607
				}
30043 amit.gupta 608
			} else {
26802 tejbeer 609
				throw new ProfitMandiBusinessException("SchemeId", searchTerm, "SchemeId Not Found");
610
			}
30043 amit.gupta 611
		} else if (searchItem > 0) {
27394 amit.gupta 612
			TagListing tagListing = null;
28134 tejbeer 613
			tagListing = tagListingRepository.selectByItemId(searchItem);
28492 amit.gupta 614
			Item item = itemRepository.selectById(searchItem);
28134 tejbeer 615
			if (tagListing != null) {
616
				model.addAttribute("dp", tagListing.getSellingPrice());
617
				model.addAttribute("mop", tagListing.getMop());
26802 tejbeer 618
			}
29707 tejbeer 619
			schemes = schemeService.selectSchemeByPartnerType(partnerType, date, searchItem, isAdmin, offset, limit)
620
					.stream().filter(x -> {
621
						return (x.getId() != 411 && x.getId() != 612) || date1.isBefore(LocalDate.of(2021, 12, 1));
622
					}).collect(Collectors.toList());
623
			// Remove 411 and 612
29658 amit.gupta 624
			model.addAttribute("schemes", schemes);
27612 tejbeer 625
			if (schemes.size() == 0) {
28795 tejbeer 626
				if (isAdmin)
627
					return "schemes";
628
				else {
27612 tejbeer 629
 
28795 tejbeer 630
					return "schemes-partner";
27389 amit.gupta 631
				}
632
			}
28795 tejbeer 633
			// For 7720(HR) remove investment
634
			int nlc = this.getNlc(item, loginDetails.getFofoId(), schemes, tagListing, searchItem);
27897 amit.gupta 635
			size = schemeService.selectSchemeCount(partnerType, date, searchItem, isAdmin);
26802 tejbeer 636
			model.addAttribute("start", offset + 1);
637
			model.addAttribute("size", size);
638
			if (schemes.size() < limit) {
639
				model.addAttribute("end", offset + schemes.size());
640
			} else {
641
				model.addAttribute("end", offset + limit);
642
			}
28547 amit.gupta 643
			model.addAttribute("nlc", Math.round(nlc));
28795 tejbeer 644
		} else if (!(searchImei.equals(""))) {
645
 
646
			LOGGER.info("searchImei" + searchImei);
647
 
648
			InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumberFofoId(searchImei,
649
					loginDetails.getFofoId());
28802 tejbeer 650
			Item item = itemRepository.selectById(inventoryItem.getItemId());
28795 tejbeer 651
			Map<Integer, Scheme> schemeMap = new HashMap<>();
652
			if (inventoryItem != null) {
653
 
654
				LOGGER.info("inventoryItem" + inventoryItem);
655
 
656
				schemeInOut = schemeInOutRepository
657
						.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
658
 
659
				LOGGER.info("schemeInOut" + schemeInOut);
660
 
661
				if (!schemeInOut.isEmpty()) {
662
 
663
					List<Integer> schemeIds = schemeInOut.stream().map(x -> x.getSchemeId())
664
							.collect(Collectors.toList());
665
 
666
					schemes = schemeRepository.selectBySchemeIds(schemeIds);
667
					for (Scheme scheme : schemes) {
668
						if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
669
							scheme.setAmountModel(scheme.getAmount() + "%");
670
						} else {
671
							scheme.setAmountModel(scheme.getAmount() + "");
672
						}
673
					}
674
 
675
					schemeMap = schemes.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
676
				}
677
			}
678
 
679
			model.addAttribute("schemeMap", schemeMap);
28802 tejbeer 680
			model.addAttribute("item", item);
28795 tejbeer 681
 
28796 tejbeer 682
		}
683
		model.addAttribute("schemeInOut", schemeInOut);
28795 tejbeer 684
 
27876 amit.gupta 685
		model.addAttribute("searchItem", searchItem);
686
		model.addAttribute("searchTerm", searchTerm);
687
		model.addAttribute("partnerType", partnerType);
688
		model.addAttribute("isAdmin", isAdmin);
29650 amit.gupta 689
		LOGGER.info("schemes" + schemes);
29707 tejbeer 690
		model.addAttribute("schemes", schemes != null ? schemes.stream().filter(x -> {
691
			return (x.getId() != 411 && x.getId() != 612) || date1.isBefore(LocalDate.of(2021, 12, 1));
29651 amit.gupta 692
		}).collect(Collectors.toList()) : null);
27876 amit.gupta 693
		LOGGER.info("schemes" + schemes);
23786 amit.gupta 694
		// model.addAttribute("roleTypes", loginDetails.getRoleTypes());
29899 tejbeer 695
		if (isAdmin) {
696
 
697
			boolean fullAccess = this.getAccess(loginDetails.getEmailId());
698
 
699
			model.addAttribute("fullAccess", fullAccess);
700
 
27876 amit.gupta 701
			return "schemes";
29899 tejbeer 702
		} else {
30043 amit.gupta 703
			List<CreateOfferRequest> offers = null;
29883 amit.gupta 704
			Map<Integer, Map<Integer, Long>> offerSlabPayoutMap = new HashMap<>();
28795 tejbeer 705
			List<PriceDropIMEI> priceDropImeis = new ArrayList<>();
28134 tejbeer 706
			if (searchItem > 0) {
27897 amit.gupta 707
				offers = offerService.getPublishedOffers(date, loginDetails.getFofoId(), searchItem);
29899 tejbeer 708
				for (CreateOfferRequest createOfferRequest : offers) {
709
					Map<Integer, Map<Integer, Long>> itemSlabPayoutMap = offerService
710
							.getSlabPayoutMap(createOfferRequest);
711
					Map<Integer, Long> slabPayoutMap = itemSlabPayoutMap.get(searchItem);
29883 amit.gupta 712
					offerSlabPayoutMap.put(createOfferRequest.getId(), slabPayoutMap);
713
				}
30043 amit.gupta 714
			} else {
715
				offers = new ArrayList<>();
27897 amit.gupta 716
			}
28795 tejbeer 717
			if (!(searchImei.equals(""))) {
718
				InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumberFofoId(searchImei,
719
						loginDetails.getFofoId());
720
 
721
				priceDropImeis = priceDropIMEIRepository.selectByFofoIdImei(loginDetails.getFofoId(), searchImei);
722
				for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
723
					int priceDropId = priceDropIMEI.getPriceDropId();
724
					PriceDrop pd = priceDropRepository.selectById(priceDropId);
725
 
726
					priceDropIMEI.setPriceDrop(pd);
727
				}
728
			}
28136 tejbeer 729
			FofoStore fs = fofoStoreRepository.selectByRetailerId(loginDetails.getFofoId());
730
 
27876 amit.gupta 731
			model.addAttribute("offers", offers);
29883 amit.gupta 732
			model.addAttribute("offerSlabPayoutMap", offerSlabPayoutMap);
28136 tejbeer 733
			model.addAttribute("partnerCode", fs.getCode());
28795 tejbeer 734
			model.addAttribute("fofoId", fs.getId());
735
			model.addAttribute("priceDropImeis", priceDropImeis);
27876 amit.gupta 736
			return "schemes-partner";
737
		}
29899 tejbeer 738
 
22860 ashik.ali 739
	}
23786 amit.gupta 740
 
28795 tejbeer 741
	private int getNlc(Item item, int fofoId, List<Scheme> schemes, TagListing tagListing, int itemId)
742
			throws ProfitMandiBusinessException {
743
 
744
		if (item.getBrand().equals("Vivo") && fofoStoreRepository.getWarehousePartnerMap().get(7720).stream()
745
				.filter(x -> x.getId() == fofoId).count() > 0) {
746
			schemes = schemes.stream().filter(x -> !x.getType().equals(SchemeType.INVESTMENT))
747
					.collect(Collectors.toList());
748
		}
749
		float nlc = tagListing.getSellingPrice();
750
		for (Scheme scheme : schemes) {
751
			if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
752
				if (tagListing != null) {
753
					float taxRate = stateGstRateRepository.getIgstTaxRate(Arrays.asList(itemId)).get(itemId);
754
					float taxableSellingPrice = tagListing.getSellingPrice() / (1 + taxRate / 100);
755
					float amount = taxableSellingPrice * scheme.getAmount() / 100;
756
					scheme.setAmountModel(
29927 amit.gupta 757
							FormattingUtils.formatDecimal(amount) + " (" + scheme.getAmount() + "%)");
28795 tejbeer 758
					nlc -= amount;
30043 amit.gupta 759
				} else {
28795 tejbeer 760
					scheme.setAmountModel(scheme.getAmount() + "%");
761
				}
762
			} else {
763
				scheme.setAmountModel(scheme.getAmount() + "");
764
				nlc -= scheme.getAmount();
765
			}
766
		}
767
 
768
		return Math.round(nlc);
769
 
770
	}
771
 
22860 ashik.ali 772
	@RequestMapping(value = "/getPaginatedSchemes", method = RequestMethod.GET)
27876 amit.gupta 773
	public String getPaginatedSchemes(HttpServletRequest request, @RequestParam(required = false) LocalDate date,
30043 amit.gupta 774
									  @RequestParam(name = "offset", defaultValue = "0") int offset,
775
									  @RequestParam(name = "limit", defaultValue = "10") int limit,
776
									  @RequestParam(name = "partnerType", required = false, defaultValue = "ALL") PartnerType partnerType,
777
									  Model model) throws ProfitMandiBusinessException {
26802 tejbeer 778
 
23343 ashik.ali 779
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
26802 tejbeer 780
		boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
27876 amit.gupta 781
		if (date == null) {
782
			date = LocalDate.now();
783
		}
23271 ashik.ali 784
		LOGGER.info("requested offset=[{}], limit = [{}]", offset, limit);
27876 amit.gupta 785
		List<Scheme> schemes = schemeRepository.selectAll();
26802 tejbeer 786
		int itemId = 0;
27394 amit.gupta 787
		TagListing tagListing = null;
27897 amit.gupta 788
 
27612 tejbeer 789
		for (Scheme scheme : schemes) {
790
			if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
791
				if (itemId > 0) {
27394 amit.gupta 792
					float taxRate = stateGstRateRepository.getIgstTaxRate(Arrays.asList(itemId)).get(itemId);
793
					float taxableSellingPrice = tagListing.getSellingPrice() / (1 + taxRate / 100);
794
					float amount = taxableSellingPrice * scheme.getAmount() / 100;
27612 tejbeer 795
					scheme.setAmountModel(
29927 amit.gupta 796
							FormattingUtils.formatDecimal(amount) + " (" + scheme.getAmount() + "%)");
27394 amit.gupta 797
				} else {
798
					scheme.setAmountModel(scheme.getAmount() + "%");
799
				}
800
			} else {
27876 amit.gupta 801
				scheme.setAmountModel("" + scheme.getAmount());
27394 amit.gupta 802
			}
803
		}
26802 tejbeer 804
 
22860 ashik.ali 805
		model.addAttribute("schemes", schemes);
26912 tejbeer 806
		model.addAttribute("partnerType", partnerType);
23914 govind 807
		model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
22860 ashik.ali 808
		return "schemes-paginated";
809
	}
23786 amit.gupta 810
 
23020 ashik.ali 811
	@RequestMapping(value = "/schemes/downloadPage", method = RequestMethod.GET)
23786 amit.gupta 812
	public String downloadPage(HttpServletRequest request, Model model) {
23020 ashik.ali 813
		return "schemes-download";
814
	}
23786 amit.gupta 815
 
23020 ashik.ali 816
	@RequestMapping(value = "/schemes/download", method = RequestMethod.GET)
23786 amit.gupta 817
	public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request,
30043 amit.gupta 818
																  @RequestParam(name = ProfitMandiConstants.START_DATE_TIME) String startDateTimeString,
819
																  @RequestParam(name = ProfitMandiConstants.END_DATE_TIME) String endDateTimeString, Model model)
23786 amit.gupta 820
			throws ProfitMandiBusinessException {
23914 govind 821
		LocalDateTime startDateTime = StringUtils.toDateTime(startDateTimeString,
24406 amit.gupta 822
				DateTimePattern.DD_MM_yyyy_T_HH_MM_SS);
823
		LocalDateTime endDateTime = StringUtils.toDateTime(endDateTimeString, DateTimePattern.DD_MM_yyyy_T_HH_MM_SS);
23914 govind 824
 
23020 ashik.ali 825
		List<SchemeModel> schemeModels = schemeService.getAllSchemeModels(startDateTime, endDateTime);
23786 amit.gupta 826
 
23020 ashik.ali 827
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
828
		ExcelUtils.writeSchemeModels(schemeModels, byteArrayOutputStream);
23786 amit.gupta 829
 
830
		final HttpHeaders headers = new HttpHeaders();
831
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
23020 ashik.ali 832
		headers.set("Content-disposition", "inline; filename=SchemesReport.xlsx");
23786 amit.gupta 833
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
834
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
835
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
836
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
23020 ashik.ali 837
	}
23786 amit.gupta 838
 
22860 ashik.ali 839
	@RequestMapping(value = "/getSchemeById", method = RequestMethod.GET)
23786 amit.gupta 840
	public String getSchemeById(HttpServletRequest request,
30043 amit.gupta 841
								@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId, Model model)
23786 amit.gupta 842
			throws ProfitMandiBusinessException {
23343 ashik.ali 843
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29899 tejbeer 844
 
845
		boolean fullAccess = this.getAccess(loginDetails.getEmailId());
22860 ashik.ali 846
		Scheme scheme = schemeService.getSchemeById(schemeId);
29899 tejbeer 847
		model.addAttribute("fullAccess", fullAccess);
22860 ashik.ali 848
		model.addAttribute("scheme", scheme);
24445 amit.gupta 849
		model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
22860 ashik.ali 850
		return "scheme-details";
23914 govind 851
 
22860 ashik.ali 852
	}
23786 amit.gupta 853
 
22860 ashik.ali 854
	@RequestMapping(value = "/activeSchemeById", method = RequestMethod.PUT)
23786 amit.gupta 855
	public String activeSchemeById(HttpServletRequest request,
30043 amit.gupta 856
								   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
857
								   @RequestParam(name = "offset", defaultValue = "0") int offset,
858
								   @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
23786 amit.gupta 859
			throws ProfitMandiBusinessException {
22860 ashik.ali 860
		schemeService.activeSchemeById(schemeId);
861
		List<Scheme> schemes = schemeRepository.selectAll(offset, limit);
862
		model.addAttribute("schemes", schemes);
863
		return "schemes-paginated";
864
	}
23786 amit.gupta 865
 
22860 ashik.ali 866
	@RequestMapping(value = "/expireSchemeById", method = RequestMethod.PUT)
23786 amit.gupta 867
	public String expireSchemeById(HttpServletRequest request,
30043 amit.gupta 868
								   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
869
								   @RequestParam(name = ProfitMandiConstants.EXPIRE_TIMESTAMP) LocalDateTime expiryTimestamp,
870
								   @RequestParam(name = "offset", defaultValue = "0") int offset,
871
								   @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
23786 amit.gupta 872
			throws ProfitMandiBusinessException {
28924 amit.gupta 873
		expiryTimestamp = LocalDateTime.of(expiryTimestamp.toLocalDate(), Utils.MAX_TIME);
25069 amit.gupta 874
		schemeService.expireSchemeById(schemeId, expiryTimestamp);
22860 ashik.ali 875
		List<Scheme> schemes = schemeRepository.selectAll(offset, limit);
876
		model.addAttribute("schemes", schemes);
877
		return "schemes-paginated";
878
	}
23786 amit.gupta 879
 
23784 ashik.ali 880
	@RequestMapping(value = "/getSchemesJson", method = RequestMethod.GET)
23786 amit.gupta 881
	public ResponseEntity<?> getSchemesJson(HttpServletRequest request,
30043 amit.gupta 882
											@RequestParam(name = "offset", defaultValue = "0") int offset,
883
											@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
23786 amit.gupta 884
			throws ProfitMandiBusinessException {
23784 ashik.ali 885
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
886
		return responseSender.ok(schemeService.getSchemes(loginDetails.getRoleIds(), offset, limit));
887
	}
26802 tejbeer 888
 
26763 tejbeer 889
	@RequestMapping(value = "/searchSchemeByCategory")
890
	public String getSchemeByCategory(HttpServletRequest request,
30043 amit.gupta 891
									  @RequestParam(name = "offset", defaultValue = "0") int offset,
892
									  @RequestParam(name = "limit", defaultValue = "10") int limit,
893
									  @RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem,
894
									  @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm,
895
									  @RequestParam(name = "category", required = true, defaultValue = "") PartnerType category, Model model)
26763 tejbeer 896
			throws ProfitMandiBusinessException {
897
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
898
		List<Scheme> schemes = null;
899
		long size = 0;
26802 tejbeer 900
 
901
		schemes = schemeRepository.selectByPartnerType(category, offset, limit);
902
 
903
		if (!(schemes.size() == 0)) {
904
			size = schemeRepository.selectAllCount();
905
			LOGGER.info("schemes" + schemes);
906
			model.addAttribute("schemes", schemes);
907
			model.addAttribute("start", offset + 1);
908
			model.addAttribute("size", size);
909
			model.addAttribute("searchTerm", searchTerm);
910
			model.addAttribute("searchItem", searchItem);
911
			model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
912
			if (schemes.size() < limit) {
913
				model.addAttribute("end", offset + schemes.size());
914
			} else {
915
				model.addAttribute("end", offset + limit);
26763 tejbeer 916
			}
26802 tejbeer 917
		}
918
 
26763 tejbeer 919
		return "schemes";
920
	}
26802 tejbeer 921
 
26763 tejbeer 922
	@RequestMapping(value = "/getSchemeByCategoryPaginated")
923
	public String getSchemeByCategoryPaginated(HttpServletRequest request,
30043 amit.gupta 924
											   @RequestParam(name = "offset", defaultValue = "0") int offset,
925
											   @RequestParam(name = "limit", defaultValue = "10") int limit,
926
											   @RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem,
927
											   @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm,
928
											   @RequestParam(name = "category", required = true, defaultValue = "") PartnerType category, Model model)
26763 tejbeer 929
			throws ProfitMandiBusinessException {
930
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
931
		LOGGER.info("In search Item....");
932
		List<Scheme> schemes = null;
26802 tejbeer 933
 
26763 tejbeer 934
		schemes = schemeRepository.selectByPartnerType(category, offset, limit);
23506 amit.gupta 935
 
26763 tejbeer 936
		model.addAttribute("schemes", schemes);
937
		model.addAttribute("searchItem", searchItem);
938
		model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
939
		return "schemes-paginated";
940
	}
941
 
23752 govind 942
	@RequestMapping(value = "/searchScheme")
943
	public String getSchemeBySchemeId(HttpServletRequest request,
30043 amit.gupta 944
									  @RequestParam(name = "offset", defaultValue = "0") int offset,
945
									  @RequestParam(name = "limit", defaultValue = "10") int limit,
946
									  @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm,
947
									  @RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem, Model model)
23752 govind 948
			throws ProfitMandiBusinessException {
949
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
950
		List<Scheme> schemes = null;
951
		long size = 0;
952
		if (!(searchTerm.equals("")) && searchItem.equals("")) {
953
			schemes = schemeRepository.selectBySearchTerm(searchTerm, offset, limit);
23786 amit.gupta 954
			if (!(schemes.size() == 0)) {
955
				size = schemeRepository.selectAllCount();
956
				LOGGER.info("schemes" + schemes);
957
				model.addAttribute("schemes", schemes);
958
				model.addAttribute("start", offset + 1);
959
				model.addAttribute("size", size);
960
				model.addAttribute("searchTerm", searchTerm);
961
				model.addAttribute("searchItem", searchItem);
23914 govind 962
				model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
23786 amit.gupta 963
				if (schemes.size() < limit) {
964
					model.addAttribute("end", offset + schemes.size());
965
				} else {
966
					model.addAttribute("end", offset + limit);
967
				}
23752 govind 968
			} else {
23786 amit.gupta 969
				throw new ProfitMandiBusinessException("SchemeId", searchTerm, "SchemeId Not Found");
23752 govind 970
			}
971
		} else if (!(searchItem.equals("")) && searchTerm.equals("")) {
972
			List<Integer> schemeIds = schemeItemRepository.selectSchemeIdByItemId(Integer.parseInt(searchItem));
23786 amit.gupta 973
			if (!(schemeIds.size() == 0)) {
23752 govind 974
				LOGGER.info("schemeIds in searchItemScheme" + schemeIds);
975
				schemes = schemeRepository.selectBySchemeIds(schemeIds, offset, limit);
976
				size = schemeIds.size();
977
				LOGGER.info("Size" + size);
978
				model.addAttribute("schemes", schemes);
979
				model.addAttribute("start", offset + 1);
980
				model.addAttribute("size", size);
981
				model.addAttribute("searchItem", searchItem);
982
				model.addAttribute("searchTerm", searchTerm);
23914 govind 983
				model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
23752 govind 984
				if (schemes.size() < limit) {
985
					model.addAttribute("end", offset + schemes.size());
986
				} else {
987
					model.addAttribute("end", offset + limit);
988
				}
989
 
990
			} else {
991
				throw new ProfitMandiBusinessException("SchemeIds", searchItem, "SchemeId Not Found");
992
			}
993
		} else {
23798 amit.gupta 994
			if (roleManager.isAdmin(loginDetails.getRoleIds())) {
23752 govind 995
				schemes = schemeRepository.selectAll(offset, limit);
996
				size = schemeRepository.selectAllCount();
997
			} else {
998
				schemes = schemeRepository.selectActiveAll(offset, limit);
999
				size = schemeRepository.selectAllActiveCount();
1000
			}
1001
			model.addAttribute("schemes", schemes);
1002
			model.addAttribute("start", offset + 1);
1003
			model.addAttribute("size", size);
1004
			model.addAttribute("searchItem", searchItem);
1005
			model.addAttribute("searchTerm", searchTerm);
23914 govind 1006
			model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
23752 govind 1007
			if (schemes.size() < limit) {
1008
				model.addAttribute("end", offset + schemes.size());
1009
			} else {
1010
				model.addAttribute("end", offset + limit);
1011
			}
1012
		}
1013
		return "schemes";
1014
	}
1015
 
1016
	@RequestMapping(value = "/searchItemSchemePanigated")
1017
	public String getSchemeByItemPanigated(HttpServletRequest request,
30043 amit.gupta 1018
										   @RequestParam(name = "offset", defaultValue = "0") int offset,
1019
										   @RequestParam(name = "limit", defaultValue = "10") int limit,
1020
										   @RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem, Model model)
23752 govind 1021
			throws ProfitMandiBusinessException {
23914 govind 1022
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23752 govind 1023
		LOGGER.info("In search Item....");
1024
		List<Scheme> schemes = null;
1025
		if (!searchItem.equals("")) {
1026
			List<Integer> schemeIds = schemeItemRepository.selectSchemeIdByItemId(Integer.parseInt(searchItem));
1027
			if (schemeIds != null) {
1028
				LOGGER.info(schemeIds);
1029
				schemes = schemeRepository.selectBySchemeIds(schemeIds, offset, limit);
1030
 
1031
			}
1032
		}
1033
		model.addAttribute("schemes", schemes);
1034
		model.addAttribute("searchItem", searchItem);
23914 govind 1035
		model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
23752 govind 1036
		return "schemes-paginated";
1037
 
1038
	}
29707 tejbeer 1039
 
1040
	@RequestMapping(value = "/getCustomerOffer", method = RequestMethod.GET)
1041
	public String getCustomerOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1042
 
1043
		List<CustomerOffer> customerOffers = customerOfferRepository.selectAll();
1044
 
1045
		model.addAttribute("customerOffers", customerOffers);
1046
		return "customer-offer";
1047
 
1048
	}
1049
 
1050
	@RequestMapping(value = "/createCustomerOffer", method = RequestMethod.POST)
1051
	public String createCustomerOffer(HttpServletRequest request, @RequestParam String offerName,
30043 amit.gupta 1052
									  @RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, Model model) throws Exception {
29707 tejbeer 1053
 
1054
		CustomerOffer co = new CustomerOffer();
1055
		co.setOfferName(offerName);
1056
		co.setStartDate(startDate);
1057
		co.setEndDate(endDate);
1058
		co.setCreatedTimestamp(LocalDateTime.now());
1059
		co.setUpdatedTimestamp(LocalDateTime.now());
1060
		customerOfferRepository.persist(co);
1061
 
1062
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
1063
 
1064
		return "response";
1065
 
1066
	}
1067
 
1068
	@RequestMapping(value = "/customerOffer/downloadTemplate", method = RequestMethod.GET)
1069
	public ResponseEntity<?> downloadCustomerOfferTemplate(HttpServletRequest request) throws Exception {
1070
		List<List<?>> rows = new ArrayList<>();
1071
 
1072
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1073
				.getCSVByteStream(Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout"), rows);
1074
 
1075
		final HttpHeaders headers = new HttpHeaders();
1076
		headers.set("Content-Type", "text/csv");
1077
		headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1078
		headers.setContentLength(baos.toByteArray().length);
1079
 
1080
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1081
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1082
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1083
 
1084
	}
1085
 
1086
	@RequestMapping(value = "/customerOfferItem/upload", method = RequestMethod.POST)
1087
	public String uploadCustomerOfferItem(HttpServletRequest request, Model model, @RequestParam int offerId,
30043 amit.gupta 1088
										  HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {
29707 tejbeer 1089
 
1090
		List<CSVRecord> records = FileUtil.readFile(file);
1091
 
1092
		for (CSVRecord record : records) {
1093
			if (Integer.parseInt(record.get(0)) == 0) {
1094
				CustomerOfferItem coi = new CustomerOfferItem();
1095
				coi.setCatalogId(Integer.parseInt(record.get(1)));
1096
				coi.setSchemePayout(Integer.parseInt(record.get(2)));
1097
				coi.setDealerPayout(Integer.parseInt(record.get(3)));
1098
				coi.setCustomerOfferId(offerId);
1099
				coi.setUpdatedTimestamp(LocalDateTime.now());
1100
				coi.setCreatedTimestamp(LocalDateTime.now());
1101
				customerOfferItemRepository.persist(coi);
1102
 
1103
			} else {
1104
				CustomerOfferItem coi = customerOfferItemRepository.selectById(Integer.parseInt(record.get(0)));
1105
				coi.setSchemePayout(Integer.parseInt(record.get(2)));
1106
				coi.setDealerPayout(Integer.parseInt(record.get(3)));
1107
				coi.setUpdatedTimestamp(LocalDateTime.now());
1108
 
1109
			}
1110
 
1111
		}
1112
 
1113
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
1114
 
1115
		return "response";
1116
 
1117
	}
1118
 
1119
	@RequestMapping(value = "/customerOfferItem/download", method = RequestMethod.GET)
1120
	public ResponseEntity<?> downloadOfferItem(HttpServletRequest request, @RequestParam int offerId) throws Exception {
1121
 
1122
		List<CustomerOfferItem> cois = customerOfferItemRepository.selectByOfferId(offerId);
1123
		List<List<?>> rows = new ArrayList<>();
1124
 
1125
		for (CustomerOfferItem coi : cois) {
1126
			rows.add(Arrays.asList(coi.getId(), coi.getCatalogId(), coi.getSchemePayout(), coi.getDealerPayout()));
1127
 
1128
		}
1129
 
1130
		org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
1131
				.getCSVByteStream(Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout"), rows);
1132
 
1133
		final HttpHeaders headers = new HttpHeaders();
1134
		headers.set("Content-Type", "text/csv");
1135
		headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1136
		headers.setContentLength(baos.toByteArray().length);
1137
 
1138
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1139
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1140
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1141
 
1142
	}
1143
 
1144
	@RequestMapping(value = "/extendCustomerOffer", method = RequestMethod.POST)
1145
	public String extendCustomerOffer(HttpServletRequest request, @RequestParam int id,
30043 amit.gupta 1146
									  @RequestParam LocalDateTime endDate, Model model) throws ProfitMandiBusinessException {
29707 tejbeer 1147
 
1148
		CustomerOffer co = customerOfferRepository.selectById(id);
1149
		co.setEndDate(endDate);
1150
		co.setUpdatedTimestamp(LocalDateTime.now());
1151
 
1152
		model.addAttribute("co", co);
1153
 
1154
		return "customer-index-offer";
1155
 
1156
	}
1157
 
1158
	@RequestMapping(value = "/getSamsungUpgradeOffer", method = RequestMethod.GET)
1159
	public String getSamsungUpgradeOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1160
 
1161
		List<UpgradeOfferStatus> uos = UpgradeOfferStatus.offerStatus;
1162
		List<SamsungUpgradeOffer> samsungUpgradeOffers = samsungUpgradeOfferRepository.selectByStatus(
1163
				uos.stream().filter(x -> !x.equals(UpgradeOfferStatus.rejected)).collect(Collectors.toList()));
1164
 
1165
		model.addAttribute("samsungUpgradeOffers", samsungUpgradeOffers);
1166
		return "samsung-upgrade-offer";
1167
 
1168
	}
1169
 
1170
	@RequestMapping(value = "/approveSamsungUpgradeOffer", method = RequestMethod.POST)
1171
	public String approveSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1172
			throws ProfitMandiBusinessException {
1173
 
1174
		SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1175
		suo.setStatus(UpgradeOfferStatus.approved);
1176
		suo.setApprovedTimestamp(LocalDateTime.now());
1177
		model.addAttribute("suo", suo);
1178
		return "samsung-upgrade-offer-index";
1179
 
1180
	}
1181
 
1182
	@RequestMapping(value = "/rejectSamsungUpgradeOffer", method = RequestMethod.POST)
1183
	public String rejectSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1184
			throws ProfitMandiBusinessException {
1185
 
1186
		SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1187
		suo.setStatus(UpgradeOfferStatus.rejected);
1188
 
1189
		model.addAttribute("suo", suo);
1190
		return "samsung-upgrade-offer-index";
1191
 
1192
	}
1193
 
22860 ashik.ali 1194
}