Subversion Repositories SmartDukaan

Rev

Rev 29499 | Rev 29683 | 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
 
3
import java.time.LocalDate;
4
import java.time.LocalDateTime;
5
import java.time.YearMonth;
6
import java.util.ArrayList;
28152 amit.gupta 7
import java.util.Arrays;
27877 amit.gupta 8
import java.util.Collections;
9
import java.util.Comparator;
10
import java.util.List;
11
import java.util.Set;
12
import java.util.stream.Collectors;
13
 
14
import org.apache.logging.log4j.LogManager;
15
import org.apache.logging.log4j.Logger;
16
import org.springframework.beans.factory.annotation.Autowired;
17
import org.springframework.stereotype.Component;
18
 
19
import com.google.gson.Gson;
29499 amit.gupta 20
import com.spice.profitmandi.common.enumuration.SchemeType;
27877 amit.gupta 21
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
22
import com.spice.profitmandi.dao.entity.catalog.ItemCriteria;
23
import com.spice.profitmandi.dao.entity.catalog.Offer;
24
import com.spice.profitmandi.dao.entity.catalog.TargetSlab;
29499 amit.gupta 25
import com.spice.profitmandi.dao.enumuration.catalog.OfferSchemeType;
27877 amit.gupta 26
import com.spice.profitmandi.dao.model.CreateOfferRequest;
27
import com.spice.profitmandi.dao.model.ItemCriteriaPayout;
28
import com.spice.profitmandi.dao.repository.catalog.ItemCriteriaRepository;
29
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
30
import com.spice.profitmandi.dao.repository.catalog.OfferRepository;
31
import com.spice.profitmandi.dao.repository.catalog.OfferTargetSlabRepository;
32
import com.spice.profitmandi.service.user.RetailerService;
33
 
34
@Component
35
public class OfferServiceImpl implements OfferService {
36
 
29499 amit.gupta 37
	private static final List<String> targets = Arrays.asList("Target 1", "Target 2", "Target 3", "Target 4",
38
			"Target 5");
39
 
27877 amit.gupta 40
	@Autowired
41
	private Gson gson;
42
 
43
	@Autowired
44
	private OfferRepository offerRepository;
45
 
46
	@Autowired
47
	private RetailerService retailerService;
48
 
49
	@Autowired
50
	private ItemCriteriaRepository itemCriteriaRepository;
51
 
52
	@Autowired
53
	private ItemRepository itemRepository;
54
 
55
	@Autowired
56
	private OfferTargetSlabRepository targetSlabRepository;
57
 
58
	private static final Logger LOGGER = LogManager.getLogger(OfferServiceImpl.class);
59
 
60
	@Override
61
	public void addOfferService(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
62
		this.createOffer(createOfferRequest);
63
		this.createTargetSlabs(createOfferRequest);
64
	}
65
 
66
	private void createOffer(CreateOfferRequest createOfferRequest) {
67
		Offer offer = new Offer();
68
		offer.setName(createOfferRequest.getName());
69
		offer.setTargetType(createOfferRequest.getTargetType());
27918 amit.gupta 70
		offer.setPayoutType(createOfferRequest.getPayoutType());
27877 amit.gupta 71
		offer.setSchemeType(createOfferRequest.getSchemeType());
28019 amit.gupta 72
		offer.setIncrementalTarget(createOfferRequest.isIncrementalTarget());
27877 amit.gupta 73
		offer.setEndDate(createOfferRequest.getEndDate());
74
		offer.setStartDate(createOfferRequest.getStartDate());
75
		offer.setBrandSharePercentage(createOfferRequest.getBrandShareTerms());
27918 amit.gupta 76
		offer.setSellinPercentage(createOfferRequest.getSellinPercentage());
27877 amit.gupta 77
		offer.setOfferNotes(createOfferRequest.getOfferNotes());
78
		offer.setActivationBrands(createOfferRequest.getActivationBrands());
79
		offer.setTerms(createOfferRequest.getTerms());
80
		offer.setItemCriteria(gson.toJson(createOfferRequest.getItemCriteria()));
81
		offer.setPartnerCriteria(gson.toJson(createOfferRequest.getPartnerCriteria()));
82
		offerRepository.persist(offer);
83
		createOfferRequest.setId(offer.getId());
84
	}
85
 
86
	@Override
87
	public List<CreateOfferRequest> getPublishedOffers(int fofoId, YearMonth yearMonth) {
88
		List<Offer> publishedOffers = offerRepository
29677 amit.gupta 89
				.selectAllPublishedMapByPartner(yearMonth).get(fofoId);
27877 amit.gupta 90
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
91
		if (publishedOffers != null) {
92
			for (Offer offer : publishedOffers) {
93
				List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
94
						.getByOfferId(offer.getId());
95
				CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
96
				createOfferRequest.getItemCriteria();
97
				createOfferRequest.setTargetSlabs(targetSlabs);
98
				createOfferRequests.add(createOfferRequest);
99
 
100
			}
101
			for (CreateOfferRequest createOfferRequest : createOfferRequests) {
29499 amit.gupta 102
				if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
103
				} else {
104
					long amount = offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId) == null ? 0
105
							: offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId);
27877 amit.gupta 106
 
29499 amit.gupta 107
					com.spice.profitmandi.dao.model.TargetSlab currentSlab = createOfferRequest.getTargetSlabs()
108
							.stream().filter(x -> x.getOnwardsAmount() <= amount)
109
							.max(Comparator.comparing(x -> x.getOnwardsAmount())).orElse(null);
27877 amit.gupta 110
 
29499 amit.gupta 111
					com.spice.profitmandi.dao.model.TargetSlab nextSlab = createOfferRequest.getTargetSlabs().stream()
112
							.filter(x -> x.getOnwardsAmount() > amount)
113
							.min(Comparator.comparing(x -> x.getOnwardsAmount())).orElse(null);
114
					createOfferRequest.setNextTargetSlab(nextSlab);
115
					if (nextSlab != null) {
116
						createOfferRequest
117
								.setNextTarget(targets.get(createOfferRequest.getTargetSlabs().indexOf(nextSlab)));
118
					}
119
					createOfferRequest.setCurrentTargetSlab(currentSlab);
120
					if (currentSlab != null) {
121
						createOfferRequest.setCurrentTarget(
122
								targets.get(createOfferRequest.getTargetSlabs().indexOf(currentSlab)));
123
					}
124
					createOfferRequest.setEligibleSale((int) amount);
28152 amit.gupta 125
				}
27877 amit.gupta 126
 
127
			}
128
		}
129
		return createOfferRequests;
130
	}
131
 
132
	@Override
133
	public List<CreateOfferRequest> getAllOffers(YearMonth yearMonth) {
134
		List<Offer> allOffers = offerRepository.selectAll(yearMonth, false);
135
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
136
		for (Offer offer : allOffers) {
137
			CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
138
			createOfferRequests.add(createOfferRequest);
139
		}
140
		return createOfferRequests;
141
	}
142
 
143
	@Override
144
	public CreateOfferRequest getOffer(int offerId) {
145
		Offer offer = offerRepository.selectById(offerId);
146
		CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
147
		return createOfferRequest;
148
	}
149
 
150
	private CreateOfferRequest getCreateOfferRequest(Offer fromOffer) {
151
		CreateOfferRequest createOfferRequest = new CreateOfferRequest();
152
		createOfferRequest.setName(fromOffer.getName());
153
		createOfferRequest.setTargetType(fromOffer.getTargetType());
27918 amit.gupta 154
		createOfferRequest.setPayoutType(fromOffer.getPayoutType());
27877 amit.gupta 155
		createOfferRequest.setSchemeType(fromOffer.getSchemeType());
156
		createOfferRequest.setActivationBrands(fromOffer.getActivationBrands());
157
		createOfferRequest.setEndDate(fromOffer.getEndDate());
158
		createOfferRequest.setStartDate(fromOffer.getStartDate());
159
		createOfferRequest.setActive(fromOffer.isActive());
160
		createOfferRequest.setSellinPercentage(fromOffer.getSellinPercentage());
161
		createOfferRequest.setBrandShareTerms(fromOffer.getBrandSharePercentage());
162
		createOfferRequest.setOfferNotes(fromOffer.getOfferNotes());
163
		createOfferRequest.setTerms(fromOffer.getTerms());
164
		createOfferRequest.setItemCriteria(
165
				gson.fromJson(fromOffer.getItemCriteria(), com.spice.profitmandi.service.offers.ItemCriteria.class));
166
		createOfferRequest.setPartnerCriteria(gson.fromJson(fromOffer.getPartnerCriteria(), PartnerCriteria.class));
167
		createOfferRequest.setId(fromOffer.getId());
168
		createOfferRequest.setCreatedOn(fromOffer.getCreatedTimestamp());
169
		createOfferRequest.setItemCriteriaString(
170
				itemCriteriaRepository.getItemCriteriaDescription(createOfferRequest.getItemCriteria()));
171
		List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
172
				.getByOfferId(fromOffer.getId());
173
		createOfferRequest.setPartnerCriteriaString(
174
				retailerService.getPartnerCriteriaString(createOfferRequest.getPartnerCriteria()));
175
		createOfferRequest.setTargetSlabs(targetSlabs);
176
		LOGGER.info("createOfferRequest {}", createOfferRequest);
177
		return createOfferRequest;
178
 
179
	}
180
 
181
	private void createTargetSlabs(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
182
		List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = createOfferRequest.getTargetSlabs().stream()
183
				.filter(x -> x.validate()).collect(Collectors.toList());
184
		if (targetSlabs.size() >= 0) {
185
			Collections.sort(targetSlabs);
186
			for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
187
				if (targetSlab.validate()) {
188
					List<ItemCriteriaPayout> itemCriteriaPayouts = targetSlab.getItemCriteriaPayouts();
189
					for (ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
190
						String itemCriteriaJson = gson.toJson(itemCriteriaPayout.getItemCriteria());
191
						ItemCriteria itemCriteria = itemCriteriaRepository.selectByCriteria(itemCriteriaJson);
192
						// ItemCriteria Only once
193
						if (itemCriteria == null) {
194
							itemCriteria = new ItemCriteria();
195
							itemCriteria.setCriteria(gson.toJson(itemCriteriaPayout.getItemCriteria()));
196
							itemCriteriaRepository.persist(itemCriteria);
197
						}
198
						for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
199
							TargetSlab targetSlab1 = new TargetSlab();
200
							targetSlab1.setOfferId(createOfferRequest.getId());
201
							targetSlab1.setOnwardsTarget(targetSlab.getOnwardsAmount());
202
							targetSlab1.setTargetDescription(targetSlab.getTargetDescription());
203
							targetSlab1.setPayoutTarget(payoutSlab.getOnwardsAmount());
204
							targetSlab1.setPayoutValue(payoutSlab.getPayoutAmount());
205
							targetSlab1.setItemCriteriaId(itemCriteria.getId());
206
							targetSlab1.setAmountType(itemCriteriaPayout.getAmountType());
207
							targetSlabRepository.persist(targetSlab1);
208
						}
209
					}
210
				}
211
			}
212
 
213
		} else {
214
			throw new ProfitMandiBusinessException("Invalid Target Slabs", "Invalid Target", "");
215
		}
216
 
217
	}
218
 
219
	@Override
220
	public List<CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, int itemId) {
221
		List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(YearMonth.from(date)).get(fofoId);
222
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
223
		if (publishedOffers != null) {
224
			for (Offer offer : publishedOffers) {
28007 amit.gupta 225
				boolean found = false;
27877 amit.gupta 226
				List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
227
						.getByOfferId(offer.getId());
228
				CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
229
				createOfferRequest.setTargetSlabs(targetSlabs);
230
				Set<com.spice.profitmandi.service.offers.ItemCriteria> itemCriteriaSet = targetSlabs.stream()
231
						.flatMap(x -> x.getItemCriteriaPayouts().stream()).map(x -> x.getItemCriteria()).distinct()
232
						.filter(x -> itemRepository.containsItem(x, itemId)).collect(Collectors.toSet());
233
 
234
				for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
235
					targetSlab.setItemCriteriaPayouts(targetSlab.getItemCriteriaPayouts().stream()
236
							.filter(x -> itemCriteriaSet.contains(x.getItemCriteria())).collect(Collectors.toList()));
29499 amit.gupta 237
					if (targetSlab.getItemCriteriaPayouts().size() > 0) {
28007 amit.gupta 238
						found = true;
239
					}
27877 amit.gupta 240
				}
29499 amit.gupta 241
				if (found) {
28007 amit.gupta 242
					createOfferRequests.add(createOfferRequest);
243
				}
27877 amit.gupta 244
			}
245
		}
29499 amit.gupta 246
 
27877 amit.gupta 247
		return createOfferRequests;
248
	}
249
 
250
}