Subversion Repositories SmartDukaan

Rev

Rev 27391 | Rev 27895 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
27391 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
27876 amit.gupta 3
import java.io.ByteArrayInputStream;
4
import java.io.InputStream;
5
import java.time.LocalDate;
27391 tejbeer 6
import java.time.LocalDateTime;
27876 amit.gupta 7
import java.time.YearMonth;
8
import java.time.temporal.ChronoField;
27391 tejbeer 9
import java.util.ArrayList;
27876 amit.gupta 10
import java.util.Arrays;
11
import java.util.Collection;
12
import java.util.Comparator;
27391 tejbeer 13
import java.util.List;
14
import java.util.Map;
15
import java.util.Set;
16
import java.util.stream.Collectors;
17
 
18
import javax.servlet.http.HttpServletRequest;
19
import javax.transaction.Transactional;
20
 
27876 amit.gupta 21
import org.apache.commons.io.output.ByteArrayOutputStream;
27391 tejbeer 22
import org.apache.logging.log4j.LogManager;
23
import org.apache.logging.log4j.Logger;
24
import org.springframework.beans.factory.annotation.Autowired;
27876 amit.gupta 25
import org.springframework.core.io.InputStreamResource;
26
import org.springframework.http.HttpHeaders;
27
import org.springframework.http.HttpStatus;
28
import org.springframework.http.ResponseEntity;
27391 tejbeer 29
import org.springframework.stereotype.Controller;
30
import org.springframework.ui.Model;
27876 amit.gupta 31
import org.springframework.web.bind.annotation.PathVariable;
27391 tejbeer 32
import org.springframework.web.bind.annotation.RequestBody;
33
import org.springframework.web.bind.annotation.RequestMapping;
34
import org.springframework.web.bind.annotation.RequestMethod;
35
import org.springframework.web.bind.annotation.RequestParam;
36
 
37
import com.google.gson.Gson;
38
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
39
import com.spice.profitmandi.common.model.CustomRetailer;
27876 amit.gupta 40
import com.spice.profitmandi.common.model.ProfitMandiConstants;
41
import com.spice.profitmandi.common.util.FileUtil;
42
import com.spice.profitmandi.common.web.util.ResponseSender;
27391 tejbeer 43
import com.spice.profitmandi.dao.entity.catalog.Offer;
44
import com.spice.profitmandi.dao.entity.fofo.PartnerType;
45
import com.spice.profitmandi.dao.enumuration.catalog.ItemCriteriaType;
46
import com.spice.profitmandi.dao.model.CreateOfferRequest;
27876 amit.gupta 47
import com.spice.profitmandi.dao.model.OfferRowModel;
27391 tejbeer 48
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
49
import com.spice.profitmandi.dao.repository.catalog.OfferMarginRepository;
50
import com.spice.profitmandi.dao.repository.catalog.OfferPartnerRepository;
51
import com.spice.profitmandi.dao.repository.catalog.OfferRepository;
52
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
53
import com.spice.profitmandi.dao.repository.dtr.Mongo;
54
import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;
27876 amit.gupta 55
import com.spice.profitmandi.service.offers.OfferService;
27391 tejbeer 56
import com.spice.profitmandi.service.user.RetailerService;
57
import com.spice.profitmandi.web.model.LoginDetails;
58
import com.spice.profitmandi.web.util.CookiesProcessor;
59
import com.spice.profitmandi.web.util.MVCResponseSender;
60
 
61
@Controller
62
@Transactional(rollbackOn = Throwable.class)
63
public class OfferController {
64
	private static final Logger LOGGER = LogManager.getLogger(OfferController.class);
65
	@Autowired
66
	private OfferRepository offerRepository;
67
 
68
	@Autowired
69
	private OfferMarginRepository offerMarginRepository;
70
 
71
	@Autowired
72
	private FofoStoreRepository fofoStoreRepository;
73
 
74
	@Autowired
27876 amit.gupta 75
	private ResponseSender responseSender;
76
 
77
	@Autowired
27391 tejbeer 78
	private OfferPartnerRepository offerPartnerRepository;
79
 
80
	@Autowired
81
	private ItemRepository itemRepository;
82
 
83
	@Autowired
84
	private MVCResponseSender mvcResponseSender;
85
 
86
	@Autowired
87
	private Gson gson;
88
 
89
	@Autowired
90
	private RetailerService retailerService;
91
 
92
	@Autowired
93
	private Mongo mongoClient;
94
 
95
	@Autowired
96
	private CookiesProcessor cookiesProcessor;
97
 
98
	@Autowired
27876 amit.gupta 99
	private OfferService offerService;
100
 
101
	@Autowired
27391 tejbeer 102
	private PartnerTypeChangeService partnerTypeChangeService;
103
 
104
	@RequestMapping(value = "/getCreateOffer", method = RequestMethod.GET)
105
	public String getCreateOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
106
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
107
		List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
108
				.collect(Collectors.toList());
109
 
27876 amit.gupta 110
		Set<String> brands = mongoClient.getMongoBrands(loginDetails.getFofoId(), null, 3).stream()
111
				.map(x -> (String) x.get("name")).collect(Collectors.toSet());
112
		brands.add("Vivo");
27391 tejbeer 113
 
114
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(fofoIds);
115
 
116
		model.addAttribute("customRetailersMap", customRetailersMap);
117
		model.addAttribute("itemCriteriaType", ItemCriteriaType.values());
118
		model.addAttribute("brands", brands);
119
		model.addAttribute("partnerCategories", PartnerType.values());
27876 amit.gupta 120
		model.addAttribute("warehouseRegion", ProfitMandiConstants.WAREHOUSE_MAP);
27391 tejbeer 121
		return "scheme_offer";
122
 
123
	}
124
 
125
	@RequestMapping(value = "/createOffer", method = RequestMethod.POST)
126
	public String createOffer(HttpServletRequest request, @RequestBody CreateOfferRequest createOfferRequest,
127
			Model model) throws Exception {
27876 amit.gupta 128
		LOGGER.info("createOfferRequest [{}]", createOfferRequest);
129
		offerService.addOfferService(createOfferRequest);
27391 tejbeer 130
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
131
		return "response";
132
 
133
	}
134
 
27876 amit.gupta 135
	@RequestMapping(value = "/offers/published", method = RequestMethod.GET)
136
	public String getPublishedOffers(HttpServletRequest request, @RequestParam int fofoId, Model model)
27391 tejbeer 137
			throws Exception {
27876 amit.gupta 138
		LOGGER.info("Published");
139
		offerService.getPublishedOffers(fofoId, YearMonth.from(LocalDateTime.now()));
140
		return "scheme_offer/published";
27391 tejbeer 141
 
27876 amit.gupta 142
	}
27391 tejbeer 143
 
27876 amit.gupta 144
	@RequestMapping(value = "/offer/active/{offerId}", method = RequestMethod.GET)
145
	public String activateOffer(HttpServletRequest request, @PathVariable int offerId, Model model)
146
			throws ProfitMandiBusinessException, Exception {
147
		Offer offer = offerRepository.selectById(offerId);
148
		offer.setActive(true);
149
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
150
		return "response";
151
	}
27391 tejbeer 152
 
27876 amit.gupta 153
	@RequestMapping(value = "/offerHistory", method = RequestMethod.GET)
154
	public String getPaginatedOffers(HttpServletRequest request, @RequestParam YearMonth yearMonth, Model model)
155
			throws ProfitMandiBusinessException {
27391 tejbeer 156
 
27876 amit.gupta 157
		List<CreateOfferRequest> publishedOffers = offerService.getAllOffers(yearMonth);
158
		model.addAttribute("offers", publishedOffers);
159
		model.addAttribute("yearMonth", yearMonth);
27391 tejbeer 160
 
161
		return "offer_history";
162
	}
163
 
27876 amit.gupta 164
	@RequestMapping(value = "/offer-details", method = RequestMethod.GET)
165
	public String schemeDetails(HttpServletRequest request, @RequestParam int offerId, Model model)
27391 tejbeer 166
			throws ProfitMandiBusinessException {
27876 amit.gupta 167
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
27391 tejbeer 168
 
27876 amit.gupta 169
		CreateOfferRequest createOfferRequest = offerService.getOffer(offerId);
170
		int fofoId = loginDetails.getFofoId();
171
		double amount = offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId) == null ? 0
172
				: offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId);
27391 tejbeer 173
 
27876 amit.gupta 174
		com.spice.profitmandi.dao.model.TargetSlab currentSlab = createOfferRequest.getTargetSlabs().stream()
175
				.filter(x -> x.getOnwardsAmount() <= amount).max(Comparator.comparing(x -> x.getOnwardsAmount()))
176
				.orElse(null);
27391 tejbeer 177
 
27876 amit.gupta 178
		com.spice.profitmandi.dao.model.TargetSlab nextSlab = createOfferRequest.getTargetSlabs().stream()
179
				.filter(x -> x.getOnwardsAmount() > amount).min(Comparator.comparing(x -> x.getOnwardsAmount()))
180
				.orElse(null);
181
		createOfferRequest.setNextTargetSlab(nextSlab);
182
		createOfferRequest.setCurrentTargetSlab(currentSlab);
183
		createOfferRequest.setEligibleSale((int) amount);
27391 tejbeer 184
 
27876 amit.gupta 185
		model.addAttribute("offer", createOfferRequest);
186
		return "offer-details";
27391 tejbeer 187
	}
188
 
27876 amit.gupta 189
	@RequestMapping(value = "/offerDownload", method = RequestMethod.GET)
190
	public ResponseEntity<?> dowloadOfferSummary(HttpServletRequest request, @RequestParam int offerId, Model model)
191
			throws Exception {
192
		List<List<?>> listOfRows = new ArrayList<>();
193
		final HttpHeaders headers = new HttpHeaders();
194
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
195
		headers.set("Content-disposition", "inline; filename=offer-" + offerId + ".csv");
196
		CreateOfferRequest createOfferRequest = offerService.getOffer(offerId);
197
		Collection<OfferRowModel> offerRowModels = offerRepository.getOfferRows(createOfferRequest);
27391 tejbeer 198
 
27876 amit.gupta 199
		for (OfferRowModel offerRowModel : offerRowModels) {
200
			CustomRetailer customRetailer = retailerService.getFofoRetailer(offerRowModel.getFofoId());
201
			listOfRows.add(Arrays.asList(createOfferRequest.getId(), createOfferRequest.getName(),
202
					createOfferRequest.getTargetType(), createOfferRequest.getSchemeType(),
203
					createOfferRequest.getBrandShareTerms(), createOfferRequest.getSellinPercentage(),
204
					createOfferRequest.getPartnerCriteriaString(), createOfferRequest.getItemCriteriaString(),
205
					createOfferRequest.getStartDate(), createOfferRequest.getEndDate(),
206
					createOfferRequest.getCreatedOn(), customRetailer.getPartnerId(), customRetailer.getBusinessName(),
207
					customRetailer.getCode(), offerRowModel.getTotalSale(), offerRowModel.getEligibleSale(),
208
					offerRowModel.getAchievedTarget(), offerRowModel.getNextTarget(), offerRowModel.getEligibleSaleDp(),
209
					offerRowModel.getTotalPurchaseValue(), offerRowModel.getCurrentPayoutTarget(),
210
					offerRowModel.getPayoutTargetAchieved(), offerRowModel.getAmountType(),
211
					offerRowModel.getPayoutValue(), offerRowModel.getPayoutValueDp(), offerRowModel.getFinalPayout(),
212
					String.join(", ", offerRowModel.getPendingImeis())));
27391 tejbeer 213
		}
27876 amit.gupta 214
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
215
				Arrays.asList("Id", "Name", "Target Type", "Scheme Type", "Brand %", "Sellin %", "Partner Criteria",
216
						"Item Criteria", "Start", "End", "Created", "Partner Id", "Partner Name", "Partner Code",
217
						"Total Sale", "Eligible Sale", "Achieved Target", "Next Target", "Eligible Sale DP",
218
						"Total Purchase DP", "Current Payout Target", "Payout Target Achieved", "Payout Amount Type",
219
						"Payout Value", "Payout Value DP", "Amount to be credited", "IMEIs pending for Activation"
220
				// "Payout Sale Qty", "Activated Value", "Activated Qty",
221
				), listOfRows);
222
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
223
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
224
		return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
27391 tejbeer 225
	}
27876 amit.gupta 226
 
227
	@RequestMapping(value = "/offerById", method = RequestMethod.GET)
228
	public String offerById(HttpServletRequest request, int offerId, Model model) throws ProfitMandiBusinessException {
27391 tejbeer 229
		Offer offer = offerRepository.selectById(offerId);
230
 
231
		model.addAttribute("offer", offer);
232
 
27876 amit.gupta 233
		return "offer-edit";
27391 tejbeer 234
 
235
	}
236
 
27876 amit.gupta 237
	@RequestMapping(value = "/getOfferMargins", method = RequestMethod.GET)
238
	public String getOfferMargins(HttpServletRequest request,
239
			@RequestParam(name = "offerId", defaultValue = "0") int offerId, Model model) throws Exception {
27391 tejbeer 240
		Offer offer = offerRepository.selectById(offerId);
241
 
27876 amit.gupta 242
		LOGGER.info("offerId" + offer.getId());
27391 tejbeer 243
 
27876 amit.gupta 244
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
27391 tejbeer 245
 
27876 amit.gupta 246
		CreateOfferRequest createOfferRequest = offerService.getOffer(offerId);
247
		int fofoId = loginDetails.getFofoId();
248
		double amount = offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId) == null ? 0
249
				: offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId);
27391 tejbeer 250
 
27876 amit.gupta 251
		com.spice.profitmandi.dao.model.TargetSlab currentSlab = createOfferRequest.getTargetSlabs().stream()
252
				.filter(x -> x.getOnwardsAmount() <= amount).max(Comparator.comparing(x -> x.getOnwardsAmount()))
253
				.orElse(null);
27391 tejbeer 254
 
27876 amit.gupta 255
		com.spice.profitmandi.dao.model.TargetSlab nextSlab = createOfferRequest.getTargetSlabs().stream()
256
				.filter(x -> x.getOnwardsAmount() > amount).min(Comparator.comparing(x -> x.getOnwardsAmount()))
257
				.orElse(null);
258
		createOfferRequest.setNextTargetSlab(nextSlab);
259
		createOfferRequest.setCurrentTargetSlab(currentSlab);
260
		createOfferRequest.setEligibleSale((int) amount);
261
		model.addAttribute("offer", createOfferRequest);
27391 tejbeer 262
 
27876 amit.gupta 263
		return "offer_margin_detail_partner";
27391 tejbeer 264
 
265
	}
266
 
267
}