Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
27877 amit.gupta 1
package com.spice.profitmandi.service.offers;
2
 
29783 amit.gupta 3
import com.google.common.collect.Lists;
27877 amit.gupta 4
import com.google.gson.Gson;
5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
29683 amit.gupta 6
import com.spice.profitmandi.common.model.PartnerTargetModel;
7
import com.spice.profitmandi.common.model.ProfitMandiConstants;
27877 amit.gupta 8
import com.spice.profitmandi.dao.entity.catalog.ItemCriteria;
9
import com.spice.profitmandi.dao.entity.catalog.Offer;
29783 amit.gupta 10
import com.spice.profitmandi.dao.entity.catalog.TagListing;
27877 amit.gupta 11
import com.spice.profitmandi.dao.entity.catalog.TargetSlab;
29783 amit.gupta 12
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
29499 amit.gupta 13
import com.spice.profitmandi.dao.enumuration.catalog.OfferSchemeType;
27877 amit.gupta 14
import com.spice.profitmandi.dao.model.CreateOfferRequest;
15
import com.spice.profitmandi.dao.model.ItemCriteriaPayout;
30066 amit.gupta 16
import com.spice.profitmandi.dao.repository.catalog.*;
27877 amit.gupta 17
import com.spice.profitmandi.service.user.RetailerService;
30066 amit.gupta 18
import org.apache.logging.log4j.LogManager;
19
import org.apache.logging.log4j.Logger;
20
import org.apache.poi.ss.usermodel.Cell;
21
import org.apache.poi.ss.usermodel.CellType;
22
import org.apache.poi.ss.usermodel.Row;
23
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
24
import org.apache.poi.xssf.usermodel.XSSFRow;
25
import org.apache.poi.xssf.usermodel.XSSFSheet;
26
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
27
import org.springframework.beans.factory.annotation.Autowired;
28
import org.springframework.cache.CacheManager;
29
import org.springframework.cache.annotation.Cacheable;
30
import org.springframework.stereotype.Component;
27877 amit.gupta 31
 
30066 amit.gupta 32
import java.io.IOException;
33
import java.io.InputStream;
34
import java.time.LocalDate;
35
import java.time.YearMonth;
36
import java.util.*;
37
import java.util.stream.Collectors;
38
 
27877 amit.gupta 39
@Component
40
public class OfferServiceImpl implements OfferService {
41
 
29499 amit.gupta 42
	private static final List<String> targets = Arrays.asList("Target 1", "Target 2", "Target 3", "Target 4",
43
			"Target 5");
44
 
27877 amit.gupta 45
	@Autowired
46
	private Gson gson;
47
 
48
	@Autowired
49
	private OfferRepository offerRepository;
50
 
51
	@Autowired
52
	private RetailerService retailerService;
53
 
54
	@Autowired
55
	private ItemCriteriaRepository itemCriteriaRepository;
56
 
57
	@Autowired
58
	private ItemRepository itemRepository;
59
 
60
	@Autowired
29783 amit.gupta 61
	private TagListingRepository tagListingRepository;
62
 
63
	@Autowired
30066 amit.gupta 64
	private OfferTargetSlabRepository offerTargetSlabRepository;
30684 amit.gupta 65
 
29806 amit.gupta 66
	@Autowired
29810 amit.gupta 67
	CacheManager thirtyMinsTimeOutCacheManager;
27877 amit.gupta 68
 
29806 amit.gupta 69
 
27877 amit.gupta 70
	private static final Logger LOGGER = LogManager.getLogger(OfferServiceImpl.class);
71
 
72
	@Override
73
	public void addOfferService(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
29686 amit.gupta 74
		LOGGER.info("createOfferRequest  -- {}", createOfferRequest);
27877 amit.gupta 75
		this.createOffer(createOfferRequest);
76
		this.createTargetSlabs(createOfferRequest);
77
	}
78
 
79
	private void createOffer(CreateOfferRequest createOfferRequest) {
80
		Offer offer = new Offer();
81
		offer.setName(createOfferRequest.getName());
82
		offer.setTargetType(createOfferRequest.getTargetType());
31190 amit.gupta 83
		offer.setBooster(createOfferRequest.isBooster());
27918 amit.gupta 84
		offer.setPayoutType(createOfferRequest.getPayoutType());
27877 amit.gupta 85
		offer.setSchemeType(createOfferRequest.getSchemeType());
29795 amit.gupta 86
		offer.setBaseCriteia(createOfferRequest.isBaseCriteria());
27877 amit.gupta 87
		offer.setEndDate(createOfferRequest.getEndDate());
88
		offer.setStartDate(createOfferRequest.getStartDate());
89
		offer.setBrandSharePercentage(createOfferRequest.getBrandShareTerms());
27918 amit.gupta 90
		offer.setSellinPercentage(createOfferRequest.getSellinPercentage());
27877 amit.gupta 91
		offer.setOfferNotes(createOfferRequest.getOfferNotes());
92
		offer.setActivationBrands(createOfferRequest.getActivationBrands());
93
		offer.setTerms(createOfferRequest.getTerms());
94
		offer.setItemCriteria(gson.toJson(createOfferRequest.getItemCriteria()));
95
		offer.setPartnerCriteria(gson.toJson(createOfferRequest.getPartnerCriteria()));
96
		offerRepository.persist(offer);
97
		createOfferRequest.setId(offer.getId());
98
	}
99
 
100
	@Override
101
	public List<CreateOfferRequest> getPublishedOffers(int fofoId, YearMonth yearMonth) {
29783 amit.gupta 102
		List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(yearMonth).get(fofoId);
27877 amit.gupta 103
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
104
		if (publishedOffers != null) {
105
			for (Offer offer : publishedOffers) {
106
				CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
107
				createOfferRequests.add(createOfferRequest);
29783 amit.gupta 108
				setCriteriaPayoutAchieved(fofoId, createOfferRequest);
27877 amit.gupta 109
 
110
			}
29783 amit.gupta 111
		}
112
		return createOfferRequests;
113
	}
27877 amit.gupta 114
 
29783 amit.gupta 115
	private void setCriteriaPayoutAchieved(int fofoId, CreateOfferRequest createOfferRequest) {
116
		Map<Integer, Long> criteriaTransactionMap = null;
117
		if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
118
			criteriaTransactionMap = offerRepository.getPartnerWisePurchaseSum(createOfferRequest).get(fofoId);
119
		} else {
120
			criteriaTransactionMap = offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId);
121
		}
122
		LOGGER.info("I am here ------- {}", createOfferRequest.getId());
123
		List<com.spice.profitmandi.dao.model.ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest
124
				.getTargetSlabs().get(0).getItemCriteriaPayouts();
27877 amit.gupta 125
 
29783 amit.gupta 126
		for (com.spice.profitmandi.dao.model.ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
127
			itemCriteriaPayout.setNextSlab(null);
128
			LOGGER.info("I am here --- {}", itemCriteriaPayout.getPayoutSlabs());
129
			long saleAmount = 0;
130
			if (criteriaTransactionMap != null
131
					&& criteriaTransactionMap.containsKey(itemCriteriaPayout.getItemCriteria().getId())) {
132
				saleAmount = criteriaTransactionMap.get(itemCriteriaPayout.getItemCriteria().getId());
133
			}
134
			itemCriteriaPayout.setAchievedValue(saleAmount);
135
			List<com.spice.profitmandi.service.offers.PayoutSlab> payoutSlabs = itemCriteriaPayout.getPayoutSlabs();
136
			for (int i = 0; i < payoutSlabs.size(); i++) {
137
				com.spice.profitmandi.service.offers.PayoutSlab beginSlab = payoutSlabs.get(i);
138
				com.spice.profitmandi.service.offers.PayoutSlab endSlab = null;
139
				if (payoutSlabs.size() - 1 > i) {
140
					endSlab = payoutSlabs.get(i + 1);
141
				}
142
				if (beginSlab.getOnwardsAmount() > saleAmount) {
143
					itemCriteriaPayout.setShortValue(beginSlab.getOnwardsAmount() - saleAmount);
144
					itemCriteriaPayout.setNextSlab(beginSlab);
145
					LOGGER.info("I am here");
146
					break;
147
				}
148
				if (endSlab != null) {
149
					if (beginSlab.getOnwardsAmount() <= saleAmount && endSlab.getOnwardsAmount() > saleAmount) {
150
						itemCriteriaPayout.setCurrentSlab(beginSlab);
151
						beginSlab.setSelected(true);
152
						itemCriteriaPayout.setNextSlab(endSlab);
153
						itemCriteriaPayout.setShortValue(endSlab.getOnwardsAmount() - saleAmount);
154
						LOGGER.info("I am here");
155
						break;
29499 amit.gupta 156
					}
29783 amit.gupta 157
					// Last loop
158
				} else {
159
					beginSlab.setSelected(true);
160
					itemCriteriaPayout.setCurrentSlab(beginSlab);
161
					LOGGER.info("I am here");
28152 amit.gupta 162
				}
27877 amit.gupta 163
			}
29783 amit.gupta 164
			LOGGER.info("I am here --- {}", itemCriteriaPayout);
27877 amit.gupta 165
		}
29783 amit.gupta 166
 
27877 amit.gupta 167
	}
168
 
169
	@Override
29783 amit.gupta 170
	@Cacheable(value = "allOffers", cacheManager = "thirtyMinsTimeOutCacheManager")
171
	public Map<Integer, CreateOfferRequest> getAllOffers(YearMonth yearMonth) {
27877 amit.gupta 172
		List<Offer> allOffers = offerRepository.selectAll(yearMonth, false);
173
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
174
		for (Offer offer : allOffers) {
175
			CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
176
			createOfferRequests.add(createOfferRequest);
177
		}
29783 amit.gupta 178
		return createOfferRequests.stream().collect(Collectors.toMap(CreateOfferRequest::getId, x -> x));
27877 amit.gupta 179
	}
180
 
181
	@Override
29783 amit.gupta 182
	@Cacheable(value = "partnerOffers", cacheManager = "thirtyMinsTimeOutCacheManager")
183
	public CreateOfferRequest getOffer(int fofoId, int offerId) {
27877 amit.gupta 184
		Offer offer = offerRepository.selectById(offerId);
185
		CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
29783 amit.gupta 186
		if (fofoId > 0) {
187
			this.setCriteriaPayoutAchieved(fofoId, createOfferRequest);
188
		}
189
 
27877 amit.gupta 190
		return createOfferRequest;
191
	}
192
 
29902 amit.gupta 193
	@Override
194
	public CreateOfferRequest getCreateOfferRequest(Offer fromOffer) {
27877 amit.gupta 195
		CreateOfferRequest createOfferRequest = new CreateOfferRequest();
196
		createOfferRequest.setName(fromOffer.getName());
197
		createOfferRequest.setTargetType(fromOffer.getTargetType());
27918 amit.gupta 198
		createOfferRequest.setPayoutType(fromOffer.getPayoutType());
27877 amit.gupta 199
		createOfferRequest.setSchemeType(fromOffer.getSchemeType());
200
		createOfferRequest.setActivationBrands(fromOffer.getActivationBrands());
201
		createOfferRequest.setEndDate(fromOffer.getEndDate());
202
		createOfferRequest.setStartDate(fromOffer.getStartDate());
31190 amit.gupta 203
		createOfferRequest.setBooster(fromOffer.isBooster());
27877 amit.gupta 204
		createOfferRequest.setActive(fromOffer.isActive());
205
		createOfferRequest.setSellinPercentage(fromOffer.getSellinPercentage());
206
		createOfferRequest.setBrandShareTerms(fromOffer.getBrandSharePercentage());
207
		createOfferRequest.setOfferNotes(fromOffer.getOfferNotes());
208
		createOfferRequest.setTerms(fromOffer.getTerms());
29795 amit.gupta 209
		createOfferRequest.setBaseCriteria(fromOffer.isBaseCriteia());
27877 amit.gupta 210
		createOfferRequest.setItemCriteria(
211
				gson.fromJson(fromOffer.getItemCriteria(), com.spice.profitmandi.service.offers.ItemCriteria.class));
212
		createOfferRequest.setPartnerCriteria(gson.fromJson(fromOffer.getPartnerCriteria(), PartnerCriteria.class));
213
		createOfferRequest.setId(fromOffer.getId());
214
		createOfferRequest.setCreatedOn(fromOffer.getCreatedTimestamp());
215
		createOfferRequest.setItemCriteriaString(
216
				itemCriteriaRepository.getItemCriteriaDescription(createOfferRequest.getItemCriteria()));
30066 amit.gupta 217
		List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = offerTargetSlabRepository
27877 amit.gupta 218
				.getByOfferId(fromOffer.getId());
219
		createOfferRequest.setPartnerCriteriaString(
220
				retailerService.getPartnerCriteriaString(createOfferRequest.getPartnerCriteria()));
221
		createOfferRequest.setTargetSlabs(targetSlabs);
29783 amit.gupta 222
		for (com.spice.profitmandi.dao.model.ItemCriteriaPayout itemCriteriaPayout : createOfferRequest.getTargetSlabs()
223
				.get(0).getItemCriteriaPayouts()) {
224
			itemCriteriaPayout.setNextSlab(itemCriteriaPayout.getPayoutSlabs().get(0));
225
		}
27877 amit.gupta 226
		return createOfferRequest;
227
 
228
	}
229
 
230
	private void createTargetSlabs(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
231
		List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = createOfferRequest.getTargetSlabs().stream()
232
				.filter(x -> x.validate()).collect(Collectors.toList());
233
		if (targetSlabs.size() >= 0) {
234
			Collections.sort(targetSlabs);
235
			for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
236
				if (targetSlab.validate()) {
237
					List<ItemCriteriaPayout> itemCriteriaPayouts = targetSlab.getItemCriteriaPayouts();
238
					for (ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
30684 amit.gupta 239
						ItemCriteria itemCriteria = itemCriteriaRepository.selectById(itemCriteriaPayout.getItemCriteria().getId());
240
						if (itemCriteriaPayout.getItemCriteria().getId() > 0) {
241
							itemCriteriaPayout.getItemCriteria().setId(0);
242
						} else {
243
 
244
							String itemCriteriaJson = gson.toJson(itemCriteriaPayout.getItemCriteria());
245
							itemCriteria = itemCriteriaRepository.selectByCriteria(itemCriteriaJson);
246
							// ItemCriteria Only once
247
							if (itemCriteria == null) {
248
								itemCriteria = new ItemCriteria();
249
								itemCriteria.setCriteria(gson.toJson(itemCriteriaPayout.getItemCriteria()));
250
								itemCriteriaRepository.persist(itemCriteria);
251
							}
27877 amit.gupta 252
						}
253
						for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
254
							TargetSlab targetSlab1 = new TargetSlab();
255
							targetSlab1.setOfferId(createOfferRequest.getId());
256
							targetSlab1.setOnwardsTarget(targetSlab.getOnwardsAmount());
257
							targetSlab1.setTargetDescription(targetSlab.getTargetDescription());
258
							targetSlab1.setPayoutTarget(payoutSlab.getOnwardsAmount());
259
							targetSlab1.setPayoutValue(payoutSlab.getPayoutAmount());
260
							targetSlab1.setItemCriteriaId(itemCriteria.getId());
261
							targetSlab1.setAmountType(itemCriteriaPayout.getAmountType());
30066 amit.gupta 262
							offerTargetSlabRepository.persist(targetSlab1);
27877 amit.gupta 263
						}
264
					}
265
				}
266
			}
267
 
268
		} else {
269
			throw new ProfitMandiBusinessException("Invalid Target Slabs", "Invalid Target", "");
270
		}
271
 
272
	}
273
 
274
	@Override
30274 amit.gupta 275
	public List<CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, int catalogId) {
27877 amit.gupta 276
		List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(YearMonth.from(date)).get(fofoId);
277
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
278
		if (publishedOffers != null) {
279
			for (Offer offer : publishedOffers) {
28007 amit.gupta 280
				boolean found = false;
30066 amit.gupta 281
				List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = offerTargetSlabRepository
27877 amit.gupta 282
						.getByOfferId(offer.getId());
283
				CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
284
				createOfferRequest.setTargetSlabs(targetSlabs);
29883 amit.gupta 285
				this.setCriteriaPayoutAchieved(fofoId, createOfferRequest);
27877 amit.gupta 286
				Set<com.spice.profitmandi.service.offers.ItemCriteria> itemCriteriaSet = targetSlabs.stream()
287
						.flatMap(x -> x.getItemCriteriaPayouts().stream()).map(x -> x.getItemCriteria()).distinct()
30274 amit.gupta 288
						.filter(x -> itemRepository.containsModel(x, catalogId)).collect(Collectors.toSet());
27877 amit.gupta 289
 
290
				for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
291
					targetSlab.setItemCriteriaPayouts(targetSlab.getItemCriteriaPayouts().stream()
292
							.filter(x -> itemCriteriaSet.contains(x.getItemCriteria())).collect(Collectors.toList()));
29499 amit.gupta 293
					if (targetSlab.getItemCriteriaPayouts().size() > 0) {
28007 amit.gupta 294
						found = true;
295
					}
27877 amit.gupta 296
				}
29499 amit.gupta 297
				if (found) {
28007 amit.gupta 298
					createOfferRequests.add(createOfferRequest);
299
				}
27877 amit.gupta 300
			}
301
		}
29499 amit.gupta 302
 
27877 amit.gupta 303
		return createOfferRequests;
304
	}
29783 amit.gupta 305
 
29683 amit.gupta 306
	@Override
307
	public void createOffers(InputStream fileInputStream) throws Exception {
308
		Map<CreateOfferRequest, List<PartnerTargetModel>> offerPartnerTargetMap = this.parseFromExcel(fileInputStream);
29783 amit.gupta 309
		for (Map.Entry<CreateOfferRequest, List<PartnerTargetModel>> partnerTargetEntry : offerPartnerTargetMap
310
				.entrySet()) {
29683 amit.gupta 311
			CreateOfferRequest createOfferRequest = partnerTargetEntry.getKey();
29783 amit.gupta 312
			Map<List<Integer>, List<Integer>> targetPartnerMap = partnerTargetEntry.getValue().stream()
313
					.collect(Collectors.groupingBy(PartnerTargetModel::getTargets,
314
							Collectors.mapping(PartnerTargetModel::getFofoId, Collectors.toList())));
315
			for (Map.Entry<List<Integer>, List<Integer>> targetPartnersEntry : targetPartnerMap.entrySet()) {
316
				List<Integer> fofoIds = createOfferRequest.getPartnerCriteria().getFofoIds();
317
				List<Integer> filterFofoIds = targetPartnersEntry.getValue().stream().filter(x -> !fofoIds.contains(x))
318
						.collect(Collectors.toList());
29796 amit.gupta 319
				LOGGER.info("FofoIds {}", filterFofoIds);
29783 amit.gupta 320
				List<Integer> targets = targetPartnersEntry.getKey();
29796 amit.gupta 321
				LOGGER.info("Targets  {}", targets);
29783 amit.gupta 322
 
323
				createOfferRequest.getPartnerCriteria().setFofoIds(filterFofoIds);
324
				int counter = 0;
29806 amit.gupta 325
				List<ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest.getTargetSlabs().get(0)
326
						.getItemCriteriaPayouts();
30684 amit.gupta 327
				List<PayoutSlab> payoutSlabs = itemCriteriaPayouts.stream().flatMap(x -> x.getPayoutSlabs().stream()).collect(Collectors.toList());
29806 amit.gupta 328
				for (PayoutSlab payoutSlab : payoutSlabs) {
29783 amit.gupta 329
					payoutSlab.setOnwardsAmount(targets.get(counter));
330
					counter++;
331
				}
29808 amit.gupta 332
				this.addOfferService(createOfferRequest);
29783 amit.gupta 333
			}
29683 amit.gupta 334
		}
29810 amit.gupta 335
		thirtyMinsTimeOutCacheManager.getCache("allOffers").evict(YearMonth.now());
29806 amit.gupta 336
 
29683 amit.gupta 337
	}
27877 amit.gupta 338
 
29783 amit.gupta 339
	private Map<CreateOfferRequest, List<PartnerTargetModel>> parseFromExcel(InputStream inputStream)
340
			throws ProfitMandiBusinessException {
341
 
342
		Map<CreateOfferRequest, List<PartnerTargetModel>> offerPartnerTargetMap = new HashMap<>();
29683 amit.gupta 343
		XSSFWorkbook myWorkBook = null;
344
		try {
345
			myWorkBook = new XSSFWorkbook(inputStream);
346
			myWorkBook.setMissingCellPolicy(MissingCellPolicy.RETURN_BLANK_AS_NULL);
29783 amit.gupta 347
			for (int i = 0; i < myWorkBook.getNumberOfSheets(); i++) {
348
 
29683 amit.gupta 349
				XSSFSheet mySheet = myWorkBook.getSheetAt(i);
350
				int offerId = Integer.parseInt(mySheet.getSheetName());
29783 amit.gupta 351
				CreateOfferRequest existingOffer = this.getOffer(0, offerId);
29683 amit.gupta 352
				List<PartnerTargetModel> partnerTargetModels = new ArrayList<>();
353
				offerPartnerTargetMap.put(existingOffer, partnerTargetModels);
354
				this.printIterator(mySheet);
355
				LOGGER.info("rowCellNum {}", mySheet.getLastRowNum());
356
				for (int rowNumber = 1; rowNumber <= mySheet.getLastRowNum(); rowNumber++) {
357
					XSSFRow row = mySheet.getRow(rowNumber);
358
					LOGGER.info("row {}", row);
359
					PartnerTargetModel partnerTargetModel = new PartnerTargetModel();
360
 
361
					if (row.getCell(0) != null && row.getCell(0).getCellTypeEnum() == CellType.NUMERIC) {
362
						partnerTargetModel.setFofoId((int) row.getCell(0).getNumericCellValue());
363
					} else {
364
						ProfitMandiBusinessException profitMandiBusinessException = new ProfitMandiBusinessException(
365
								"FOFO ID", row.getCell(0).toString(), "TGLSTNG_VE_1010");
366
						LOGGER.error("Excel file parse error : ", profitMandiBusinessException);
367
						throw profitMandiBusinessException;
368
					}
369
					List<Integer> targets = new ArrayList<>();
30684 amit.gupta 370
					long targetsSize = existingOffer.getTargetSlabs().get(0).getItemCriteriaPayouts().stream().flatMap(x -> x.getPayoutSlabs().stream()).collect(Collectors.counting());
29797 amit.gupta 371
					for (int cellNumber = 1; cellNumber <= targetsSize; cellNumber++) {
29683 amit.gupta 372
						if (row.getCell(cellNumber) != null
373
								&& row.getCell(cellNumber).getCellTypeEnum() == CellType.NUMERIC) {
374
							targets.add((int) row.getCell(cellNumber).getNumericCellValue());
375
						} else {
376
							ProfitMandiBusinessException profitMandiBusinessException = new ProfitMandiBusinessException(
377
									"Target Column issue at " + rowNumber + ", " + cellNumber, row.getCell(cellNumber),
378
									"Invalid target");
379
							LOGGER.error("Excel file parse error : ", profitMandiBusinessException);
380
							throw profitMandiBusinessException;
381
						}
382
					}
383
					partnerTargetModel.setTargets(targets);
384
					partnerTargetModels.add(partnerTargetModel);
385
				}
386
			}
387
			myWorkBook.close();
29783 amit.gupta 388
		} catch (ProfitMandiBusinessException pbse) {
29683 amit.gupta 389
			throw pbse;
390
		} catch (IOException ioException) {
391
			ioException.printStackTrace();
392
			throw new ProfitMandiBusinessException(ProfitMandiConstants.EXCEL_FILE, ioException.getMessage(),
393
					"EXL_VE_1000");
394
		} finally {
395
			if (myWorkBook != null) {
396
				try {
397
					myWorkBook.close();
398
				} catch (IOException e) {
399
					// TODO Auto-generated catch block
400
					e.printStackTrace();
401
				}
402
			}
403
		}
404
		LOGGER.info("offerPartnerTargetMap {}", offerPartnerTargetMap);
405
		return offerPartnerTargetMap;
406
	}
29783 amit.gupta 407
 
408
	private void printIterator(XSSFSheet sheet) {
409
		Iterator<Row> rowIterator = sheet.iterator();
410
		while (rowIterator.hasNext()) {
411
			Row row = rowIterator.next();
412
			// For each row, iterate through all the columns
413
			Iterator<Cell> cellIterator = row.cellIterator();
414
 
415
			while (cellIterator.hasNext()) {
416
				Cell cell = cellIterator.next();
417
				// Check the cell type and format accordingly
418
				switch (cell.getCellType()) {
30684 amit.gupta 419
					case Cell.CELL_TYPE_NUMERIC:
420
						System.out.print(cell.getNumericCellValue() + "t");
421
						break;
422
					case Cell.CELL_TYPE_STRING:
423
						System.out.print(cell.getStringCellValue() + "t");
424
						break;
29783 amit.gupta 425
				}
426
			}
427
			System.out.println("");
428
		}
29683 amit.gupta 429
	}
430
 
29783 amit.gupta 431
	@Override
432
	public Map<Integer, CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, String brand) {
433
		// TODO Auto-generated method stub
434
		return null;
435
	}
29683 amit.gupta 436
 
29783 amit.gupta 437
	@Override
30215 amit.gupta 438
	@Cacheable(value = "slabPayoutMap", cacheManager = "oneDayCacheManager")
29783 amit.gupta 439
	public Map<Integer, Map<Integer, Long>> getSlabPayoutMap(CreateOfferRequest createOfferRequest) {
30121 amit.gupta 440
		Map<Integer, Map<Integer, Long>> catalogSlabPayoutMap = new HashMap<>();
29785 amit.gupta 441
		com.spice.profitmandi.dao.model.TargetSlab targetSlab = createOfferRequest.getTargetSlabs().get(0);
29783 amit.gupta 442
		List<ItemCriteriaPayout> payouts = targetSlab.getItemCriteriaPayouts();
30684 amit.gupta 443
 
29783 amit.gupta 444
		for (ItemCriteriaPayout itemCriteriaPayout : payouts) {
445
			com.spice.profitmandi.service.offers.ItemCriteria itemCriteria = itemCriteriaPayout.getItemCriteria();
30121 amit.gupta 446
			List<Integer> catalogIds = itemRepository.getCatalogIds(itemCriteria);
29783 amit.gupta 447
			for (PayoutSlab payoutSlab : Lists.reverse(itemCriteriaPayout.getPayoutSlabs())) {
448
				if (itemCriteriaPayout.getAmountType().equals(AmountType.FIXED)) {
30121 amit.gupta 449
					for (Integer catalogId : catalogIds) {
450
						if (!catalogSlabPayoutMap.containsKey(catalogId)) {
451
							catalogSlabPayoutMap.put(catalogId, new LinkedHashMap<>());
29783 amit.gupta 452
						}
30121 amit.gupta 453
						catalogSlabPayoutMap.get(catalogId).put(payoutSlab.getOnwardsAmount(),
29783 amit.gupta 454
								(long) payoutSlab.getPayoutAmount());
455
					}
456
				} else if (itemCriteriaPayout.getAmountType().equals(AmountType.SLAB_FIXED)) {
30121 amit.gupta 457
					for (Integer catalogId : catalogIds) {
458
						if (!catalogSlabPayoutMap.containsKey(catalogId)) {
459
							catalogSlabPayoutMap.put(catalogId, new LinkedHashMap<>());
29783 amit.gupta 460
						}
30121 amit.gupta 461
						catalogSlabPayoutMap.get(catalogId).put(payoutSlab.getOnwardsAmount(),
29783 amit.gupta 462
								(long) (payoutSlab.getPayoutAmount() / payoutSlab.getOnwardsAmount()));
463
					}
464
				} else if (itemCriteriaPayout.getAmountType().equals(AmountType.PERCENTAGE)) {
30139 amit.gupta 465
					Map<Integer, TagListing> tagListingsMap = tagListingRepository.selectAllByCatalogIds(catalogIds);
466
					for (Map.Entry<Integer, TagListing> tagListingEntry : tagListingsMap.entrySet()) {
467
						TagListing tagListing = tagListingEntry.getValue();
468
						if (!catalogSlabPayoutMap.containsKey(tagListingEntry.getKey())) {
469
							catalogSlabPayoutMap.put(tagListingEntry.getKey(), new LinkedHashMap<>());
29783 amit.gupta 470
						}
30139 amit.gupta 471
						catalogSlabPayoutMap.get(tagListingEntry.getKey()).put(payoutSlab.getOnwardsAmount(),
30957 amit.gupta 472
								(long) (tagListing.getSellingPrice() * payoutSlab.getPayoutAmount() / 100));
29783 amit.gupta 473
					}
474
				}
475
			}
476
		}
30121 amit.gupta 477
		return catalogSlabPayoutMap;
29783 amit.gupta 478
	}
479
 
27877 amit.gupta 480
}