Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
21615 kshitij.so 1
package com.spice.profitmandi.web.controller;
2
 
25221 amit.gupta 3
import java.text.DecimalFormat;
24288 amit.gupta 4
import java.time.LocalDate;
24276 amit.gupta 5
import java.time.LocalDateTime;
24880 govind 6
import java.time.LocalTime;
24339 amit.gupta 7
import java.util.ArrayList;
25136 amit.gupta 8
import java.util.LinkedHashMap;
23884 amit.gupta 9
import java.util.List;
24880 govind 10
import java.util.Map;
11
import java.util.stream.Collectors;
23568 govind 12
 
22086 amit.gupta 13
import javax.servlet.http.HttpServletRequest;
25221 amit.gupta 14
import javax.transaction.Transactional;
22086 amit.gupta 15
 
23786 amit.gupta 16
import org.apache.logging.log4j.LogManager;
23568 govind 17
import org.apache.logging.log4j.Logger;
22481 ashik.ali 18
import org.springframework.beans.factory.annotation.Autowired;
23379 ashik.ali 19
import org.springframework.beans.factory.annotation.Value;
21615 kshitij.so 20
import org.springframework.stereotype.Controller;
22073 ashik.ali 21
import org.springframework.ui.Model;
21615 kshitij.so 22
import org.springframework.web.bind.annotation.RequestMapping;
23
import org.springframework.web.bind.annotation.RequestMethod;
24
 
24996 amit.gupta 25
import com.mongodb.DBObject;
22481 ashik.ali 26
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
24996 amit.gupta 27
import com.spice.profitmandi.common.model.BrandStockPrice;
24203 amit.gupta 28
import com.spice.profitmandi.common.model.ProfitMandiConstants;
24880 govind 29
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
22654 ashik.ali 30
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
25640 tejbeer 31
import com.spice.profitmandi.dao.entity.fofo.HygieneData;
24288 amit.gupta 32
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
25214 amit.gupta 33
import com.spice.profitmandi.dao.entity.fofo.PartnerTarget;
34
import com.spice.profitmandi.dao.entity.fofo.PartnerTargetDetails;
25566 tejbeer 35
import com.spice.profitmandi.dao.entity.fofo.PartnerType;
24880 govind 36
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
22481 ashik.ali 37
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
24880 govind 38
import com.spice.profitmandi.dao.repository.dtr.InsurancePolicyRepository;
39
import com.spice.profitmandi.dao.repository.dtr.InsuranceProviderRepository;
24996 amit.gupta 40
import com.spice.profitmandi.dao.repository.dtr.Mongo;
24098 tejbeer 41
import com.spice.profitmandi.dao.repository.dtr.NotificationPanelRepository;
24880 govind 42
import com.spice.profitmandi.dao.repository.dtr.RechargeTransactionRepository;
24203 amit.gupta 43
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
24880 govind 44
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
25640 tejbeer 45
import com.spice.profitmandi.dao.repository.fofo.HygieneDataRepository;
24288 amit.gupta 46
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
25214 amit.gupta 47
import com.spice.profitmandi.dao.repository.fofo.PartnerTargetRepository;
25566 tejbeer 48
import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;
25214 amit.gupta 49
import com.spice.profitmandi.dao.repository.fofo.TargetSlabRepository;
24336 amit.gupta 50
import com.spice.profitmandi.service.PartnerInvestmentService;
23844 amit.gupta 51
import com.spice.profitmandi.service.authentication.RoleManager;
23884 amit.gupta 52
import com.spice.profitmandi.service.inventory.InventoryService;
25214 amit.gupta 53
import com.spice.profitmandi.service.slab.TargetSlabService;
23884 amit.gupta 54
import com.spice.profitmandi.service.transaction.TransactionService;
22481 ashik.ali 55
import com.spice.profitmandi.web.model.LoginDetails;
56
import com.spice.profitmandi.web.util.CookiesProcessor;
24263 tejbeer 57
import com.spice.profitmandi.web.util.MVCResponseSender;
22481 ashik.ali 58
 
21615 kshitij.so 59
@Controller
25222 amit.gupta 60
@Transactional(rollbackOn = Throwable.class)
21615 kshitij.so 61
public class DashboardController {
23923 amit.gupta 62
 
23379 ashik.ali 63
	@Value("${web.api.host}")
64
	private String webApiHost;
23923 amit.gupta 65
 
24072 amit.gupta 66
	@Value("${web.api.scheme}")
67
	private String webApiScheme;
24288 amit.gupta 68
 
24078 amit.gupta 69
	@Value("${web.api.root}")
70
	private String webApiRoot;
71
 
23379 ashik.ali 72
	@Value("${web.api.port}")
73
	private int webApiPort;
21615 kshitij.so 74
 
22481 ashik.ali 75
	@Autowired
22927 ashik.ali 76
	private CookiesProcessor cookiesProcessor;
23923 amit.gupta 77
 
23568 govind 78
	@Autowired
24880 govind 79
	private ItemRepository itemRepository;
80
 
81
	@Autowired
25214 amit.gupta 82
	private TargetSlabService targetSlabService;
83
 
84
	@Autowired
85
	private PartnerTargetRepository partnerTargetRepository;
86
 
87
	@Autowired
88
	private TargetSlabRepository targetSlabRepository;
89
 
90
	@Autowired
23786 amit.gupta 91
	private RoleManager roleManager;
23923 amit.gupta 92
 
23838 ashik.ali 93
	@Autowired
94
	private FofoStoreRepository fofoStoreRepository;
23884 amit.gupta 95
 
96
	@Autowired
24880 govind 97
	private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
23923 amit.gupta 98
 
23884 amit.gupta 99
	@Autowired
24880 govind 100
	private PartnerInvestmentService partnerInvestmentService;
24288 amit.gupta 101
 
23884 amit.gupta 102
	@Autowired
24880 govind 103
	private InsurancePolicyRepository insurancePolicyRepository;
23923 amit.gupta 104
	/*
105
	 * @Autowired private ScanRepository scanRepository;
106
	 */
24880 govind 107
	@Autowired
108
	private RechargeTransactionRepository rechargeTransactionRepository;
23923 amit.gupta 109
 
23884 amit.gupta 110
	@Autowired
111
	private TransactionService transactionService;
25136 amit.gupta 112
 
24996 amit.gupta 113
	@Autowired
114
	private InventoryService inventoryService;
24263 tejbeer 115
 
24098 tejbeer 116
	@Autowired
24263 tejbeer 117
	private MVCResponseSender mvcResponseSender;
118
 
119
	@Autowired
24098 tejbeer 120
	private NotificationPanelRepository notificationPanelRepository;
23923 amit.gupta 121
 
24203 amit.gupta 122
	@Autowired
123
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
124
 
24880 govind 125
	@Autowired
126
	private FofoOrderItemRepository fofoOrderItemRepository;
127
 
128
	@Autowired
129
	private InsuranceProviderRepository insuranceProviderRepository;
25566 tejbeer 130
	@Autowired
131
	private PartnerTypeChangeService partnerTypeChangeService;
25136 amit.gupta 132
 
24996 amit.gupta 133
	@Autowired
25640 tejbeer 134
	private HygieneDataRepository hygieneDataRepository;
135
 
136
	@Autowired
24996 amit.gupta 137
	private Mongo mongoClient;
24880 govind 138
 
23568 govind 139
	private static final Logger LOGGER = LogManager.getLogger(DashboardController.class);
23923 amit.gupta 140
 
25136 amit.gupta 141
	@RequestMapping(value = "/12dashboard34", method = RequestMethod.GET)
25140 amit.gupta 142
	public String dashboard1(HttpServletRequest request, Model model) throws Exception {
25136 amit.gupta 143
		LOGGER.info("In Dashboard1");
144
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
25179 amit.gupta 145
		boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
146
		model.addAttribute("isAdmin", isAdmin);
25180 amit.gupta 147
		if (!isAdmin) {
25179 amit.gupta 148
			model.addAttribute("brandStockPrices", this.getBrandStockPrices(loginDetails.getFofoId()));
149
			model.addAttribute("salesMap", this.getSales(loginDetails.getFofoId()));
150
			model.addAttribute("investments", this.getInvestments(loginDetails.getFofoId()));
151
			return "dashboard1";
152
		}
25136 amit.gupta 153
		return "dashboard1";
154
	}
155
 
156
	private Map<String, Object> getInvestments(int fofoId) throws Exception {
157
		Map<String, Object> investments = new LinkedHashMap<>();
158
		PartnerDailyInvestment investment = partnerInvestmentService.getInvestment(fofoId, 1);
159
		LocalDate yesterDate = LocalDate.now().minusDays(1);
25639 amit.gupta 160
		LocalDate currentMonthStart = yesterDate.withDayOfMonth(1);
25136 amit.gupta 161
		PartnerDailyInvestment yesterdayInvestment = partnerDailyInvestmentRepository.select(fofoId, yesterDate);
162
		if (yesterdayInvestment == null) {
163
			yesterdayInvestment = new PartnerDailyInvestment();
164
		}
165
 
166
		List<PartnerDailyInvestment> currentMonthInvestments = partnerDailyInvestmentRepository.selectAll(fofoId,
167
				currentMonthStart, currentMonthStart.withDayOfMonth(currentMonthStart.lengthOfMonth()));
168
 
25140 amit.gupta 169
		long okInvestmentDays = currentMonthInvestments.stream().filter(x -> x.getShortPercentage() <= 10)
25136 amit.gupta 170
				.collect(Collectors.counting());
25140 amit.gupta 171
		investments.put("today", investment.getTotalInvestment());
172
		investments.put("investment", investment);
173
		investments.put("inStock", investment.getInStockAmount());
25182 amit.gupta 174
		investments.put("minimum", investment.getMinInvestmentString());
25140 amit.gupta 175
		investments.put("short", investment.getShortPercentage());
25640 tejbeer 176
		investments.put("okDays",okInvestmentDays + (currentMonthStart.lengthOfMonth() - currentMonthInvestments.size()));
25136 amit.gupta 177
		return investments;
178
	}
179
 
25221 amit.gupta 180
	private Map<String, Object> getSales(int fofoId) {
181
		Map<String, Object> salesMap = new LinkedHashMap<>();
25140 amit.gupta 182
		LocalDateTime curDate = LocalDate.now().atStartOfDay();
25214 amit.gupta 183
		int monthLength = LocalDate.now().lengthOfMonth();
25140 amit.gupta 184
		List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectBetweenCreatedTime(fofoId, curDate,
185
				curDate.with(LocalTime.MAX));
186
		List<FofoOrderItem> mtdFofoOrderItems = fofoOrderItemRepository.selectBetweenCreatedTime(fofoId,
187
				curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
188
		double todaySale = fofoOrderItems.stream()
189
				.collect(Collectors.summingDouble(x -> x.getSellingPrice() * x.getQuantity()));
190
		double mtdSale = mtdFofoOrderItems.stream()
191
				.collect(Collectors.summingDouble(x -> x.getSellingPrice() * x.getQuantity()));
25214 amit.gupta 192
 
193
		List<PartnerTargetDetails> partnerTargetDetails = partnerTargetRepository
194
				.selectAllGeEqAndLeEqStartDateAndEndDate(LocalDateTime.now());
25544 amit.gupta 195
		if (partnerTargetDetails.isEmpty()) {
25372 tejbeer 196
			partnerTargetDetails = partnerTargetRepository
25633 amit.gupta 197
					.selectAllGeEqAndLeEqStartDateAndEndDate(LocalDateTime.now().minusMonths(2));
25372 tejbeer 198
		}
25214 amit.gupta 199
 
200
		List<Integer> targetIds = partnerTargetRepository
201
				.selectAllPartnerTargetForPartner(fofoId,
202
						partnerTargetDetails.stream().map(x -> x.getId()).collect(Collectors.toList()))
203
				.stream().map(x -> x.getTargetId()).collect(Collectors.toList());
204
		if (targetIds.size() > 0) {
205
			PartnerTarget target = partnerTargetRepository.selectAllPartnerTargetForPartner(fofoId, targetIds).get(0);
25544 amit.gupta 206
			double targetValue = (double) target.getTargetValue();
25214 amit.gupta 207
			int remainingDays = monthLength - curDate.getDayOfMonth() + 1;
25544 amit.gupta 208
			// Should not consider today's sale while evaluating today's target.
209
			double todayTargetValue = Math.round((targetValue - (mtdSale - todaySale)) / remainingDays);
25221 amit.gupta 210
			DecimalFormat df = new DecimalFormat("#.##");
25544 amit.gupta 211
			String targetValueString = df.format(targetValue / 100000) + "Lac";
25214 amit.gupta 212
			salesMap.put("todayTarget", todayTargetValue);
25223 amit.gupta 213
			salesMap.put("monthTarget", targetValueString);
25214 amit.gupta 214
		} else {
215
			salesMap.put("todayTarget", 0d);
216
			salesMap.put("monthTarget", 0d);
217
 
218
		}
25140 amit.gupta 219
		salesMap.put("todaySale", todaySale);
220
		salesMap.put("mtdSale", mtdSale);
25136 amit.gupta 221
		return salesMap;
222
	}
223
 
25152 amit.gupta 224
	private List<BrandStockPrice> getBrandStockPrices(int fofoId) throws Exception {
25140 amit.gupta 225
		Map<String, BrandStockPrice> brandStockPricesMap = inventoryService.getBrandWiseStockValue(fofoId);
25175 amit.gupta 226
 
25140 amit.gupta 227
		List<DBObject> mobileBrands = mongoClient.getMongoBrands(fofoId, "", 3);
25136 amit.gupta 228
		List<BrandStockPrice> brandStockPrices = new ArrayList<>();
25156 amit.gupta 229
 
25140 amit.gupta 230
		mobileBrands.stream().forEach(x -> {
231
			String brand = (String) x.get("name");
232
			if (brandStockPricesMap.containsKey(brand)) {
233
				BrandStockPrice brandStockPrice = brandStockPricesMap.get(brand);
234
				brandStockPrice.setBrandUrl((String) x.get("url"));
235
				brandStockPrice.setRank(((Double) x.get("rank")).intValue());
236
				brandStockPrices.add(brandStockPrice);
237
			}
238
		});
239
 
25175 amit.gupta 240
		return brandStockPrices.stream().filter(x -> x.getTotalQty() > 0).sorted((x, y) -> x.getRank() - y.getRank())
241
				.collect(Collectors.toList());
25136 amit.gupta 242
	}
243
 
21615 kshitij.so 244
	@RequestMapping(value = "/dashboard", method = RequestMethod.GET)
25156 amit.gupta 245
	public String dashboard(HttpServletRequest request, Model model) throws Exception {
25140 amit.gupta 246
 
22927 ashik.ali 247
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
25180 amit.gupta 248
		boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
249
		model.addAttribute("isAdmin", isAdmin);
23923 amit.gupta 250
 
22481 ashik.ali 251
		FofoStore fofoStore = null;
25274 amit.gupta 252
		model.addAttribute("webApiHost", webApiHost);
253
		model.addAttribute("webApiPort", webApiPort);
254
		model.addAttribute("webApiScheme", webApiScheme);
25544 amit.gupta 255
		model.addAttribute("webApiRoot", webApiRoot);
25183 amit.gupta 256
		if (isAdmin) {
25180 amit.gupta 257
			return "dashboard1";
258
		} else {
259
			try {
260
				fofoStore = fofoStoreRepository.selectByRetailerId(loginDetails.getFofoId());
25566 tejbeer 261
				PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(fofoStore.getId(), LocalDate.now());
25544 amit.gupta 262
				if (!fofoStore.isActive()) {
263
					return "redirect:/login";
264
				}
25566 tejbeer 265
				LOGGER.info("partnerType {}", partnerType);
266
 
267
				model.addAttribute("partnerType", partnerType);
25180 amit.gupta 268
				model.addAttribute("fofoStore", fofoStore);
25566 tejbeer 269
				model.addAttribute("partnerType", partnerType);
25180 amit.gupta 270
				model.addAttribute("hasGift", hasGift(loginDetails.getFofoId()));
271
				model.addAttribute("giftItemId", ProfitMandiConstants.GIFT_ID);
272
 
273
				model.addAttribute("brandStockPrices", this.getBrandStockPrices(loginDetails.getFofoId()));
274
				model.addAttribute("salesMap", this.getSales(loginDetails.getFofoId()));
25544 amit.gupta 275
				// this.setInvestments
276
				//
25180 amit.gupta 277
				model.addAttribute("investments", this.getInvestments(loginDetails.getFofoId()));
25544 amit.gupta 278
				model.addAttribute("isInvestmentOk", partnerInvestmentService.isInvestmentOk(loginDetails.getFofoId(),
279
						10, ProfitMandiConstants.CUTOFF_INVESTMENT));
25180 amit.gupta 280
			} catch (ProfitMandiBusinessException e) {
281
				LOGGER.error("FofoStore Code not found of fofoId {}", loginDetails.getFofoId());
282
 
283
			}
22481 ashik.ali 284
		}
25640 tejbeer 285
 
286
		LocalDateTime currentMonth = LocalDateTime.now().withDayOfMonth(1);
287
		List<HygieneData> hygieneData = hygieneDataRepository
288
				.selectAll(loginDetails.getFofoId(), currentMonth, LocalDateTime.now().plusMonths(1).withDayOfMonth(1))
289
				.stream().filter(x -> x.getDisposedTimestamp() != null).collect(Collectors.toList());
290
 
291
		LOGGER.info("hygieneData" + hygieneData);
292
		int successHygieneData = hygieneData.stream().filter(x -> x.getHygieneRating() == true)
293
				.collect(Collectors.toList()).size();
294
		int unsuccessfullHygieneData = hygieneData.stream().filter(x -> x.getHygieneRating() == false)
295
				.collect(Collectors.toList()).size();
296
 
297
		LOGGER.info("successHygieneData" + successHygieneData);
298
		LOGGER.info("fullHygieneData" + successHygieneData + unsuccessfullHygieneData);
299
 
300
		model.addAttribute("successHygieneData", successHygieneData);
301
		model.addAttribute("fullHygieneData", successHygieneData + unsuccessfullHygieneData);
25197 amit.gupta 302
		model.addAttribute("monthDays", LocalDate.now().minusDays(1).lengthOfMonth());
303
		model.addAttribute("dayOfMonth", LocalDate.now().minusDays(1).getDayOfMonth());
25140 amit.gupta 304
		return "dashboard1";
21615 kshitij.so 305
	}
23923 amit.gupta 306
 
24288 amit.gupta 307
	// This method is currently hardcoded to faciliate watches sold as gift.
24203 amit.gupta 308
	private boolean hasGift(int fofoId) {
309
		try {
24288 amit.gupta 310
			return currentInventorySnapshotRepository.selectByItemIdAndFofoId(ProfitMandiConstants.GIFT_ID, fofoId)
311
					.getAvailability() > 0;
24203 amit.gupta 312
		} catch (ProfitMandiBusinessException e) {
313
			return false;
314
		}
315
	}
24288 amit.gupta 316
 
22354 ashik.ali 317
	@RequestMapping(value = "/contactUs", method = RequestMethod.GET)
23923 amit.gupta 318
	public String contactUs(HttpServletRequest request, Model model) throws Throwable {
22354 ashik.ali 319
		model.addAttribute("appContextPath", request.getContextPath());
320
		return "contact-us";
321
	}
23923 amit.gupta 322
 
21615 kshitij.so 323
}