Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
21612 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
21689 ashik.ali 3
import java.io.ByteArrayInputStream;
4
import java.io.ByteArrayOutputStream;
5
import java.io.InputStream;
23638 amit.gupta 6
import java.time.LocalDateTime;
7
import java.time.temporal.ChronoUnit;
24844 amit.gupta 8
import java.util.ArrayList;
23654 amit.gupta 9
import java.util.Arrays;
23343 ashik.ali 10
import java.util.HashMap;
21612 ashik.ali 11
import java.util.HashSet;
21680 ashik.ali 12
import java.util.List;
13
import java.util.Map;
21612 ashik.ali 14
import java.util.Set;
23638 amit.gupta 15
import java.util.stream.Collectors;
21612 ashik.ali 16
 
17
import javax.servlet.http.HttpServletRequest;
21689 ashik.ali 18
import javax.servlet.http.HttpServletResponse;
21612 ashik.ali 19
 
23638 amit.gupta 20
import org.apache.logging.log4j.LogManager;
23568 govind 21
import org.apache.logging.log4j.Logger;
21612 ashik.ali 22
import org.springframework.beans.factory.annotation.Autowired;
21689 ashik.ali 23
import org.springframework.core.io.InputStreamResource;
24
import org.springframework.http.HttpHeaders;
25
import org.springframework.http.HttpStatus;
26
import org.springframework.http.MediaType;
27
import org.springframework.http.ResponseEntity;
21612 ashik.ali 28
import org.springframework.stereotype.Controller;
22064 ashik.ali 29
import org.springframework.transaction.annotation.Transactional;
21985 kshitij.so 30
import org.springframework.ui.Model;
24880 govind 31
import org.springframework.web.bind.annotation.GetMapping;
23654 amit.gupta 32
import org.springframework.web.bind.annotation.PathVariable;
24105 govind 33
import org.springframework.web.bind.annotation.PutMapping;
21612 ashik.ali 34
import org.springframework.web.bind.annotation.RequestBody;
35
import org.springframework.web.bind.annotation.RequestMapping;
36
import org.springframework.web.bind.annotation.RequestMethod;
21689 ashik.ali 37
import org.springframework.web.bind.annotation.RequestParam;
21612 ashik.ali 38
 
23203 ashik.ali 39
import com.spice.profitmandi.common.enumuration.SearchType;
21612 ashik.ali 40
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
21985 kshitij.so 41
import com.spice.profitmandi.common.model.CartFofo;
22860 ashik.ali 42
import com.spice.profitmandi.common.model.CreateOrderRequest;
23654 amit.gupta 43
import com.spice.profitmandi.common.model.CreditNotePdfModel;
23584 ashik.ali 44
import com.spice.profitmandi.common.model.CustomCustomer;
26647 tejbeer 45
import com.spice.profitmandi.common.model.CustomRetailer;
23638 amit.gupta 46
import com.spice.profitmandi.common.model.FoiBadReturnRequest;
24105 govind 47
import com.spice.profitmandi.common.model.PaymentOptionTransactionModel;
22660 ashik.ali 48
import com.spice.profitmandi.common.model.PdfModel;
22581 ashik.ali 49
import com.spice.profitmandi.common.model.PriceModel;
21612 ashik.ali 50
import com.spice.profitmandi.common.model.ProfitMandiConstants;
21689 ashik.ali 51
import com.spice.profitmandi.common.util.PdfUtils;
23638 amit.gupta 52
import com.spice.profitmandi.common.util.StringUtils;
22244 ashik.ali 53
import com.spice.profitmandi.common.web.util.ResponseSender;
23638 amit.gupta 54
import com.spice.profitmandi.dao.entity.catalog.Item;
22217 ashik.ali 55
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
23343 ashik.ali 56
import com.spice.profitmandi.dao.entity.dtr.InsuranceProvider;
23548 ashik.ali 57
import com.spice.profitmandi.dao.entity.dtr.PaymentOptionTransaction;
26647 tejbeer 58
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
21728 ashik.ali 59
import com.spice.profitmandi.dao.entity.fofo.Customer;
60
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
23654 amit.gupta 61
import com.spice.profitmandi.dao.entity.fofo.CustomerCreditNote;
62
import com.spice.profitmandi.dao.entity.fofo.CustomerReturnItem;
23638 amit.gupta 63
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
22927 ashik.ali 64
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
22860 ashik.ali 65
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
21728 ashik.ali 66
import com.spice.profitmandi.dao.entity.fofo.PaymentOption;
26647 tejbeer 67
import com.spice.profitmandi.dao.entity.fofo.PendingOrder;
68
import com.spice.profitmandi.dao.entity.fofo.PendingOrderItem;
23298 ashik.ali 69
import com.spice.profitmandi.dao.entity.user.Address;
23548 ashik.ali 70
import com.spice.profitmandi.dao.enumuration.dtr.PaymentOptionReferenceType;
23638 amit.gupta 71
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
26647 tejbeer 72
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
22217 ashik.ali 73
import com.spice.profitmandi.dao.repository.dtr.InsurancePolicyRepository;
23343 ashik.ali 74
import com.spice.profitmandi.dao.repository.dtr.InsuranceProviderRepository;
23638 amit.gupta 75
import com.spice.profitmandi.dao.repository.dtr.PaymentOptionTransactionRepository;
23298 ashik.ali 76
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
26647 tejbeer 77
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
21728 ashik.ali 78
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
79
import com.spice.profitmandi.dao.repository.fofo.CustomerRepository;
23650 amit.gupta 80
import com.spice.profitmandi.dao.repository.fofo.CustomerReturnItemRepository;
22860 ashik.ali 81
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
21728 ashik.ali 82
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
23366 ashik.ali 83
import com.spice.profitmandi.dao.repository.fofo.FofoPartnerPaymentOptionRepository;
21728 ashik.ali 84
import com.spice.profitmandi.dao.repository.fofo.PaymentOptionRepository;
26647 tejbeer 85
import com.spice.profitmandi.dao.repository.fofo.PendingOrderItemRepository;
86
import com.spice.profitmandi.dao.repository.fofo.PendingOrderRepository;
24440 amit.gupta 87
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
23298 ashik.ali 88
import com.spice.profitmandi.dao.repository.user.AddressRepository;
23798 amit.gupta 89
import com.spice.profitmandi.service.authentication.RoleManager;
25726 amit.gupta 90
import com.spice.profitmandi.service.integrations.zest.InsuranceService;
24440 amit.gupta 91
import com.spice.profitmandi.service.integrations.zest.MobileInsurancePlan;
23366 ashik.ali 92
import com.spice.profitmandi.service.order.OrderService;
22069 ashik.ali 93
import com.spice.profitmandi.service.pricing.PricingService;
26647 tejbeer 94
import com.spice.profitmandi.service.user.RetailerService;
22139 amit.gupta 95
import com.spice.profitmandi.web.model.LoginDetails;
22069 ashik.ali 96
import com.spice.profitmandi.web.util.CookiesProcessor;
24105 govind 97
import com.spice.profitmandi.web.util.MVCResponseSender;
21612 ashik.ali 98
 
99
@Controller
23973 govind 100
@Transactional(rollbackFor = Throwable.class)
21612 ashik.ali 101
public class OrderController {
102
 
23568 govind 103
	private static final Logger LOGGER = LogManager.getLogger(OrderController.class);
21985 kshitij.so 104
 
21612 ashik.ali 105
	@Autowired
22860 ashik.ali 106
	private CustomerRepository customerRepository;
23973 govind 107
 
23821 amit.gupta 108
	private boolean accessoriesDeals = true;
21985 kshitij.so 109
 
21612 ashik.ali 110
	@Autowired
23786 amit.gupta 111
	private RoleManager roleManager;
23973 govind 112
 
23786 amit.gupta 113
	@Autowired
23654 amit.gupta 114
	private CustomerReturnItemRepository customerReturnItemRepository;
23973 govind 115
 
23654 amit.gupta 116
	@Autowired
23638 amit.gupta 117
	private FofoOrderItemRepository fofoOrderItemRepository;
21985 kshitij.so 118
 
21612 ashik.ali 119
	@Autowired
22860 ashik.ali 120
	private PaymentOptionRepository paymentOptionRepository;
24844 amit.gupta 121
 
24440 amit.gupta 122
	@Autowired
123
	private StateRepository stateRepository;
23973 govind 124
 
23638 amit.gupta 125
	@Autowired
126
	private ItemRepository itemRepository;
21985 kshitij.so 127
 
21680 ashik.ali 128
	@Autowired
24105 govind 129
	private MVCResponseSender mvcResponseSender;
24844 amit.gupta 130
 
24440 amit.gupta 131
	@Autowired
25726 amit.gupta 132
	private InsuranceService insuranceService;
24105 govind 133
 
134
	@Autowired
22860 ashik.ali 135
	private FofoOrderRepository fofoOrderRepository;
21985 kshitij.so 136
 
21680 ashik.ali 137
	@Autowired
22860 ashik.ali 138
	private CustomerAddressRepository customerAddressRepository;
23973 govind 139
 
22217 ashik.ali 140
	@Autowired
22860 ashik.ali 141
	private InsurancePolicyRepository insurancePolicyRepository;
23973 govind 142
 
23343 ashik.ali 143
	@Autowired
144
	private InsuranceProviderRepository insuranceProviderRepository;
21985 kshitij.so 145
 
21896 ashik.ali 146
	@Autowired
22860 ashik.ali 147
	private CookiesProcessor cookiesProcessor;
23973 govind 148
 
22069 ashik.ali 149
	@Autowired
22860 ashik.ali 150
	private PricingService pricingService;
23973 govind 151
 
22354 ashik.ali 152
	@Autowired
22860 ashik.ali 153
	private OrderService orderService;
23973 govind 154
 
23298 ashik.ali 155
	@Autowired
156
	private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
23973 govind 157
 
22354 ashik.ali 158
	@Autowired
23298 ashik.ali 159
	private AddressRepository addressRepository;
23973 govind 160
 
23298 ashik.ali 161
	@Autowired
23548 ashik.ali 162
	private PaymentOptionTransactionRepository fofoOrderPaymentOptionRepository;
23973 govind 163
 
23366 ashik.ali 164
	@Autowired
165
	private FofoPartnerPaymentOptionRepository fofoPartnerPaymentOptionRepository;
23973 govind 166
 
23419 ashik.ali 167
	@Autowired
22860 ashik.ali 168
	private ResponseSender<?> responseSender;
23973 govind 169
 
26647 tejbeer 170
	@Autowired
171
	private PendingOrderRepository pendingOrderRepository;
172
 
173
	@Autowired
174
	private PendingOrderItemRepository pendingOrderItemRepository;
175
 
176
	@Autowired
177
	private FofoStoreRepository fofoStoreRepository;
178
 
179
	@Autowired
180
	private RetailerService retailerService;
181
 
182
	@Autowired
183
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
184
 
21985 kshitij.so 185
	@RequestMapping(value = "/order")
23973 govind 186
	public String orderIndex(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model)
187
			throws ProfitMandiBusinessException {
188
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
189
		;
190
 
23298 ashik.ali 191
		int addressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(loginDetails.getFofoId());
192
		Address address = addressRepository.selectById(addressId);
23973 govind 193
 
22860 ashik.ali 194
		List<CartFofo> cartItems = orderService.cartCheckout(cartData);
195
		Set<Integer> itemIds = new HashSet<>();
23973 govind 196
		for (CartFofo cartFofo : cartItems) {
22860 ashik.ali 197
			itemIds.add(cartFofo.getItemId());
21985 kshitij.so 198
		}
23973 govind 199
		Map<Integer, PriceModel> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds,
200
				loginDetails.getFofoId());
201
		List<Integer> paymentOptionIds = fofoPartnerPaymentOptionRepository
202
				.selectPaymentOptionIdsByFofoId(loginDetails.getFofoId());
23366 ashik.ali 203
		List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(new HashSet<>(paymentOptionIds));
22860 ashik.ali 204
		LOGGER.info("mopPriceMap {}", mopPriceMap);
24844 amit.gupta 205
		model.addAttribute("stateNames",
206
				stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
23298 ashik.ali 207
		model.addAttribute("retailerStateName", address.getState());
24440 amit.gupta 208
		model.addAttribute("cartItems", cartItems);
22860 ashik.ali 209
		model.addAttribute("mopPriceMap", mopPriceMap);
23366 ashik.ali 210
		model.addAttribute("paymentOptions", paymentOptions);
23821 amit.gupta 211
		model.addAttribute("accessoriesDeals", accessoriesDeals);
22860 ashik.ali 212
		return "order-index";
21985 kshitij.so 213
	}
23973 govind 214
 
24440 amit.gupta 215
	@RequestMapping(value = "/checkplans", method = RequestMethod.GET)
25726 amit.gupta 216
	public String getInsurancePrices(HttpServletRequest request, @RequestParam float price, Model model,
217
			@RequestParam int itemId) throws ProfitMandiBusinessException {
22244 ashik.ali 218
		LOGGER.info("Request received at url : {}", request.getRequestURI());
24844 amit.gupta 219
 
24440 amit.gupta 220
		try {
25726 amit.gupta 221
			String response = mvcResponseSender.createResponseString(this.getPlans(price, itemId));
24440 amit.gupta 222
			model.addAttribute("response", response);
223
		} catch (Exception e) {
224
			// TODO Auto-generated catch block
225
			e.printStackTrace();
226
			throw new ProfitMandiBusinessException("Plans", "Plans API", "Error formatting insurance plans");
227
		}
24844 amit.gupta 228
 
24440 amit.gupta 229
		return "response";
22244 ashik.ali 230
	}
23973 govind 231
 
21985 kshitij.so 232
	@RequestMapping(value = "/get-order", method = RequestMethod.GET)
23973 govind 233
	public String getOrder(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId,
234
			Model model) throws ProfitMandiBusinessException {
22927 ashik.ali 235
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
236
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
23638 amit.gupta 237
		List<FofoOrderItem> fofoLineItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
22927 ashik.ali 238
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
23973 govind 239
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
22927 ashik.ali 240
		customerAddress.setPhoneNumber(customer.getMobileNumber());
23973 govind 241
		List<PaymentOptionTransaction> paymentOptionTransactions = fofoOrderPaymentOptionRepository
242
				.selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
243
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
244
				.paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
245
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
246
				.selectByRetailerIdInvoiceNumber(fofoOrder.getFofoId(), fofoOrder.getInvoiceNumber());
23343 ashik.ali 247
		this.addInsuranceProvider(insurancePolicies);
24087 amit.gupta 248
 
22927 ashik.ali 249
		model.addAttribute("fofoOrder", fofoOrder);
250
		model.addAttribute("fofoLineItems", fofoLineItems);
251
		model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
252
		model.addAttribute("customerBillingAddressObj", customerAddress);
23548 ashik.ali 253
		model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
23366 ashik.ali 254
		model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
22927 ashik.ali 255
		model.addAttribute("insurancePolicies", insurancePolicies);
256
		return "order-details";
21985 kshitij.so 257
	}
23973 govind 258
 
259
	private Map<Integer, InsuranceProvider> toInsuranceProviderIdInsuranceProvider(
260
			List<InsuranceProvider> insuranceProviders) {
23343 ashik.ali 261
		Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = new HashMap<>();
23973 govind 262
		for (InsuranceProvider insuranceProvider : insuranceProviders) {
23343 ashik.ali 263
			insuranceProviderIdInsuranceProviderMap.put(insuranceProvider.getId(), insuranceProvider);
264
		}
265
		return insuranceProviderIdInsuranceProviderMap;
266
	}
23973 govind 267
 
268
	private void addInsuranceProvider(List<InsurancePolicy> insurancePolicies) {
269
		if (insurancePolicies.isEmpty()) {
23343 ashik.ali 270
			return;
271
		}
272
		Set<Integer> insuranceProviderIds = new HashSet<>();
23973 govind 273
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
23343 ashik.ali 274
			insuranceProviderIds.add(insurancePolicy.getProviderId());
275
		}
276
		LOGGER.info("insuranceProviderIds {}", insuranceProviderIds);
277
		List<InsuranceProvider> insuranceProviders = insuranceProviderRepository.selectByIds(insuranceProviderIds);
23973 govind 278
		Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = this
279
				.toInsuranceProviderIdInsuranceProvider(insuranceProviders);
280
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
281
			insurancePolicy
282
					.setInsuranceProvider(insuranceProviderIdInsuranceProviderMap.get(insurancePolicy.getProviderId()));
23343 ashik.ali 283
		}
284
	}
23973 govind 285
 
22244 ashik.ali 286
	@RequestMapping(value = "/saleDetails", method = RequestMethod.GET)
23973 govind 287
	public String getSaleDetails(HttpServletRequest request,
288
			@RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws Exception {
22927 ashik.ali 289
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
25562 amit.gupta 290
		boolean isAdmin = roleManager.isAdmin(fofoDetails.getRoleIds());
22927 ashik.ali 291
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
23654 amit.gupta 292
		List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
22927 ashik.ali 293
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
23973 govind 294
		List<PaymentOptionTransaction> paymentOptionTransactions = fofoOrderPaymentOptionRepository
295
				.selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
296
 
297
		// Added Migration info as we lost it.
298
		if (paymentOptionTransactions == null || paymentOptionTransactions.size() == 0) {
23952 amit.gupta 299
			PaymentOptionTransaction pot = new PaymentOptionTransaction();
300
			pot.setAmount(fofoOrder.getTotalAmount());
301
			pot.setCreateTimestamp(fofoOrder.getCreateTimestamp());
23973 govind 302
			// Mark it paid through cash
23952 amit.gupta 303
			pot.setPaymentOptionId(1);
304
			pot.setReferenceType(PaymentOptionReferenceType.ORDER);
305
			fofoOrderPaymentOptionRepository.persist(pot);
306
			paymentOptionTransactions.add(pot);
307
			LOGGER.info("Added to get invoice");
308
		}
23973 govind 309
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
310
				.paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
311
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
312
				.selectByRetailerIdInvoiceNumber(fofoOrder.getFofoId(), fofoOrder.getInvoiceNumber());
23343 ashik.ali 313
		this.addInsuranceProvider(insurancePolicies);
23973 govind 314
		Map<Integer, Item> itemsMap = fofoOrderItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> {
23638 amit.gupta 315
			try {
316
				return itemRepository.selectById(x.getItemId());
317
			} catch (ProfitMandiBusinessException e) {
318
				// TODO Auto-generated catch block
319
				return null;
320
			}
321
		}));
23973 govind 322
		Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
323
				.collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
23654 amit.gupta 324
 
23973 govind 325
		Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream()
326
				.collect(Collectors.toMap(foi -> foi.getId(),
327
						foi -> customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
23654 amit.gupta 328
 
329
		Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
23973 govind 330
 
331
		for (FofoOrderItem foi : fofoOrderItems) {
332
			for (FofoLineItem fli : foi.getFofoLineItems()) {
23654 amit.gupta 333
				inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
334
			}
23973 govind 335
			List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
336
					.selectAllByOrderItemId(foi.getId());
25562 amit.gupta 337
			this.markDoa(fofoOrder, foi, isAdmin);
23973 govind 338
			for (CustomerReturnItem customerReturnItem : customerReturnItems) {
339
				inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
340
						inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
23654 amit.gupta 341
			}
342
		}
23973 govind 343
 
23654 amit.gupta 344
		LOGGER.info("fofoOrderItemIdLineItemMap {}", fofoOrderItemIdLineItemMap);
22927 ashik.ali 345
		model.addAttribute("fofoOrder", fofoOrder);
23638 amit.gupta 346
		model.addAttribute("itemsMap", itemsMap);
23654 amit.gupta 347
		model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
23973 govind 348
		model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
349
				StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
23654 amit.gupta 350
		model.addAttribute("fofoOrderItems", fofoOrderItems);
351
		model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
22927 ashik.ali 352
		model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
353
		model.addAttribute("customerBillingAddressObj", customerAddress);
23548 ashik.ali 354
		model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
23366 ashik.ali 355
		model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
22927 ashik.ali 356
		model.addAttribute("insurancePolicies", insurancePolicies);
23638 amit.gupta 357
		model.addAttribute("markDefective", this.markDefective(fofoOrder));
22927 ashik.ali 358
		return "sale-details";
22244 ashik.ali 359
	}
23973 govind 360
 
25562 amit.gupta 361
	private void markDoa(FofoOrder fofoOrder, FofoOrderItem foi, boolean isAdmin) {
25606 tejbeer 362
		if (isAdmin) {
24094 amit.gupta 363
			foi.setDoa(true);
25562 amit.gupta 364
			return;
24094 amit.gupta 365
		}
366
		LocalDateTime buyDate = fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS);
367
		LocalDateTime curDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
368
		if (buyDate.isAfter(curDate.minusDays(45))) {
369
			foi.setDoa(true);
370
		} else
371
			foi.setDoa(
372
					foi.getBrand().equals("Nokia") && foi.getCost() < 4990 && buyDate.isAfter(curDate.minusYears(1)));
23638 amit.gupta 373
	}
23973 govind 374
 
23638 amit.gupta 375
	private boolean markDefective(FofoOrder fofoOrder) {
23973 govind 376
		return fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS).plusDays(180)
377
				.isAfter(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
378
 
23638 amit.gupta 379
	}
23973 govind 380
 
23584 ashik.ali 381
	@RequestMapping(value = "/getSearchOrder")
23973 govind 382
	public String getSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
23584 ashik.ali 383
		return "search-order";
384
	}
23973 govind 385
 
23584 ashik.ali 386
	@RequestMapping(value = "/customerDetails", method = RequestMethod.PUT)
23973 govind 387
	public String updateCustomerDetails(HttpServletRequest request, @RequestBody CustomCustomer customCustomer,
388
			@RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
24281 amit.gupta 389
			throws Exception {
23973 govind 390
 
23584 ashik.ali 391
		orderService.updateCustomerDetails(customCustomer, invoiceNumber);
392
		return this.getSearchOrderDetails(request, invoiceNumber, model);
393
	}
23973 govind 394
 
23584 ashik.ali 395
	@RequestMapping(value = "/searchOrderDetails", method = RequestMethod.GET)
23973 govind 396
	public String getSearchOrderDetails(HttpServletRequest request,
397
			@RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
24281 amit.gupta 398
			throws Exception {
23973 govind 399
 
23584 ashik.ali 400
		FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
24271 amit.gupta 401
		List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
23584 ashik.ali 402
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
403
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
24105 govind 404
		List<Integer> fofoPartnerPaymentOptions = fofoPartnerPaymentOptionRepository
405
				.selectPaymentOptionIdsByFofoId(fofoOrder.getFofoId());
24844 amit.gupta 406
 
24276 amit.gupta 407
		Map<Integer, Item> itemsMap = fofoOrderItems.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> {
408
			try {
409
				return itemRepository.selectById(x.getItemId());
410
			} catch (ProfitMandiBusinessException e) {
411
				// TODO Auto-generated catch block
412
				return null;
413
			}
414
		}));
24105 govind 415
		LOGGER.info("fofoPartnerPaymentOptions" + fofoPartnerPaymentOptions);
23973 govind 416
		List<PaymentOptionTransaction> paymentOptionTransactions = fofoOrderPaymentOptionRepository
417
				.selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
24105 govind 418
		LOGGER.info("paymentOptionTransactions" + paymentOptionTransactions);
23973 govind 419
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this
24105 govind 420
				.paymentOptionIdPaymentOptionMapUsingPaymentOptions(fofoPartnerPaymentOptions);
421
		Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
422
				.paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
423
		LOGGER.info("paymentOptionIdPaymentOptionTransactionMap" + paymentOptionIdPaymentOptionTransactionMap.keySet());
23973 govind 424
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
425
				.selectByRetailerIdInvoiceNumber(fofoOrder.getFofoId(), fofoOrder.getInvoiceNumber());
23584 ashik.ali 426
		this.addInsuranceProvider(insurancePolicies);
427
		model.addAttribute("fofoOrder", fofoOrder);
24844 amit.gupta 428
		for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
24271 amit.gupta 429
			fofoOrderItem.setDoa(true);
430
		}
24844 amit.gupta 431
 
24281 amit.gupta 432
		Map<Integer, Set<FofoLineItem>> fofoOrderItemIdLineItemMap = fofoOrderItems.stream()
433
				.collect(Collectors.toMap(FofoOrderItem::getId, FofoOrderItem::getFofoLineItems));
434
 
435
		Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream()
436
				.collect(Collectors.toMap(foi -> foi.getId(),
437
						foi -> customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
438
 
439
		Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
440
 
441
		for (FofoOrderItem foi : fofoOrderItems) {
442
			for (FofoLineItem fli : foi.getFofoLineItems()) {
443
				inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
444
			}
445
			List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository
446
					.selectAllByOrderItemId(foi.getId());
447
			for (CustomerReturnItem customerReturnItem : customerReturnItems) {
448
				inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(),
449
						inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
450
			}
451
		}
452
		model.addAttribute("foiIdCustomerReturnInventoryItemsMap",
453
				StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
24271 amit.gupta 454
		model.addAttribute("fofoOrderItems", fofoOrderItems);
24281 amit.gupta 455
		model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
456
		model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
24276 amit.gupta 457
		model.addAttribute("itemsMap", itemsMap);
24271 amit.gupta 458
		model.addAttribute("markDefective", true);
23584 ashik.ali 459
		model.addAttribute("customer", customer);
460
		model.addAttribute("customerAddress", customerAddress);
461
		model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
462
		model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
24105 govind 463
		model.addAttribute("paymentOptionIdPaymentOptionTransactionMap", paymentOptionIdPaymentOptionTransactionMap);
23584 ashik.ali 464
		model.addAttribute("insurancePolicies", insurancePolicies);
24105 govind 465
		model.addAttribute("fofoPartnerPaymentOptions", fofoPartnerPaymentOptions);
466
		model.addAttribute("totalNumberOfPaymentOptionId", fofoPartnerPaymentOptions.size());
24844 amit.gupta 467
		model.addAttribute("stateNames",
468
				stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList()));
23584 ashik.ali 469
		return "search-order-details";
470
	}
23973 govind 471
 
472
	private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap(
473
			List<PaymentOptionTransaction> paymentOptionTransactions) {
23366 ashik.ali 474
		Set<Integer> paymentOptionIds = new HashSet<>();
23973 govind 475
		for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
23548 ashik.ali 476
			paymentOptionIds.add(paymentOptionTransaction.getPaymentOptionId());
23366 ashik.ali 477
		}
478
		List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(paymentOptionIds);
479
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
23973 govind 480
		for (PaymentOption paymentOption : paymentOptions) {
23366 ashik.ali 481
			paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
482
		}
483
		return paymentOptionIdPaymentOptionMap;
484
	}
23973 govind 485
 
24105 govind 486
	private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMapUsingPaymentOptions(
487
			List<Integer> fofoPartnerPaymentOptions) {
488
		List<PaymentOption> paymentOptions = paymentOptionRepository
489
				.selectByIds(new HashSet<>(fofoPartnerPaymentOptions));
490
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
491
		for (PaymentOption paymentOption : paymentOptions) {
492
			paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
493
		}
494
		return paymentOptionIdPaymentOptionMap;
495
	}
496
 
497
	private Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap(
498
			List<PaymentOptionTransaction> paymentOptionTransactions) {
499
		Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = new HashMap<>();
500
		for (PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
501
			paymentOptionIdPaymentOptionTransactionMap.put(paymentOptionTransaction.getPaymentOptionId(),
502
					paymentOptionTransaction);
503
		}
504
		return paymentOptionIdPaymentOptionTransactionMap;
505
	}
506
 
21985 kshitij.so 507
	@RequestMapping(value = "/create-order", method = RequestMethod.POST)
23973 govind 508
	public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest,
509
			Model model) throws ProfitMandiBusinessException {
26647 tejbeer 510
		// throw new ProfitMandiBusinessException("Billing is on hold temporarily",
511
		// "Billing is on hold temporarily", "Billing is on hold temporarily");
26531 amit.gupta 512
		LOGGER.info("request at uri {} body {}", request.getRequestURI(), createOrderRequest);
22927 ashik.ali 513
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
23973 govind 514
 
23823 amit.gupta 515
		int fofoOrderId = orderService.createOrder(createOrderRequest, fofoDetails.getFofoId(), accessoriesDeals);
22280 ashik.ali 516
		LOGGER.info("Order has been created successfully...");
26531 amit.gupta 517
		return "redirect:/get-order/?orderId=" + fofoOrderId;
21612 ashik.ali 518
	}
23973 govind 519
 
23638 amit.gupta 520
	@RequestMapping(value = "/order/bad_return", method = RequestMethod.POST)
23973 govind 521
	public ResponseEntity<?> badReturn(HttpServletRequest request, @RequestBody FoiBadReturnRequest foiBadReturnRequest,
522
			Model model) throws ProfitMandiBusinessException {
23638 amit.gupta 523
		LOGGER.info("request at uri {} body {}", request.getRequestURI(), foiBadReturnRequest);
524
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
24282 amit.gupta 525
		CustomerCreditNote custmoerCreditNote;
24844 amit.gupta 526
		if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
24282 amit.gupta 527
			FofoOrderItem foi = fofoOrderItemRepository.selectById(foiBadReturnRequest.getFofoOrderItemId());
528
			FofoOrder fo = fofoOrderRepository.selectByOrderId(foi.getOrderId());
529
			custmoerCreditNote = orderService.badReturn(fo.getFofoId(), foiBadReturnRequest);
530
		} else {
531
			custmoerCreditNote = orderService.badReturn(fofoDetails.getFofoId(), foiBadReturnRequest);
532
		}
23654 amit.gupta 533
		return responseSender.ok(custmoerCreditNote.getId());
23638 amit.gupta 534
	}
21985 kshitij.so 535
 
21689 ashik.ali 536
	@RequestMapping(value = "/generateInvoice")
23973 govind 537
	public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
538
			@RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException {
539
		LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(),
540
				ProfitMandiConstants.ORDER_ID, orderId);
22139 amit.gupta 541
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
23594 ashik.ali 542
		PdfModel pdfModel = null;
23973 govind 543
		if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
23594 ashik.ali 544
			pdfModel = orderService.getInvoicePdfModel(orderId);
23973 govind 545
		} else {
23594 ashik.ali 546
			pdfModel = orderService.getInvoicePdfModel(fofoDetails.getFofoId(), orderId);
547
		}
21689 ashik.ali 548
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
24844 amit.gupta 549
		PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
21689 ashik.ali 550
		LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
23973 govind 551
		final HttpHeaders headers = new HttpHeaders();
552
		headers.setContentType(MediaType.APPLICATION_PDF);
553
		headers.set("Content-disposition", "inline; filename=invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
554
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
555
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
556
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
557
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
21689 ashik.ali 558
	}
23973 govind 559
 
24844 amit.gupta 560
	@RequestMapping(value = "/generateInvoices")
561
	public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response,
562
			@RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, @RequestParam int partnerId)
563
			throws ProfitMandiBusinessException {
564
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
565
		List<PdfModel> pdfModels = new ArrayList<>();
566
		if (roleManager.isAdmin(fofoDetails.getRoleIds())) {
567
			List<Integer> orderIds = fofoOrderRepository.selectByFofoId(partnerId, startDate, endDate, 0, 0).stream()
568
					.map(x -> x.getId()).collect(Collectors.toList());
569
			for (int orderId : orderIds) {
570
				pdfModels.add(orderService.getInvoicePdfModel(orderId));
571
			}
572
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
573
			PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
574
			LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
575
			final HttpHeaders headers = new HttpHeaders();
576
			headers.setContentType(MediaType.APPLICATION_PDF);
577
			headers.set("Content-disposition", "inline; filename=invoice-" + partnerId + ".pdf");
578
			headers.setContentLength(byteArrayOutputStream.toByteArray().length);
579
			final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
580
			final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
581
			return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
582
		} else {
583
			throw new ProfitMandiBusinessException("Auth", fofoDetails.getEmailId(), "Unauthorised access");
584
		}
585
	}
586
 
22244 ashik.ali 587
	@RequestMapping(value = "/saleHistory")
23973 govind 588
	public String saleHistory(HttpServletRequest request,
589
			@RequestParam(name = "searchValue", defaultValue = "") String searchValue,
590
			@RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
591
			@RequestParam(required = false) LocalDateTime startTime,
592
			@RequestParam(required = false) LocalDateTime endTime,
593
			@RequestParam(name = "offset", defaultValue = "0") int offset,
594
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
595
			throws ProfitMandiBusinessException {
22927 ashik.ali 596
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23973 govind 597
 
598
		Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
599
				startTime, endTime, offset, limit);
23203 ashik.ali 600
		model.addAllAttributes(map);
22244 ashik.ali 601
		return "sale-history";
602
	}
23973 govind 603
 
25092 amit.gupta 604
	@RequestMapping(value = "/downloadInvoices")
605
	public ResponseEntity<?> downloadInvoices(HttpServletRequest request,
606
			@RequestParam(name = "searchValue", defaultValue = "") String searchValue,
607
			@RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
608
			@RequestParam(required = false) LocalDateTime startTime,
609
			@RequestParam(required = false) LocalDateTime endTime,
610
			@RequestParam(name = "offset", defaultValue = "0") int offset,
611
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
612
			throws ProfitMandiBusinessException {
613
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
614
 
615
		Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue,
616
				startTime, endTime, offset, 100);
25562 amit.gupta 617
		List<FofoOrder> fofoOrders = (List<FofoOrder>) map.get("saleHistories");
25092 amit.gupta 618
 
25562 amit.gupta 619
		if (fofoOrders.size() == 0) {
25092 amit.gupta 620
			throw new ProfitMandiBusinessException("Search criteria", "", "No orders found for criteria");
621
		}
622
 
25093 amit.gupta 623
		final HttpHeaders headers = new HttpHeaders();
25092 amit.gupta 624
		headers.setContentType(MediaType.APPLICATION_PDF);
625
		headers.set("Content-disposition", "inline; filename=invoices.pdf");
626
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
627
		List<PdfModel> pdfModels = new ArrayList<>();
25562 amit.gupta 628
		for (FofoOrder fofoOrder : fofoOrders) {
25092 amit.gupta 629
			try {
630
				pdfModels.add(orderService.getInvoicePdfModel(fofoOrder.getId()));
25606 tejbeer 631
			} catch (Exception e) {
632
				LOGGER.info("could not create invoice for {}, invoice number {}", fofoOrder.getId(),
633
						fofoOrder.getInvoiceNumber());
25092 amit.gupta 634
			}
635
		}
636
		PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
637
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
638
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
639
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
640
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
641
	}
642
 
23973 govind 643
	@RequestMapping(value = "/credit-note/{creditNoteId}")
644
	public ResponseEntity<?> downloadCreditNote(HttpServletRequest request, @PathVariable int creditNoteId)
645
			throws ProfitMandiBusinessException {
23654 amit.gupta 646
		CreditNotePdfModel creditNotePdfModel = orderService.getCreditNotePdfModel(creditNoteId);
647
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
648
		PdfUtils.generateAndWriteCustomerCreditNotes(Arrays.asList(creditNotePdfModel), byteArrayOutputStream);
649
		LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
23973 govind 650
		final HttpHeaders headers = new HttpHeaders();
651
		headers.setContentType(MediaType.APPLICATION_PDF);
652
		headers.set("Content-disposition",
653
				"inline; filename=invoice-" + creditNotePdfModel.getCreditNoteNumber() + ".pdf");
654
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
655
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
656
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
657
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
23654 amit.gupta 658
	}
23973 govind 659
 
22291 ashik.ali 660
	@RequestMapping(value = "/getPaginatedSaleHistory")
23973 govind 661
	public String getSaleHistoryPaginated(HttpServletRequest request,
662
			@RequestParam(name = "searchValue", defaultValue = "") String searchValue,
663
			@RequestParam(name = "searchType", defaultValue = "") SearchType searchType,
664
			@RequestParam(required = false) LocalDateTime startTime,
665
			@RequestParam(required = false) LocalDateTime endTime,
666
			@RequestParam(name = "offset", defaultValue = "0") int offset,
667
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
668
			throws ProfitMandiBusinessException {
22927 ashik.ali 669
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23973 govind 670
		Map<String, Object> map = orderService.getSaleHistoryPaginated(loginDetails.getFofoId(), searchType,
671
				searchValue, startTime, endTime, offset, limit);
23203 ashik.ali 672
		model.addAllAttributes(map);
22291 ashik.ali 673
		return "sale-history-paginated";
674
	}
675
 
24105 govind 676
	@PutMapping(value = "/updatePaymentTransaction")
677
	public String updateTransactionDetails(HttpServletRequest request, @RequestParam String referenceType,
678
			@RequestParam int fofoId, @RequestParam int referenceId,
679
			@RequestBody List<PaymentOptionTransactionModel> paymentOptionTransactionModels, Model model)
680
			throws Exception {
681
		float amount = 0;
682
		LOGGER.info(paymentOptionTransactionModels);
683
 
684
		for (PaymentOptionTransactionModel paymentOptionTransactionModel : paymentOptionTransactionModels) {
685
			amount = amount + paymentOptionTransactionModel.getAmount();
686
		}
687
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoId, referenceId);
688
		LOGGER.info("FofoOrder amount" + fofoOrder.getTotalAmount() + "amount" + amount);
689
		if (amount == fofoOrder.getTotalAmount()) {
690
			if (paymentOptionTransactionModels.size() > 0) {
691
				List<PaymentOptionTransaction> paymentOptionTransactions = fofoOrderPaymentOptionRepository
692
						.selectByReferenceIdAndType(referenceId, PaymentOptionReferenceType.ORDER);
693
				Map<Integer, PaymentOptionTransaction> paymentOptionIdPaymentOptionTransactionMap = this
694
						.paymentOptionIdPaymentOptionTransactionMap(paymentOptionTransactions);
695
				LOGGER.info("paymentOptionIdPaymentOptionTransactionMap"
696
						+ paymentOptionIdPaymentOptionTransactionMap.keySet());
697
				for (PaymentOptionTransactionModel paymentOptionTransactionModel : paymentOptionTransactionModels) {
698
					if (paymentOptionIdPaymentOptionTransactionMap
699
							.containsKey(paymentOptionTransactionModel.getPaymentOptionId())) {
700
 
701
						PaymentOptionTransaction paymentOptionTransaction = paymentOptionIdPaymentOptionTransactionMap
702
								.get(paymentOptionTransactionModel.getPaymentOptionId());
703
 
704
						if (paymentOptionTransactionModel.getAmount() == 0) {
705
							fofoOrderPaymentOptionRepository.delete(paymentOptionTransaction);
706
							LOGGER.info("deleted successfully");
707
						} else {
708
 
709
							paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
710
							fofoOrderPaymentOptionRepository.persist(paymentOptionTransaction);
711
							LOGGER.info("updated successfully");
712
 
713
						}
714
					} else {
715
						if (paymentOptionTransactionModel.getAmount() > 0) {
716
							PaymentOptionTransaction paymentOptionTransaction = new PaymentOptionTransaction();
717
							paymentOptionTransaction.setReferenceId(referenceId);
718
							paymentOptionTransaction.setReferenceType(PaymentOptionReferenceType.ORDER);
719
							paymentOptionTransaction
720
									.setPaymentOptionId(paymentOptionTransactionModel.getPaymentOptionId());
721
							paymentOptionTransaction.setAmount(paymentOptionTransactionModel.getAmount());
722
							paymentOptionTransaction.setFofoId(fofoId);
24167 amit.gupta 723
							paymentOptionTransaction.setCreateTimestamp(fofoOrder.getCreateTimestamp());
24105 govind 724
							fofoOrderPaymentOptionRepository.persist(paymentOptionTransaction);
725
							LOGGER.info("inserted successfully");
726
						}
727
					}
728
 
729
				}
730
 
731
				model.addAttribute("response", mvcResponseSender.createResponseString(true));
732
			}
733
		} else {
734
			throw new ProfitMandiBusinessException("Amount", amount, "Sum of amount is not equal to total amount");
735
		}
736
 
737
		return "response";
738
	}
24440 amit.gupta 739
 
25726 amit.gupta 740
	private Map<String, List<MobileInsurancePlan>> getPlans(float sellingPrice, int itemId)
741
			throws ProfitMandiBusinessException {
742
		try {
743
			Map<String, List<MobileInsurancePlan>> productDurationPlans = insuranceService.getAllPlans(itemId,
744
					sellingPrice);
745
			return productDurationPlans;
746
		} catch (Exception e) {
747
			e.printStackTrace();
748
			throw new ProfitMandiBusinessException("Fetch Insurance Plans", "Insurance",
26647 tejbeer 749
					"Could not fetch insurance Plans");
25726 amit.gupta 750
		}
751
 
24440 amit.gupta 752
	}
24880 govind 753
 
754
	@GetMapping("/insuranceDetails")
755
	public String getInsuranceDetails(HttpServletRequest request,
756
			@RequestParam(name = "offset", defaultValue = "0") int offset,
757
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
758
			throws ProfitMandiBusinessException {
759
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
760
		long size = 0;
761
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
762
				offset, limit);
763
		size = insurancePolicyRepository.selectCountByRetailerId(loginDetails.getFofoId());
764
		Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
765
				.selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
766
				.stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
767
		if (size < limit) {
768
			model.addAttribute("end", offset + size);
769
		} else {
770
			model.addAttribute("end", offset + limit);
771
		}
772
		model.addAttribute("start", offset + 1);
773
		model.addAttribute("size", size);
774
		model.addAttribute("insurancePolicies", insurancePolicies);
775
		model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
776
		return "insurance-details";
777
	}
25092 amit.gupta 778
 
24880 govind 779
	@GetMapping("/insuranceDetailsPaginated")
780
	public String getInsuranceDetailsPaginated(HttpServletRequest request,
781
			@RequestParam(name = "offset", defaultValue = "0") int offset,
782
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
783
			throws ProfitMandiBusinessException {
784
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
785
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerId(loginDetails.getFofoId(),
786
				offset, limit);
787
		Map<Integer, String> providerPolicyNameAndIdMap = insuranceProviderRepository
788
				.selectByIds(insurancePolicies.stream().map(x -> x.getProviderId()).collect(Collectors.toSet()))
789
				.stream().collect(Collectors.toMap(InsuranceProvider::getId, InsuranceProvider::getName));
790
		model.addAttribute("insurancePolicies", insurancePolicies);
791
		model.addAttribute("providerPolicyNameAndIdMap", providerPolicyNameAndIdMap);
792
		return "insurance-details-paginated";
793
	}
26647 tejbeer 794
 
795
	@GetMapping("/pendingOrders")
26663 tejbeer 796
	public String getPendingOrders(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
26647 tejbeer 797
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
798
		boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
799
		List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
800
				.collect(Collectors.toList());
801
 
802
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(fofoIds);
803
 
804
		List<PendingOrder> pendingOrder = null;
805
		if (isAdmin) {
26721 tejbeer 806
			pendingOrder = pendingOrderRepository.selectAllByStatus("open");
26647 tejbeer 807
			model.addAttribute("customRetailersMap", customRetailersMap);
808
		} else {
26721 tejbeer 809
			pendingOrder = pendingOrderRepository.selectByFofoId(loginDetails.getFofoId(), "open");
26647 tejbeer 810
		}
811
		model.addAttribute("pendingOrder", pendingOrder);
26721 tejbeer 812
		model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
26647 tejbeer 813
		return "pending_fofo_order";
814
	}
815
 
816
	@GetMapping("/getPendingOrderItem")
817
	public String getPendingOrderItem(HttpServletRequest request, @RequestParam int orderId, Model model)
818
			throws ProfitMandiBusinessException {
819
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
820
		Map<Integer, Item> itemMap = new HashMap<>();
821
		Map<Integer, CurrentInventorySnapshot> inventoryMap = new HashMap<>();
822
		List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByOrderId(orderId);
823
		for (PendingOrderItem pendingOrderItem : pendingOrderItems) {
824
			Item item = itemRepository.selectById(pendingOrderItem.getItemId());
825
			CurrentInventorySnapshot cis = currentInventorySnapshotRepository
826
					.selectByItemAndFofoId(pendingOrderItem.getItemId(), loginDetails.getFofoId());
827
			itemMap.put(pendingOrderItem.getItemId(), item);
828
			LOGGER.info("cis" + cis);
829
			inventoryMap.put(pendingOrderItem.getItemId(), cis);
830
		}
831
 
832
		LOGGER.info("inventoryMap" + inventoryMap);
833
		model.addAttribute("pendingOrderItems", pendingOrderItems);
834
		model.addAttribute("itemMap", itemMap);
835
		model.addAttribute("inventoryMap", inventoryMap);
26721 tejbeer 836
		model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
26647 tejbeer 837
		return "pending-order-item";
838
	}
26721 tejbeer 839
 
840
	@RequestMapping(value = "/cancelPendingOrder", method = RequestMethod.POST)
841
	public String cancelPendingOrder(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
842
		PendingOrder pendingOrder = pendingOrderRepository.selectById(id);
843
 
844
		List<PendingOrderItem> pendingOrderItem = pendingOrderItemRepository.selectByOrderId(id);
845
		for (PendingOrderItem poi : pendingOrderItem) {
846
			poi.setStatus("cancelled");
847
 
848
		}
849
		pendingOrder.setStatus("closed");
850
 
851
		pendingOrderRepository.persist(pendingOrder);
852
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
853
 
854
		return "response";
855
	}
856
 
857
	@RequestMapping(value = "/cancelPendingOrderItem", method = RequestMethod.POST)
858
	public String cancelPendingOrderItem(HttpServletRequest request, @RequestParam int id, Model model)
859
			throws Exception {
860
		PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(id);
861
 
862
		pendingOrderItem.setStatus("cancelled");
863
		PendingOrder pendingOrder = pendingOrderRepository.selectById(pendingOrderItem.getId());
864
 
865
		List<String> status = pendingOrderItemRepository.selectByOrderId(pendingOrderItem.getOrderId()).stream()
866
				.map(x -> x.getStatus()).collect(Collectors.toList());
867
 
868
		if (!status.contains("pending")) {
869
			pendingOrder.setStatus("closed");
870
		}
871
		pendingOrderItemRepository.persist(pendingOrderItem);
872
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
873
 
874
		return "response";
875
	}
21612 ashik.ali 876
}