Subversion Repositories SmartDukaan

Rev

Rev 29677 | Rev 29686 | 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
 
29683 amit.gupta 3
import java.io.FileInputStream;
4
import java.io.IOException;
5
import java.io.InputStream;
27877 amit.gupta 6
import java.time.LocalDate;
7
import java.time.YearMonth;
8
import java.util.ArrayList;
28152 amit.gupta 9
import java.util.Arrays;
27877 amit.gupta 10
import java.util.Collections;
11
import java.util.Comparator;
29683 amit.gupta 12
import java.util.HashMap;
13
import java.util.Iterator;
27877 amit.gupta 14
import java.util.List;
29683 amit.gupta 15
import java.util.Map;
27877 amit.gupta 16
import java.util.Set;
17
import java.util.stream.Collectors;
18
 
19
import org.apache.logging.log4j.LogManager;
20
import org.apache.logging.log4j.Logger;
29683 amit.gupta 21
import org.apache.poi.ss.usermodel.Cell;
22
import org.apache.poi.ss.usermodel.CellType;
23
import org.apache.poi.ss.usermodel.Row;
24
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
25
import org.apache.poi.xssf.usermodel.XSSFRow;
26
import org.apache.poi.xssf.usermodel.XSSFSheet;
27
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
27877 amit.gupta 28
import org.springframework.beans.factory.annotation.Autowired;
29
import org.springframework.stereotype.Component;
30
 
31
import com.google.gson.Gson;
32
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
29683 amit.gupta 33
import com.spice.profitmandi.common.model.PartnerTargetModel;
34
import com.spice.profitmandi.common.model.ProfitMandiConstants;
27877 amit.gupta 35
import com.spice.profitmandi.dao.entity.catalog.ItemCriteria;
36
import com.spice.profitmandi.dao.entity.catalog.Offer;
37
import com.spice.profitmandi.dao.entity.catalog.TargetSlab;
29499 amit.gupta 38
import com.spice.profitmandi.dao.enumuration.catalog.OfferSchemeType;
27877 amit.gupta 39
import com.spice.profitmandi.dao.model.CreateOfferRequest;
40
import com.spice.profitmandi.dao.model.ItemCriteriaPayout;
41
import com.spice.profitmandi.dao.repository.catalog.ItemCriteriaRepository;
42
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
43
import com.spice.profitmandi.dao.repository.catalog.OfferRepository;
44
import com.spice.profitmandi.dao.repository.catalog.OfferTargetSlabRepository;
45
import com.spice.profitmandi.service.user.RetailerService;
46
 
47
@Component
48
public class OfferServiceImpl implements OfferService {
49
 
29499 amit.gupta 50
	private static final List<String> targets = Arrays.asList("Target 1", "Target 2", "Target 3", "Target 4",
51
			"Target 5");
52
 
27877 amit.gupta 53
	@Autowired
54
	private Gson gson;
55
 
56
	@Autowired
57
	private OfferRepository offerRepository;
58
 
59
	@Autowired
60
	private RetailerService retailerService;
61
 
62
	@Autowired
63
	private ItemCriteriaRepository itemCriteriaRepository;
64
 
65
	@Autowired
66
	private ItemRepository itemRepository;
67
 
68
	@Autowired
69
	private OfferTargetSlabRepository targetSlabRepository;
70
 
71
	private static final Logger LOGGER = LogManager.getLogger(OfferServiceImpl.class);
72
 
73
	@Override
74
	public void addOfferService(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
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());
27918 amit.gupta 83
		offer.setPayoutType(createOfferRequest.getPayoutType());
27877 amit.gupta 84
		offer.setSchemeType(createOfferRequest.getSchemeType());
28019 amit.gupta 85
		offer.setIncrementalTarget(createOfferRequest.isIncrementalTarget());
27877 amit.gupta 86
		offer.setEndDate(createOfferRequest.getEndDate());
87
		offer.setStartDate(createOfferRequest.getStartDate());
88
		offer.setBrandSharePercentage(createOfferRequest.getBrandShareTerms());
27918 amit.gupta 89
		offer.setSellinPercentage(createOfferRequest.getSellinPercentage());
27877 amit.gupta 90
		offer.setOfferNotes(createOfferRequest.getOfferNotes());
91
		offer.setActivationBrands(createOfferRequest.getActivationBrands());
92
		offer.setTerms(createOfferRequest.getTerms());
93
		offer.setItemCriteria(gson.toJson(createOfferRequest.getItemCriteria()));
94
		offer.setPartnerCriteria(gson.toJson(createOfferRequest.getPartnerCriteria()));
95
		offerRepository.persist(offer);
96
		createOfferRequest.setId(offer.getId());
97
	}
98
 
99
	@Override
100
	public List<CreateOfferRequest> getPublishedOffers(int fofoId, YearMonth yearMonth) {
101
		List<Offer> publishedOffers = offerRepository
29677 amit.gupta 102
				.selectAllPublishedMapByPartner(yearMonth).get(fofoId);
27877 amit.gupta 103
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
104
		if (publishedOffers != null) {
105
			for (Offer offer : publishedOffers) {
106
				List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
107
						.getByOfferId(offer.getId());
108
				CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
109
				createOfferRequest.getItemCriteria();
110
				createOfferRequest.setTargetSlabs(targetSlabs);
111
				createOfferRequests.add(createOfferRequest);
112
 
113
			}
114
			for (CreateOfferRequest createOfferRequest : createOfferRequests) {
29499 amit.gupta 115
				if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
116
				} else {
117
					long amount = offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId) == null ? 0
118
							: offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId);
27877 amit.gupta 119
 
29499 amit.gupta 120
					com.spice.profitmandi.dao.model.TargetSlab currentSlab = createOfferRequest.getTargetSlabs()
121
							.stream().filter(x -> x.getOnwardsAmount() <= amount)
122
							.max(Comparator.comparing(x -> x.getOnwardsAmount())).orElse(null);
27877 amit.gupta 123
 
29499 amit.gupta 124
					com.spice.profitmandi.dao.model.TargetSlab nextSlab = createOfferRequest.getTargetSlabs().stream()
125
							.filter(x -> x.getOnwardsAmount() > amount)
126
							.min(Comparator.comparing(x -> x.getOnwardsAmount())).orElse(null);
127
					createOfferRequest.setNextTargetSlab(nextSlab);
128
					if (nextSlab != null) {
129
						createOfferRequest
130
								.setNextTarget(targets.get(createOfferRequest.getTargetSlabs().indexOf(nextSlab)));
131
					}
132
					createOfferRequest.setCurrentTargetSlab(currentSlab);
133
					if (currentSlab != null) {
134
						createOfferRequest.setCurrentTarget(
135
								targets.get(createOfferRequest.getTargetSlabs().indexOf(currentSlab)));
136
					}
137
					createOfferRequest.setEligibleSale((int) amount);
28152 amit.gupta 138
				}
27877 amit.gupta 139
 
140
			}
141
		}
142
		return createOfferRequests;
143
	}
144
 
145
	@Override
146
	public List<CreateOfferRequest> getAllOffers(YearMonth yearMonth) {
147
		List<Offer> allOffers = offerRepository.selectAll(yearMonth, false);
148
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
149
		for (Offer offer : allOffers) {
150
			CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
151
			createOfferRequests.add(createOfferRequest);
152
		}
153
		return createOfferRequests;
154
	}
155
 
156
	@Override
157
	public CreateOfferRequest getOffer(int offerId) {
158
		Offer offer = offerRepository.selectById(offerId);
159
		CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
160
		return createOfferRequest;
161
	}
162
 
163
	private CreateOfferRequest getCreateOfferRequest(Offer fromOffer) {
164
		CreateOfferRequest createOfferRequest = new CreateOfferRequest();
165
		createOfferRequest.setName(fromOffer.getName());
166
		createOfferRequest.setTargetType(fromOffer.getTargetType());
27918 amit.gupta 167
		createOfferRequest.setPayoutType(fromOffer.getPayoutType());
27877 amit.gupta 168
		createOfferRequest.setSchemeType(fromOffer.getSchemeType());
169
		createOfferRequest.setActivationBrands(fromOffer.getActivationBrands());
170
		createOfferRequest.setEndDate(fromOffer.getEndDate());
171
		createOfferRequest.setStartDate(fromOffer.getStartDate());
172
		createOfferRequest.setActive(fromOffer.isActive());
173
		createOfferRequest.setSellinPercentage(fromOffer.getSellinPercentage());
174
		createOfferRequest.setBrandShareTerms(fromOffer.getBrandSharePercentage());
175
		createOfferRequest.setOfferNotes(fromOffer.getOfferNotes());
176
		createOfferRequest.setTerms(fromOffer.getTerms());
177
		createOfferRequest.setItemCriteria(
178
				gson.fromJson(fromOffer.getItemCriteria(), com.spice.profitmandi.service.offers.ItemCriteria.class));
179
		createOfferRequest.setPartnerCriteria(gson.fromJson(fromOffer.getPartnerCriteria(), PartnerCriteria.class));
180
		createOfferRequest.setId(fromOffer.getId());
181
		createOfferRequest.setCreatedOn(fromOffer.getCreatedTimestamp());
182
		createOfferRequest.setItemCriteriaString(
183
				itemCriteriaRepository.getItemCriteriaDescription(createOfferRequest.getItemCriteria()));
184
		List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
185
				.getByOfferId(fromOffer.getId());
186
		createOfferRequest.setPartnerCriteriaString(
187
				retailerService.getPartnerCriteriaString(createOfferRequest.getPartnerCriteria()));
188
		createOfferRequest.setTargetSlabs(targetSlabs);
189
		LOGGER.info("createOfferRequest {}", createOfferRequest);
190
		return createOfferRequest;
191
 
192
	}
193
 
194
	private void createTargetSlabs(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
195
		List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = createOfferRequest.getTargetSlabs().stream()
196
				.filter(x -> x.validate()).collect(Collectors.toList());
197
		if (targetSlabs.size() >= 0) {
198
			Collections.sort(targetSlabs);
199
			for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
200
				if (targetSlab.validate()) {
201
					List<ItemCriteriaPayout> itemCriteriaPayouts = targetSlab.getItemCriteriaPayouts();
202
					for (ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
203
						String itemCriteriaJson = gson.toJson(itemCriteriaPayout.getItemCriteria());
204
						ItemCriteria itemCriteria = itemCriteriaRepository.selectByCriteria(itemCriteriaJson);
205
						// ItemCriteria Only once
206
						if (itemCriteria == null) {
207
							itemCriteria = new ItemCriteria();
208
							itemCriteria.setCriteria(gson.toJson(itemCriteriaPayout.getItemCriteria()));
209
							itemCriteriaRepository.persist(itemCriteria);
210
						}
211
						for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
212
							TargetSlab targetSlab1 = new TargetSlab();
213
							targetSlab1.setOfferId(createOfferRequest.getId());
214
							targetSlab1.setOnwardsTarget(targetSlab.getOnwardsAmount());
215
							targetSlab1.setTargetDescription(targetSlab.getTargetDescription());
216
							targetSlab1.setPayoutTarget(payoutSlab.getOnwardsAmount());
217
							targetSlab1.setPayoutValue(payoutSlab.getPayoutAmount());
218
							targetSlab1.setItemCriteriaId(itemCriteria.getId());
219
							targetSlab1.setAmountType(itemCriteriaPayout.getAmountType());
220
							targetSlabRepository.persist(targetSlab1);
221
						}
222
					}
223
				}
224
			}
225
 
226
		} else {
227
			throw new ProfitMandiBusinessException("Invalid Target Slabs", "Invalid Target", "");
228
		}
229
 
230
	}
231
 
232
	@Override
233
	public List<CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, int itemId) {
234
		List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(YearMonth.from(date)).get(fofoId);
235
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
236
		if (publishedOffers != null) {
237
			for (Offer offer : publishedOffers) {
28007 amit.gupta 238
				boolean found = false;
27877 amit.gupta 239
				List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
240
						.getByOfferId(offer.getId());
241
				CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
242
				createOfferRequest.setTargetSlabs(targetSlabs);
243
				Set<com.spice.profitmandi.service.offers.ItemCriteria> itemCriteriaSet = targetSlabs.stream()
244
						.flatMap(x -> x.getItemCriteriaPayouts().stream()).map(x -> x.getItemCriteria()).distinct()
245
						.filter(x -> itemRepository.containsItem(x, itemId)).collect(Collectors.toSet());
246
 
247
				for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
248
					targetSlab.setItemCriteriaPayouts(targetSlab.getItemCriteriaPayouts().stream()
249
							.filter(x -> itemCriteriaSet.contains(x.getItemCriteria())).collect(Collectors.toList()));
29499 amit.gupta 250
					if (targetSlab.getItemCriteriaPayouts().size() > 0) {
28007 amit.gupta 251
						found = true;
252
					}
27877 amit.gupta 253
				}
29499 amit.gupta 254
				if (found) {
28007 amit.gupta 255
					createOfferRequests.add(createOfferRequest);
256
				}
27877 amit.gupta 257
			}
258
		}
29499 amit.gupta 259
 
27877 amit.gupta 260
		return createOfferRequests;
261
	}
29683 amit.gupta 262
 
263
	@Override
264
	public void createOffers(InputStream fileInputStream) throws Exception {
265
		Map<CreateOfferRequest, List<PartnerTargetModel>> offerPartnerTargetMap = this.parseFromExcel(fileInputStream);
266
		for(Map.Entry<CreateOfferRequest, List<PartnerTargetModel>> partnerTargetEntry: offerPartnerTargetMap.entrySet()) {
267
			CreateOfferRequest createOfferRequest = partnerTargetEntry.getKey();
268
			Map<List<Integer>, List<Integer>> targetPartnerMap = partnerTargetEntry.getValue().stream().collect(Collectors.groupingBy(PartnerTargetModel::getTargets, Collectors.mapping(PartnerTargetModel::getFofoId, Collectors.toList())));
269
					for (Map.Entry<List<Integer>, List<Integer>> targetPartnersEntry : targetPartnerMap.entrySet()) {
270
						List<Integer> fofoIds = createOfferRequest.getPartnerCriteria().getFofoIds();
271
						List<Integer> filterFofoIds = targetPartnersEntry.getValue().stream().filter(x->!fofoIds.contains(x)).collect(Collectors.toList());
272
						List<Integer> targets = targetPartnersEntry.getKey();
273
 
274
						createOfferRequest.getPartnerCriteria().setFofoIds(filterFofoIds);
275
						int counter = 0;
276
						for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : createOfferRequest.getTargetSlabs()) {
277
							targetSlab.setOnwardsAmount(targets.get(counter));
278
							counter++;
279
						}
280
						this.addOfferService(createOfferRequest);
281
					}
282
		}
283
	}
284
 
285
	private Map<CreateOfferRequest, List<PartnerTargetModel>> parseFromExcel(InputStream inputStream) throws ProfitMandiBusinessException {
27877 amit.gupta 286
 
29683 amit.gupta 287
		Map<CreateOfferRequest, List<PartnerTargetModel>> offerPartnerTargetMap =  new HashMap<>();
288
		XSSFWorkbook myWorkBook = null;
289
		try {
290
			myWorkBook = new XSSFWorkbook(inputStream);
291
			myWorkBook.setMissingCellPolicy(MissingCellPolicy.RETURN_BLANK_AS_NULL);
292
			for(int i=0; i< myWorkBook.getNumberOfSheets();i++) {
293
 
294
				XSSFSheet mySheet = myWorkBook.getSheetAt(i);
295
				int offerId = Integer.parseInt(mySheet.getSheetName());
296
				CreateOfferRequest existingOffer = this.getOffer(offerId);
297
				List<PartnerTargetModel> partnerTargetModels = new ArrayList<>();
298
				offerPartnerTargetMap.put(existingOffer, partnerTargetModels);
299
				this.printIterator(mySheet);
300
				LOGGER.info("rowCellNum {}", mySheet.getLastRowNum());
301
				for (int rowNumber = 1; rowNumber <= mySheet.getLastRowNum(); rowNumber++) {
302
					XSSFRow row = mySheet.getRow(rowNumber);
303
					LOGGER.info("row {}", row);
304
					PartnerTargetModel partnerTargetModel = new PartnerTargetModel();
305
 
306
					if (row.getCell(0) != null && row.getCell(0).getCellTypeEnum() == CellType.NUMERIC) {
307
						partnerTargetModel.setFofoId((int) row.getCell(0).getNumericCellValue());
308
					} else {
309
						ProfitMandiBusinessException profitMandiBusinessException = new ProfitMandiBusinessException(
310
								"FOFO ID", row.getCell(0).toString(), "TGLSTNG_VE_1010");
311
						LOGGER.error("Excel file parse error : ", profitMandiBusinessException);
312
						throw profitMandiBusinessException;
313
					}
314
					List<Integer> targets = new ArrayList<>();
315
					for (int cellNumber = 1; cellNumber <= existingOffer.getTargetSlabs().size(); cellNumber++) {
316
						if (row.getCell(cellNumber) != null
317
								&& row.getCell(cellNumber).getCellTypeEnum() == CellType.NUMERIC) {
318
							targets.add((int) row.getCell(cellNumber).getNumericCellValue());
319
						} else {
320
							ProfitMandiBusinessException profitMandiBusinessException = new ProfitMandiBusinessException(
321
									"Target Column issue at " + rowNumber + ", " + cellNumber, row.getCell(cellNumber),
322
									"Invalid target");
323
							LOGGER.error("Excel file parse error : ", profitMandiBusinessException);
324
							throw profitMandiBusinessException;
325
						}
326
					}
327
					partnerTargetModel.setTargets(targets);
328
					partnerTargetModels.add(partnerTargetModel);
329
				}
330
			}
331
			myWorkBook.close();
332
		} catch ( ProfitMandiBusinessException pbse) {
333
			throw pbse;
334
		} catch (IOException ioException) {
335
			ioException.printStackTrace();
336
			throw new ProfitMandiBusinessException(ProfitMandiConstants.EXCEL_FILE, ioException.getMessage(),
337
					"EXL_VE_1000");
338
		} finally {
339
			if (myWorkBook != null) {
340
				try {
341
					myWorkBook.close();
342
				} catch (IOException e) {
343
					// TODO Auto-generated catch block
344
					e.printStackTrace();
345
				}
346
			}
347
		}
348
		LOGGER.info("offerPartnerTargetMap {}", offerPartnerTargetMap);
349
		return offerPartnerTargetMap;
350
	}
351
 
352
	private void printIterator (XSSFSheet sheet) {
353
		 Iterator<Row> rowIterator = sheet.iterator();
354
         while (rowIterator.hasNext()) 
355
         {
356
             Row row = rowIterator.next();
357
             //For each row, iterate through all the columns
358
             Iterator<Cell> cellIterator = row.cellIterator();
359
 
360
             while (cellIterator.hasNext()) 
361
             {
362
                 Cell cell = cellIterator.next();
363
                 //Check the cell type and format accordingly
364
                 switch (cell.getCellType()) 
365
                 {
366
                     case Cell.CELL_TYPE_NUMERIC:
367
                         System.out.print(cell.getNumericCellValue() + "t");
368
                         break;
369
                     case Cell.CELL_TYPE_STRING:
370
                         System.out.print(cell.getStringCellValue() + "t");
371
                         break;
372
                 }
373
             }
374
             System.out.println("");
375
         }
376
	}
377
 
378
 
27877 amit.gupta 379
}