Subversion Repositories SmartDukaan

Rev

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