Subversion Repositories SmartDukaan

Rev

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