Subversion Repositories SmartDukaan

Rev

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