Subversion Repositories SmartDukaan

Rev

Rev 31077 | Rev 32884 | Go to most recent revision | View as "text/plain" | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.spice.profitmandi.service;

import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
import com.spice.profitmandi.dao.entity.logistics.Provider;
import com.spice.profitmandi.dao.entity.logistics.ProviderTat;
import com.spice.profitmandi.dao.entity.transaction.Order;
import com.spice.profitmandi.dao.model.DispatchNotificationModel;
import com.spice.profitmandi.dao.repository.logistics.ProviderTatRepository;
import com.spice.profitmandi.dao.repository.logistics.PublicHolidaysRepository;
import in.shop2020.model.v1.order.OrderStatus;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Component
public class LogisticsServiceImpl implements LogisticsService {

        @Autowired
        private PublicHolidaysRepository publicHolidaysRepository;

        @Autowired
        private ProviderTatRepository providerTatRepository;

        @Override
        public LocalDate calculateDeliveryTimeline(LocalDate date, ProviderTat providerTat, int delayDays) {
                int businessDays = 0;
                int deliveryTat = 3;
                if (providerTat != null) {
                        deliveryTat = providerTat.getDeliveryTime();
                }
                deliveryTat = deliveryTat + delayDays;
                LocalDate currDate = date.plusDays(1);
                List<LocalDate> ph = publicHolidaysRepository.selectAllByDate(currDate).stream().map(x -> x.getDate())
                                .collect(Collectors.toList());
                while (businessDays < deliveryTat) {
                        if (ph.contains(currDate) || currDate.getDayOfWeek().equals(DayOfWeek.SUNDAY)) {
                        } else {
                                businessDays++;
                        }
                        currDate = currDate.plusDays(1);
                }
                return currDate;
        }

        @Override
        public Map<String, DispatchNotificationModel> markedOrderShippedDetail(List<Order> orders, Provider provider,
                                                                                                                                                   Map<String, DispatchNotificationModel> dispatchNotication, String airwaybillNo, LocalDateTime shippingTimestamp)
                        throws ProfitMandiBusinessException {

                for (Order order : orders) {
                        if (order.getStatus().equals(OrderStatus.BILLED)) {

                                if (StringUtils.isEmpty(airwaybillNo)) {
                                        throw new ProfitMandiBusinessException("Uploaded File", "",
                                                        "Invoice Number " + order.getInvoiceNumber() + " airwaybill_no is empty");

                                }

                                if (airwaybillNo.equals("Error")) {
                                        break;
                                }
                                order.setLogisticsProviderId(provider.getId());
                                order.setAirwayBillNumber(airwaybillNo);
                                order.setStatus(OrderStatus.SHIPPED_FROM_WH);
                                order.setStatusDescription("Order shipped from warehouses");

                                ProviderTat pt = providerTatRepository.selectByProviderId(order.getLogisticsProviderId(),
                                                order.getWarehouseId(), order.getRetailerPinCode());
                                order.setShippingTimestamp(shippingTimestamp);

                                LocalDate deliveryDate = this.calculateDeliveryTimeline(LocalDate.now(), pt, 0);
                                order.setExpectedDeliveryTime(deliveryDate.atStartOfDay());

                                if (dispatchNotication.get(airwaybillNo) != null) {
                                        DispatchNotificationModel dnm = dispatchNotication.get(airwaybillNo);
                                        List<String> invoiceNumbers = dnm.getInvoiceNumber();
                                        invoiceNumbers.add(order.getInvoiceNumber());
                                        dnm.setInvoiceNumber(invoiceNumbers);
                                        Float totalAmount = dnm.getTotalAmount();
                                        dnm.setTotalAmount(totalAmount + order.getTotalAmount());

                                        int totalQty = dnm.getTotalQty();
                                        dnm.setTotalQty(totalQty + order.getLineItem().getQuantity());

                                        dispatchNotication.put(airwaybillNo, dnm);

                                } else {
                                        DispatchNotificationModel dnm = new DispatchNotificationModel();
                                        List<String> invoiceNumber = new ArrayList<>();
                                        invoiceNumber.add(order.getInvoiceNumber());
                                        dnm.setInvoiceNumber(invoiceNumber);
                                        dnm.setTotalAmount(order.getTotalAmount());
                                        dnm.setTotalQty(order.getLineItem().getQuantity());
                                        dnm.setFofoId(order.getRetailerId());
                                        dnm.setProviderId(order.getLogisticsProviderId());
                                        dnm.setDate(deliveryDate);

                                        dispatchNotication.put(airwaybillNo, dnm);

                                }

                        }

                }
                return dispatchNotication;

        }

}