Subversion Repositories SmartDukaan

Rev

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