Subversion Repositories SmartDukaan

Rev

Rev 28001 | Rev 28012 | 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());
66
		offer.setEndDate(createOfferRequest.getEndDate());
67
		offer.setStartDate(createOfferRequest.getStartDate());
68
		offer.setBrandSharePercentage(createOfferRequest.getBrandShareTerms());
27918 amit.gupta 69
		offer.setSellinPercentage(createOfferRequest.getSellinPercentage());
27877 amit.gupta 70
		offer.setOfferNotes(createOfferRequest.getOfferNotes());
71
		offer.setActivationBrands(createOfferRequest.getActivationBrands());
72
		offer.setTerms(createOfferRequest.getTerms());
73
		offer.setItemCriteria(gson.toJson(createOfferRequest.getItemCriteria()));
74
		offer.setPartnerCriteria(gson.toJson(createOfferRequest.getPartnerCriteria()));
75
		offerRepository.persist(offer);
76
		createOfferRequest.setId(offer.getId());
77
	}
78
 
79
	@Override
80
	public List<CreateOfferRequest> getPublishedOffers(int fofoId, YearMonth yearMonth) {
81
		List<Offer> publishedOffers = offerRepository
82
				.selectAllPublishedMapByPartner(YearMonth.from(LocalDateTime.now())).get(fofoId);
83
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
84
		if (publishedOffers != null) {
85
			for (Offer offer : publishedOffers) {
86
				List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
87
						.getByOfferId(offer.getId());
88
				CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
89
				createOfferRequest.getItemCriteria();
90
				createOfferRequest.setTargetSlabs(targetSlabs);
91
				createOfferRequests.add(createOfferRequest);
92
 
93
			}
94
			for (CreateOfferRequest createOfferRequest : createOfferRequests) {
95
				double amount = offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId) == null ? 0
96
						: offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId);
97
 
98
				com.spice.profitmandi.dao.model.TargetSlab currentSlab = createOfferRequest.getTargetSlabs().stream()
99
						.filter(x -> x.getOnwardsAmount() <= amount)
100
						.max(Comparator.comparing(x -> x.getOnwardsAmount())).orElse(null);
101
 
102
				com.spice.profitmandi.dao.model.TargetSlab nextSlab = createOfferRequest.getTargetSlabs().stream()
103
						.filter(x -> x.getOnwardsAmount() > amount).min(Comparator.comparing(x -> x.getOnwardsAmount()))
104
						.orElse(null);
105
				createOfferRequest.setNextTargetSlab(nextSlab);
106
				createOfferRequest.setCurrentTargetSlab(currentSlab);
107
				createOfferRequest.setEligibleSale((int) amount);
108
 
109
			}
110
		}
111
		return createOfferRequests;
112
	}
113
 
114
	@Override
115
	public List<CreateOfferRequest> getAllOffers(YearMonth yearMonth) {
116
		List<Offer> allOffers = offerRepository.selectAll(yearMonth, false);
117
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
118
		for (Offer offer : allOffers) {
119
			CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
120
			createOfferRequests.add(createOfferRequest);
121
		}
122
		return createOfferRequests;
123
	}
124
 
125
	@Override
126
	public CreateOfferRequest getOffer(int offerId) {
127
		Offer offer = offerRepository.selectById(offerId);
128
		CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
129
		return createOfferRequest;
130
	}
131
 
132
	private CreateOfferRequest getCreateOfferRequest(Offer fromOffer) {
133
		CreateOfferRequest createOfferRequest = new CreateOfferRequest();
134
		createOfferRequest.setName(fromOffer.getName());
135
		createOfferRequest.setTargetType(fromOffer.getTargetType());
27918 amit.gupta 136
		createOfferRequest.setPayoutType(fromOffer.getPayoutType());
27877 amit.gupta 137
		createOfferRequest.setSchemeType(fromOffer.getSchemeType());
138
		createOfferRequest.setActivationBrands(fromOffer.getActivationBrands());
139
		createOfferRequest.setEndDate(fromOffer.getEndDate());
140
		createOfferRequest.setStartDate(fromOffer.getStartDate());
141
		createOfferRequest.setActive(fromOffer.isActive());
142
		createOfferRequest.setSellinPercentage(fromOffer.getSellinPercentage());
143
		createOfferRequest.setBrandShareTerms(fromOffer.getBrandSharePercentage());
144
		createOfferRequest.setOfferNotes(fromOffer.getOfferNotes());
145
		createOfferRequest.setTerms(fromOffer.getTerms());
146
		createOfferRequest.setItemCriteria(
147
				gson.fromJson(fromOffer.getItemCriteria(), com.spice.profitmandi.service.offers.ItemCriteria.class));
148
		createOfferRequest.setPartnerCriteria(gson.fromJson(fromOffer.getPartnerCriteria(), PartnerCriteria.class));
149
		createOfferRequest.setId(fromOffer.getId());
150
		createOfferRequest.setCreatedOn(fromOffer.getCreatedTimestamp());
151
		createOfferRequest.setItemCriteriaString(
152
				itemCriteriaRepository.getItemCriteriaDescription(createOfferRequest.getItemCriteria()));
153
		List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
154
				.getByOfferId(fromOffer.getId());
155
		createOfferRequest.setPartnerCriteriaString(
156
				retailerService.getPartnerCriteriaString(createOfferRequest.getPartnerCriteria()));
157
		createOfferRequest.setTargetSlabs(targetSlabs);
158
		LOGGER.info("createOfferRequest {}", createOfferRequest);
159
		return createOfferRequest;
160
 
161
	}
162
 
163
	private void createTargetSlabs(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
164
		List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = createOfferRequest.getTargetSlabs().stream()
165
				.filter(x -> x.validate()).collect(Collectors.toList());
166
		if (targetSlabs.size() >= 0) {
167
			Collections.sort(targetSlabs);
168
			for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
169
				if (targetSlab.validate()) {
170
					List<ItemCriteriaPayout> itemCriteriaPayouts = targetSlab.getItemCriteriaPayouts();
171
					for (ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
172
						String itemCriteriaJson = gson.toJson(itemCriteriaPayout.getItemCriteria());
173
						ItemCriteria itemCriteria = itemCriteriaRepository.selectByCriteria(itemCriteriaJson);
174
						// ItemCriteria Only once
175
						if (itemCriteria == null) {
176
							itemCriteria = new ItemCriteria();
177
							itemCriteria.setCriteria(gson.toJson(itemCriteriaPayout.getItemCriteria()));
178
							itemCriteriaRepository.persist(itemCriteria);
179
						}
180
						for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
181
							TargetSlab targetSlab1 = new TargetSlab();
182
							targetSlab1.setOfferId(createOfferRequest.getId());
183
							targetSlab1.setOnwardsTarget(targetSlab.getOnwardsAmount());
184
							targetSlab1.setTargetDescription(targetSlab.getTargetDescription());
185
							targetSlab1.setPayoutTarget(payoutSlab.getOnwardsAmount());
186
							targetSlab1.setPayoutValue(payoutSlab.getPayoutAmount());
187
							targetSlab1.setItemCriteriaId(itemCriteria.getId());
188
							targetSlab1.setAmountType(itemCriteriaPayout.getAmountType());
189
							targetSlabRepository.persist(targetSlab1);
190
						}
191
					}
192
				}
193
			}
194
 
195
		} else {
196
			throw new ProfitMandiBusinessException("Invalid Target Slabs", "Invalid Target", "");
197
		}
198
 
199
	}
200
 
201
	@Override
202
	public List<CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, int itemId) {
203
		List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(YearMonth.from(date)).get(fofoId);
204
		List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
205
		if (publishedOffers != null) {
206
			for (Offer offer : publishedOffers) {
28007 amit.gupta 207
				boolean found = false;
27877 amit.gupta 208
				List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = targetSlabRepository
209
						.getByOfferId(offer.getId());
210
				CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
211
				createOfferRequest.setTargetSlabs(targetSlabs);
212
				Set<com.spice.profitmandi.service.offers.ItemCriteria> itemCriteriaSet = targetSlabs.stream()
213
						.flatMap(x -> x.getItemCriteriaPayouts().stream()).map(x -> x.getItemCriteria()).distinct()
214
						.filter(x -> itemRepository.containsItem(x, itemId)).collect(Collectors.toSet());
215
 
216
				for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
217
					targetSlab.setItemCriteriaPayouts(targetSlab.getItemCriteriaPayouts().stream()
218
							.filter(x -> itemCriteriaSet.contains(x.getItemCriteria())).collect(Collectors.toList()));
28007 amit.gupta 219
					if(targetSlab.getItemCriteriaPayouts().size() > 1) {
220
						found = true;
221
					}
27877 amit.gupta 222
				}
28007 amit.gupta 223
				if(found) {
224
					createOfferRequests.add(createOfferRequest);
225
				}
27877 amit.gupta 226
			}
227
		}
28007 amit.gupta 228
 
27877 amit.gupta 229
		return createOfferRequests;
230
	}
231
 
232
}