Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
21339 kshitij.so 1
package com.spice.profitmandi.web.controller;
2
 
3
import com.eclipsesource.json.Json;
4
import com.eclipsesource.json.JsonArray;
5
import com.eclipsesource.json.JsonObject;
6
import com.eclipsesource.json.JsonValue;
7
import com.google.gson.Gson;
21356 kshitij.so 8
import com.google.gson.reflect.TypeToken;
25010 amit.gupta 9
import com.mongodb.BasicDBObject;
24163 amit.gupta 10
import com.mongodb.DBObject;
21643 ashik.ali 11
import com.spice.profitmandi.common.enumuration.SchemeType;
21339 kshitij.so 12
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
13
import com.spice.profitmandi.common.model.ProfitMandiConstants;
22289 amit.gupta 14
import com.spice.profitmandi.common.model.UserInfo;
27030 amit.gupta 15
import com.spice.profitmandi.common.solr.SolrService;
21643 ashik.ali 16
import com.spice.profitmandi.common.web.client.RestClient;
22319 amit.gupta 17
import com.spice.profitmandi.common.web.util.ResponseSender;
30686 amit.gupta 18
import com.spice.profitmandi.dao.entity.catalog.*;
31507 tejbeer 19
import com.spice.profitmandi.dao.entity.dtr.WebListing;
30595 tejbeer 20
import com.spice.profitmandi.dao.entity.dtr.WebOffer;
31612 tejbeer 21
import com.spice.profitmandi.dao.entity.dtr.WebProductListing;
31625 tejbeer 22
import com.spice.profitmandi.dao.entity.fofo.CatalogFavourite;
27090 amit.gupta 23
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
26847 tejbeer 24
import com.spice.profitmandi.dao.entity.fofo.SuggestedPo;
26846 tejbeer 25
import com.spice.profitmandi.dao.entity.fofo.SuggestedPoDetail;
30669 amit.gupta 26
import com.spice.profitmandi.dao.entity.inventory.SaholicCISTable;
27032 amit.gupta 27
import com.spice.profitmandi.dao.entity.inventory.SaholicPOItem;
31572 tejbeer 28
import com.spice.profitmandi.dao.enumuration.dtr.WebListingSource;
31507 tejbeer 29
import com.spice.profitmandi.dao.enumuration.dtr.WebListingType;
30188 amit.gupta 30
import com.spice.profitmandi.dao.model.CreateOfferRequest;
22361 amit.gupta 31
import com.spice.profitmandi.dao.model.UserCart;
30686 amit.gupta 32
import com.spice.profitmandi.dao.repository.catalog.*;
27030 amit.gupta 33
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
22333 amit.gupta 34
import com.spice.profitmandi.dao.repository.dtr.Mongo;
22361 amit.gupta 35
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
31547 tejbeer 36
import com.spice.profitmandi.dao.repository.dtr.WebListingRepository;
30595 tejbeer 37
import com.spice.profitmandi.dao.repository.dtr.WebOfferRepository;
31547 tejbeer 38
import com.spice.profitmandi.dao.repository.dtr.WebProductListingRepository;
31625 tejbeer 39
import com.spice.profitmandi.dao.repository.fofo.CatalogFavouriteRepository;
26846 tejbeer 40
import com.spice.profitmandi.dao.repository.fofo.SuggestedPoDetailRepository;
26847 tejbeer 41
import com.spice.profitmandi.dao.repository.fofo.SuggestedPoRepository;
30669 amit.gupta 42
import com.spice.profitmandi.dao.repository.inventory.SaholicCISTableRepository;
23798 amit.gupta 43
import com.spice.profitmandi.service.authentication.RoleManager;
31507 tejbeer 44
import com.spice.profitmandi.service.catalog.BrandsService;
30686 amit.gupta 45
import com.spice.profitmandi.service.inventory.*;
30123 amit.gupta 46
import com.spice.profitmandi.service.pricecircular.PriceCircularItemModel;
47
import com.spice.profitmandi.service.pricecircular.PriceCircularModel;
48
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
22287 amit.gupta 49
import com.spice.profitmandi.service.pricing.PricingService;
26695 amit.gupta 50
import com.spice.profitmandi.service.scheme.SchemeService;
21356 kshitij.so 51
import com.spice.profitmandi.web.res.DealBrands;
21339 kshitij.so 52
import com.spice.profitmandi.web.res.DealObjectResponse;
53
import com.spice.profitmandi.web.res.DealsResponse;
54
import io.swagger.annotations.ApiImplicitParam;
55
import io.swagger.annotations.ApiImplicitParams;
56
import io.swagger.annotations.ApiOperation;
30686 amit.gupta 57
import org.apache.commons.lang3.StringUtils;
58
import org.apache.http.conn.HttpHostConnectException;
59
import org.apache.logging.log4j.LogManager;
60
import org.apache.logging.log4j.Logger;
61
import org.json.JSONArray;
62
import org.json.JSONObject;
63
import org.springframework.beans.factory.annotation.Autowired;
64
import org.springframework.beans.factory.annotation.Value;
65
import org.springframework.http.HttpStatus;
66
import org.springframework.http.MediaType;
67
import org.springframework.http.ResponseEntity;
68
import org.springframework.stereotype.Controller;
69
import org.springframework.transaction.annotation.Transactional;
70
import org.springframework.web.bind.annotation.PathVariable;
71
import org.springframework.web.bind.annotation.RequestMapping;
72
import org.springframework.web.bind.annotation.RequestMethod;
73
import org.springframework.web.bind.annotation.RequestParam;
21339 kshitij.so 74
 
30686 amit.gupta 75
import javax.servlet.http.HttpServletRequest;
31625 tejbeer 76
 
77
import java.time.LocalDateTime;
30686 amit.gupta 78
import java.util.*;
79
import java.util.concurrent.atomic.AtomicInteger;
80
import java.util.stream.Collectors;
81
 
21339 kshitij.so 82
@Controller
22319 amit.gupta 83
@Transactional(rollbackFor = Throwable.class)
21339 kshitij.so 84
public class DealsController {
85
 
23568 govind 86
	private static final Logger logger = LogManager.getLogger(DealsController.class);
31547 tejbeer 87
	private static final List<Integer> TAG_IDS = Arrays.asList(4);
21339 kshitij.so 88
 
89
	@Value("${python.api.host}")
90
	private String host;
23816 amit.gupta 91
 
26889 amit.gupta 92
	@Value("${new.solr.url}")
93
	private String solrUrl;
94
 
21339 kshitij.so 95
	@Value("${python.api.port}")
96
	private int port;
23816 amit.gupta 97
 
26889 amit.gupta 98
	@Autowired
99
	RestClient restClient;
27051 amit.gupta 100
 
27030 amit.gupta 101
	@Autowired
102
	SolrService solrService;
26889 amit.gupta 103
 
26924 amit.gupta 104
	@Autowired
105
	InventoryService inventoryService;
106
 
23816 amit.gupta 107
	// This is now unused as we are not supporting multiple companies.
23300 amit.gupta 108
	@Value("${gadgetCops.invoice.cc}")
23816 amit.gupta 109
	private String[] ccGadgetCopInvoiceTo;
22319 amit.gupta 110
 
111
	@Autowired
112
	private PricingService pricingService;
23816 amit.gupta 113
 
22273 amit.gupta 114
	@Autowired
25010 amit.gupta 115
	private CategoryRepository categoryRepository;
116
 
117
	@Autowired
26695 amit.gupta 118
	private SchemeService schemeService;
119
 
120
	@Autowired
26889 amit.gupta 121
	private SaholicInventoryService saholicInventoryService;
122
 
123
	@Autowired
22333 amit.gupta 124
	private Mongo mongoClient;
25879 amit.gupta 125
 
25875 amit.gupta 126
	@Autowired
127
	private ItemBucketService itemBucketService;
23816 amit.gupta 128
 
22333 amit.gupta 129
	@Autowired
22361 amit.gupta 130
	private UserAccountRepository userAccountRepository;
27051 amit.gupta 131
 
27030 amit.gupta 132
	@Autowired
133
	private FofoStoreRepository fofoStoreRepository;
23816 amit.gupta 134
 
22989 amit.gupta 135
	@Autowired
22931 ashik.ali 136
	private ResponseSender<?> responseSender;
23816 amit.gupta 137
 
22554 amit.gupta 138
	@Autowired
23814 amit.gupta 139
	private TagListingRepository tagListingRepository;
23816 amit.gupta 140
 
23814 amit.gupta 141
	@Autowired
23426 amit.gupta 142
	private ItemRepository itemRepository;
30123 amit.gupta 143
	@Autowired
144
	private PriceCircularService priceCircularService;
23816 amit.gupta 145
 
23786 amit.gupta 146
	@Autowired
23798 amit.gupta 147
	private RoleManager roleManagerService;
23816 amit.gupta 148
 
26846 tejbeer 149
	@Autowired
150
	private SuggestedPoDetailRepository monthlyPoDetailRepository;
151
 
26847 tejbeer 152
	@Autowired
153
	private SuggestedPoRepository suggestedPoRepository;
154
 
30595 tejbeer 155
	@Autowired
156
	private WebOfferRepository webOfferRepository;
157
 
30683 tejbeer 158
	@Autowired
159
	private ComboModelRepository comboModelRepository;
160
 
161
	@Autowired
162
	private ComboMappedModelRepository comboMappedModelRepository;
163
 
31507 tejbeer 164
	@Autowired
165
	private BrandsService brandsService;
31547 tejbeer 166
 
167
	@Autowired
168
	private WebListingRepository webListingRepository;
169
 
170
	@Autowired
171
	private WebProductListingRepository webProductListingRepository;
172
 
31625 tejbeer 173
	@Autowired
174
	private CatalogFavouriteRepository catalogFavouriteRepository;
175
 
22336 amit.gupta 176
	List<String> filterableParams = Arrays.asList("brand");
24949 amit.gupta 177
 
25876 amit.gupta 178
	@RequestMapping(value = "/fofo/buckets", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
25879 amit.gupta 179
	public ResponseEntity<?> getBuckets(HttpServletRequest request) throws ProfitMandiBusinessException {
25875 amit.gupta 180
		logger.info("Request " + request.getParameterMap());
181
		return responseSender.ok(itemBucketService.getBuckets(Optional.of(true)));
182
	}
25879 amit.gupta 183
 
184
	@RequestMapping(value = "/fofo/bucket", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
25880 amit.gupta 185
	public ResponseEntity<?> getBucketDetails(HttpServletRequest request, @RequestParam int id)
25879 amit.gupta 186
			throws ProfitMandiBusinessException {
25880 amit.gupta 187
		List<ItemQuantityPojo> iqPojo = itemBucketService.getBucketDetails(id);
25968 amit.gupta 188
		Map<Integer, Integer> itemIdsQtyMap = iqPojo.stream()
189
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x.getQuantity()));
190
		Set<Integer> catalogIds = itemRepository.selectByIds(itemIdsQtyMap.keySet()).stream()
191
				.map(x -> x.getCatalogItemId()).collect(Collectors.toSet());
25879 amit.gupta 192
		RestClient rc = new RestClient();
193
		Map<String, String> params = new HashMap<>();
194
		List<String> mandatoryQ = new ArrayList<>();
25968 amit.gupta 195
		mandatoryQ.add(
196
				String.format("+catalogId_i:(%s) +{!parent which=\"id:catalog*\"}", StringUtils.join(catalogIds, " ")));
25959 amit.gupta 197
		params.put("start", "0");
198
		params.put("rows", "100");
25879 amit.gupta 199
		params.put("q", StringUtils.join(mandatoryQ, " "));
200
		params.put("fl", "*, [child parentFilter=id:catalog*]");
201
 
202
		params.put("wt", "json");
203
		String response = null;
204
		try {
26889 amit.gupta 205
			response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
25879 amit.gupta 206
		} catch (HttpHostConnectException e) {
207
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
208
		}
209
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
210
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
25968 amit.gupta 211
		List<FofoCatalogResponse> dealResponse = getCatalogSingleSkuResponse(docs, itemIdsQtyMap, false);
26051 amit.gupta 212
 
26589 amit.gupta 213
		Bucket bucket = itemBucketService.getBuckets(Optional.of(true)).stream().filter(x -> x.getId() == id)
214
				.collect(Collectors.toList()).get(0);
25882 amit.gupta 215
		bucket.setFofoCatalogResponses(dealResponse);
216
		return responseSender.ok(bucket);
25879 amit.gupta 217
	}
218
 
26846 tejbeer 219
	@RequestMapping(value = "/fofo/suggestedPo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
220
	public ResponseEntity<?> getSuggestedPo(HttpServletRequest request, @RequestParam int id)
221
			throws ProfitMandiBusinessException {
222
 
223
		List<SuggestedPoDetail> mpd = monthlyPoDetailRepository.selectByPoId(id);
224
		Map<Integer, Integer> itemIdsQtyMap = mpd.stream()
225
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x.getQuantity()));
226
 
227
		Set<Integer> catalogIds = itemRepository.selectByIds(itemIdsQtyMap.keySet()).stream()
228
				.map(x -> x.getCatalogItemId()).collect(Collectors.toSet());
229
		RestClient rc = new RestClient();
230
		Map<String, String> params = new HashMap<>();
231
		List<String> mandatoryQ = new ArrayList<>();
232
		mandatoryQ.add(
233
				String.format("+catalogId_i:(%s) +{!parent which=\"id:catalog*\"}", StringUtils.join(catalogIds, " ")));
234
		params.put("start", "0");
235
		params.put("rows", "100");
236
		params.put("q", StringUtils.join(mandatoryQ, " "));
237
		params.put("fl", "*, [child parentFilter=id:catalog*]");
238
 
239
		params.put("wt", "json");
240
		String response = null;
241
		try {
26889 amit.gupta 242
			response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
26846 tejbeer 243
		} catch (HttpHostConnectException e) {
244
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
245
		}
246
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
247
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
248
		List<FofoCatalogResponse> dealResponse = getCatalogSingleSkuResponse(docs, itemIdsQtyMap, false);
249
 
250
		return responseSender.ok(dealResponse);
251
	}
252
 
26847 tejbeer 253
	@RequestMapping(value = "/suggestedPo/status", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
26848 tejbeer 254
	@ApiImplicitParams({
31507 tejbeer 255
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
26848 tejbeer 256
	@ApiOperation(value = "")
26847 tejbeer 257
	public ResponseEntity<?> changeSuggestedPoStatus(HttpServletRequest request, @RequestParam int id)
258
			throws ProfitMandiBusinessException {
259
		SuggestedPo suggestedPo = suggestedPoRepository.selectById(id);
260
		suggestedPo.setStatus("closed");
261
 
262
		return responseSender.ok(true);
263
	}
264
 
31625 tejbeer 265
	@RequestMapping(value = "/fofo/fovourites", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
31629 tejbeer 266
	public ResponseEntity<?> getFavourites(HttpServletRequest request) throws Exception {
31625 tejbeer 267
 
31629 tejbeer 268
		int userId = (int) request.getAttribute("userId");
269
		UserCart uc = userAccountRepository.getUserCart(userId);
270
		int fofoId = uc.getUserId();
271
 
31625 tejbeer 272
		Set<Integer> catalogIds = catalogFavouriteRepository.selectBypartnerId(fofoId).stream()
31628 tejbeer 273
				.map(x -> x.getCatalogId()).collect(Collectors.toSet());
31625 tejbeer 274
		RestClient rc = new RestClient();
275
		Map<String, String> params = new HashMap<>();
276
		List<String> mandatoryQ = new ArrayList<>();
277
		mandatoryQ.add(
278
				String.format("+catalogId_i:(%s) +{!parent which=\"id:catalog*\"}", StringUtils.join(catalogIds, " ")));
279
		params.put("start", "0");
280
		params.put("rows", "100");
281
		params.put("q", StringUtils.join(mandatoryQ, " "));
282
		params.put("fl", "*, [child parentFilter=id:catalog*]");
283
 
284
		params.put("wt", "json");
285
		String response = null;
286
		try {
287
			response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
288
		} catch (HttpHostConnectException e) {
289
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
290
		}
291
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
292
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
293
		List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, fofoId);
294
 
295
		return responseSender.ok(dealResponse);
296
	}
297
 
298
	@RequestMapping(value = "/favourites/manage", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
299
	@ApiImplicitParams({
300
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
301
	@ApiOperation(value = "")
302
	public ResponseEntity<?> mangeFavourites(HttpServletRequest request, @RequestParam int catalogId)
303
			throws ProfitMandiBusinessException {
304
 
305
		int userId = (int) request.getAttribute("userId");
306
		UserCart uc = userAccountRepository.getUserCart(userId);
307
		int fofoId = uc.getUserId();
308
 
309
		CatalogFavourite catalogFavourite = catalogFavouriteRepository.selectBypartnerAndCatalogId(fofoId, catalogId);
310
 
311
		if (catalogFavourite == null) {
312
			catalogFavourite = new CatalogFavourite();
31628 tejbeer 313
			catalogFavourite.setCatalogId(catalogId);
31625 tejbeer 314
			catalogFavourite.setFofoId(fofoId);
315
			catalogFavourite.setCreatedTimestamp(LocalDateTime.now());
316
			catalogFavouriteRepository.persist(catalogFavourite);
317
 
318
		}
319
 
320
		else {
321
			catalogFavouriteRepository.deleteByPartnerAndCatalogId(fofoId, catalogId);
322
		}
323
		return responseSender.ok(true);
324
	}
325
 
23816 amit.gupta 326
	private String getCommaSeparateTags(int userId) {
22361 amit.gupta 327
		UserCart uc = userAccountRepository.getUserCart(userId);
328
		List<Integer> tagIds = pricingService.getTagsIdsByRetailerId(uc.getUserId());
22287 amit.gupta 329
		List<String> strTagIds = new ArrayList<>();
330
		for (Integer tagId : tagIds) {
331
			strTagIds.add(String.valueOf(tagId));
22273 amit.gupta 332
		}
22287 amit.gupta 333
		return String.join(",", strTagIds);
22273 amit.gupta 334
	}
335
 
22319 amit.gupta 336
	@ApiImplicitParams({
31507 tejbeer 337
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
22319 amit.gupta 338
	@RequestMapping(value = "/fofo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
24091 tejbeer 339
	public ResponseEntity<?> getFofo(HttpServletRequest request,
31507 tejbeer 340
			@RequestParam(value = "categoryId", required = false, defaultValue = "3") String categoryId,
341
			@RequestParam(value = "offset") String offset, @RequestParam(value = "limit") String limit,
342
			@RequestParam(value = "sort", required = false) String sort,
343
			@RequestParam(value = "brand", required = false) String brand,
344
			@RequestParam(value = "subCategoryId", required = false) int subCategoryId,
345
			@RequestParam(value = "q", required = false) String queryTerm,
31548 tejbeer 346
			@RequestParam(value = "hotDeal", required = false) boolean hotDeal,
347
			@RequestParam(value = "endPoint", required = false) String endPoint) throws Throwable {
22328 amit.gupta 348
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
22319 amit.gupta 349
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
27090 amit.gupta 350
		FofoStore fs = fofoStoreRepository.selectByRetailerId(userInfo.getRetailerId());
28262 amit.gupta 351
		sort = "w" + fs.getWarehouseId() + "_i desc";
31548 tejbeer 352
 
353
		logger.info("endPoint {}", endPoint);
31552 tejbeer 354
 
31554 tejbeer 355
		if (endPoint != null && !endPoint.trim().isEmpty()) {
31552 tejbeer 356
			WebListing webListing = webListingRepository.selectByUrl(endPoint);
31557 tejbeer 357
			dealResponse = this.getDealResponses(userInfo, webListing, offset, limit);
31552 tejbeer 358
 
359
		} else {
360
 
31548 tejbeer 361
			dealResponse = this.getCatalogResponse(
362
					solrService.getSolrDocs(queryTerm, categoryId, offset, limit, sort, brand, subCategoryId, hotDeal),
363
					hotDeal, userInfo.getRetailerId());
364
		}
28101 amit.gupta 365
		logger.info("log me");
26889 amit.gupta 366
		return responseSender.ok(dealResponse);
367
	}
25015 amit.gupta 368
 
22319 amit.gupta 369
	@RequestMapping(value = "/online-deals", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
22272 amit.gupta 370
	@ApiImplicitParams({
31507 tejbeer 371
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
22272 amit.gupta 372
	@ApiOperation(value = "Get online deals")
22319 amit.gupta 373
	public ResponseEntity<?> getOnlineDeals(HttpServletRequest request,
31507 tejbeer 374
			@RequestParam(value = "categoryId") String categoryId, @RequestParam(value = "offset") String offset,
375
			@RequestParam(value = "limit") String limit, @RequestParam(value = "sort", required = false) String sort,
376
			@RequestParam(value = "direction", required = false) String direction,
377
			@RequestParam(value = "filterData", required = false) String filterData) throws Throwable {
22319 amit.gupta 378
		logger.info("Request " + request.getParameterMap());
22272 amit.gupta 379
		String response = null;
22319 amit.gupta 380
		int userId = (int) request.getAttribute("userId");
22289 amit.gupta 381
 
22319 amit.gupta 382
		String uri = "/deals/" + userId;
23532 amit.gupta 383
		RestClient rc = new RestClient();
22272 amit.gupta 384
		Map<String, String> params = new HashMap<>();
385
		params.put("offset", offset);
386
		params.put("limit", limit);
387
		params.put("categoryId", categoryId);
388
		params.put("direction", direction);
389
		params.put("sort", sort);
390
		params.put("source", "online");
391
		params.put("filterData", filterData);
23816 amit.gupta 392
		/*
393
		 * if (userInfo.getRoleNames().contains(RoleType.FOFO.toString())) {
394
		 * params.put("tag_ids", getCommaSeparateTags(userId)); }
395
		 */
22272 amit.gupta 396
		List<Object> responseObject = new ArrayList<>();
23532 amit.gupta 397
		try {
398
			response = rc.get(SchemeType.HTTP, host, port, uri, params);
399
		} catch (HttpHostConnectException e) {
400
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
401
		}
22931 ashik.ali 402
 
22272 amit.gupta 403
		JsonArray result_json = Json.parse(response).asArray();
22319 amit.gupta 404
		for (JsonValue j : result_json) {
23816 amit.gupta 405
			// logger.info("res " + j.asArray());
22272 amit.gupta 406
			List<Object> innerObject = new ArrayList<>();
22319 amit.gupta 407
			for (JsonValue jsonObject : j.asArray()) {
22272 amit.gupta 408
				innerObject.add(toDealObject(jsonObject.asObject()));
409
			}
22319 amit.gupta 410
			if (innerObject.size() > 0) {
22272 amit.gupta 411
				responseObject.add(innerObject);
412
			}
413
		}
23022 ashik.ali 414
		return responseSender.ok(responseObject);
22272 amit.gupta 415
	}
416
 
22319 amit.gupta 417
	private Object toDealObject(JsonObject jsonObject) {
418
		if (jsonObject.get("dealObject") != null && jsonObject.get("dealObject").asInt() == 1) {
21339 kshitij.so 419
			return new Gson().fromJson(jsonObject.toString(), DealObjectResponse.class);
420
		}
421
		return new Gson().fromJson(jsonObject.toString(), DealsResponse.class);
422
	}
22319 amit.gupta 423
 
424
	@RequestMapping(value = ProfitMandiConstants.URL_BRANDS, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
21356 kshitij.so 425
	@ApiImplicitParams({
31507 tejbeer 426
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
21356 kshitij.so 427
	@ApiOperation(value = "Get brand list and count for category")
22319 amit.gupta 428
	public ResponseEntity<?> getBrands(HttpServletRequest request,
31507 tejbeer 429
			@RequestParam(value = "category_id") String category_id) throws ProfitMandiBusinessException {
22319 amit.gupta 430
		logger.info("Request " + request.getParameterMap());
21356 kshitij.so 431
		String response = null;
22319 amit.gupta 432
		// TODO: move to properties
21356 kshitij.so 433
		String uri = ProfitMandiConstants.URL_BRANDS;
23532 amit.gupta 434
		RestClient rc = new RestClient();
21356 kshitij.so 435
		Map<String, String> params = new HashMap<>();
436
		params.put("category_id", category_id);
21358 kshitij.so 437
		List<DealBrands> dealBrandsResponse = null;
23532 amit.gupta 438
		try {
439
			response = rc.get(SchemeType.HTTP, host, port, uri, params);
440
		} catch (HttpHostConnectException e) {
441
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
442
		}
23816 amit.gupta 443
 
22319 amit.gupta 444
		dealBrandsResponse = new Gson().fromJson(response, new TypeToken<List<DealBrands>>() {
445
		}.getType());
23022 ashik.ali 446
 
447
		return responseSender.ok(dealBrandsResponse);
21356 kshitij.so 448
	}
22319 amit.gupta 449
 
450
	@RequestMapping(value = ProfitMandiConstants.URL_UNIT_DEAL, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
21445 kshitij.so 451
	@ApiImplicitParams({
31507 tejbeer 452
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
21445 kshitij.so 453
	@ApiOperation(value = "Get unit deal object")
23816 amit.gupta 454
	public ResponseEntity<?> getUnitDeal(HttpServletRequest request, @PathVariable(value = "id") long id)
455
			throws ProfitMandiBusinessException {
21445 kshitij.so 456
		String response = null;
22319 amit.gupta 457
		// TODO: move to properties
458
		String uri = "getDealById/" + id;
459
		System.out.println("Unit deal " + uri);
23532 amit.gupta 460
		RestClient rc = new RestClient();
21445 kshitij.so 461
		Map<String, String> params = new HashMap<>();
462
		DealsResponse dealsResponse = null;
23532 amit.gupta 463
		try {
464
			response = rc.get(SchemeType.HTTP, host, port, uri, params);
465
		} catch (HttpHostConnectException e) {
466
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
467
		}
23816 amit.gupta 468
 
21445 kshitij.so 469
		JsonObject result_json = Json.parse(response).asObject();
22319 amit.gupta 470
		if (!result_json.isEmpty()) {
21445 kshitij.so 471
			dealsResponse = new Gson().fromJson(response, DealsResponse.class);
22952 amit.gupta 472
			Iterator<AvailabilityInfo> iter = dealsResponse.getAvailabilityInfo().iterator();
23816 amit.gupta 473
			while (iter.hasNext()) {
22952 amit.gupta 474
				AvailabilityInfo ai = iter.next();
23816 amit.gupta 475
				if (ai.getAvailability() <= 0)
22952 amit.gupta 476
					iter.remove();
477
			}
21445 kshitij.so 478
		}
22952 amit.gupta 479
		return responseSender.ok(dealsResponse);
21445 kshitij.so 480
	}
23816 amit.gupta 481
 
24091 tejbeer 482
	@RequestMapping(value = "/partnerdeals/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
483
	@ApiImplicitParams({
31507 tejbeer 484
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
24091 tejbeer 485
	@ApiOperation(value = "Get unit deal object")
486
	public ResponseEntity<?> getUnitFocoDeal(HttpServletRequest request, @PathVariable(value = "id") long id)
27030 amit.gupta 487
			throws Exception {
24091 tejbeer 488
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
489
		List<Integer> tagIds = Arrays.asList(4);
490
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
491
		if (roleManagerService.isPartner(userInfo.getRoleIds())) {
492
			String categoryId = "(3 OR 6)";
493
			UserCart uc = userAccountRepository.getUserCart(userInfo.getUserId());
494
			RestClient rc = new RestClient();
495
			Map<String, String> params = new HashMap<>();
496
			List<String> mandatoryQ = new ArrayList<>();
497
			String catalogString = "catalog" + id;
498
 
24149 amit.gupta 499
			mandatoryQ.add(String.format("+(categoryId_i:%s) +(id:%s) +{!parent which=\"id:%s\"} tagId_i:(%s)",
500
					categoryId, catalogString, catalogString, StringUtils.join(tagIds, " ")));
501
 
24091 tejbeer 502
			params.put("q", StringUtils.join(mandatoryQ, " "));
503
			params.put("fl", "*, [child parentFilter=id:catalog*]");
504
			params.put("sort", "rank_i asc, create_s desc");
505
			params.put("wt", "json");
506
			String response = null;
507
			try {
26575 amit.gupta 508
				response = rc.get(SchemeType.HTTP, "50.116.10.120", 8984, "solr/demo/select", params);
24091 tejbeer 509
			} catch (HttpHostConnectException e) {
510
				throw new ProfitMandiBusinessException("", "", "Could not connect to host");
511
			}
512
			JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
513
			JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
26889 amit.gupta 514
			dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
24091 tejbeer 515
		} else {
516
			return responseSender.badRequest(
517
					new ProfitMandiBusinessException("Retailer id", userInfo.getUserId(), "NOT_FOFO_RETAILER"));
518
		}
519
		return responseSender.ok(dealResponse.get(0));
520
	}
521
 
22333 amit.gupta 522
	@RequestMapping(value = "/fofo/brands", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
24949 amit.gupta 523
	public ResponseEntity<?> getBrandsToDisplay(HttpServletRequest request,
31507 tejbeer 524
			@RequestParam(required = false, defaultValue = "0") int categoryId) throws Exception {
24163 amit.gupta 525
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
25543 amit.gupta 526
		logger.info("userInfo [{}]", userInfo);
25879 amit.gupta 527
		List<DBObject> brandsDisplay = mongoClient.getMongoBrands(userInfo.getRetailerId(), userInfo.getEmail(),
528
				categoryId);
24163 amit.gupta 529
		return new ResponseEntity<>(brandsDisplay, HttpStatus.OK);
22333 amit.gupta 530
	}
25879 amit.gupta 531
 
31507 tejbeer 532
	@RequestMapping(value = "/fofo/brandCatalog", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
533
	public ResponseEntity<?> getBrands(HttpServletRequest request,
534
			@RequestParam(required = false, defaultValue = "0") int categoryId) throws Exception {
535
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
536
		logger.info("userInfo [{}]", userInfo);
537
 
538
		List<BrandCatalog> brandsDisplay = brandsService.getBrands(userInfo.getRetailerId(), userInfo.getEmail(),
539
				categoryId);
540
		return new ResponseEntity<>(brandsDisplay, HttpStatus.OK);
541
	}
542
 
25813 amit.gupta 543
	@RequestMapping(value = "/fofo/accessory/all-categories", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
544
	public ResponseEntity<?> getSubCategoriesToDisplay(HttpServletRequest request) throws Exception {
545
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
546
		logger.info("userInfo [{}]", userInfo);
26889 amit.gupta 547
		List<DBObject> subCategoriesDisplay = this.getSubCategoriesToDisplay();
548
		return new ResponseEntity<>(subCategoriesDisplay, HttpStatus.OK);
25813 amit.gupta 549
	}
23816 amit.gupta 550
 
25011 amit.gupta 551
	private List<DBObject> getSubCategoriesToDisplay() throws Exception {
25010 amit.gupta 552
		List<DBObject> subCategories = new ArrayList<>();
553
		RestClient rc = new RestClient();
554
		Map<String, String> params = new HashMap<>();
555
		params.put("q", "categoryId_i:6");
556
		params.put("group", "true");
557
		params.put("group.field", "subCategoryId_i");
558
		params.put("wt", "json");
25126 amit.gupta 559
		params.put("rows", "50");
25014 amit.gupta 560
		params.put("fl", "subCategoryId_i");
25010 amit.gupta 561
		String response = null;
562
		try {
26575 amit.gupta 563
			response = rc.get(SchemeType.HTTP, "50.116.10.120", 8984, "solr/demo/select", params);
25010 amit.gupta 564
		} catch (HttpHostConnectException e) {
565
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
566
		}
567
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("grouped");
568
		JSONArray groups = solrResponseJSONObj.getJSONObject("subCategoryId_i").getJSONArray("groups");
569
		List<Integer> categoryIds = new ArrayList<>();
25015 amit.gupta 570
		for (int i = 0; i < groups.length(); i++) {
571
			JSONObject groupObject = groups.getJSONObject(i);
572
			int subCategoryId = groupObject.getInt("groupValue");
25010 amit.gupta 573
			int quantity = groupObject.getJSONObject("doclist").getInt("numFound");
25013 amit.gupta 574
			categoryIds.add(subCategoryId);
25010 amit.gupta 575
		}
25015 amit.gupta 576
 
25010 amit.gupta 577
		List<Category> categories = categoryRepository.selectByIds(categoryIds);
25015 amit.gupta 578
		AtomicInteger i = new AtomicInteger(0);
579
		categories.forEach(x -> {
25011 amit.gupta 580
			DBObject dbObject = new BasicDBObject();
581
			dbObject.put("name", x.getLabel());
582
			dbObject.put("subCategoryId", x.getId());
583
			dbObject.put("rank", i.incrementAndGet());
584
			dbObject.put("categoryId", 6);
26441 tejbeer 585
			dbObject.put("url", "https://images.smartdukaan.com/uploads/campaigns/" + x.getId() + ".png");
25011 amit.gupta 586
			subCategories.add(dbObject);
25010 amit.gupta 587
		});
25015 amit.gupta 588
 
25011 amit.gupta 589
		return subCategories;
25015 amit.gupta 590
 
25010 amit.gupta 591
	}
592
 
22446 amit.gupta 593
	@RequestMapping(value = "/banners/{bannerType}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
22448 amit.gupta 594
	public ResponseEntity<?> getBanners(@PathVariable String bannerType) {
22447 amit.gupta 595
		return new ResponseEntity<>(mongoClient.getBannersByType(bannerType), HttpStatus.OK);
22446 amit.gupta 596
	}
23816 amit.gupta 597
 
23793 tejbeer 598
	@RequestMapping(value = "/deals/subCategories", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
599
	public ResponseEntity<?> getSubcategoriesToDisplay() {
600
		return new ResponseEntity<>(mongoClient.getSubcategoriesToDisplay(), HttpStatus.OK);
601
	}
23816 amit.gupta 602
 
22406 amit.gupta 603
	@ApiImplicitParams({
31507 tejbeer 604
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
22401 amit.gupta 605
	@RequestMapping(value = "/deals/skus/{skus}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
22931 ashik.ali 606
	public ResponseEntity<?> getDealsBySkus(@PathVariable String skus) throws ProfitMandiBusinessException {
22401 amit.gupta 607
		StringBuffer sb = new StringBuffer("/getDealsForNotification/");
608
		String uri = sb.append(skus).toString();
23532 amit.gupta 609
		RestClient rc = new RestClient();
610
		String response;
611
		try {
612
			response = rc.get(SchemeType.HTTP, host, port, uri, new HashMap<>());
23816 amit.gupta 613
		} catch (HttpHostConnectException e) {
23532 amit.gupta 614
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
615
		}
22406 amit.gupta 616
		JsonArray result_json = Json.parse(response).asArray();
22407 amit.gupta 617
		List<Object> responseObject = new ArrayList<>();
618
		for (JsonValue j : result_json) {
23816 amit.gupta 619
			// logger.info("res " + j.asArray());
22407 amit.gupta 620
			List<Object> innerObject = new ArrayList<>();
621
			for (JsonValue jsonObject : j.asArray()) {
622
				innerObject.add(toDealObject(jsonObject.asObject()));
623
			}
624
			if (innerObject.size() > 0) {
625
				responseObject.add(innerObject);
626
			}
627
		}
22408 amit.gupta 628
		return responseSender.ok(responseObject);
22401 amit.gupta 629
	}
21339 kshitij.so 630
 
31547 tejbeer 631
	@RequestMapping(value = "/partner/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
632
	public ResponseEntity<?> getPartnersListing(HttpServletRequest request) throws Exception {
633
		List<WebListing> webListings = webListingRepository.selectAllWebListingByType(Optional.of(true),
31572 tejbeer 634
				WebListingSource.partner);
31547 tejbeer 635
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
636
		for (WebListing webListing : webListings) {
31642 tejbeer 637
 
638
			List<WebProductListing> webProducts = webProductListingRepository
639
					.selectAllByWebListingId(webListing.getId());
640
			String size = "50";
641
			if (!webProducts.isEmpty()) {
642
				size = String.valueOf(webProducts.size());
643
			}
644
			webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing, "0", size));
31547 tejbeer 645
		}
646
		return responseSender.ok(webListings);
647
	}
648
 
31557 tejbeer 649
	private List<FofoCatalogResponse> getDealResponses(UserInfo userInfo, WebListing webListing, String offset,
650
			String limit) throws Exception {
31572 tejbeer 651
 
31547 tejbeer 652
		RestClient rc = new RestClient();
653
		Map<String, String> params = new HashMap<>();
654
		List<String> mandatoryQ = new ArrayList<>();
31596 amit.gupta 655
		mandatoryQ.add("show_default_b:true");
31625 tejbeer 656
 
31612 tejbeer 657
		List<Integer> webProducts = null;
31578 tejbeer 658
		if (webListing.getType().equals(WebListingType.solr)) {
31576 tejbeer 659
			logger.info("solrtype {}", webListing.getSolrQuery());
31584 tejbeer 660
			mandatoryQ.add(String.format("+{!parent which=\"" + webListing.getSolrQuery() + "\"} AND active_b:true"));
31642 tejbeer 661
			params.put("sort", "create_s desc");
31572 tejbeer 662
		} else {
31576 tejbeer 663
			logger.info("solrtype2 {}", webListing.getSolrQuery());
664
 
31612 tejbeer 665
			webProducts = webProductListingRepository
31572 tejbeer 666
					.selectAllByWebListingId(webListing.getId(), Integer.parseInt(offset), Integer.parseInt(limit))
667
					.stream().filter(x -> x.getRank() > 0).map(x -> x.getEntityId()).collect(Collectors.toList());
668
			if (webProducts.size() == 0) {
669
				return new ArrayList<>();
670
			}
671
 
672
			mandatoryQ.add(String.format(
31584 tejbeer 673
					"+{!parent which=\"catalogId_i:" + StringUtils.join(webProducts, " ") + "\"} AND active_b:true"));
31572 tejbeer 674
 
675
		}
31547 tejbeer 676
		params.put("q", StringUtils.join(mandatoryQ, " "));
31581 tejbeer 677
		params.put("fl", "*, [child parentFilter=id:catalog* childFilter=active_b:true ]");
31642 tejbeer 678
 
31557 tejbeer 679
		params.put("start", String.valueOf(offset));
680
		params.put("rows", String.valueOf(limit));
31547 tejbeer 681
		params.put("wt", "json");
682
		String response = null;
683
		try {
31612 tejbeer 684
			response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
31547 tejbeer 685
		} catch (HttpHostConnectException e) {
686
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
687
		}
688
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
689
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
690
		List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
31612 tejbeer 691
		if (webProducts != null) {
692
			List<Integer> webProductsFinal = webProducts;
693
			dealResponse = dealResponse.stream()
694
					.sorted(Comparator.comparing(x -> webProductsFinal.indexOf(x.getCatalogId())))
695
					.collect(Collectors.toList());
696
		}
697
 
31547 tejbeer 698
		return dealResponse;
699
	}
700
 
30669 amit.gupta 701
	@Autowired
702
	private SaholicCISTableRepository saholicCISTableRepository;
703
 
27053 amit.gupta 704
	private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId) throws Exception {
24091 tejbeer 705
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
706
		List<Integer> tagIds = Arrays.asList(4);
26924 amit.gupta 707
		List<Integer> itemIds = new ArrayList<>();
24091 tejbeer 708
		if (docs.length() > 0) {
709
			for (int i = 0; i < docs.length(); i++) {
710
				JSONObject doc = docs.getJSONObject(i);
26589 amit.gupta 711
				if (doc.has("_childDocuments_")) {
26515 amit.gupta 712
					for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
713
						JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
714
						int itemId = childItem.getInt("itemId_i");
26924 amit.gupta 715
						itemIds.add(itemId);
26515 amit.gupta 716
					}
24091 tejbeer 717
				}
718
			}
26924 amit.gupta 719
			if (itemIds.size() == 0) {
26573 amit.gupta 720
				return dealResponse;
721
			}
24091 tejbeer 722
		}
27053 amit.gupta 723
		// get warehouse Id
27030 amit.gupta 724
		int warehouseId = fofoStoreRepository.selectByRetailerId(fofoId).getWarehouseId();
27053 amit.gupta 725
		Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = saholicInventoryService.getSaholicPOItems()
726
				.get(warehouseId);
30123 amit.gupta 727
		List<Integer> catalogIds = new ArrayList<>();
728
		for (int i = 0; i < docs.length(); i++) {
729
			Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
730
			JSONObject doc = docs.getJSONObject(i);
731
			catalogIds.add(doc.getInt("catalogId_i"));
732
		}
30188 amit.gupta 733
		List<CreateOfferRequest> allSchemOffers = null;
30156 amit.gupta 734
		Map<Integer, PriceCircularItemModel> priceCircularItemModelMap = new HashMap<>();
735
		if (catalogIds.size() > 0) {
736
			PriceCircularModel priceCircularModel = priceCircularService.getPriceCircularByOffer(fofoId, catalogIds);
30188 amit.gupta 737
			allSchemOffers = priceCircularModel.getOffers();
27053 amit.gupta 738
 
30156 amit.gupta 739
			List<PriceCircularItemModel> priceCircularItemModels = priceCircularModel.getPriceCircularItemModels();
740
			if (priceCircularItemModels != null) {
30595 tejbeer 741
				priceCircularItemModelMap = priceCircularItemModels.stream()
742
						.collect(Collectors.toMap(x -> x.getCatalogId(), x -> x));
30156 amit.gupta 743
			}
30123 amit.gupta 744
		}
30188 amit.gupta 745
 
31629 tejbeer 746
		List<CatalogFavourite> catalogFavourites = catalogFavouriteRepository.selectBypartnerId(fofoId);
747
		List<Integer> catalogFavouriteIds = new ArrayList<>();
748
		if (!catalogFavourites.isEmpty()) {
749
			catalogFavouriteIds = catalogFavourites.stream().map(x -> x.getCatalogId()).collect(Collectors.toList());
750
		}
751
 
752
		if (!catalogFavourites.isEmpty()) {
753
			catalogFavourites.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> x));
754
		}
755
 
24091 tejbeer 756
		for (int i = 0; i < docs.length(); i++) {
757
			Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
758
			JSONObject doc = docs.getJSONObject(i);
30188 amit.gupta 759
			FofoCatalogResponse fofoCatalogResponse = new FofoCatalogResponse();
760
			fofoCatalogResponse.setCatalogId(doc.getInt("catalogId_i"));
761
			fofoCatalogResponse.setImageUrl(doc.getString("imageUrl_s"));
762
			fofoCatalogResponse.setTitle(doc.getString("title_s"));
30595 tejbeer 763
 
31629 tejbeer 764
			if (catalogFavouriteIds.contains(fofoCatalogResponse.getCatalogId())) {
765
				fofoCatalogResponse.setFavourite(true);
766
			}
767
 
30595 tejbeer 768
			List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers()
769
					.get(fofoCatalogResponse.getCatalogId());
30683 tejbeer 770
 
30617 tejbeer 771
			logger.info("webOffers {}", webOffers);
30595 tejbeer 772
			if (webOffers != null && webOffers.size() > 0) {
30597 tejbeer 773
				fofoCatalogResponse.setWebOffers(webOffers);
31612 tejbeer 774
				fofoCatalogResponse.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
775
 
30595 tejbeer 776
			}
30683 tejbeer 777
 
778
			List<ComboModel> comboModels = comboModelRepository.selectByWarehouseId(warehouseId).stream()
779
					.filter(x -> x.getCatalogId() == fofoCatalogResponse.getCatalogId()).collect(Collectors.toList());
780
 
781
			for (ComboModel comboModel : comboModels) {
782
 
783
				List<ComboMappedModel> mappedModels = comboMappedModelRepository.selectByComboId(comboModel.getId());
784
 
785
				comboModel.setComboMappedModels(mappedModels);
786
 
787
			}
788
 
789
			if (comboModels != null && comboModels.size() > 0) {
790
				fofoCatalogResponse.setComboModels(comboModels);
791
			}
792
 
24117 amit.gupta 793
			try {
30188 amit.gupta 794
				fofoCatalogResponse.setFeature(doc.getString("feature_s"));
24149 amit.gupta 795
			} catch (Exception e) {
30188 amit.gupta 796
				fofoCatalogResponse.setFeature(null);
797
				logger.info("Could not find Feature_s for {}", fofoCatalogResponse.getCatalogId());
24117 amit.gupta 798
			}
31612 tejbeer 799
 
30188 amit.gupta 800
			fofoCatalogResponse.setBrand(doc.getJSONArray("brand_ss").getString(0));
31612 tejbeer 801
			logger.info("labelss {}", doc.has("label_ss"));
802
 
803
			if (doc.has("label_ss")) {
804
				logger.info("label {}", doc.getJSONArray("label_ss"));
805
 
806
				JSONArray arr = doc.getJSONArray("label_ss");
807
				List<String> labels = new ArrayList<String>();
31635 tejbeer 808
				for (int j = 0; j < arr.length(); j++) {
31612 tejbeer 809
					labels.add(arr.getString(j));
810
				}
811
 
812
				fofoCatalogResponse.setLabels(labels);
813
 
814
			}
815
 
26589 amit.gupta 816
			if (doc.has("_childDocuments_")) {
27035 amit.gupta 817
				String modelColorClass = "grey";
27042 amit.gupta 818
				FofoAvailabilityInfo fdiAnyColour = null;
31507 tejbeer 819
				// Iterating itemIds
26515 amit.gupta 820
				for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
30595 tejbeer 821
					PriceCircularItemModel priceCircularItemModel = priceCircularItemModelMap
822
							.get(fofoCatalogResponse.getCatalogId());
26515 amit.gupta 823
					JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
824
					int itemId = childItem.getInt("itemId_i");
825
					float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
31507 tejbeer 826
					if (!fofoAvailabilityInfoMap.containsKey(itemId)) {
26515 amit.gupta 827
						FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
31507 tejbeer 828
						List<SaholicCISTable> currentAvailability = saholicCISTableRepository
829
								.selectByItemWarehouse(itemId, warehouseId);
27869 amit.gupta 830
						List<SaholicPOItem> poItemAvailability = null;
28262 amit.gupta 831
						if (poItemAvailabilityMap != null) {
27869 amit.gupta 832
							poItemAvailability = poItemAvailabilityMap.get(itemId);
833
						}
30175 amit.gupta 834
						fdi.setNlc(priceCircularItemModel == null ? 0 : priceCircularItemModel.getNetPrice());
30686 amit.gupta 835
 
31625 tejbeer 836
						fdi.setNlc(fdi.getNlc() == 0 ? sellingPrice : priceCircularItemModel.getNetPrice());
837
 
30686 amit.gupta 838
						for (SaholicCISTable saholicCISTable : currentAvailability) {
839
							saholicCISTable.setWarehouseName(
840
									ProfitMandiConstants.WAREHOUSE_MAP.get(saholicCISTable.getWarehouseFrom()));
27062 amit.gupta 841
						}
30693 amit.gupta 842
 
843
						Map<Integer, SaholicCISTable> map = currentAvailability.stream()
30686 amit.gupta 844
								.collect(Collectors.toMap(SaholicCISTable::getWarehouseFrom, x -> x));
28262 amit.gupta 845
						if (poItemAvailability != null) {
30686 amit.gupta 846
							for (SaholicPOItem saholicPOItem : poItemAvailability) {
847
								if (map.containsKey(saholicPOItem.getWarehouseFrom())) {
848
									map.get(saholicPOItem.getWarehouseFrom())
849
											.setPopendingQty(saholicPOItem.getUnfulfilledQty());
850
								} else {
30669 amit.gupta 851
									SaholicCISTable saholicCISTable = new SaholicCISTable();
852
									saholicCISTable.setAvailability(0);
853
									saholicCISTable.setReserved(0);
854
									saholicCISTable.setItemId(itemId);
30692 amit.gupta 855
									saholicCISTable.setWarehouseId(warehouseId);
30669 amit.gupta 856
									saholicCISTable.setPopendingQty(saholicPOItem.getUnfulfilledQty());
857
									saholicCISTable.setWarehouseFrom(saholicPOItem.getWarehouseFrom());
31507 tejbeer 858
									saholicCISTable.setWarehouseName(
859
											ProfitMandiConstants.WAREHOUSE_MAP.get(saholicPOItem.getWarehouseFrom()));
30669 amit.gupta 860
									map.put(saholicPOItem.getWarehouseFrom(), saholicCISTable);
27053 amit.gupta 861
								}
862
							}
863
						}
30669 amit.gupta 864
						fdi.setSaholicCISTableList(new ArrayList<>(map.values()));
27042 amit.gupta 865
						String poColor = "grey";
27032 amit.gupta 866
						boolean active = false;
27053 amit.gupta 867
						if (currentAvailability != null && currentAvailability.stream()
30669 amit.gupta 868
								.collect(Collectors.summingInt(SaholicCISTable::getNetAvailability)) > 0) {
27053 amit.gupta 869
							poColor = "green";
870
							modelColorClass = "green";
871
						} else if (poItemAvailability != null && poItemAvailability.stream()
872
								.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty)) > 0) {
873
							if (currentAvailability != null && poItemAvailability.stream()
874
									.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty))
875
									+ currentAvailability.stream()
31507 tejbeer 876
											.collect(Collectors.summingInt(SaholicCISTable::getNetAvailability)) <= 0) {
27042 amit.gupta 877
								poColor = "grey";
27032 amit.gupta 878
							} else {
27040 amit.gupta 879
								poColor = "yellow";
27053 amit.gupta 880
								if (modelColorClass != "green") {
27035 amit.gupta 881
									modelColorClass = poColor;
882
								}
27032 amit.gupta 883
							}
27031 amit.gupta 884
						}
27032 amit.gupta 885
						fdi.setColorClass(poColor);
26889 amit.gupta 886
						fdi.setSellingPrice(sellingPrice);
27031 amit.gupta 887
						fdi.setActive(active);
26889 amit.gupta 888
						fdi.setMrp(childItem.getDouble("mrp_f"));
26515 amit.gupta 889
						fdi.setMop((float) childItem.getDouble("mop_f"));
890
						fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
27042 amit.gupta 891
						if (fdi.getColor().equalsIgnoreCase("any colour")) {
27053 amit.gupta 892
							fdiAnyColour = fdi;
27042 amit.gupta 893
						}
26515 amit.gupta 894
						fdi.setTagId(childItem.getInt("tagId_i"));
895
						fdi.setItem_id(itemId);
30595 tejbeer 896
						Float cashBack = schemeService.getCatalogSchemeCashBack()
897
								.get(fofoCatalogResponse.getCatalogId());
26846 tejbeer 898
						cashBack = cashBack == null ? 0 : cashBack;
26696 amit.gupta 899
						fdi.setCashback(cashBack);
26897 amit.gupta 900
						fdi.setMinBuyQuantity(1);
28268 amit.gupta 901
						if (hotDeal) {
902
							if (currentAvailability != null) {
903
								fdi.setAvailability(currentAvailability.stream()
30669 amit.gupta 904
										.collect(Collectors.summingInt(SaholicCISTable::getNetAvailability)));
28268 amit.gupta 905
							} else {
906
								fdi.setAvailability(0);
907
							}
908
						} else {
30595 tejbeer 909
							// Lets consider that its out of stock
28268 amit.gupta 910
							fdi.setAvailability(100);
911
							Item item = null;
30135 amit.gupta 912
							try {
28268 amit.gupta 913
								item = itemRepository.selectById(itemId);
30135 amit.gupta 914
							} catch (Exception e) {
28268 amit.gupta 915
								e.printStackTrace();
916
								continue;
917
							}
30711 amit.gupta 918
							// In case its tampered glass moq should be
28268 amit.gupta 919
							if (item.getCategoryId() == 10020) {
920
								fdi.setMinBuyQuantity(5);
921
							}
24091 tejbeer 922
						}
26515 amit.gupta 923
						fdi.setQuantityStep(1);
924
						fdi.setMaxQuantity(Math.min(fdi.getAvailability(), 100));
925
						fofoAvailabilityInfoMap.put(itemId, fdi);
24091 tejbeer 926
					}
927
				}
27053 amit.gupta 928
				if (fdiAnyColour != null) {
30444 amit.gupta 929
					fdiAnyColour.setColorClass(modelColorClass);
27042 amit.gupta 930
				}
24091 tejbeer 931
			}
932
			if (fofoAvailabilityInfoMap.values().size() > 0) {
27053 amit.gupta 933
				List<FofoAvailabilityInfo> availabilityList = fofoAvailabilityInfoMap.values().stream()
934
						.sorted(Comparator.comparing(FofoAvailabilityInfo::getAvailability).reversed())
935
						.collect(Collectors.toList());
30188 amit.gupta 936
				fofoCatalogResponse.setItems(availabilityList);
937
				if (priceCircularItemModelMap.containsKey(fofoCatalogResponse.getCatalogId())) {
30595 tejbeer 938
					PriceCircularItemModel priceCircularItemModel = priceCircularItemModelMap
939
							.get(fofoCatalogResponse.getCatalogId());
30193 amit.gupta 940
					if (priceCircularItemModel.getSlabPayouts() != null) {
941
						List<CreateOfferRequest> schemeOffers = new ArrayList<>();
30196 amit.gupta 942
						List<Map<Integer, Long>> slabPayouts = priceCircularItemModel.getSlabPayouts();
943
						Iterator<Map<Integer, Long>> iterator = slabPayouts.iterator();
944
						int iteratorCount = 0;
945
						while (iterator.hasNext()) {
946
							Map<Integer, Long> slabPayoutMap = iterator.next();
947
							if (slabPayoutMap != null) {
948
								schemeOffers.add(allSchemOffers.get(iteratorCount));
30193 amit.gupta 949
							} else {
30196 amit.gupta 950
								iterator.remove();
30193 amit.gupta 951
							}
30198 amit.gupta 952
							iteratorCount++;
30188 amit.gupta 953
						}
30193 amit.gupta 954
						fofoCatalogResponse.setSchemeOffers(schemeOffers);
955
					}
30188 amit.gupta 956
					fofoCatalogResponse.setPriceCircularItemModel(priceCircularItemModel);
957
				}
958
				dealResponse.add(fofoCatalogResponse);
24091 tejbeer 959
			}
27053 amit.gupta 960
		}
961
		return dealResponse;
24091 tejbeer 962
 
963
	}
964
 
25968 amit.gupta 965
	private List<FofoCatalogResponse> getCatalogSingleSkuResponse(JSONArray docs, Map<Integer, Integer> itemFilter,
31507 tejbeer 966
			boolean hotDeal) throws ProfitMandiBusinessException {
25879 amit.gupta 967
		Map<Integer, TagListing> itemTagListingMap = null;
968
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
969
		List<Integer> tagIds = Arrays.asList(4);
26589 amit.gupta 970
 
25968 amit.gupta 971
		itemTagListingMap = tagListingRepository.selectByItemIdsAndTagIds(itemFilter.keySet(), new HashSet<>(tagIds))
972
				.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x));
25880 amit.gupta 973
 
25879 amit.gupta 974
		for (int i = 0; i < docs.length(); i++) {
975
			Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
976
			JSONObject doc = docs.getJSONObject(i);
25880 amit.gupta 977
 
25879 amit.gupta 978
			for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
979
				JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
980
				int itemId = childItem.getInt("itemId_i");
981
				TagListing tl = itemTagListingMap.get(itemId);
26589 amit.gupta 982
				if (tl == null) {
25968 amit.gupta 983
					continue;
984
				}
25879 amit.gupta 985
				if (hotDeal) {
986
					if (!tl.isHotDeals()) {
987
						continue;
988
					}
989
				}
990
				float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
991
				if (fofoAvailabilityInfoMap.containsKey(itemId)) {
992
					if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
993
						fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
994
						fofoAvailabilityInfoMap.get(itemId).setMop((float) childItem.getDouble("mop_f"));
995
					}
996
				} else {
997
					FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
998
					fdi.setSellingPrice((float) childItem.getDouble("sellingPrice_f"));
999
					fdi.setMop((float) childItem.getDouble("mop_f"));
26665 amit.gupta 1000
					fdi.setMop((float) tl.getMrp());
25879 amit.gupta 1001
					fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
1002
					fdi.setTagId(childItem.getInt("tagId_i"));
1003
					fdi.setItem_id(itemId);
1004
					Item item = itemRepository.selectById(itemId);
1005
					// In case its tampered glass moq should be 5
1006
					if (item.getCategoryId() == 10020) {
1007
						fdi.setMinBuyQuantity(10);
1008
					} else {
1009
						fdi.setMinBuyQuantity(1);
1010
					}
26050 amit.gupta 1011
					fdi.setAvailability(itemFilter.get(itemId));
25879 amit.gupta 1012
					fdi.setQuantityStep(1);
1013
					fdi.setMaxQuantity(Math.min(fdi.getAvailability(), 100));
1014
					fofoAvailabilityInfoMap.put(itemId, fdi);
1015
				}
1016
			}
1017
			if (fofoAvailabilityInfoMap.values().size() > 0) {
25880 amit.gupta 1018
				for (FofoAvailabilityInfo fofoAvailabilityInfo : fofoAvailabilityInfoMap.values()) {
25879 amit.gupta 1019
					FofoCatalogResponse ffdr = new FofoCatalogResponse();
1020
					ffdr.setCatalogId(doc.getInt("catalogId_i"));
1021
					ffdr.setImageUrl(doc.getString("imageUrl_s"));
1022
					ffdr.setTitle(doc.getString("title_s"));
1023
					try {
1024
						ffdr.setFeature(doc.getString("feature_s"));
1025
					} catch (Exception e) {
1026
						ffdr.setFeature(null);
1027
						logger.info("Could not find Feature_s for {}", ffdr.getCatalogId());
1028
					}
1029
					ffdr.setBrand(doc.getJSONArray("brand_ss").getString(0));
1030
					ffdr.setItems(Arrays.asList(fofoAvailabilityInfo));
1031
					dealResponse.add(ffdr);
1032
				}
1033
			}
1034
		}
1035
		return dealResponse;
25880 amit.gupta 1036
 
25879 amit.gupta 1037
	}
30683 tejbeer 1038
 
1039
	@RequestMapping(value = "/combo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
1040
	public ResponseEntity<?> getBanners(@RequestParam int catalogId, @RequestParam int warehouseId) {
1041
		List<ComboModel> comboModels = comboModelRepository.selectByCatalogIdAndWarehouseId(catalogId, warehouseId);
1042
		return responseSender.ok(comboModels);
1043
	}
25967 amit.gupta 1044
}