Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
26607 amit.gupta 1
package com.spice.profitmandi.web.controller;
2
 
27025 tejbeer 3
import java.time.LocalDateTime;
26628 amit.gupta 4
import java.time.LocalTime;
27069 tejbeer 5
import java.time.format.DateTimeFormatter;
26607 amit.gupta 6
import java.util.ArrayList;
7
import java.util.Arrays;
28312 amit.gupta 8
import java.util.Comparator;
26607 amit.gupta 9
import java.util.HashMap;
10
import java.util.HashSet;
11
import java.util.List;
12
import java.util.Map;
26745 amit.gupta 13
import java.util.Optional;
26607 amit.gupta 14
import java.util.Set;
15
import java.util.stream.Collectors;
16
 
17
import javax.servlet.http.HttpServletRequest;
28334 amit.gupta 18
import javax.servlet.http.HttpServletResponse;
26607 amit.gupta 19
 
20
import org.apache.commons.lang3.StringUtils;
21
import org.apache.http.conn.HttpHostConnectException;
22
import org.apache.logging.log4j.LogManager;
23
import org.apache.logging.log4j.Logger;
24
import org.json.JSONArray;
25
import org.json.JSONObject;
26
import org.springframework.beans.factory.annotation.Autowired;
27
import org.springframework.beans.factory.annotation.Value;
28
import org.springframework.http.MediaType;
29
import org.springframework.http.ResponseEntity;
30
import org.springframework.stereotype.Controller;
31
import org.springframework.transaction.annotation.Transactional;
26923 amit.gupta 32
import org.springframework.web.bind.annotation.GetMapping;
26662 amit.gupta 33
import org.springframework.web.bind.annotation.PathVariable;
26607 amit.gupta 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;
38
 
39
import com.eclipsesource.json.JsonObject;
26774 amit.gupta 40
import com.fasterxml.jackson.annotation.JsonProperty;
26607 amit.gupta 41
import com.google.gson.Gson;
42
import com.google.gson.reflect.TypeToken;
28377 tejbeer 43
import com.spice.profitmandi.common.enumuration.MessageType;
26607 amit.gupta 44
import com.spice.profitmandi.common.enumuration.SchemeType;
45
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
26923 amit.gupta 46
import com.spice.profitmandi.common.model.CreatePendingOrderItem;
26648 amit.gupta 47
import com.spice.profitmandi.common.model.CreatePendingOrderRequest;
26651 amit.gupta 48
import com.spice.profitmandi.common.model.CustomRetailer;
26607 amit.gupta 49
import com.spice.profitmandi.common.model.ProfitMandiConstants;
28377 tejbeer 50
import com.spice.profitmandi.common.model.SendNotificationModel;
26607 amit.gupta 51
import com.spice.profitmandi.common.model.UserInfo;
52
import com.spice.profitmandi.common.solr.SolrService;
28304 amit.gupta 53
import com.spice.profitmandi.common.util.FormattingUtils;
28405 amit.gupta 54
import com.spice.profitmandi.common.util.Utils;
26607 amit.gupta 55
import com.spice.profitmandi.common.web.client.RestClient;
56
import com.spice.profitmandi.common.web.util.ResponseSender;
57
import com.spice.profitmandi.dao.entity.catalog.Item;
58
import com.spice.profitmandi.dao.entity.catalog.TagListing;
28377 tejbeer 59
import com.spice.profitmandi.dao.entity.dtr.User;
26745 amit.gupta 60
import com.spice.profitmandi.dao.entity.dtr.WebListing;
28374 amit.gupta 61
import com.spice.profitmandi.dao.entity.dtr.WebOffer;
26774 amit.gupta 62
import com.spice.profitmandi.dao.entity.fofo.Customer;
26857 amit.gupta 63
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
28267 amit.gupta 64
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
26855 tejbeer 65
import com.spice.profitmandi.dao.entity.fofo.PendingOrder;
66
import com.spice.profitmandi.dao.entity.fofo.PendingOrderItem;
26715 amit.gupta 67
import com.spice.profitmandi.dao.entity.fofo.PincodePartner;
26630 amit.gupta 68
import com.spice.profitmandi.dao.enumuration.dtr.OtpType;
27045 tejbeer 69
import com.spice.profitmandi.dao.enumuration.transaction.OrderStatus;
26607 amit.gupta 70
import com.spice.profitmandi.dao.model.AddCartRequest;
71
import com.spice.profitmandi.dao.model.CartItem;
72
import com.spice.profitmandi.dao.model.CartItemResponseModel;
73
import com.spice.profitmandi.dao.model.CartResponse;
27045 tejbeer 74
import com.spice.profitmandi.dao.model.CustomerOrderDetail;
26607 amit.gupta 75
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
76
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
28290 tejbeer 77
import com.spice.profitmandi.dao.repository.cs.CsService;
26718 amit.gupta 78
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
27030 amit.gupta 79
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
26745 amit.gupta 80
import com.spice.profitmandi.dao.repository.dtr.WebListingRepository;
28374 amit.gupta 81
import com.spice.profitmandi.dao.repository.dtr.WebOfferRepository;
26745 amit.gupta 82
import com.spice.profitmandi.dao.repository.dtr.WebProductListingRepository;
26607 amit.gupta 83
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
26788 amit.gupta 84
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
26774 amit.gupta 85
import com.spice.profitmandi.dao.repository.fofo.CustomerRepository;
26855 tejbeer 86
import com.spice.profitmandi.dao.repository.fofo.PendingOrderItemRepository;
87
import com.spice.profitmandi.dao.repository.fofo.PendingOrderRepository;
26648 amit.gupta 88
import com.spice.profitmandi.dao.repository.fofo.PendingOrderService;
26715 amit.gupta 89
import com.spice.profitmandi.dao.repository.fofo.PincodePartnerRepository;
26607 amit.gupta 90
import com.spice.profitmandi.dao.repository.inventory.ItemAvailabilityCacheRepository;
26784 amit.gupta 91
import com.spice.profitmandi.service.CustomerService;
28377 tejbeer 92
import com.spice.profitmandi.service.EmailService;
93
import com.spice.profitmandi.service.NotificationService;
26607 amit.gupta 94
import com.spice.profitmandi.service.authentication.RoleManager;
26923 amit.gupta 95
import com.spice.profitmandi.service.inventory.AvailabilityModel;
26607 amit.gupta 96
import com.spice.profitmandi.service.inventory.FofoAvailabilityInfo;
97
import com.spice.profitmandi.service.inventory.FofoCatalogResponse;
26923 amit.gupta 98
import com.spice.profitmandi.service.inventory.InventoryService;
26909 amit.gupta 99
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
26683 amit.gupta 100
import com.spice.profitmandi.service.scheme.SchemeService;
26651 amit.gupta 101
import com.spice.profitmandi.service.user.RetailerService;
26630 amit.gupta 102
import com.spice.profitmandi.web.processor.OtpProcessor;
26607 amit.gupta 103
import com.spice.profitmandi.web.res.DealBrands;
104
import com.spice.profitmandi.web.res.DealObjectResponse;
105
import com.spice.profitmandi.web.res.DealsResponse;
106
import com.spice.profitmandi.web.res.ValidateCartResponse;
28322 amit.gupta 107
import com.spice.profitmandi.web.services.PartnerIndexService;
26607 amit.gupta 108
 
109
import io.swagger.annotations.ApiImplicitParam;
110
import io.swagger.annotations.ApiImplicitParams;
111
import io.swagger.annotations.ApiOperation;
112
 
113
@Controller
114
@Transactional(rollbackFor = Throwable.class)
115
public class StoreController {
116
 
117
	private static final Logger logger = LogManager.getLogger(StoreController.class);
26630 amit.gupta 118
 
26628 amit.gupta 119
	private static final LocalTime CUTOFF_TIME = LocalTime.of(15, 0);
26745 amit.gupta 120
 
121
	private static final List<Integer> TAG_IDS = Arrays.asList(4);
122
 
26788 amit.gupta 123
	@Autowired
124
	CustomerAddressRepository customerAddressRepository;
28392 tejbeer 125
 
28374 amit.gupta 126
	@Autowired
127
	WebOfferRepository webOfferRepository;
26607 amit.gupta 128
 
28315 amit.gupta 129
	@Value("${new.solr.url}")
28314 amit.gupta 130
	private String solrUrl;
28345 tejbeer 131
 
26923 amit.gupta 132
	@Autowired
28322 amit.gupta 133
	private PartnerIndexService partnerIndexService;
28345 tejbeer 134
 
28322 amit.gupta 135
	@Autowired
26923 amit.gupta 136
	InventoryService inventoryService;
27045 tejbeer 137
 
27030 amit.gupta 138
	@Autowired
139
	UserAccountRepository userAccountRepository;
26923 amit.gupta 140
 
26607 amit.gupta 141
	@Value("${python.api.host}")
142
	private String host;
26833 amit.gupta 143
 
26784 amit.gupta 144
	@Autowired
145
	CustomerService customerService;
26607 amit.gupta 146
 
147
	@Value("${python.api.port}")
148
	private int port;
26923 amit.gupta 149
 
26909 amit.gupta 150
	@Autowired
151
	private SaholicInventoryService saholicInventoryService;
26607 amit.gupta 152
 
153
	@Autowired
26715 amit.gupta 154
	private PincodePartnerRepository pincodePartnerRepository;
155
 
156
	@Autowired
26718 amit.gupta 157
	private FofoStoreRepository fofoStoreRepository;
26745 amit.gupta 158
 
26718 amit.gupta 159
	@Autowired
26651 amit.gupta 160
	private RetailerService retailerService;
26861 tejbeer 161
 
26857 amit.gupta 162
	@Autowired
163
	private PendingOrderRepository pendingOrderRepository;
26861 tejbeer 164
 
26857 amit.gupta 165
	@Autowired
166
	private PendingOrderItemRepository pendingOrderItemRepository;
26652 amit.gupta 167
 
26651 amit.gupta 168
	@Autowired
26652 amit.gupta 169
	private PendingOrderService pendingOrderService;
26648 amit.gupta 170
 
171
	@Autowired
26774 amit.gupta 172
	private CustomerRepository customerRepository;
173
 
174
	@Autowired
26607 amit.gupta 175
	private SolrService commonSolrService;
176
 
177
	@Autowired
26630 amit.gupta 178
	private OtpProcessor otpProcessor;
179
 
180
	@Autowired
26607 amit.gupta 181
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
182
 
26609 amit.gupta 183
	@Autowired
26607 amit.gupta 184
	private ResponseSender<?> responseSender;
185
 
186
	@Autowired
187
	private TagListingRepository tagListingRepository;
188
 
189
	@Autowired
190
	private ItemRepository itemRepository;
26701 amit.gupta 191
 
26683 amit.gupta 192
	@Autowired
193
	private SchemeService schemeService;
26607 amit.gupta 194
 
195
	@Autowired
196
	private ItemAvailabilityCacheRepository itemAvailabilityCacheRepository;
197
 
198
	@Autowired
26745 amit.gupta 199
	private WebListingRepository webListingRepository;
200
 
201
	@Autowired
202
	private WebProductListingRepository webProductListingRepository;
203
 
204
	@Autowired
26607 amit.gupta 205
	private RoleManager roleManagerService;
206
 
27028 tejbeer 207
	@Autowired
28304 amit.gupta 208
	EmailService emailService;
27028 tejbeer 209
 
210
	@Autowired
28290 tejbeer 211
	CsService csService;
28339 tejbeer 212
 
28377 tejbeer 213
	@Autowired
214
	private NotificationService notificationService;
215
 
216
	@Autowired
217
	private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
218
 
28339 tejbeer 219
	private static final List<String> offlineOrders = Arrays.asList("EMIOD", "POD");
220
 
26607 amit.gupta 221
	List<String> filterableParams = Arrays.asList("brand");
222
 
26668 amit.gupta 223
	@RequestMapping(value = "/store/entity/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
224
	@ApiImplicitParams({
225
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
226
	@ApiOperation(value = "Get unit deal object")
227
	public ResponseEntity<?> getUnitFocoDeal(HttpServletRequest request, @PathVariable(value = "id") long id)
228
			throws ProfitMandiBusinessException {
28423 amit.gupta 229
		List<FofoCatalogResponse> dealResponses = new ArrayList<>();
26668 amit.gupta 230
		List<Integer> tagIds = Arrays.asList(4);
28423 amit.gupta 231
		FofoCatalogResponse fofoCatalogResponse = null;
26668 amit.gupta 232
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
233
		if (roleManagerService.isPartner(userInfo.getRoleIds())) {
234
			String categoryId = "(3 OR 6)";
26745 amit.gupta 235
 
26668 amit.gupta 236
			RestClient rc = new RestClient();
237
			Map<String, String> params = new HashMap<>();
238
			List<String> mandatoryQ = new ArrayList<>();
239
			String catalogString = "catalog" + id;
26607 amit.gupta 240
 
26668 amit.gupta 241
			mandatoryQ.add(String.format("+(categoryId_i:%s) +(id:%s) +{!parent which=\"id:%s\"} tagId_i:(%s)",
242
					categoryId, catalogString, catalogString, StringUtils.join(tagIds, " ")));
243
 
244
			params.put("q", StringUtils.join(mandatoryQ, " "));
245
			params.put("fl", "*, [child parentFilter=id:catalog*]");
246
			params.put("sort", "rank_i asc, create_s desc");
247
			params.put("wt", "json");
248
			String response = null;
249
			try {
28316 amit.gupta 250
				response = rc.get(SchemeType.HTTP, solrUrl, 8984, "solr/demo/select", params);
26668 amit.gupta 251
			} catch (HttpHostConnectException e) {
252
				throw new ProfitMandiBusinessException("", "", "Could not connect to host");
253
			}
254
			JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
255
			JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
28423 amit.gupta 256
			dealResponses = getCatalogResponse(docs, false, userInfo.getRetailerId());
257
			fofoCatalogResponse = dealResponses.get(0);
258
			fofoCatalogResponse.setWebOffers(webOfferRepository.selectAllActiveOffers().get(fofoCatalogResponse.getCatalogId()));
259
 
26668 amit.gupta 260
		} else {
261
			return responseSender.badRequest(
262
					new ProfitMandiBusinessException("Retailer id", userInfo.getUserId(), "NOT_FOFO_RETAILER"));
263
		}
28423 amit.gupta 264
		return responseSender.ok(dealResponses.get(0));
26668 amit.gupta 265
	}
266
 
26607 amit.gupta 267
	private Object toDealObject(JsonObject jsonObject) {
268
		if (jsonObject.get("dealObject") != null && jsonObject.get("dealObject").asInt() == 1) {
269
			return new Gson().fromJson(jsonObject.toString(), DealObjectResponse.class);
270
		}
271
		return new Gson().fromJson(jsonObject.toString(), DealsResponse.class);
272
	}
273
 
274
	@RequestMapping(value = "/store/brands", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
275
	@ApiImplicitParams({
276
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
277
	@ApiOperation(value = "Get brand list and count for category")
278
	public ResponseEntity<?> getBrands(HttpServletRequest request,
279
			@RequestParam(value = "category_id") String category_id) throws ProfitMandiBusinessException {
280
		logger.info("Request " + request.getParameterMap());
281
		String response = null;
282
		// TODO: move to properties
283
		String uri = ProfitMandiConstants.URL_BRANDS;
284
		RestClient rc = new RestClient();
285
		Map<String, String> params = new HashMap<>();
286
		params.put("category_id", category_id);
287
		List<DealBrands> dealBrandsResponse = null;
288
		try {
289
			response = rc.get(SchemeType.HTTP, host, port, uri, params);
290
		} catch (HttpHostConnectException e) {
291
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
292
		}
293
 
294
		dealBrandsResponse = new Gson().fromJson(response, new TypeToken<List<DealBrands>>() {
295
		}.getType());
296
 
297
		return responseSender.ok(dealBrandsResponse);
298
	}
299
 
26745 amit.gupta 300
	@RequestMapping(value = "/store/listing/{listingUrl}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
301
	public ResponseEntity<?> bestSellers(HttpServletRequest request, @PathVariable String listingUrl) throws Exception {
26909 amit.gupta 302
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
28287 amit.gupta 303
		WebListing webListing = webListingRepository.selectByUrl(listingUrl);
304
		webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
26745 amit.gupta 305
		return responseSender.ok(webListing);
26654 amit.gupta 306
	}
307
 
26632 amit.gupta 308
	@RequestMapping(value = "/store/otp/generateOTP", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
26783 amit.gupta 309
	public ResponseEntity<?> generateOtp(HttpServletRequest request, @RequestParam String mobile) throws Exception {
26630 amit.gupta 310
 
26857 amit.gupta 311
		return responseSender.ok(otpProcessor.generateOtp(mobile, OtpType.REGISTRATION));
26630 amit.gupta 312
 
313
	}
26652 amit.gupta 314
 
26784 amit.gupta 315
	@RequestMapping(value = "/store/checkmobile/{mobile}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
26833 amit.gupta 316
	public ResponseEntity<?> checkRegistrationUsingMobile(HttpServletRequest request, @PathVariable String mobile)
317
			throws Exception {
26774 amit.gupta 318
		try {
319
			Customer customer = customerRepository.selectByMobileNumber(mobile);
26777 amit.gupta 320
			customer.setPasswordExist(StringUtils.isNotEmpty(customer.getPassword()));
26774 amit.gupta 321
			return responseSender.ok(new CustomerModel(true, customer));
322
		} catch (Exception e) {
323
			return responseSender.ok(new CustomerModel(false, null));
324
		}
325
	}
26833 amit.gupta 326
 
26784 amit.gupta 327
	@RequestMapping(value = "/store/signin", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
328
	public ResponseEntity<?> signIn(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
26833 amit.gupta 329
		if (customerService.authenticate(userModel.getMobile(), userModel.getPassword())) {
26784 amit.gupta 330
			return responseSender.ok(true);
331
		} else {
332
			return responseSender.ok(false);
333
		}
334
	}
26923 amit.gupta 335
 
26841 amit.gupta 336
	@RequestMapping(value = "/store/resetPassword", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
26923 amit.gupta 337
	public ResponseEntity<?> resetPassword(HttpServletRequest request, @RequestBody UserModel userModel)
338
			throws Exception {
26843 amit.gupta 339
		customerService.changePassword(userModel.getMobile(), userModel.getPassword());
26841 amit.gupta 340
		return responseSender.ok(true);
341
	}
26774 amit.gupta 342
 
26857 amit.gupta 343
	@RequestMapping(value = "/store/register", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
344
	public ResponseEntity<?> register(HttpServletRequest request, @RequestBody UserModel userModel) throws Exception {
345
		Customer customer = new Customer();
346
		customer.setPassword(userModel.getPassword());
347
		customer.setEmailId(userModel.getEmail());
348
		customer.setFirstName(userModel.getFirstName());
349
		customer.setLastName(userModel.getLastName());
350
		customer.setMobileNumber(userModel.getMobile());
351
		return responseSender.ok(customerService.addCustomer(customer));
352
	}
353
 
26648 amit.gupta 354
	@RequestMapping(value = "/store/confirmOrder", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
26857 amit.gupta 355
	public ResponseEntity<?> confirmOrder(HttpServletRequest request,
26652 amit.gupta 356
			@RequestBody CreatePendingOrderRequest createPendingOrderRequest) throws Exception {
26648 amit.gupta 357
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
358
		Integer storeId = userInfo.getRetailerId();
359
		createPendingOrderRequest.setFofoId(storeId);
26923 amit.gupta 360
		List<CreatePendingOrderItem> pendingOrderItems = createPendingOrderRequest.getCreatePendingOrderItem();
361
		List<CartItem> cartItems = new ArrayList<>();
362
		pendingOrderItems.stream().forEach(x -> {
363
			CartItem ci = new CartItem();
364
			ci.setItemId(x.getItemId());
365
			ci.setQuantity(x.getQuantity());
366
			ci.setSellingPrice(x.getSellingPrice());
367
			cartItems.add(ci);
368
		});
369
		CartResponse cr = this.validateCart(storeId, cartItems);
370
		if (cr.getCartMessageChanged() > 0 || cr.getTotalAmount() != createPendingOrderRequest.getTotalAmount()) {
371
			return responseSender.badRequest("Invalid request");
372
		}
26652 amit.gupta 373
 
27028 tejbeer 374
		Map<String, String> returnMap = this.pendingOrderService.createPendingOrder(createPendingOrderRequest, cr);
375
 
28339 tejbeer 376
		PendingOrder pendingOrder = pendingOrderRepository.selectById(Integer.parseInt(returnMap.get("poId")));
377
		if (offlineOrders.contains(pendingOrder.getPayMethod())) {
378
 
379
			Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(pendingOrder);
380
 
381
			CustomRetailer customRetailer = retailerService.getFofoRetailer(pendingOrder.getFofoId());
382
			Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
383
			String[] customerEmail = null;
28405 amit.gupta 384
			if (Utils.validateEmail(customer.getEmailId())) {
28339 tejbeer 385
				customerEmail = new String[] { customer.getEmailId() };
386
			}
28377 tejbeer 387
 
28339 tejbeer 388
			List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
389
					"hemant.kaura@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
28436 tejbeer 390
					"tejbeer.kaur@shop2020.in","devkinandan.lal@smartdukaan.com", customRetailer.getEmail());
28377 tejbeer 391
 
28339 tejbeer 392
			List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
393
			if (authUserEmails != null) {
394
				authUserEmails = new ArrayList<>();
395
			}
396
			logger.info("authUserEmails {}", authUserEmails);
397
			authUserEmails.addAll(bccTo);
28374 amit.gupta 398
			StringBuffer itemBuffer = new StringBuffer();
399
			List<PendingOrderItem> orderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
400
			int totalItems = 0;
401
			String itemNoColor = null;
402
			float maxValue = 0;
28391 tejbeer 403
			for (PendingOrderItem orderItem : orderItems) {
404
				if (maxValue < orderItem.getSellingPrice()) {
28374 amit.gupta 405
					maxValue = orderItem.getSellingPrice();
406
					itemNoColor = itemRepository.selectById(orderItem.getItemId()).getItemDescriptionNoColor();
407
				}
408
				totalItems += orderItem.getQuantity();
409
			}
28391 tejbeer 410
			if (totalItems > 1) {
28374 amit.gupta 411
				itemBuffer.append(StringUtils.abbreviate(itemNoColor, 22));
28391 tejbeer 412
				itemBuffer.append(" +").append(totalItems - 1).append(" items");
28374 amit.gupta 413
			} else {
414
				itemBuffer.append(StringUtils.abbreviate(itemNoColor, 30));
415
			}
28400 tejbeer 416
			String message = String.format(OtpProcessor.TEMPLATE_ORDER_CREATED, pendingOrder.getId(),
417
					itemBuffer.toString(), pendingOrder.getTotalAmount());
418
			otpProcessor.sendSms(OtpProcessor.TEMPLATE_ORDER_CREATED_ID, message, customer.getMobileNumber());
28391 tejbeer 419
 
28400 tejbeer 420
			emailService.sendMailWithAttachments("Order Created with SmartDukaan", "order-confirm.vm", emailModel,
421
					customerEmail, null, bccTo.toArray(new String[0]));
422
 
28402 tejbeer 423
			List<String> emailIds = csService.getAuthUserIdByPartnerId(customRetailer.getPartnerId()).stream()
424
					.map(x -> x.getEmailId()).collect(Collectors.toList());
425
			emailIds.add("tarun.verma@smartdukaan.com");
28436 tejbeer 426
			emailIds.add("devkinandan.lal@smartdukaan.com");
28402 tejbeer 427
			emailIds.add("tejbeer.kaur@shop2020.in");
428
			List<User> user = dtrUserRepository.selectAllByEmailIds(emailIds);
28377 tejbeer 429
			List<Integer> userIds = user.stream().map(x -> x.getId()).collect(Collectors.toList());
28394 tejbeer 430
 
431
			logger.info("userIds" + userIds);
28397 tejbeer 432
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
28377 tejbeer 433
			sendNotificationModel.setCampaignName("Online Order Alert");
434
			sendNotificationModel.setTitle("Online Order Update");
28391 tejbeer 435
			sendNotificationModel.setMessage(String.format(
436
					"You have new Online Order. Please check your Dashboard. In case of an activation scheme pls ensure the handset is activated, payout will be processed as per brand's activation report."));
28377 tejbeer 437
			sendNotificationModel.setType("url");
438
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
439
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
440
			sendNotificationModel.setMessageType(MessageType.notification);
441
			int userId = userAccountRepository.selectUserIdByRetailerId(pendingOrder.getFofoId());
442
			sendNotificationModel.setUserIds(Arrays.asList(userId));
28397 tejbeer 443
			notificationService.sendNotification(sendNotificationModel);
28377 tejbeer 444
 
28394 tejbeer 445
			SendNotificationModel snm = new SendNotificationModel();
446
			snm.setCampaignName("Online Order Alert");
447
			snm.setTitle("Online Order Update");
448
			snm.setMessage(String.format("Your Partner " + customRetailer.getBusinessName()
28393 tejbeer 449
					+ " have new Online Order. Please inform your partner. In case of an activation scheme pls ensure the handset is activated, payout will be processed as per brand's activation report."));
28394 tejbeer 450
			snm.setType("url");
451
			snm.setUrl("https://app.smartdukaan.com/pages/home/notifications");
452
			snm.setExpiresat(LocalDateTime.now().plusDays(1));
453
			snm.setMessageType(MessageType.notification);
454
			snm.setUserIds(userIds);
455
			notificationService.sendNotification(snm);
28377 tejbeer 456
 
28339 tejbeer 457
		}
27028 tejbeer 458
		return responseSender.ok(returnMap);
459
 
26648 amit.gupta 460
	}
26630 amit.gupta 461
 
26857 amit.gupta 462
	@RequestMapping(value = "/store/address", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
463
	@ApiImplicitParams({
464
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
465
	@ApiOperation(value = "Get brand list and count for category")
466
	public ResponseEntity<?> getAddress(HttpServletRequest request) throws Exception {
467
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
468
		Integer storeId = userInfo.getRetailerId();
469
		CustomRetailer customRetailer = retailerService.getFofoRetailer(storeId);
470
 
471
		return responseSender.ok(customRetailer.getAddress());
472
 
473
	}
474
 
475
	@RequestMapping(value = "/store/address/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
476
	@ApiImplicitParams({
477
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
478
	@ApiOperation(value = "Get brand list and count for category")
479
	public ResponseEntity<?> getStoresByPincode(HttpServletRequest request, @PathVariable String pincode)
480
			throws Exception {
481
		List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
28321 amit.gupta 482
		int fofoId = ProfitMandiConstants.DEFAULT_STORE;
26857 amit.gupta 483
		if (pincodePartners.size() > 0) {
28287 amit.gupta 484
			List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
28267 amit.gupta 485
			List<FofoStore> fofoStores = fofoStoreRepository.selectActivePartnersByRetailerIds(fofoIds);
28287 amit.gupta 486
			if (fofoStores.size() > 0) {
28267 amit.gupta 487
				fofoId = fofoStores.get(0).getId();
488
			}
28287 amit.gupta 489
 
26857 amit.gupta 490
		}
491
		return responseSender.ok(fofoStoreRepository.selectByRetailerId(fofoId).getCode());
492
	}
26923 amit.gupta 493
 
28298 tejbeer 494
	@RequestMapping(value = "/store/address/detail/{pincode}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
495
	@ApiImplicitParams({
496
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
497
	@ApiOperation(value = "Get brand list and count for category")
498
	public ResponseEntity<?> getStoresDetailsByPincode(HttpServletRequest request, @PathVariable String pincode)
499
			throws Exception {
500
		List<CustomRetailer> customerRetailers = new ArrayList<>();
501
		List<PincodePartner> pincodePartners = pincodePartnerRepository.selectPartnersByPincode(pincode);
502
 
503
		if (!pincodePartners.isEmpty()) {
504
			List<Integer> fofoIds = pincodePartners.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
505
			List<Integer> activefofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream()
506
					.filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
507
			Map<Integer, CustomRetailer> customerRetailerMap = retailerService.getFofoRetailers(activefofoIds);
508
			customerRetailers.addAll(customerRetailerMap.values());
509
		}
510
 
511
		logger.info("customerRetailers" + customerRetailers);
512
		return responseSender.ok(customerRetailers);
513
	}
514
 
26855 tejbeer 515
	@RequestMapping(value = "/store/order", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
516
	public ResponseEntity<?> getOrderDetail(HttpServletRequest request, @RequestParam(value = "id") int id,
27049 tejbeer 517
			@RequestParam(name = "offset") int offset, @RequestParam(name = "limit") int limit) throws Exception {
26855 tejbeer 518
		List<CustomerOrderDetail> customerOrderDetails = new ArrayList<>();
27049 tejbeer 519
		List<Integer> catalogIds = new ArrayList<>();
26855 tejbeer 520
		List<PendingOrder> pendingOrders = pendingOrderRepository.selectByCustomerId(id, offset, limit);
521
		if (!pendingOrders.isEmpty()) {
522
			for (PendingOrder po : pendingOrders) {
523
				List<PendingOrderItem> pois = pendingOrderItemRepository.selectByOrderId(po.getId());
27049 tejbeer 524
				for (PendingOrderItem pendingOrderItem : pois) {
525
					Item item = itemRepository.selectById(pendingOrderItem.getItemId());
526
					pendingOrderItem.setItemName(item.getItemDescription());
527
					catalogIds.add(item.getCatalogItemId());
528
				}
529
 
530
				Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
531
 
26855 tejbeer 532
				for (PendingOrderItem poi : pois) {
533
 
534
					CustomerOrderDetail customerOrderDetail = new CustomerOrderDetail();
535
 
536
					Item item = itemRepository.selectById(poi.getItemId());
27049 tejbeer 537
					JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
538
					customerOrderDetail.setImageUrl(jsonObj.getString("imageUrl_s"));
26855 tejbeer 539
					customerOrderDetail.setBrand(item.getBrand());
540
					customerOrderDetail.setColor(item.getColor());
27056 tejbeer 541
					customerOrderDetail.setPendingOrderItemId(poi.getId());
26855 tejbeer 542
					customerOrderDetail.setId(poi.getOrderId());
543
					customerOrderDetail.setItemId(poi.getItemId());
544
					customerOrderDetail.setModelName(item.getModelName());
545
					customerOrderDetail.setModelNumber(item.getModelNumber());
546
					customerOrderDetail.setQuantity(poi.getQuantity());
27045 tejbeer 547
					customerOrderDetail.setBilledTimestamp(poi.getBilledTimestamp());
548
					customerOrderDetail.setStatus(poi.getStatus());
26855 tejbeer 549
					customerOrderDetail.setTotalPrice(poi.getSellingPrice());
550
					customerOrderDetail.setPayMethod(po.getPayMethod());
26861 tejbeer 551
					customerOrderDetail.setCreatedTimeStamp(po.getCreateTimestamp());
26855 tejbeer 552
					customerOrderDetails.add(customerOrderDetail);
553
				}
554
			}
555
		}
556
 
557
		return responseSender.ok(customerOrderDetails);
558
	}
559
 
26745 amit.gupta 560
	@RequestMapping(value = "/store/listing", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
26774 amit.gupta 561
	public ResponseEntity<?> getStoresListing(HttpServletRequest request) throws Exception {
26745 amit.gupta 562
		List<WebListing> webListings = webListingRepository.selectAllWebListing(Optional.of(true));
28287 amit.gupta 563
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
26745 amit.gupta 564
		for (WebListing webListing : webListings) {
28287 amit.gupta 565
			webListing.setFofoCatalogResponses(getDealResponses(userInfo, webListing));
26745 amit.gupta 566
		}
567
		return responseSender.ok(webListings);
568
	}
569
 
28287 amit.gupta 570
	private List<FofoCatalogResponse> getDealResponses(UserInfo userInfo, WebListing webListing)
571
			throws ProfitMandiBusinessException {
572
		List<Integer> webProducts = webProductListingRepository.selectAllByWebListingId(webListing.getId()).stream()
573
				.filter(x -> x.getRank() > 0).map(x -> x.getEntityId()).collect(Collectors.toList());
574
		if (webProducts.size() == 0) {
575
			return new ArrayList<>();
576
		}
577
		RestClient rc = new RestClient();
578
		Map<String, String> params = new HashMap<>();
579
		List<String> mandatoryQ = new ArrayList<>();
580
		mandatoryQ.add(String.format(
581
				"+{!parent which=\"catalogId_i:" + StringUtils.join(webProducts, " ") + "\"} tagId_i:(%s)",
582
				StringUtils.join(TAG_IDS, " ")));
583
		params.put("q", StringUtils.join(mandatoryQ, " "));
584
		params.put("fl", "*, [child parentFilter=id:catalog*]");
585
		// params.put("sort", "create_s desc");
586
		params.put("start", String.valueOf(0));
587
		params.put("rows", String.valueOf(100));
588
		params.put("wt", "json");
589
		String response = null;
590
		try {
591
			response = rc.get(SchemeType.HTTP, "50.116.10.120", 8984, "solr/demo/select", params);
592
		} catch (HttpHostConnectException e) {
593
			throw new ProfitMandiBusinessException("", "", "Could not connect to host");
594
		}
595
		JSONObject solrResponseJSONObj = new JSONObject(response).getJSONObject("response");
596
		JSONArray docs = solrResponseJSONObj.getJSONArray("docs");
597
		List<FofoCatalogResponse> dealResponse = getCatalogResponse(docs, false, userInfo.getRetailerId());
598
		return dealResponse;
599
	}
600
 
26652 amit.gupta 601
	@RequestMapping(value = "/store/cart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
602
	@ApiImplicitParams({
26651 amit.gupta 603
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
26652 amit.gupta 604
	@ApiOperation(value = "Get brand list and count for category")
605
	public ResponseEntity<?> cart(HttpServletRequest request, @RequestBody AddCartRequest cartRequest)
606
			throws Exception {
26923 amit.gupta 607
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
608
		Integer storeId = userInfo.getRetailerId();
609
		ValidateCartResponse vc = new ValidateCartResponse(this.validateCart(storeId, cartRequest.getCartItems()),
610
				"Success", "Items added to cart successfully");
611
		return responseSender.ok(vc);
612
	}
613
 
614
	// Validate Cart for B2C Customers
615
	private CartResponse validateCart(int storeId, List<CartItem> cartItems) throws Exception {
616
		cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
617
		List<Integer> itemIds = cartItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
618
		Map<Integer, AvailabilityModel> inventoryItemAvailabilityMap = inventoryService.getStoreAndOurStock(storeId,
619
				itemIds);
26607 amit.gupta 620
		CartResponse cartResponse = new CartResponse();
26612 amit.gupta 621
		List<CartItemResponseModel> cartItemResponseModels = new ArrayList<>();
622
		cartResponse.setCartItems(cartItemResponseModels);
26607 amit.gupta 623
		Set<Integer> itemsIdsSet = new HashSet<>(itemIds);
26668 amit.gupta 624
		logger.info("Store Id {}, Item Ids {}", storeId, itemsIdsSet);
26607 amit.gupta 625
 
626
		Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemsIdsSet).stream()
627
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
628
 
26923 amit.gupta 629
		Map<Integer, TagListing> tagListingMap = tagListingRepository
26607 amit.gupta 630
				.selectByItemIdsAndTagIds(new HashSet<>(itemIds), new HashSet<>(Arrays.asList(4))).stream()
631
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x));
632
 
633
		List<Integer> catalogIds = itemsMap.values().stream().map(x -> x.getCatalogItemId())
634
				.collect(Collectors.toList());
635
 
636
		Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
637
 
638
		// cartResponse.getCartItems()
26923 amit.gupta 639
		int cartMessageChanged = 0;
640
		int cartMessageOOS = 0;
641
		int totalAmount = 0;
642
		int totalQty = 0;
643
		for (CartItem cartItem : cartItems) {
26607 amit.gupta 644
			Item item = itemsMap.get(cartItem.getItemId());
26923 amit.gupta 645
			TagListing tagListing = tagListingMap.get(cartItem.getItemId());
646
			Float cashback = schemeService.getItemSchemeCashBack().get(cartItem.getItemId());
647
			cashback = cashback == null ? 0 : cashback;
648
			float itemSellingPrice = tagListing.getMop() - cashback;
26607 amit.gupta 649
			CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
26923 amit.gupta 650
			cartItemResponseModel.setSellingPrice(cartItem.getSellingPrice());
651
			if (itemSellingPrice != cartItem.getSellingPrice()) {
652
				cartItemResponseModel.setSellingPrice(itemSellingPrice);
653
				cartMessageChanged++;
654
			}
26628 amit.gupta 655
			int estimate = -2;
27025 tejbeer 656
			LocalDateTime promiseDeliveryTime = LocalDateTime.now();
26923 amit.gupta 657
			int qtyRequired = (int) cartItem.getQuantity();
658
			AvailabilityModel availabilityModel = inventoryItemAvailabilityMap.get(cartItem.getItemId());
659
			cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
660
			if (availabilityModel.getStoreAvailability() >= qtyRequired) {
661
				estimate = 0;
662
			} else if (availabilityModel.getWarehouseAvailability() >= qtyRequired) {
26628 amit.gupta 663
				estimate = 2;
26923 amit.gupta 664
			} else if (availabilityModel.getStoreAvailability() > 0) {
665
				estimate = 0;
666
				qtyRequired = availabilityModel.getStoreAvailability();
667
				cartMessageChanged++;
668
			} else if (availabilityModel.getWarehouseAvailability() > 0) {
669
				qtyRequired = availabilityModel.getWarehouseAvailability();
670
				estimate = 2;
671
				cartMessageChanged++;
26620 amit.gupta 672
			} else {
26923 amit.gupta 673
				qtyRequired = 0;
26926 amit.gupta 674
				cartMessageChanged++;
26607 amit.gupta 675
			}
26923 amit.gupta 676
			cartItemResponseModel.setQuantity(qtyRequired);
26630 amit.gupta 677
			if (estimate >= 0 && LocalTime.now().isAfter(CUTOFF_TIME)) {
26628 amit.gupta 678
				estimate = estimate + 1;
27025 tejbeer 679
				promiseDeliveryTime = promiseDeliveryTime.plusDays(3);
26628 amit.gupta 680
			}
26923 amit.gupta 681
			totalQty += qtyRequired;
682
			totalAmount += qtyRequired * itemSellingPrice;
26628 amit.gupta 683
			cartItemResponseModel.setEstimate(estimate);
26616 amit.gupta 684
			cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
26614 amit.gupta 685
			cartItemResponseModel.setItemId(cartItem.getItemId());
26615 amit.gupta 686
			cartItemResponseModel.setMinBuyQuantity(1);
26923 amit.gupta 687
			cartItemResponseModel.setQuantity(qtyRequired);
26621 amit.gupta 688
			cartItemResponseModel.setQuantityStep(1);
27025 tejbeer 689
			cartItemResponseModel.setPromiseDelivery(promiseDeliveryTime);
26923 amit.gupta 690
			cartItemResponseModel.setMaxQuantity(availabilityModel.getMaxAvailability());
26607 amit.gupta 691
			cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
692
			cartItemResponseModel.setImageUrl(contentMap.get(item.getCatalogItemId()).getString("imageUrl_s"));
693
			cartItemResponseModel.setColor(item.getColor());
26620 amit.gupta 694
			cartItemResponseModels.add(cartItemResponseModel);
26607 amit.gupta 695
		}
26923 amit.gupta 696
		cartResponse.setCartItems(cartItemResponseModels);
697
		cartResponse.setCartMessageChanged(cartMessageChanged);
698
		cartResponse.setCartMessageOOS(cartMessageOOS);
699
		int maxEstimate = cartItemResponseModels.stream().mapToInt(x -> x.getEstimate()).max().getAsInt();
700
		cartResponse.setMaxEstimate(maxEstimate);
701
		cartResponse.setTotalAmount(totalAmount);
702
		cartResponse.setTotalQty(totalQty);
26652 amit.gupta 703
 
26923 amit.gupta 704
		return cartResponse;
705
 
26648 amit.gupta 706
	}
26607 amit.gupta 707
 
27030 amit.gupta 708
	@RequestMapping(value = "/store/partnerStock", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
709
	public ResponseEntity<?> partnerStock(HttpServletRequest request,
710
			@RequestParam(value = "categoryId", required = false, defaultValue = "3") String categoryId,
711
			@RequestParam(value = "offset") String offset, @RequestParam(value = "limit") String limit,
712
			@RequestParam(value = "sort", required = false) String sort,
713
			@RequestParam(value = "brand", required = false) String brand,
714
			@RequestParam(value = "subCategoryId", required = false) int subCategoryId,
715
			@RequestParam(value = "q", required = false) String queryTerm,
28287 amit.gupta 716
			@RequestParam(required = false) String listing,
717
			@RequestParam(required = false, defaultValue = "true") boolean partnerStockOnly) throws Throwable {
27030 amit.gupta 718
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
719
		UserInfo userInfo = (UserInfo) request.getAttribute("userInfo");
28269 amit.gupta 720
		FofoStore fs = fofoStoreRepository.selectByRetailerId(userInfo.getRetailerId());
721
		sort = "w" + fs.getWarehouseId() + "_i desc";
27045 tejbeer 722
		dealResponse = this.getCatalogResponse(
28314 amit.gupta 723
				commonSolrService.getSolrDocs(queryTerm, categoryId, offset, limit, sort, brand, subCategoryId, false),
724
				false, userInfo.getRetailerId());
27030 amit.gupta 725
		return responseSender.ok(dealResponse);
726
	}
727
 
26909 amit.gupta 728
	private List<FofoCatalogResponse> getCatalogResponse(JSONArray docs, boolean hotDeal, int fofoId)
26607 amit.gupta 729
			throws ProfitMandiBusinessException {
26909 amit.gupta 730
		Map<Integer, Integer> ourItemAvailabilityMap = null;
731
		Map<Integer, Integer> partnerStockAvailabilityMap = null;
26607 amit.gupta 732
		List<FofoCatalogResponse> dealResponse = new ArrayList<>();
733
		List<Integer> tagIds = Arrays.asList(4);
734
		if (docs.length() > 0) {
735
			HashSet<Integer> itemsSet = new HashSet<>();
736
			for (int i = 0; i < docs.length(); i++) {
737
				JSONObject doc = docs.getJSONObject(i);
738
				if (doc.has("_childDocuments_")) {
739
					for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
740
						JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
741
						int itemId = childItem.getInt("itemId_i");
742
						itemsSet.add(itemId);
743
					}
744
				}
745
			}
746
			if (itemsSet.size() == 0) {
747
				return dealResponse;
748
			}
28269 amit.gupta 749
			if (fofoId > 0) {
26909 amit.gupta 750
				partnerStockAvailabilityMap = currentInventorySnapshotRepository.selectItemsStock(fofoId).stream()
751
						.collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
752
			}
28287 amit.gupta 753
			ourItemAvailabilityMap = saholicInventoryService.getTotalAvailabilityByItemIds(new ArrayList<>(itemsSet));
26607 amit.gupta 754
		}
755
 
756
		for (int i = 0; i < docs.length(); i++) {
757
			Map<Integer, FofoAvailabilityInfo> fofoAvailabilityInfoMap = new HashMap<>();
758
			JSONObject doc = docs.getJSONObject(i);
759
			FofoCatalogResponse ffdr = new FofoCatalogResponse();
760
			ffdr.setCatalogId(doc.getInt("catalogId_i"));
761
			ffdr.setImageUrl(doc.getString("imageUrl_s"));
762
			ffdr.setTitle(doc.getString("title_s"));
28374 amit.gupta 763
			List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(ffdr.getCatalogId());
28391 tejbeer 764
			if (webOffers != null && webOffers.size() > 0) {
28428 amit.gupta 765
				ffdr.setOffers(webOffers.stream().map(x -> x.getTitle()).collect(Collectors.toList()));
28374 amit.gupta 766
			}
26607 amit.gupta 767
			try {
768
				ffdr.setFeature(doc.getString("feature_s"));
769
			} catch (Exception e) {
770
				ffdr.setFeature(null);
771
			}
772
			ffdr.setBrand(doc.getJSONArray("brand_ss").getString(0));
773
			if (doc.has("_childDocuments_")) {
774
				for (int j = 0; j < doc.getJSONArray("_childDocuments_").length(); j++) {
775
					JSONObject childItem = doc.getJSONArray("_childDocuments_").getJSONObject(j);
776
					int itemId = childItem.getInt("itemId_i");
777
					float sellingPrice = (float) childItem.getDouble("sellingPrice_f");
778
					if (fofoAvailabilityInfoMap.containsKey(itemId)) {
779
						if (fofoAvailabilityInfoMap.get(itemId).getSellingPrice() > sellingPrice) {
780
							fofoAvailabilityInfoMap.get(itemId).setSellingPrice(sellingPrice);
781
							fofoAvailabilityInfoMap.get(itemId).setMop((float) childItem.getDouble("mop_f"));
782
						}
783
					} else {
784
						FofoAvailabilityInfo fdi = new FofoAvailabilityInfo();
26909 amit.gupta 785
						fdi.setSellingPrice(sellingPrice);
786
						fdi.setMrp(childItem.getDouble("mrp_f"));
26607 amit.gupta 787
						fdi.setMop((float) childItem.getDouble("mop_f"));
788
						fdi.setColor(childItem.has("color_s") ? childItem.getString("color_s") : "");
789
						fdi.setTagId(childItem.getInt("tagId_i"));
790
						fdi.setItem_id(itemId);
26909 amit.gupta 791
						Float cashBack = schemeService.getItemSchemeCashBack().get(itemId);
792
						cashBack = cashBack == null ? 0 : cashBack;
28391 tejbeer 793
						// TODO:Dont commit
794
						// fdi.setCashback(Math.min(100, fdi.getMop()));
28405 amit.gupta 795
						fdi.setCashback(cashBack);
26673 amit.gupta 796
						fdi.setMinBuyQuantity(1);
28313 amit.gupta 797
						int partnerAvailability = partnerStockAvailabilityMap.get(itemId) == null ? 0
798
								: partnerStockAvailabilityMap.get(itemId);
28287 amit.gupta 799
						int ourStockAvailability = ourItemAvailabilityMap.get(itemId) == null ? 0
800
								: Math.max(0, ourItemAvailabilityMap.get(itemId));
28313 amit.gupta 801
						fdi.setActive(partnerAvailability > 0);
28426 amit.gupta 802
						//fdi.setActive(true);
28287 amit.gupta 803
						fdi.setAvailability(Math.min(5, ourStockAvailability + partnerAvailability));
26607 amit.gupta 804
						fdi.setQuantityStep(1);
28269 amit.gupta 805
						fdi.setMaxQuantity(fdi.getAvailability());
26607 amit.gupta 806
						fofoAvailabilityInfoMap.put(itemId, fdi);
807
					}
808
				}
809
			}
810
			if (fofoAvailabilityInfoMap.values().size() > 0) {
28313 amit.gupta 811
				ffdr.setItems(fofoAvailabilityInfoMap.values().stream()
812
						.sorted(Comparator.comparing(FofoAvailabilityInfo::isActive, Comparator.reverseOrder())
813
								.thenComparingInt(y -> -y.getAvailability()))
814
						.collect(Collectors.toList()));
26607 amit.gupta 815
				dealResponse.add(ffdr);
816
			}
817
		}
28314 amit.gupta 818
		return dealResponse.stream()
819
				.sorted(Comparator
820
						.comparing(FofoCatalogResponse::getItems,
821
								(s1, s2) -> (s2.get(0).isActive() ? 1 : 0) - (s1.get(0).isActive() ? 1 : 0))
822
						.thenComparing(FofoCatalogResponse::getItems,
823
								(x, y) -> y.get(0).getAvailability() - x.get(0).getAvailability()))
824
				.collect(Collectors.toList());
26607 amit.gupta 825
	}
26923 amit.gupta 826
 
827
	@GetMapping(value = "store/order-status/{pendingOrderId}")
27028 tejbeer 828
	public ResponseEntity<?> orderStatus(HttpServletRequest request, @PathVariable int pendingOrderId)
829
			throws Exception {
26923 amit.gupta 830
		PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
831
		List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(pendingOrder.getId());
832
		List<Integer> catalogIds = new ArrayList<>();
27028 tejbeer 833
		for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
26923 amit.gupta 834
			Item item = itemRepository.selectById(pendingOrderItem.getItemId());
835
			pendingOrderItem.setItemName(item.getItemDescription());
836
			catalogIds.add(item.getCatalogItemId());
837
		}
838
		Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
27028 tejbeer 839
		for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
26923 amit.gupta 840
			Item item = itemRepository.selectById(pendingOrderItem.getItemId());
841
			JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
842
			pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
843
		}
844
		pendingOrder.setPendingOrderItems(pendingOrderItems);
27069 tejbeer 845
 
26923 amit.gupta 846
		return responseSender.ok(pendingOrder);
847
	}
848
 
26833 amit.gupta 849
	@RequestMapping(value = "/store/addresses/{customerId}", method = RequestMethod.GET)
850
	public ResponseEntity<?> getAll(HttpServletRequest request, @PathVariable int customerId) throws Throwable {
27045 tejbeer 851
		return responseSender.ok(customerAddressRepository.selectByActiveCustomerId(customerId));
26788 amit.gupta 852
	}
26833 amit.gupta 853
 
26857 amit.gupta 854
	@RequestMapping(value = "/store/address", method = RequestMethod.POST)
855
	public ResponseEntity<?> addAddress(HttpServletRequest request, @RequestBody CustomerAddress customerAddress)
856
			throws Throwable {
857
		customerAddressRepository.persist(customerAddress);
858
		return responseSender.ok(customerAddress);
859
	}
860
 
27045 tejbeer 861
	@RequestMapping(value = "/store/deactivateCustomerAddress", method = RequestMethod.POST)
862
	public ResponseEntity<?> deactivateAddresss(HttpServletRequest request, @RequestParam int id) throws Throwable {
863
		CustomerAddress cust = customerAddressRepository.selectById(id);
864
		cust.setActive(false);
865
		return responseSender.ok(cust);
866
	}
867
 
26861 tejbeer 868
	@RequestMapping(value = "/store/updateCustomer", method = RequestMethod.POST)
869
	public ResponseEntity<?> updateCustomerProfile(HttpServletRequest request, @RequestBody Customer customer)
870
			throws Throwable {
871
		Customer cust = customerRepository.selectById(customer.getId());
872
		cust.setGender(customer.getGender());
26867 tejbeer 873
		cust.setProfileImageId(customer.getProfileImageId());
26861 tejbeer 874
		cust.setDob(customer.getDob());
875
		return responseSender.ok(cust);
876
	}
28345 tejbeer 877
 
28322 amit.gupta 878
	@RequestMapping(value = "/stores/{state}/{city}/{storeCode}", method = RequestMethod.GET)
28345 tejbeer 879
	public void getStoreIndex(HttpServletResponse response, HttpServletRequest request, @PathVariable String state,
880
			@PathVariable String city, @PathVariable String storeCode) throws Throwable {
28325 amit.gupta 881
		logger.info("Store code {}", storeCode);
28345 tejbeer 882
		Map<String, Integer> map = retailerService.getStoreCodeRetailerMap();
883
		logger.info("retailer id {}", map.get(storeCode));
28336 amit.gupta 884
		String retailerName = retailerService.getAllFofoRetailers().get(map.get(storeCode)).getBusinessName();
28322 amit.gupta 885
		String html = partnerIndexService.getPartnerIndexHtml();
28332 amit.gupta 886
		logger.info("html {}", html);
28327 amit.gupta 887
		html = html.replace("Buy Mobiles and Accessories at exciting prices - SmartDukaan",
28338 amit.gupta 888
				String.format("%s is now ONLINE. Buy Mobiles, Accessories & more | SmartDukaan", retailerName));
28334 amit.gupta 889
		response.getWriter().write(html);
28322 amit.gupta 890
	}
26861 tejbeer 891
 
27048 tejbeer 892
	@RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
893
	public ResponseEntity<?> cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id,
27045 tejbeer 894
 
28354 tejbeer 895
			@RequestParam String statusDescription, @RequestParam String reason) throws Exception {
27048 tejbeer 896
 
897
		PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
27057 tejbeer 898
		PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getOrderId());
28304 amit.gupta 899
		Customer customer = customerRepository.selectById(pendingOrder.getCustomerId());
27048 tejbeer 900
		if (pendingOrderItem.getBilledTimestamp() == null) {
901
			pendingOrderItem.setStatus(OrderStatus.CANCELLED);
28354 tejbeer 902
			pendingOrderItem.setRemark(reason);
903
			pendingOrderItem.setStatusDescription("cancel by self");
28304 amit.gupta 904
			pendingOrderItem.setCancelledTimestamp(LocalDateTime.now());
27048 tejbeer 905
			List<OrderStatus> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId())
906
					.stream().map(x -> x.getStatus()).collect(Collectors.toList());
907
 
28345 tejbeer 908
			if (!status.contains(OrderStatus.PENDING) && !status.contains(OrderStatus.PROCESSING)
909
					&& !status.contains(OrderStatus.BILLED) && !status.contains(OrderStatus.UNSETTLED)
910
					&& !status.contains(OrderStatus.CLAIMED)) {
27048 tejbeer 911
				pendingOrder.setStatus(OrderStatus.CLOSED);
912
			}
913
 
914
			pendingOrderItemRepository.persist(pendingOrderItem);
28304 amit.gupta 915
			String itemDescription = itemRepository.selectById(pendingOrderItem.getItemId()).getItemDescription();
28313 amit.gupta 916
			otpProcessor.sendSms(OtpProcessor.SELF_CANCELLED_TEMPLATE_ID,
917
					String.format(OtpProcessor.SELF_CANCELLED_TEMPLATE, pendingOrder.getId(),
28304 amit.gupta 918
							StringUtils.abbreviate(itemDescription, 30),
28313 amit.gupta 919
							FormattingUtils.format(pendingOrderItem.getCancelledTimestamp())),
28304 amit.gupta 920
					customer.getMobileNumber());
28339 tejbeer 921
 
922
			List<Integer> catalogIds = new ArrayList<>();
923
 
924
			Item item = itemRepository.selectById(pendingOrderItem.getItemId());
925
			pendingOrderItem.setItemName(item.getItemDescription());
926
			catalogIds.add(item.getCatalogItemId());
927
 
928
			Map<Integer, JSONObject> contentMap = commonSolrService.getContentByCatalogIds(catalogIds);
929
			JSONObject jsonObj = contentMap.get(item.getCatalogItemId());
930
			pendingOrderItem.setImgUrl(jsonObj.getString("imageUrl_s"));
931
			pendingOrder.setPendingOrderItems(Arrays.asList(pendingOrderItem));
932
			CustomerAddress customerAddress = customerAddressRepository.selectById(pendingOrder.getCustomerAddressId());
933
 
934
			DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm a");
935
 
936
			Map<String, Object> emailModel = new HashMap<>();
937
			emailModel.put("customer", customerAddress);
938
			emailModel.put("pendingOrder", pendingOrder);
939
			emailModel.put("date", dateTimeFormatter);
940
 
941
			String[] customerEmail = null;
942
			if (customer.getEmailId() != null) {
28355 tejbeer 943
				customerEmail = new String[] { customer.getEmailId() };
28339 tejbeer 944
 
28355 tejbeer 945
				List<String> bccTo = Arrays.asList("tejbeer.kaur@smartdukaan.com");
946
 
28339 tejbeer 947
				emailService.sendMailWithAttachments("Order Cancellation", "order-cancellation.vm", emailModel,
28355 tejbeer 948
						customerEmail, null, bccTo.toArray(new String[0]));
28339 tejbeer 949
 
950
			}
27048 tejbeer 951
		}
952
 
953
		return responseSender.ok(true);
954
 
955
	}
956
 
26774 amit.gupta 957
}
958
 
26784 amit.gupta 959
class UserModel {
26857 amit.gupta 960
	@JsonProperty(required = true)
26784 amit.gupta 961
	private String mobile;
26857 amit.gupta 962
	@JsonProperty(required = true)
26784 amit.gupta 963
	private String password;
26857 amit.gupta 964
	@JsonProperty(required = false)
965
	private String firstName;
966
	@JsonProperty(required = false)
967
	private String lastName;
968
	@JsonProperty(required = false)
969
	private String email;
26833 amit.gupta 970
 
26784 amit.gupta 971
	@Override
972
	public String toString() {
973
		return "UserModel [mobile=" + mobile + ", password=" + password + "]";
974
	}
26833 amit.gupta 975
 
26784 amit.gupta 976
	public String getMobile() {
977
		return mobile;
978
	}
26833 amit.gupta 979
 
26784 amit.gupta 980
	public void setMobile(String mobile) {
981
		this.mobile = mobile;
982
	}
26833 amit.gupta 983
 
26784 amit.gupta 984
	public String getPassword() {
985
		return password;
986
	}
26833 amit.gupta 987
 
26784 amit.gupta 988
	public void setPassword(String password) {
989
		this.password = password;
990
	}
26857 amit.gupta 991
 
992
	public String getFirstName() {
993
		return firstName;
994
	}
995
 
996
	public void setFirstName(String firstName) {
997
		this.firstName = firstName;
998
	}
999
 
1000
	public String getLastName() {
1001
		return lastName;
1002
	}
1003
 
1004
	public void setLastName(String lastName) {
1005
		this.lastName = lastName;
1006
	}
1007
 
1008
	public String getEmail() {
1009
		return email;
1010
	}
1011
 
1012
	public void setEmail(String email) {
1013
		this.email = email;
1014
	}
1015
 
26784 amit.gupta 1016
}
1017
 
26774 amit.gupta 1018
class CustomerModel {
26783 amit.gupta 1019
 
26774 amit.gupta 1020
	@JsonProperty(required = false)
1021
	private Customer customer;
1022
	@JsonProperty(required = true)
1023
	private boolean exists;
1024
 
1025
	public CustomerModel(boolean exists, Customer customer) {
1026
		super();
1027
		this.customer = customer;
1028
		this.exists = exists;
1029
	}
1030
 
1031
	@Override
1032
	public String toString() {
1033
		return "CustomerModel [customer=" + customer + ", exists=" + exists + "]";
1034
	}
1035
 
1036
	public Customer getCustomer() {
1037
		return customer;
1038
	}
1039
 
1040
	public void setCustomer(Customer customer) {
1041
		this.customer = customer;
1042
	}
1043
 
1044
	public boolean isExists() {
1045
		return exists;
1046
	}
1047
 
1048
	public void setExists(boolean exists) {
1049
		this.exists = exists;
1050
	}
26607 amit.gupta 1051
}