Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
21561 ashik.ali 1
package com.spice.profitmandi.web.controller;
21555 kshitij.so 2
 
30289 amit.gupta 3
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
4
import com.spice.profitmandi.common.model.ProfitMandiConstants;
30694 amit.gupta 5
import com.spice.profitmandi.common.model.ScanSerializedRequest;
31442 amit.gupta 6
import com.spice.profitmandi.common.util.Utils;
30289 amit.gupta 7
import com.spice.profitmandi.common.web.client.RestClient;
30694 amit.gupta 8
import com.spice.profitmandi.common.web.util.ResponseSender;
9
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
30289 amit.gupta 10
import com.spice.profitmandi.dao.entity.transaction.Order;
30694 amit.gupta 11
import com.spice.profitmandi.dao.model.ImeiInoviceModel;
12
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
30715 amit.gupta 13
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
30289 amit.gupta 14
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
15
import com.spice.profitmandi.service.authentication.RoleManager;
16
import com.spice.profitmandi.service.inventory.PurchaseService;
30380 amit.gupta 17
import com.spice.profitmandi.service.transaction.invoicing.InvoiceService;
30289 amit.gupta 18
import com.spice.profitmandi.web.model.LoginDetails;
19
import com.spice.profitmandi.web.util.CookiesProcessor;
30394 amit.gupta 20
import org.apache.commons.io.IOUtils;
30289 amit.gupta 21
import org.apache.http.HttpResponse;
30394 amit.gupta 22
import org.apache.http.entity.ContentType;
30289 amit.gupta 23
import org.apache.logging.log4j.LogManager;
23569 govind 24
import org.apache.logging.log4j.Logger;
21574 ashik.ali 25
import org.springframework.beans.factory.annotation.Autowired;
30289 amit.gupta 26
import org.springframework.core.io.InputStreamResource;
27
import org.springframework.http.HttpHeaders;
28
import org.springframework.http.HttpStatus;
30380 amit.gupta 29
import org.springframework.http.MediaType;
30289 amit.gupta 30
import org.springframework.http.ResponseEntity;
21555 kshitij.so 31
import org.springframework.stereotype.Controller;
21636 ashik.ali 32
import org.springframework.transaction.annotation.Transactional;
21574 ashik.ali 33
import org.springframework.ui.Model;
30694 amit.gupta 34
import org.springframework.web.bind.annotation.*;
21555 kshitij.so 35
 
30289 amit.gupta 36
import javax.servlet.http.HttpServletRequest;
30394 amit.gupta 37
import java.io.ByteArrayInputStream;
30380 amit.gupta 38
import java.io.ByteArrayOutputStream;
30289 amit.gupta 39
import java.io.File;
30394 amit.gupta 40
import java.io.InputStream;
30289 amit.gupta 41
import java.time.LocalDateTime;
31442 amit.gupta 42
import java.time.LocalTime;
43
import java.time.YearMonth;
30380 amit.gupta 44
import java.util.*;
31442 amit.gupta 45
import java.util.function.Function;
30387 amit.gupta 46
import java.util.stream.Collectors;
30380 amit.gupta 47
import java.util.zip.ZipEntry;
48
import java.util.zip.ZipOutputStream;
21555 kshitij.so 49
 
30395 amit.gupta 50
import static org.springframework.util.FileCopyUtils.BUFFER_SIZE;
51
 
21555 kshitij.so 52
@Controller
30289 amit.gupta 53
@Transactional(rollbackFor = Throwable.class)
21582 kshitij.so 54
public class PurchaseController {
21555 kshitij.so 55
 
31437 amit.gupta 56
    private static final Logger LOGGER = LogManager.getLogger(PurchaseController.class);
57
    @Autowired
58
    RestClient restClient;
59
    @Autowired
60
    private PurchaseService purchaseService;
61
    @Autowired
62
    private PurchaseRepository purchaseRepository;
63
    @Autowired
64
    private InventoryItemRepository inventoryItemRepository;
65
    @Autowired
66
    private OrderRepository orderRepository;
67
    @Autowired
68
    private RoleManager roleManager;
30289 amit.gupta 69
 
31437 amit.gupta 70
    @Autowired
71
    private ResponseSender responseSender;
30289 amit.gupta 72
 
31437 amit.gupta 73
    @Autowired
74
    private CookiesProcessor cookiesProcessor;
30715 amit.gupta 75
 
31437 amit.gupta 76
    @Autowired
77
    private InvoiceService invoiceService;
30694 amit.gupta 78
 
31437 amit.gupta 79
    @RequestMapping(value = "/purchase", method = RequestMethod.GET)
80
    public String purchase(HttpServletRequest request) throws Exception {
81
        return "purchase";
82
    }
21640 kshitij.so 83
 
31437 amit.gupta 84
    @RequestMapping(value = "/pendingGrn", method = RequestMethod.GET)
85
    public String pendingGrn(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
86
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
87
        LOGGER.info("Request Received at url {}", request.getRequestURI());
88
        List<Order> pendingGrns = orderRepository.selectShipmentToDeliveredByRetailerId(fofoDetails.getFofoId());
89
        model.addAttribute("pendingGrns", pendingGrns);
90
        return "pending-grn";
91
    }
30289 amit.gupta 92
 
31437 amit.gupta 93
    @RequestMapping(value = "/purchase/validate-imeis", method = RequestMethod.POST)
94
    public ResponseEntity<?> validatePurchaseImeis(HttpServletRequest request, @RequestBody ImeiInoviceModel imeiInoviceModel, Model model) throws ProfitMandiBusinessException {
95
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
96
        return responseSender.ok(this.getImeiValidationMap(fofoDetails.getFofoId(), imeiInoviceModel));
97
    }
30694 amit.gupta 98
 
31437 amit.gupta 99
    private Map<String, Boolean> getImeiValidationMap(int fofoId, ImeiInoviceModel imeiInoviceModel) throws ProfitMandiBusinessException {
100
        LOGGER.info("serialNumbers - {}", imeiInoviceModel.getSerialNumbers());
101
        Set<String> serialNumbers = new HashSet<>(orderRepository.selectSerialNumbers(imeiInoviceModel.getInvoiceNumber(), fofoId, imeiInoviceModel.getSerialNumbers()));
102
        Map<String, Boolean> imeiValidationMap = new HashMap<>();
103
        imeiInoviceModel.getSerialNumbers().stream().forEach(x -> {
104
            imeiValidationMap.put(x, true);
105
        });
106
        if (serialNumbers.size() > 0) {
107
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, new HashSet<>(serialNumbers), false);
108
            Set<String> grnedSerialNumberSet = inventoryItems.stream().filter(x -> x.getPurchase().getPurchaseReference().equals(imeiInoviceModel.getInvoiceNumber()))
109
                    .map(x -> x.getSerialNumber()).collect(Collectors.toSet());
110
            imeiInoviceModel.getSerialNumbers().stream().forEach(imei -> {
111
                if (grnedSerialNumberSet.contains(imei)) {
112
                    imeiValidationMap.put(imei, false);
113
                }
114
            });
21640 kshitij.so 115
 
31437 amit.gupta 116
        }
117
        return imeiValidationMap;
118
    }
21640 kshitij.so 119
 
31437 amit.gupta 120
    @RequestMapping(value = "/purchase/grn-imeis", method = RequestMethod.POST)
121
    public ResponseEntity<?> grnImeis(HttpServletRequest request, @RequestBody ImeiInoviceModel imeiInoviceModel, Model model) throws ProfitMandiBusinessException {
122
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
123
        Map<String, Boolean> imeiValidationMap = this.getImeiValidationMap(fofoDetails.getFofoId(), imeiInoviceModel);
124
        if (imeiValidationMap.values().stream().filter(x -> !x).findFirst().isPresent()) {
125
            throw new ProfitMandiBusinessException("Found invalid imeis cant proceed", "invalid imeis", "invalid imeis");
126
        }
30289 amit.gupta 127
 
31437 amit.gupta 128
        Map<Integer, List<String>> itemSerialNumberMap = orderRepository.selectItemSerialNumberMap(imeiInoviceModel.getInvoiceNumber(), fofoDetails.getFofoId(), imeiInoviceModel.getSerialNumbers());
129
        for (Map.Entry<Integer, List<String>> itemSerialNumberEntry : itemSerialNumberMap.entrySet()) {
130
            ScanSerializedRequest scanSerializedRequest = new ScanSerializedRequest();
131
            scanSerializedRequest.setSerialNumbers(itemSerialNumberEntry.getValue());
132
            scanSerializedRequest.setInvoiceNumber(imeiInoviceModel.getInvoiceNumber());
133
            scanSerializedRequest.setItemId(itemSerialNumberEntry.getKey());
134
            purchaseService.scanSerializedItems(scanSerializedRequest, fofoDetails.getFofoId());
135
        }
136
        return responseSender.ok(true);
137
    }
30289 amit.gupta 138
 
31437 amit.gupta 139
    @RequestMapping(value = "/purchase/get-imeis", method = RequestMethod.GET)
140
    public ResponseEntity<?> getImeis(HttpServletRequest request, @RequestParam String invoiceNumber, @RequestParam int itemId) throws ProfitMandiBusinessException {
141
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
142
        List<String> serialNumbers = orderRepository.selectSerialNumbersByInvoiceItem(invoiceNumber, itemId, fofoDetails.getFofoId());
143
        ImeiInoviceModel imeiInoviceModel = new ImeiInoviceModel();
144
        imeiInoviceModel.setInvoiceNumber(invoiceNumber);
145
        imeiInoviceModel.setSerialNumbers(serialNumbers);
146
        List<String> validSerialNumbers = this.getImeiValidationMap(fofoDetails.getFofoId(), imeiInoviceModel).entrySet().stream().filter(x -> x.getValue()).map(x -> x.getKey()).collect(Collectors.toList());
147
        return responseSender.ok(validSerialNumbers);
148
    }
30694 amit.gupta 149
 
30715 amit.gupta 150
 
31437 amit.gupta 151
    @RequestMapping(value = "/pendingGrnDetails", method = RequestMethod.GET)
152
    public String pendingGrnDetails(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ORDER_ID) int orderId, Model model) throws ProfitMandiBusinessException {
153
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
154
        LOGGER.info("Request Received at url [{}] with orderId [{}]", request.getRequestURI(), orderId);
155
        model.addAttribute("pendingGrnDetails", purchaseService.getShippingDetailByOrderId(orderId, fofoDetails.getFofoId()));
156
        return "pending-grn-details";
157
    }
30694 amit.gupta 158
 
31437 amit.gupta 159
    @RequestMapping(value = "/purchaseByInvoiceNumber", method = RequestMethod.GET)
160
    public String purchaseByAirwayBillOrInvoiceNumber(HttpServletRequest request,
161
                                                      @RequestParam(name = ProfitMandiConstants.AIRWAY_BILL_OR_INVOICE_NUMBER)
162
                                                      String airwayBillOrInvoiceNumber, Model model) throws ProfitMandiBusinessException {
163
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
164
        LOGGER.info("Request Received at url {} with airwayBillOrInvoiceNumber {}", request.getRequestURI(), airwayBillOrInvoiceNumber);
165
        Map<String, Object> map = purchaseService.purchaseByInvoiceNumber(airwayBillOrInvoiceNumber, fofoDetails.getFofoId());
166
        model.addAllAttributes(map);
167
        return "purchase";
168
    }
30694 amit.gupta 169
 
31442 amit.gupta 170
 
31437 amit.gupta 171
    @RequestMapping(value = "/purchase-invoice/{invoiceNumber}", method = RequestMethod.GET)
172
    public ResponseEntity<?> downloadInvoice(HttpServletRequest request, @PathVariable String invoiceNumber, Model model) throws Exception {
173
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
31442 amit.gupta 174
        List<String> invoiceNumbers = null;
175
        try {
176
            YearMonth ym = YearMonth.parse(invoiceNumber);
177
            if (!roleManager.isAdmin(fofoDetails.getRoleIds())) {
178
                List<Order> orders = orderRepository.selectAllByBillingDatesBetween(fofoDetails.getFofoId(), ym.atDay(1).atStartOfDay(),
179
                        ym.atEndOfMonth().atTime(LocalTime.MAX));
180
                invoiceNumbers = orders.stream().map(x -> x.getInvoiceNumber()).filter(Utils.distinctByKey(Function.identity())).collect(Collectors.toList());
181
            }
182
        } catch (Exception e) {
183
            invoiceNumbers = Arrays.asList(invoiceNumber.replaceAll(" ", "").split(","));
184
        }
31437 amit.gupta 185
        Map<String, List<Order>> invoiceOrdersMap = orderRepository.selectByInvoiceNumbers(invoiceNumbers).stream().collect(Collectors.groupingBy(x -> x.getInvoiceNumber()));
186
        if (invoiceOrdersMap.size() > 0) {
187
            if (roleManager.isAdmin(fofoDetails.getRoleIds()) || invoiceOrdersMap.get(invoiceNumbers.get(0)).get(0).getRetailerId() == fofoDetails.getFofoId()) {
31438 amit.gupta 188
                if (invoiceOrdersMap.get(invoiceNumbers.get(0)).get(0).getRetailerId() == fofoDetails.getFofoId()) {
189
                    invoiceOrdersMap = invoiceOrdersMap.entrySet().stream().filter(x -> x.getValue().get(0).getRetailerId() == fofoDetails.getFofoId()).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
190
                }
30694 amit.gupta 191
 
31437 amit.gupta 192
                final HttpHeaders headers = new HttpHeaders();
30694 amit.gupta 193
 
30701 amit.gupta 194
 
31437 amit.gupta 195
                Map<String, String> headersMap = new HashMap<>();
196
                headersMap.put("Authorization", "Basic " + Base64.getEncoder().encodeToString("smartdukaan:$smart@123#".getBytes()));
197
                if (invoiceNumbers.size() == 1) {
32647 amit.gupta 198
                    Order order = invoiceOrdersMap.get(invoiceNumbers.get(0)).get(0);
31437 amit.gupta 199
                    String invoicePath = this.getInvoicePath(invoiceOrdersMap.get(invoiceNumbers.get(0)).get(0));
32647 amit.gupta 200
                    HttpResponse response;
201
                    try {
202
                        response = restClient.getResponse("http://45.79.106.95/" + invoicePath, null, headersMap);
203
                    } catch (Exception e) {
204
                        invoicePath = this.getInvoicePathLastMonth(order);
205
                        response = restClient.getResponse("http://45.79.106.95/" + invoicePath, null, headersMap);
206
                    }
31437 amit.gupta 207
                    headers.setContentType(MediaType.APPLICATION_PDF);
208
                    headers.set("Content-Type", "application/pdf");
209
                    headers.set("Content-disposition", "inline; filename=" + invoiceNumber + ".pdf");
210
                    InputStreamResource is = new InputStreamResource(response.getEntity().getContent());
211
                    return new ResponseEntity<>(is, headers, HttpStatus.OK);
30289 amit.gupta 212
 
31437 amit.gupta 213
                } else {
30380 amit.gupta 214
 
31437 amit.gupta 215
                    ByteArrayOutputStream fos = new ByteArrayOutputStream();
216
                    ZipOutputStream zipOut = new ZipOutputStream(fos);
30289 amit.gupta 217
 
31437 amit.gupta 218
                    for (String invoice : invoiceNumbers) {
32647 amit.gupta 219
                        Order order = invoiceOrdersMap.get(invoiceNumbers.get(0)).get(0);
220
                        String invoicePath = this.getInvoicePath(order);
221
                        HttpResponse response;
222
                        try {
223
                            response = restClient.getResponse("http://45.79.106.95/" + invoicePath, null, headersMap);
224
                        } catch (Exception e) {
225
                            invoicePath = this.getInvoicePathLastMonth(order);
226
                            response = restClient.getResponse("http://45.79.106.95/" + invoicePath, null, headersMap);
227
                        }
31437 amit.gupta 228
                        this.addFileToZip(zipOut, response.getEntity().getContent(), invoice + ".pdf");
229
                    }
230
                    zipOut.close();
231
                    byte[] byteArray = fos.toByteArray();
232
                    headers.set("Content-Type", ContentType.APPLICATION_OCTET_STREAM.getMimeType());
233
                    headers.set("Content-disposition", "attachment; filename=invoices.zip");
234
                    headers.setContentLength(byteArray.length);
235
                    final InputStream inputStream = new ByteArrayInputStream(fos.toByteArray());
236
                    return new ResponseEntity<>(new InputStreamResource(inputStream), headers, HttpStatus.OK);
237
                }
30380 amit.gupta 238
 
31437 amit.gupta 239
            }
240
        } else {
241
            throw new ProfitMandiBusinessException("Invalid Invoice", invoiceNumber, "Please check with your manager");
242
        }
243
        return null;
244
    }
30380 amit.gupta 245
 
31437 amit.gupta 246
    private void addFileToZip(ZipOutputStream outZip, InputStream inputStream, String fileName) throws Exception {
247
        byte data[] = new byte[BUFFER_SIZE];
248
        ZipEntry entry = new ZipEntry(fileName);
249
        outZip.putNextEntry(entry);
250
        IOUtils.copy(inputStream, outZip);
251
        outZip.closeEntry();
252
    }
30380 amit.gupta 253
 
31437 amit.gupta 254
    private String getInvoicePath(Order order) {
255
        LocalDateTime billTime = order.getBillingTimestamp();
256
        String dirPath = billTime.getYear() + "-" + (billTime.getMonthValue() - 1) + File.separator + order.getRetailerId();
257
        String filename = dirPath + File.separator + order.getInvoiceNumber() + ".pdf";
258
        return filename;
259
    }
32647 amit.gupta 260
 
261
    private String getInvoicePathLastMonth(Order order) {
262
        LocalDateTime billTime = order.getBillingTimestamp();
263
        billTime = billTime.minusMonths(1);
264
        String dirPath = billTime.getYear() + "-" + (billTime.getMonthValue() - 1) + File.separator + order.getRetailerId();
265
        String filename = dirPath + File.separator + order.getInvoiceNumber() + ".pdf";
266
        return filename;
267
    }
21636 ashik.ali 268
}