Subversion Repositories SmartDukaan

Rev

Rev 23657 | Rev 23786 | 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;
23654 amit.gupta 8
import java.util.Arrays;
23343 ashik.ali 9
import java.util.HashMap;
21612 ashik.ali 10
import java.util.HashSet;
21680 ashik.ali 11
import java.util.List;
12
import java.util.Map;
21612 ashik.ali 13
import java.util.Set;
23638 amit.gupta 14
import java.util.stream.Collectors;
21612 ashik.ali 15
 
16
import javax.servlet.http.HttpServletRequest;
21689 ashik.ali 17
import javax.servlet.http.HttpServletResponse;
21612 ashik.ali 18
 
23638 amit.gupta 19
import org.apache.logging.log4j.LogManager;
23568 govind 20
import org.apache.logging.log4j.Logger;
21612 ashik.ali 21
import org.springframework.beans.factory.annotation.Autowired;
23784 ashik.ali 22
import org.springframework.beans.factory.annotation.Qualifier;
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;
23654 amit.gupta 31
import org.springframework.web.bind.annotation.PathVariable;
21612 ashik.ali 32
import org.springframework.web.bind.annotation.RequestBody;
33
import org.springframework.web.bind.annotation.RequestMapping;
34
import org.springframework.web.bind.annotation.RequestMethod;
21689 ashik.ali 35
import org.springframework.web.bind.annotation.RequestParam;
21612 ashik.ali 36
 
23203 ashik.ali 37
import com.spice.profitmandi.common.enumuration.SearchType;
21612 ashik.ali 38
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
21985 kshitij.so 39
import com.spice.profitmandi.common.model.CartFofo;
22860 ashik.ali 40
import com.spice.profitmandi.common.model.CreateOrderRequest;
23654 amit.gupta 41
import com.spice.profitmandi.common.model.CreditNotePdfModel;
23584 ashik.ali 42
import com.spice.profitmandi.common.model.CustomCustomer;
23638 amit.gupta 43
import com.spice.profitmandi.common.model.FoiBadReturnRequest;
22660 ashik.ali 44
import com.spice.profitmandi.common.model.PdfModel;
22581 ashik.ali 45
import com.spice.profitmandi.common.model.PriceModel;
21612 ashik.ali 46
import com.spice.profitmandi.common.model.ProfitMandiConstants;
21689 ashik.ali 47
import com.spice.profitmandi.common.util.PdfUtils;
23638 amit.gupta 48
import com.spice.profitmandi.common.util.StringUtils;
23298 ashik.ali 49
import com.spice.profitmandi.common.util.Utils;
22244 ashik.ali 50
import com.spice.profitmandi.common.web.util.ResponseSender;
23638 amit.gupta 51
import com.spice.profitmandi.dao.entity.catalog.Item;
22217 ashik.ali 52
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
23343 ashik.ali 53
import com.spice.profitmandi.dao.entity.dtr.InsuranceProvider;
23548 ashik.ali 54
import com.spice.profitmandi.dao.entity.dtr.PaymentOptionTransaction;
23784 ashik.ali 55
import com.spice.profitmandi.dao.entity.dtr.Role;
21728 ashik.ali 56
import com.spice.profitmandi.dao.entity.fofo.Customer;
57
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
23654 amit.gupta 58
import com.spice.profitmandi.dao.entity.fofo.CustomerCreditNote;
59
import com.spice.profitmandi.dao.entity.fofo.CustomerReturnItem;
23638 amit.gupta 60
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
22927 ashik.ali 61
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
22860 ashik.ali 62
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
21728 ashik.ali 63
import com.spice.profitmandi.dao.entity.fofo.PaymentOption;
23419 ashik.ali 64
import com.spice.profitmandi.dao.entity.fofo.PrebookingOrderItem;
23298 ashik.ali 65
import com.spice.profitmandi.dao.entity.user.Address;
23548 ashik.ali 66
import com.spice.profitmandi.dao.enumuration.dtr.PaymentOptionReferenceType;
23594 ashik.ali 67
import com.spice.profitmandi.dao.enumuration.dtr.RoleType;
23638 amit.gupta 68
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
22217 ashik.ali 69
import com.spice.profitmandi.dao.repository.dtr.InsurancePolicyRepository;
23343 ashik.ali 70
import com.spice.profitmandi.dao.repository.dtr.InsuranceProviderRepository;
23638 amit.gupta 71
import com.spice.profitmandi.dao.repository.dtr.PaymentOptionTransactionRepository;
23298 ashik.ali 72
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
23784 ashik.ali 73
import com.spice.profitmandi.dao.repository.dtr.RoleRepository;
21728 ashik.ali 74
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
75
import com.spice.profitmandi.dao.repository.fofo.CustomerRepository;
23650 amit.gupta 76
import com.spice.profitmandi.dao.repository.fofo.CustomerReturnItemRepository;
23638 amit.gupta 77
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
22860 ashik.ali 78
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
21728 ashik.ali 79
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
23366 ashik.ali 80
import com.spice.profitmandi.dao.repository.fofo.FofoPartnerPaymentOptionRepository;
21728 ashik.ali 81
import com.spice.profitmandi.dao.repository.fofo.PaymentOptionRepository;
23419 ashik.ali 82
import com.spice.profitmandi.dao.repository.fofo.PrebookingOrderItemRepository;
23298 ashik.ali 83
import com.spice.profitmandi.dao.repository.user.AddressRepository;
23366 ashik.ali 84
import com.spice.profitmandi.service.order.OrderService;
22069 ashik.ali 85
import com.spice.profitmandi.service.pricing.PricingService;
22139 amit.gupta 86
import com.spice.profitmandi.web.model.LoginDetails;
22069 ashik.ali 87
import com.spice.profitmandi.web.util.CookiesProcessor;
21612 ashik.ali 88
 
89
@Controller
22037 amit.gupta 90
@Transactional(rollbackFor=Throwable.class)
21612 ashik.ali 91
public class OrderController {
92
 
23568 govind 93
	private static final Logger LOGGER = LogManager.getLogger(OrderController.class);
21985 kshitij.so 94
 
21612 ashik.ali 95
	@Autowired
22860 ashik.ali 96
	private CustomerRepository customerRepository;
21985 kshitij.so 97
 
21612 ashik.ali 98
	@Autowired
23654 amit.gupta 99
	private CustomerReturnItemRepository customerReturnItemRepository;
100
 
101
	@Autowired
23638 amit.gupta 102
	private FofoOrderItemRepository fofoOrderItemRepository;
103
 
104
	@Autowired
105
	private FofoLineItemRepository fofoLineItemRepository;
21985 kshitij.so 106
 
21612 ashik.ali 107
	@Autowired
22860 ashik.ali 108
	private PaymentOptionRepository paymentOptionRepository;
23638 amit.gupta 109
 
110
	@Autowired
23784 ashik.ali 111
	@Qualifier("catalogItemRepository")
23638 amit.gupta 112
	private ItemRepository itemRepository;
21985 kshitij.so 113
 
21680 ashik.ali 114
	@Autowired
22860 ashik.ali 115
	private FofoOrderRepository fofoOrderRepository;
21985 kshitij.so 116
 
21680 ashik.ali 117
	@Autowired
22860 ashik.ali 118
	private CustomerAddressRepository customerAddressRepository;
22217 ashik.ali 119
 
120
	@Autowired
22860 ashik.ali 121
	private InsurancePolicyRepository insurancePolicyRepository;
23343 ashik.ali 122
 
123
	@Autowired
124
	private InsuranceProviderRepository insuranceProviderRepository;
21985 kshitij.so 125
 
21896 ashik.ali 126
	@Autowired
22860 ashik.ali 127
	private CookiesProcessor cookiesProcessor;
22069 ashik.ali 128
 
129
	@Autowired
22860 ashik.ali 130
	private PricingService pricingService;
22244 ashik.ali 131
 
22354 ashik.ali 132
	@Autowired
22860 ashik.ali 133
	private OrderService orderService;
22244 ashik.ali 134
 
23298 ashik.ali 135
	@Autowired
136
	private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
22354 ashik.ali 137
 
138
	@Autowired
23298 ashik.ali 139
	private AddressRepository addressRepository;
140
 
141
	@Autowired
23548 ashik.ali 142
	private PaymentOptionTransactionRepository fofoOrderPaymentOptionRepository;
23366 ashik.ali 143
 
144
	@Autowired
145
	private FofoPartnerPaymentOptionRepository fofoPartnerPaymentOptionRepository;
146
 
147
	@Autowired
23419 ashik.ali 148
	private PrebookingOrderItemRepository prebookingOrderItemRepository;
149
 
150
	@Autowired
23784 ashik.ali 151
	private RoleRepository roleRepository;
152
 
153
	@Autowired
22860 ashik.ali 154
	private ResponseSender<?> responseSender;
22689 amit.gupta 155
 
21985 kshitij.so 156
	@RequestMapping(value = "/order")
22927 ashik.ali 157
	public String orderIndex(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model) throws ProfitMandiBusinessException{
158
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);;
159
 
23298 ashik.ali 160
		int addressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(loginDetails.getFofoId());
161
		Address address = addressRepository.selectById(addressId);
162
 
22860 ashik.ali 163
		List<CartFofo> cartItems = orderService.cartCheckout(cartData);
164
		Set<Integer> itemIds = new HashSet<>();
165
		for(CartFofo cartFofo : cartItems){
166
			itemIds.add(cartFofo.getItemId());
21985 kshitij.so 167
		}
22860 ashik.ali 168
		Map<Integer, PriceModel> mopPriceMap = pricingService.getPurchasePriceMopPriceNotFound(itemIds, loginDetails.getFofoId());
23366 ashik.ali 169
		List<Integer> paymentOptionIds = fofoPartnerPaymentOptionRepository.selectPaymentOptionIdsByFofoId(loginDetails.getFofoId());
170
		List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(new HashSet<>(paymentOptionIds));
22860 ashik.ali 171
		LOGGER.info("mopPriceMap {}", mopPriceMap);
23298 ashik.ali 172
		model.addAttribute("stateNames", Utils.getAllStateNames());
173
		model.addAttribute("retailerStateName", address.getState());
22860 ashik.ali 174
		model.addAttribute("cartObj", cartItems);
175
		model.addAttribute("mopPriceMap", mopPriceMap);
23366 ashik.ali 176
		model.addAttribute("paymentOptions", paymentOptions);
22860 ashik.ali 177
		return "order-index";
21985 kshitij.so 178
	}
22660 ashik.ali 179
 
21612 ashik.ali 180
 
22244 ashik.ali 181
	@RequestMapping(value = "/insurancePrices", method = RequestMethod.GET)
22927 ashik.ali 182
	public ResponseEntity<?> getInsurancePrices(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.PRICE) float price) throws ProfitMandiBusinessException{
22244 ashik.ali 183
		LOGGER.info("Request received at url : {}", request.getRequestURI());
22927 ashik.ali 184
		Set<Float> prices = new HashSet<>();
185
		prices.add(price);
186
		return responseSender.ok(pricingService.getInsurancePrices(prices, ProfitMandiConstants.GADGET_COPS));
22244 ashik.ali 187
	}
188
 
189
 
21985 kshitij.so 190
	@RequestMapping(value = "/get-order", method = RequestMethod.GET)
22927 ashik.ali 191
	public String getOrder(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws ProfitMandiBusinessException{
192
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
193
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
23638 amit.gupta 194
		List<FofoOrderItem> fofoLineItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
22927 ashik.ali 195
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
196
		Customer customer  = customerRepository.selectById(fofoOrder.getCustomerId());
197
		customerAddress.setPhoneNumber(customer.getMobileNumber());
23548 ashik.ali 198
		List<PaymentOptionTransaction> paymentOptionTransactions = fofoOrderPaymentOptionRepository.selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
199
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this.paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
22927 ashik.ali 200
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fofoOrder.getFofoId(), fofoOrder.getInvoiceNumber());
23343 ashik.ali 201
		this.addInsuranceProvider(insurancePolicies);
23419 ashik.ali 202
		List<PrebookingOrderItem> prebookingOrderItems = prebookingOrderItemRepository.selectByOrderId(orderId);
203
		Map<Integer, PrebookingOrderItem> itemIdPrebookingOrderItemMap = this.prebookingOrderItemToItemIdPrebookingOrderItem(prebookingOrderItems);
22927 ashik.ali 204
		model.addAttribute("fofoOrder", fofoOrder);
205
		model.addAttribute("fofoLineItems", fofoLineItems);
206
		model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
207
		model.addAttribute("customerBillingAddressObj", customerAddress);
23548 ashik.ali 208
		model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
23366 ashik.ali 209
		model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
22927 ashik.ali 210
		model.addAttribute("insurancePolicies", insurancePolicies);
23419 ashik.ali 211
		model.addAttribute("itemIdPrebookingOrderItemMap", itemIdPrebookingOrderItemMap);
22927 ashik.ali 212
		return "order-details";
21985 kshitij.so 213
	}
22244 ashik.ali 214
 
23419 ashik.ali 215
	@RequestMapping(value = "/generateOtp", method = RequestMethod.POST)
216
	public ResponseEntity<?> generateOtp(@RequestBody Map<Integer, Float> itemIdAdvanceAmount, @RequestParam(name = ProfitMandiConstants.CUSTOMER_EMAIL_ID) String customerEmailId, @RequestParam(name = ProfitMandiConstants.CUSTOMER_MOBILE_NUMBER) String customerMobileNumber)
217
			throws ProfitMandiBusinessException{
218
 
219
		int response = orderService.generatePrebookingOrdersOtp(customerEmailId, customerMobileNumber, itemIdAdvanceAmount);
220
 
221
		return responseSender.ok(response);
222
	}
223
 
224
	@RequestMapping(value = "/validateOtp", method = RequestMethod.GET)
225
	public ResponseEntity<?> validateOtp(@RequestParam(name = ProfitMandiConstants.CUSTOMER_EMAIL_ID) String customerEmailId,
226
			@RequestParam(name = ProfitMandiConstants.CUSTOMER_MOBILE_NUMBER) String customerMobileNumber,
227
			@RequestParam("otpId") int otpId, @RequestParam("otpValue") String otpValue)
228
			throws ProfitMandiBusinessException{
229
 
230
		String responseString = orderService.validateOtp(customerEmailId, customerMobileNumber, otpId, otpValue);
231
 
232
		return responseSender.ok(responseString);
233
	}
234
 
235
 
23343 ashik.ali 236
	private Map<Integer, InsuranceProvider> toInsuranceProviderIdInsuranceProvider(List<InsuranceProvider> insuranceProviders){
237
		Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = new HashMap<>();
238
		for(InsuranceProvider insuranceProvider : insuranceProviders){
239
			insuranceProviderIdInsuranceProviderMap.put(insuranceProvider.getId(), insuranceProvider);
240
		}
241
		return insuranceProviderIdInsuranceProviderMap;
242
	}
22244 ashik.ali 243
 
23343 ashik.ali 244
	private void addInsuranceProvider(List<InsurancePolicy> insurancePolicies){
245
		if(insurancePolicies.isEmpty()){
246
			return;
247
		}
248
		Set<Integer> insuranceProviderIds = new HashSet<>();
249
		for(InsurancePolicy insurancePolicy : insurancePolicies){
250
			insuranceProviderIds.add(insurancePolicy.getProviderId());
251
		}
252
		LOGGER.info("insuranceProviderIds {}", insuranceProviderIds);
253
		List<InsuranceProvider> insuranceProviders = insuranceProviderRepository.selectByIds(insuranceProviderIds);
254
		Map<Integer, InsuranceProvider> insuranceProviderIdInsuranceProviderMap = this.toInsuranceProviderIdInsuranceProvider(insuranceProviders);
255
		for(InsurancePolicy insurancePolicy : insurancePolicies){
256
			insurancePolicy.setInsuranceProvider(insuranceProviderIdInsuranceProviderMap.get(insurancePolicy.getProviderId()));
257
		}
258
	}
259
 
260
 
22244 ashik.ali 261
	@RequestMapping(value = "/saleDetails", method = RequestMethod.GET)
23638 amit.gupta 262
	public String getSaleDetails(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws Exception {
22927 ashik.ali 263
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
264
 
265
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(fofoDetails.getFofoId(), orderId);
23654 amit.gupta 266
		List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
22927 ashik.ali 267
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
23548 ashik.ali 268
		List<PaymentOptionTransaction> paymentOptionTransactions = fofoOrderPaymentOptionRepository.selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
269
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this.paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
22927 ashik.ali 270
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fofoOrder.getFofoId(), fofoOrder.getInvoiceNumber());
23343 ashik.ali 271
		this.addInsuranceProvider(insurancePolicies);
23419 ashik.ali 272
		List<PrebookingOrderItem> prebookingOrderItems = prebookingOrderItemRepository.selectByOrderId(orderId);
273
		Map<Integer, PrebookingOrderItem> itemIdPrebookingOrderItemMap = this.prebookingOrderItemToItemIdPrebookingOrderItem(prebookingOrderItems);
23654 amit.gupta 274
		Map<Integer, Item> itemsMap = fofoOrderItems.stream().collect(Collectors.toMap(x->x.getItemId(), x->{
23638 amit.gupta 275
			try {
276
				return itemRepository.selectById(x.getItemId());
277
			} catch (ProfitMandiBusinessException e) {
278
				// TODO Auto-generated catch block
279
				return null;
280
			}
281
		}));
23654 amit.gupta 282
		Map<Integer, Set<FofoLineItem>>fofoOrderItemIdLineItemMap = fofoOrderItems.stream().collect(Collectors.toMap(FofoOrderItem::getId, 
283
				FofoOrderItem::getFofoLineItems));
284
 
285
		Map<Integer, List<CustomerReturnItem>> foiIdCustomerReturnInventoryItemsMap = fofoOrderItems.stream().collect(Collectors.toMap(foi->foi.getId(),
286
				foi->customerReturnItemRepository.selectAllByOrderItemId(foi.getId())));
287
 
288
		Map<Integer, Integer> inventoryItemBilledQtyMap = new HashMap<>();
289
 
290
 
291
 
292
		for(FofoOrderItem foi : fofoOrderItems) {
293
			for(FofoLineItem fli : foi.getFofoLineItems()) {
294
				inventoryItemBilledQtyMap.put(fli.getInventoryItemId(), fli.getQuantity());
295
			}
296
			List<CustomerReturnItem> customerReturnItems = customerReturnItemRepository.selectAllByOrderItemId(foi.getId());
297
			for(CustomerReturnItem customerReturnItem : customerReturnItems) {
298
				inventoryItemBilledQtyMap.put(customerReturnItem.getInventoryItemId(), inventoryItemBilledQtyMap.get(customerReturnItem.getInventoryItemId()) - 1);
299
			}
300
		}
301
 
302
		LOGGER.info("fofoOrderItemIdLineItemMap {}", fofoOrderItemIdLineItemMap);
22927 ashik.ali 303
		model.addAttribute("fofoOrder", fofoOrder);
23638 amit.gupta 304
		model.addAttribute("itemsMap", itemsMap);
23654 amit.gupta 305
		model.addAttribute("fofoOrderItemIdLineItemsMap", StringUtils.toString(fofoOrderItemIdLineItemMap));
306
		model.addAttribute("foiIdCustomerReturnInventoryItemsMap",StringUtils.toString(foiIdCustomerReturnInventoryItemsMap));
307
		model.addAttribute("fofoOrderItems", fofoOrderItems);
308
		model.addAttribute("inventoryItemBilledQtyMap", StringUtils.toString(inventoryItemBilledQtyMap));
22927 ashik.ali 309
		model.addAttribute("customerBillingAddress", orderService.getBillingAddress(customerAddress));
310
		model.addAttribute("customerBillingAddressObj", customerAddress);
23548 ashik.ali 311
		model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
23366 ashik.ali 312
		model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
22927 ashik.ali 313
		model.addAttribute("insurancePolicies", insurancePolicies);
23419 ashik.ali 314
		model.addAttribute("itemIdPrebookingOrderItemMap", itemIdPrebookingOrderItemMap);
23638 amit.gupta 315
		model.addAttribute("markDoa", this.markDoa(fofoOrder));
316
		model.addAttribute("markDefective", this.markDefective(fofoOrder));
22927 ashik.ali 317
		return "sale-details";
22244 ashik.ali 318
	}
319
 
23638 amit.gupta 320
	private boolean markDoa(FofoOrder fofoOrder) {
23657 amit.gupta 321
		return fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS).plusDays(30).
23638 amit.gupta 322
		isAfter(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
323
	}
324
 
325
	private boolean markDefective(FofoOrder fofoOrder) {
23656 amit.gupta 326
		return fofoOrder.getCreateTimestamp().truncatedTo(ChronoUnit.DAYS).plusDays(30).
23638 amit.gupta 327
		isAfter(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
328
 
329
	}
330
 
23584 ashik.ali 331
	@RequestMapping(value = "/getSearchOrder")
332
	public String getSearchOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException{
333
		return "search-order";
334
	}
335
 
336
 
337
	@RequestMapping(value = "/customerDetails", method = RequestMethod.PUT)
338
	public String updateCustomerDetails(HttpServletRequest request, @RequestBody CustomCustomer customCustomer, @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model)
339
			throws ProfitMandiBusinessException{
340
 
341
		orderService.updateCustomerDetails(customCustomer, invoiceNumber);
342
 
343
		return this.getSearchOrderDetails(request, invoiceNumber, model);
344
	}
345
 
346
 
347
	@RequestMapping(value = "/searchOrderDetails", method = RequestMethod.GET)
348
	public String getSearchOrderDetails(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.INVOICE_NUMBER) String invoiceNumber, Model model) throws ProfitMandiBusinessException{
349
 
350
		FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
23638 amit.gupta 351
		List<FofoOrderItem> fofoLineItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
23584 ashik.ali 352
		Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
353
		CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
354
		List<PaymentOptionTransaction> paymentOptionTransactions = fofoOrderPaymentOptionRepository.selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
355
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = this.paymentOptionIdPaymentOptionMap(paymentOptionTransactions);
356
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectByRetailerIdInvoiceNumber(fofoOrder.getFofoId(), fofoOrder.getInvoiceNumber());
357
		this.addInsuranceProvider(insurancePolicies);
358
		List<PrebookingOrderItem> prebookingOrderItems = prebookingOrderItemRepository.selectByOrderId(fofoOrder.getId());
359
		Map<Integer, PrebookingOrderItem> itemIdPrebookingOrderItemMap = this.prebookingOrderItemToItemIdPrebookingOrderItem(prebookingOrderItems);
360
		model.addAttribute("fofoOrder", fofoOrder);
361
		model.addAttribute("fofoLineItems", fofoLineItems);
362
		model.addAttribute("customer", customer);
363
		model.addAttribute("customerAddress", customerAddress);
364
		model.addAttribute("paymentOptionTransactions", paymentOptionTransactions);
365
		model.addAttribute("paymentOptionIdPaymentOptionMap", paymentOptionIdPaymentOptionMap);
366
		model.addAttribute("insurancePolicies", insurancePolicies);
367
		model.addAttribute("itemIdPrebookingOrderItemMap", itemIdPrebookingOrderItemMap);
368
		model.addAttribute("stateNames", Utils.getAllStateNames());
369
		return "search-order-details";
370
	}
371
 
23548 ashik.ali 372
	private Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap(List<PaymentOptionTransaction> paymentOptionTransactions){
23366 ashik.ali 373
		Set<Integer> paymentOptionIds = new HashSet<>();
23548 ashik.ali 374
		for(PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
375
			paymentOptionIds.add(paymentOptionTransaction.getPaymentOptionId());
23366 ashik.ali 376
		}
377
		List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(paymentOptionIds);
378
		Map<Integer, PaymentOption> paymentOptionIdPaymentOptionMap = new HashMap<>();
379
		for(PaymentOption paymentOption : paymentOptions) {
380
			paymentOptionIdPaymentOptionMap.put(paymentOption.getId(), paymentOption);
381
		}
382
		return paymentOptionIdPaymentOptionMap;
383
	}
384
 
23419 ashik.ali 385
	private Map<Integer, PrebookingOrderItem> prebookingOrderItemToItemIdPrebookingOrderItem(List<PrebookingOrderItem> prebookingOrderItems){
386
		Map<Integer, PrebookingOrderItem> itemIdPrebookingOrderItem = new HashMap<>();
387
		for(PrebookingOrderItem prebookingOrderItem : prebookingOrderItems) {
388
			itemIdPrebookingOrderItem.put(prebookingOrderItem.getItemId(), prebookingOrderItem);
389
		}
390
		return itemIdPrebookingOrderItem;
391
	}
392
 
21985 kshitij.so 393
 
394
	@RequestMapping(value = "/create-order", method = RequestMethod.POST)
22927 ashik.ali 395
	public String createOrder(HttpServletRequest request, @RequestBody CreateOrderRequest createOrderRequest, Model model)  throws ProfitMandiBusinessException{
22064 ashik.ali 396
		LOGGER.info("request at uri {} body {}", request.getRequestURI(), createOrderRequest);
22927 ashik.ali 397
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
398
 
22860 ashik.ali 399
		int fofoOrderId = orderService.createOrder(createOrderRequest, fofoDetails.getFofoId());
22280 ashik.ali 400
		LOGGER.info("Order has been created successfully...");
22860 ashik.ali 401
		return "redirect:/get-order/?orderId="+fofoOrderId;
21612 ashik.ali 402
	}
23638 amit.gupta 403
 
404
	@RequestMapping(value = "/order/bad_return", method = RequestMethod.POST)
23654 amit.gupta 405
	public ResponseEntity<?> badReturn(HttpServletRequest request, @RequestBody FoiBadReturnRequest foiBadReturnRequest, Model model)  throws ProfitMandiBusinessException{
23638 amit.gupta 406
		LOGGER.info("request at uri {} body {}", request.getRequestURI(), foiBadReturnRequest);
407
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
23654 amit.gupta 408
		CustomerCreditNote custmoerCreditNote = orderService.badReturn(fofoDetails.getFofoId(), foiBadReturnRequest);
409
		return responseSender.ok(custmoerCreditNote.getId());
23638 amit.gupta 410
	}
21985 kshitij.so 411
 
412
 
21689 ashik.ali 413
	@RequestMapping(value = "/generateInvoice")
22927 ashik.ali 414
	public ResponseEntity<?> generateInvoice(HttpServletRequest request, HttpServletResponse response, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId) throws ProfitMandiBusinessException{
22064 ashik.ali 415
		LOGGER.info("Request received at url {} with params [{}={}] ", request.getRequestURI(), ProfitMandiConstants.ORDER_ID, orderId);
22139 amit.gupta 416
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
23594 ashik.ali 417
		PdfModel pdfModel = null;
23784 ashik.ali 418
		Role role = roleRepository.selectByName(RoleType.FOFO_ADMIN.toString());
419
		if(fofoDetails.getRoleIds().contains(role.getId())) {
23594 ashik.ali 420
			pdfModel = orderService.getInvoicePdfModel(orderId);
421
		}else {
422
			pdfModel = orderService.getInvoicePdfModel(fofoDetails.getFofoId(), orderId);
423
		}
21689 ashik.ali 424
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
425
		PdfUtils.generateAndWrite(pdfModel, byteArrayOutputStream);
426
		LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
22026 ashik.ali 427
        final HttpHeaders headers=new HttpHeaders();
428
        headers.setContentType(MediaType.APPLICATION_PDF);
22860 ashik.ali 429
        headers.set("Content-disposition", "inline; filename=invoice-" + pdfModel.getInvoiceNumber() + ".pdf");
22026 ashik.ali 430
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
431
        final InputStream inputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
432
        final InputStreamResource inputStreamResource=new InputStreamResource(inputStream);
433
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
21689 ashik.ali 434
	}
22244 ashik.ali 435
 
436
	@RequestMapping(value = "/saleHistory")
23203 ashik.ali 437
	public String saleHistory(HttpServletRequest request, @RequestParam(name = "searchValue", defaultValue = "") String searchValue, @RequestParam(name = "searchType", defaultValue="") SearchType searchType, @RequestParam(name = ProfitMandiConstants.START_TIME, required = false) String startTimeString, @RequestParam(name = ProfitMandiConstants.END_TIME, required = false) String endTimeString, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws ProfitMandiBusinessException{
22927 ashik.ali 438
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
22244 ashik.ali 439
 
23203 ashik.ali 440
		Map<String, Object> map = orderService.getSaleHistory(loginDetails.getFofoId(), searchType, searchValue, startTimeString, endTimeString, offset, limit);
441
		model.addAllAttributes(map);
22244 ashik.ali 442
 
443
		return "sale-history";
444
	}
22291 ashik.ali 445
 
23654 amit.gupta 446
	@RequestMapping(value="/credit-note/{creditNoteId}") 
447
	public ResponseEntity<?> downloadCreditNote(HttpServletRequest request, @PathVariable int creditNoteId) throws ProfitMandiBusinessException	{
448
		CreditNotePdfModel creditNotePdfModel = orderService.getCreditNotePdfModel(creditNoteId);
449
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
450
		PdfUtils.generateAndWriteCustomerCreditNotes(Arrays.asList(creditNotePdfModel), byteArrayOutputStream);
451
		LOGGER.info("Pdf Stream length {}", byteArrayOutputStream.toByteArray().length);
452
        final HttpHeaders headers=new HttpHeaders();
453
        headers.setContentType(MediaType.APPLICATION_PDF);
454
        headers.set("Content-disposition", "inline; filename=invoice-" + creditNotePdfModel.getCreditNoteNumber() + ".pdf");
455
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
456
        final InputStream inputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
457
        final InputStreamResource inputStreamResource=new InputStreamResource(inputStream);
458
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
459
	}
22291 ashik.ali 460
 
23654 amit.gupta 461
 
22291 ashik.ali 462
	@RequestMapping(value = "/getPaginatedSaleHistory")
23203 ashik.ali 463
	public String getSaleHistoryPaginated(HttpServletRequest request, @RequestParam(name = "searchValue", defaultValue="") String searchValue, @RequestParam(name = "searchType", defaultValue = "") SearchType searchType, @RequestParam(name = ProfitMandiConstants.START_TIME, required = false) String startTimeString, @RequestParam(name = ProfitMandiConstants.END_TIME, required = false) String endTimeString, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue="10") int limit, Model model) throws ProfitMandiBusinessException{
22927 ashik.ali 464
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
465
 
23203 ashik.ali 466
		Map<String, Object> map = orderService.getSaleHistoryPaginated(loginDetails.getFofoId(), searchType, searchValue, startTimeString, endTimeString, offset, limit);
467
		model.addAllAttributes(map);
468
 
22291 ashik.ali 469
		return "sale-history-paginated";
470
	}
471
 
21612 ashik.ali 472
}