Subversion Repositories SmartDukaan

Rev

Rev 29809 | Rev 29855 | 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 {
29839 amit.gupta 177
		CreateOfferRequest createOfferRequest = offerService.getOffer(0, offerId);
27391 tejbeer 178
 
27876 amit.gupta 179
		model.addAttribute("offer", createOfferRequest);
180
		return "offer-details";
27391 tejbeer 181
	}
182
 
27876 amit.gupta 183
	@RequestMapping(value = "/offerDownload", method = RequestMethod.GET)
184
	public ResponseEntity<?> dowloadOfferSummary(HttpServletRequest request, @RequestParam int offerId, Model model)
185
			throws Exception {
186
		List<List<?>> listOfRows = new ArrayList<>();
187
		final HttpHeaders headers = new HttpHeaders();
188
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
189
		headers.set("Content-disposition", "inline; filename=offer-" + offerId + ".csv");
29785 amit.gupta 190
		CreateOfferRequest createOfferRequest = offerService.getOffer(0, offerId);
27876 amit.gupta 191
		Collection<OfferRowModel> offerRowModels = offerRepository.getOfferRows(createOfferRequest);
27391 tejbeer 192
 
27876 amit.gupta 193
		for (OfferRowModel offerRowModel : offerRowModels) {
194
			CustomRetailer customRetailer = retailerService.getFofoRetailer(offerRowModel.getFofoId());
195
			listOfRows.add(Arrays.asList(createOfferRequest.getId(), createOfferRequest.getName(),
196
					createOfferRequest.getTargetType(), createOfferRequest.getSchemeType(),
197
					createOfferRequest.getBrandShareTerms(), createOfferRequest.getSellinPercentage(),
198
					createOfferRequest.getPartnerCriteriaString(), createOfferRequest.getItemCriteriaString(),
199
					createOfferRequest.getStartDate(), createOfferRequest.getEndDate(),
200
					createOfferRequest.getCreatedOn(), customRetailer.getPartnerId(), customRetailer.getBusinessName(),
201
					customRetailer.getCode(), offerRowModel.getTotalSale(), offerRowModel.getEligibleSale(),
202
					offerRowModel.getAchievedTarget(), offerRowModel.getNextTarget(), offerRowModel.getEligibleSaleDp(),
203
					offerRowModel.getTotalPurchaseValue(), offerRowModel.getCurrentPayoutTarget(),
204
					offerRowModel.getPayoutTargetAchieved(), offerRowModel.getAmountType(),
205
					offerRowModel.getPayoutValue(), offerRowModel.getPayoutValueDp(), offerRowModel.getFinalPayout(),
206
					String.join(", ", offerRowModel.getPendingImeis())));
27391 tejbeer 207
		}
27876 amit.gupta 208
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
209
				Arrays.asList("Id", "Name", "Target Type", "Scheme Type", "Brand %", "Sellin %", "Partner Criteria",
210
						"Item Criteria", "Start", "End", "Created", "Partner Id", "Partner Name", "Partner Code",
211
						"Total Sale", "Eligible Sale", "Achieved Target", "Next Target", "Eligible Sale DP",
212
						"Total Purchase DP", "Current Payout Target", "Payout Target Achieved", "Payout Amount Type",
213
						"Payout Value", "Payout Value DP", "Amount to be credited", "IMEIs pending for Activation"
214
				// "Payout Sale Qty", "Activated Value", "Activated Qty",
215
				), listOfRows);
216
		final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
217
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
218
		return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
27391 tejbeer 219
	}
27876 amit.gupta 220
 
221
	@RequestMapping(value = "/offerById", method = RequestMethod.GET)
222
	public String offerById(HttpServletRequest request, int offerId, Model model) throws ProfitMandiBusinessException {
27391 tejbeer 223
		Offer offer = offerRepository.selectById(offerId);
224
 
225
		model.addAttribute("offer", offer);
226
 
27876 amit.gupta 227
		return "offer-edit";
27391 tejbeer 228
 
229
	}
29675 amit.gupta 230
 
231
	@RequestMapping(value = "/published-offers/{yearMonth}", method = RequestMethod.GET)
29677 amit.gupta 232
	public String publishedOffersOnMonthBefore(HttpServletRequest request, @PathVariable int yearMonth, Model model) throws ProfitMandiBusinessException {
29675 amit.gupta 233
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
234
		int fofoId = loginDetails.getFofoId();
29677 amit.gupta 235
		List<CreateOfferRequest> createOffers = offerService.getPublishedOffers(fofoId, YearMonth.from(LocalDate.now()).minusMonths(yearMonth));
29675 amit.gupta 236
 
237
		model.addAttribute("publishedOffers", createOffers);
238
 
29785 amit.gupta 239
 
240
 
29675 amit.gupta 241
		return "published-offers";
242
	}
29682 amit.gupta 243
 
244
	@PostMapping(value = "/offers/upload")
245
	public String uploadOffers(HttpServletRequest request, @RequestPart("file") MultipartFile targetFile, Model model)
246
			throws Exception {
247
		offerService.createOffers(targetFile.getInputStream());
248
		model.addAttribute("response", true);
249
		return "response";
250
	}
29785 amit.gupta 251
 
252
	@Autowired
253
	RoleManager roleManager;
27391 tejbeer 254
 
27876 amit.gupta 255
	@RequestMapping(value = "/getOfferMargins", method = RequestMethod.GET)
256
	public String getOfferMargins(HttpServletRequest request,
257
			@RequestParam(name = "offerId", defaultValue = "0") int offerId, Model model) throws Exception {
258
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29785 amit.gupta 259
		boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
260
		CreateOfferRequest createOfferRequest = offerService.getOffer(isAdmin?0:loginDetails.getFofoId(), offerId);
261
 
27876 amit.gupta 262
		model.addAttribute("offer", createOfferRequest);
27391 tejbeer 263
 
27876 amit.gupta 264
		return "offer_margin_detail_partner";
27391 tejbeer 265
 
266
	}
267
 
27895 amit.gupta 268
}