Subversion Repositories SmartDukaan

Rev

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