Subversion Repositories SmartDukaan

Rev

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