Subversion Repositories SmartDukaan

Rev

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