Subversion Repositories SmartDukaan

Rev

Rev 27876 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
27391 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
3
import java.time.LocalDateTime;
4
import java.util.ArrayList;
5
import java.util.HashMap;
6
import java.util.HashSet;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.Set;
10
import java.util.stream.Collectors;
11
 
12
import javax.servlet.http.HttpServletRequest;
13
import javax.transaction.Transactional;
14
 
15
import org.apache.logging.log4j.LogManager;
16
import org.apache.logging.log4j.Logger;
17
import org.springframework.beans.factory.annotation.Autowired;
18
import org.springframework.stereotype.Controller;
19
import org.springframework.ui.Model;
20
import org.springframework.web.bind.annotation.RequestBody;
21
import org.springframework.web.bind.annotation.RequestMapping;
22
import org.springframework.web.bind.annotation.RequestMethod;
23
import org.springframework.web.bind.annotation.RequestParam;
24
 
25
import com.google.gson.Gson;
26
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
27
import com.spice.profitmandi.common.model.CustomRetailer;
28
import com.spice.profitmandi.dao.entity.catalog.Item;
29
import com.spice.profitmandi.dao.entity.catalog.Offer;
30
import com.spice.profitmandi.dao.entity.catalog.OfferPartner;
31
import com.spice.profitmandi.dao.entity.catalog.Offermargin;
32
import com.spice.profitmandi.dao.entity.fofo.PartnerType;
33
import com.spice.profitmandi.dao.enumuration.catalog.ItemCriteriaType;
34
import com.spice.profitmandi.dao.model.AmountMarginModel;
35
import com.spice.profitmandi.dao.model.CreateOfferRequest;
36
import com.spice.profitmandi.dao.model.ItemTypeParams;
37
import com.spice.profitmandi.dao.model.SimpleItemType;
38
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
39
import com.spice.profitmandi.dao.repository.catalog.OfferMarginRepository;
40
import com.spice.profitmandi.dao.repository.catalog.OfferPartnerRepository;
41
import com.spice.profitmandi.dao.repository.catalog.OfferRepository;
42
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
43
import com.spice.profitmandi.dao.repository.dtr.Mongo;
44
import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;
45
import com.spice.profitmandi.service.user.RetailerService;
46
import com.spice.profitmandi.web.model.LoginDetails;
47
import com.spice.profitmandi.web.util.CookiesProcessor;
48
import com.spice.profitmandi.web.util.MVCResponseSender;
49
 
50
@Controller
51
@Transactional(rollbackOn = Throwable.class)
52
public class OfferController {
53
	private static final Logger LOGGER = LogManager.getLogger(OfferController.class);
54
	@Autowired
55
	private OfferRepository offerRepository;
56
 
57
	@Autowired
58
	private OfferMarginRepository offerMarginRepository;
59
 
60
	@Autowired
61
	private FofoStoreRepository fofoStoreRepository;
62
 
63
	@Autowired
64
	private OfferPartnerRepository offerPartnerRepository;
65
 
66
	@Autowired
67
	private ItemRepository itemRepository;
68
 
69
	@Autowired
70
	private MVCResponseSender mvcResponseSender;
71
 
72
	@Autowired
73
	private Gson gson;
74
 
75
	@Autowired
76
	private RetailerService retailerService;
77
 
78
	@Autowired
79
	private Mongo mongoClient;
80
 
81
	@Autowired
82
	private CookiesProcessor cookiesProcessor;
83
 
84
	@Autowired
85
	private PartnerTypeChangeService partnerTypeChangeService;
86
 
87
	@RequestMapping(value = "/getCreateOffer", method = RequestMethod.GET)
88
	public String getCreateOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
89
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
90
		List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
91
				.collect(Collectors.toList());
92
 
93
		List<String> brands = mongoClient.getMongoBrands(loginDetails.getFofoId(), null, 3).stream()
94
				.map(x -> (String) x.get("name")).collect(Collectors.toList());
95
 
96
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(fofoIds);
97
 
98
		model.addAttribute("customRetailersMap", customRetailersMap);
99
		model.addAttribute("itemCriteriaType", ItemCriteriaType.values());
100
		model.addAttribute("brands", brands);
101
		model.addAttribute("partnerCategories", PartnerType.values());
102
		return "scheme_offer";
103
 
104
	}
105
 
106
	@RequestMapping(value = "/createOffer", method = RequestMethod.POST)
107
	public String createOffer(HttpServletRequest request, @RequestBody CreateOfferRequest createOfferRequest,
108
			Model model) throws Exception {
109
		LOGGER.info("createOfferRequest" + createOfferRequest.getAmountOffer());
110
 
111
		Offer offer = new Offer();
112
		offer.setName(createOfferRequest.getName());
113
		offer.setDescription(createOfferRequest.getDescription());
114
		offer.setItemCreteria(createOfferRequest.getItemCriteria());
115
		offer.setTargetType(createOfferRequest.getTargetType());
116
		offer.setAmountType(createOfferRequest.getAmountType());
117
		offer.setStartDateTime(createOfferRequest.getStartDate());
118
		offer.setEndDateTime(createOfferRequest.getEndDate());
119
		offer.setPrice(createOfferRequest.getPrice());
120
		offer.setCreatedTimestamp(LocalDateTime.now());
121
		offer.setSchemeType(createOfferRequest.getSchemeType());
122
		offer.setCriteria(createOfferRequest.getCriteria());
123
		offer.setPartnerType(createOfferRequest.getPartnerType());
124
 
125
		if (createOfferRequest.getItemCriteria().equals(ItemCriteriaType.Item_Model)) {
126
			ItemTypeParams itemTypeParams = new ItemTypeParams();
127
			itemTypeParams.setCatalogId(createOfferRequest.getCatalogIds());
128
			SimpleItemType sit = new SimpleItemType(itemTypeParams);
129
			sit.setItemTypeParams(itemTypeParams);
130
			offer.setItemParam(gson.toJson(itemTypeParams));
131
		} else if (createOfferRequest.getItemCriteria().equals(ItemCriteriaType.Multiple_Brand)) {
132
			ItemTypeParams itemTypeParams = new ItemTypeParams();
133
			itemTypeParams.setBrands(createOfferRequest.getBrands());
134
			SimpleItemType sit = new SimpleItemType(itemTypeParams);
135
			sit.setItemTypeParams(itemTypeParams);
136
			offer.setItemParam(gson.toJson(itemTypeParams));
137
		}
138
 
139
		offerRepository.persist(offer);
140
		if (createOfferRequest.getFofoIds().isEmpty()) {
141
			List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
142
					.collect(Collectors.toList());
143
			for (Integer fofoId : fofoIds) {
144
				PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(fofoId,
145
						offer.getStartDateTime().toLocalDate());
146
				if (offer.getPartnerType().equals(partnerType)) {
147
					LOGGER.info("partnerType" + partnerType);
148
					LOGGER.info("fofoId" + fofoId);
149
 
150
					OfferPartner op = new OfferPartner();
151
					op.setFofoId(fofoId);
152
					op.setOfferId(offer.getId());
153
					offerPartnerRepository.persist(op);
154
				}
155
 
156
			}
157
		}
158
 
159
		else {
160
 
161
			for (Integer fofoId : createOfferRequest.getFofoIds()) {
162
				OfferPartner op = new OfferPartner();
163
				op.setFofoId(fofoId);
164
				op.setOfferId(offer.getId());
165
				offerPartnerRepository.persist(op);
166
			}
167
		}
168
		for (AmountMarginModel amm : createOfferRequest.getAmountOffer()) {
169
			Offermargin om = new Offermargin();
170
			om.setValue(amm.getValue());
171
			om.setMargin(amm.getMargin());
172
			om.setOfferId(offer.getId());
173
			offerMarginRepository.persist(om);
174
		}
175
 
176
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
177
		return "response";
178
 
179
	}
180
 
181
	@RequestMapping(value = "/getOffers", method = RequestMethod.GET)
182
	public String createOffer(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset,
183
			@RequestParam(name = "limit", defaultValue = "10") int limit,
184
			@RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model)
185
			throws Exception {
186
 
187
		List<Offer> offers = null;
188
		long size = 0;
189
 
190
		offers = offerRepository.selectAll(offset, limit);
191
		size = offerRepository.selectAllCount();
192
 
193
		model.addAttribute("offers", offers);
194
		model.addAttribute("start", offset + 1);
195
		model.addAttribute("size", size);
196
		model.addAttribute("searchTerm", searchTerm);
197
 
198
		if (offers.size() < limit) {
199
			model.addAttribute("end", offset + offers.size());
200
		} else {
201
			model.addAttribute("end", offset + limit);
202
		}
203
 
204
		return "offer_history";
205
 
206
	}
207
 
208
	@RequestMapping(value = "/getPaginatedOffers", method = RequestMethod.GET)
209
	public String getPaginatedOffers(HttpServletRequest request,
210
			@RequestParam(name = "offset", defaultValue = "0") int offset,
211
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
212
			throws ProfitMandiBusinessException {
213
 
214
		List<Offer> offers = null;
215
		offers = offerRepository.selectAll(offset, limit);
216
		model.addAttribute("offers", offers);
217
 
218
		return "offer_history_paginated";
219
	}
220
 
221
	@RequestMapping(value = "/searchOffer")
222
	public String getOfferById(HttpServletRequest request,
223
			@RequestParam(name = "offset", defaultValue = "0") int offset,
224
			@RequestParam(name = "limit", defaultValue = "10") int limit,
225
			@RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model)
226
			throws ProfitMandiBusinessException {
227
		List<Offer> offers = null;
228
		long size = 0;
229
		if (!(searchTerm.equals(""))) {
230
			offers = offerRepository.selectBySearchTerm(searchTerm, offset, limit);
231
			if (!(offers.size() == 0)) {
232
				size = offerRepository.selectAllCount();
233
				LOGGER.info("offers" + offers);
234
				model.addAttribute("offers", offers);
235
				model.addAttribute("start", offset + 1);
236
				model.addAttribute("size", size);
237
				model.addAttribute("searchTerm", searchTerm);
238
				if (offers.size() < limit) {
239
					model.addAttribute("end", offset + offers.size());
240
				} else {
241
					model.addAttribute("end", offset + limit);
242
				}
243
			} else {
244
				throw new ProfitMandiBusinessException("OfferId", searchTerm, "offerId Not Found");
245
			}
246
		} else {
247
 
248
			offers = offerRepository.selectAll(offset, limit);
249
			size = offerRepository.selectAllCount();
250
 
251
			model.addAttribute("offers", offers);
252
			model.addAttribute("start", offset + 1);
253
			model.addAttribute("size", size);
254
			model.addAttribute("searchTerm", searchTerm);
255
 
256
			if (offers.size() < limit) {
257
				model.addAttribute("end", offset + offers.size());
258
			} else {
259
				model.addAttribute("end", offset + limit);
260
			}
261
		}
262
		return "offer_history";
263
	}
264
 
265
	@RequestMapping(value = "/updateOfferStatus", method = RequestMethod.POST)
266
	public String updateOfferStatus(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
267
 
268
		Offer offer = offerRepository.selectById(id);
269
		LOGGER.info("status" + offer.getStatus());
270
 
271
		if (offer.getStatus() == false) {
272
			offer.setStatus(true);
273
		} else {
274
			offer.setStatus(false);
275
		}
276
		offer.setCreatedTimestamp(LocalDateTime.now());
277
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
278
		return "response";
279
 
280
	}
281
 
282
	@RequestMapping(value = "/getOfferMargin", method = RequestMethod.GET)
283
	public String getOfferMargin(HttpServletRequest request,
284
			@RequestParam(name = "offerId", defaultValue = "0") int offerId, Model model) throws Exception {
285
		Offer offer = offerRepository.selectById(offerId);
286
		List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
287
				.collect(Collectors.toList());
288
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(fofoIds);
289
		List<OfferPartner> offerPartners = offerPartnerRepository.selectByOfferId(offerId);
290
 
291
		LOGGER.info("offerId" + offer.getId());
292
 
293
		Map<Integer, Double> value = offerRepository.selectSumOfferByRetailer(offer.getStartDateTime(),
294
				offer.getEndDateTime(), 0, offer, true);
295
 
296
		LOGGER.info("value" + value);
297
		List<Offermargin> offerMargin = offerMarginRepository.selectByOfferId(offerId);
298
		Map<Integer, Double> partnerValueMap = new HashMap<>();
299
		Map<Integer, List<Double>> partnerMarginMap = new HashMap<Integer, List<Double>>();
300
		Map<Integer, Integer> shortageAmount = new HashMap<>();
301
 
302
		for (OfferPartner op : offerPartners) {
303
 
304
			LOGGER.info("offerPartneer" + op.getFofoId());
305
			if (value.containsKey(op.getFofoId())) {
306
				partnerValueMap.put(op.getFofoId(), value.get(op.getFofoId()));
307
 
308
			} else {
309
				value.put(op.getFofoId(), 0d);
310
 
311
				partnerValueMap.put(op.getFofoId(), 0d);
312
 
313
			}
314
			List<Double> valSetOne = new ArrayList<Double>();
315
 
316
			for (Offermargin om : offerMargin) {
317
 
318
				if (value.get(op.getFofoId()) <= om.getValue()) {
319
					LOGGER.info("om1" + om.getMargin());
320
					shortageAmount.put(op.getFofoId(), om.getValue() - value.get(op.getFofoId()).intValue());
321
					valSetOne.add(om.getMargin());
322
					partnerMarginMap.put(op.getFofoId(), valSetOne);
323
 
324
					break;
325
				} else {
326
					LOGGER.info("om2" + om.getMargin());
327
					valSetOne.add(om.getMargin());
328
 
329
					int shortage = om.getValue() - value.get(op.getFofoId()).intValue();
330
 
331
					if (shortage < 0) {
332
						shortageAmount.put(op.getFofoId(), 0);
333
					}
334
 
335
					partnerMarginMap.put(op.getFofoId(), valSetOne);
336
 
337
				}
338
			}
339
 
340
		}
341
 
342
		LOGGER.info("partnerMarginMap" + partnerMarginMap);
343
		LOGGER.info("partnerValueMap" + partnerValueMap);
344
		LOGGER.info("shortageAmount" + shortageAmount);
345
 
346
		ItemTypeParams scp = gson.fromJson(offer.getItemParam(), ItemTypeParams.class);
347
		if (offer.getItemCriteria().equals(ItemCriteriaType.Multiple_Brand)) {
348
			List<String> brands = scp.getBrands();
349
			model.addAttribute("brands", brands);
350
		}
351
		if (offer.getItemCriteria().equals(ItemCriteriaType.Item_Model)) {
352
			List<Integer> catalogIds = scp.getCatalogId();
353
			List<Item> newList = new ArrayList<>();
354
			Set<Integer> catalogId = new HashSet<>();
355
			List<Item> items = itemRepository.selectAllByCatalogIds(catalogIds.stream().collect(Collectors.toSet()));
356
			for (Item item : items) {
357
				if (catalogId.add(item.getCatalogItemId())) {
358
					newList.add(item);
359
				}
360
			}
361
			model.addAttribute("items", newList);
362
		}
363
		model.addAttribute("partnerMarginMap", partnerMarginMap);
364
		model.addAttribute("partnerValueMap", partnerValueMap);
365
		model.addAttribute("customRetailersMap", customRetailersMap);
366
		model.addAttribute("offerMargin", offerMargin);
367
		model.addAttribute("offer", offer);
368
		model.addAttribute("shortageAmount", shortageAmount);
369
 
370
		return "offer_margin_detail";
371
 
372
	}
373
 
374
	@RequestMapping(value = "/offerById", method = RequestMethod.GET)
375
	public String offerById(HttpServletRequest request, int offerId, Model model) throws ProfitMandiBusinessException {
376
		Offer offer = offerRepository.selectById(offerId);
377
 
378
		model.addAttribute("offer", offer);
379
 
380
		return "offer-edit";
381
 
382
	}
383
 
384
	@RequestMapping(value = "/extendByOfferId", method = RequestMethod.POST)
385
	public String extendByOfferId(HttpServletRequest request,
386
 
387
			int offerId, @RequestBody LocalDateTime extendDatetime, Model model) throws Exception {
388
 
389
		LOGGER.info("ExtendDatetime" + extendDatetime);
390
		LOGGER.info("schemeId" + offerId);
391
		Offer offer = offerRepository.selectById(offerId);
392
 
393
		offer.setEndDateTime(extendDatetime);
394
		offerRepository.persist(offer);
395
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
396
		return "response";
397
	}
398
 
399
}