Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
4687 mandeep.dh 1
package in.shop2020.inventory.controllers;
2
 
4846 mandeep.dh 3
import in.shop2020.model.v1.catalog.Item;
5945 mandeep.dh 4
import in.shop2020.model.v1.inventory.InventoryType;
5
import in.shop2020.model.v1.inventory.Warehouse;
6
import in.shop2020.model.v1.inventory.WarehouseType;
5110 mandeep.dh 7
import in.shop2020.model.v1.order.LineItem;
5496 mandeep.dh 8
import in.shop2020.purchase.Invoice;
5110 mandeep.dh 9
import in.shop2020.purchase.PurchaseOrder;
4687 mandeep.dh 10
import in.shop2020.purchase.PurchaseServiceException;
11
import in.shop2020.thrift.clients.CatalogClient;
5945 mandeep.dh 12
import in.shop2020.thrift.clients.InventoryClient;
4687 mandeep.dh 13
import in.shop2020.thrift.clients.PurchaseClient;
14
import in.shop2020.thrift.clients.WarehouseClient;
4846 mandeep.dh 15
import in.shop2020.utils.ModelUtils;
4687 mandeep.dh 16
import in.shop2020.warehouse.InventoryItem;
17
import in.shop2020.warehouse.ScanType;
18
import in.shop2020.warehouse.WarehouseService.Client;
19
import in.shop2020.warehouse.WarehouseServiceException;
20
 
4846 mandeep.dh 21
import java.util.ArrayList;
5496 mandeep.dh 22
import java.util.Calendar;
23
import java.util.Date;
5110 mandeep.dh 24
import java.util.HashMap;
4846 mandeep.dh 25
import java.util.List;
5110 mandeep.dh 26
import java.util.Map;
4846 mandeep.dh 27
 
4687 mandeep.dh 28
import javax.servlet.ServletContext;
29
 
5496 mandeep.dh 30
import org.apache.commons.lang.StringUtils;
4687 mandeep.dh 31
import org.apache.struts2.convention.annotation.Result;
32
import org.apache.struts2.convention.annotation.Results;
33
import org.apache.thrift.TException;
34
import org.apache.thrift.transport.TTransportException;
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37
 
38
@SuppressWarnings("serial")
39
@Results({ @Result(name = "redirect", type = "redirectAction", params = {
40
        "actionName", "warehouse" }) })
41
public class PurchaseController extends BaseController {
5110 mandeep.dh 42
    /**
43
     * 
44
     */
45
    private static final int NUM_BULK__SCAN_ITEMS = 10;
46
    private static Logger logger = LoggerFactory.getLogger(PurchaseController.class);
47
    private static enum ScanRecordType { VALID, BLANK };
4687 mandeep.dh 48
 
49
    private ServletContext context;
50
    private String id;
51
    private String itemId;
52
    private String itemNo;
53
    private String errorMsg = "";
4846 mandeep.dh 54
    private List<Item> items;
5110 mandeep.dh 55
    private List<LineItem> lineItems;
5496 mandeep.dh 56
    private List<Invoice> invoices;
6630 amar.kumar 57
 
58
    private String invoiceNumber;
59
    private Double freightCharges ;
60
    private Long poId;
4687 mandeep.dh 61
 
62
    private String purchaseOrderId;
5110 mandeep.dh 63
    private Warehouse warehouse;
4687 mandeep.dh 64
 
65
    public String editNew() {
66
        purchaseOrderId = request.getParameter("poId");
5496 mandeep.dh 67
 
68
        try {
69
            in.shop2020.purchase.PurchaseService.Client purchaseClient = new PurchaseClient().getClient();
70
            invoices = purchaseClient.getInvoices(getPreviousDay(getPreviousDay(new Date())).getTime());
71
        } catch (Exception e) {
72
            logger.error("Error loading invoices", e);
73
        }
74
 
4687 mandeep.dh 75
        return "new";
76
    }
77
 
5496 mandeep.dh 78
    private Date getPreviousDay(Date date) {
79
        Calendar calendar = Calendar.getInstance();
80
        calendar.setTime(date);
81
        calendar.add(Calendar.DAY_OF_MONTH, -1);
82
        return calendar.getTime();
83
    }
84
 
4687 mandeep.dh 85
    public String create() {
6630 amar.kumar 86
    	this.purchaseOrderId = request.getParameter("poId");
87
        poId = Long.parseLong(purchaseOrderId);
88
        invoiceNumber = request.getParameter("invoiceNo");
4687 mandeep.dh 89
        String fc = request.getParameter("freightCharges").trim();
6630 amar.kumar 90
        freightCharges = 0D;
91
        id = "0";
4687 mandeep.dh 92
        if (fc != null && !fc.isEmpty())
93
            freightCharges = Double.parseDouble(fc);
6630 amar.kumar 94
        return show();
95
        //return "create";
4687 mandeep.dh 96
 
97
    }
98
 
99
    public String show() {
5110 mandeep.dh 100
        resetLineItems();
6630 amar.kumar 101
        setItemsFromPO();
5110 mandeep.dh 102
        return SHOW;
4687 mandeep.dh 103
    }
104
 
5110 mandeep.dh 105
    private void resetLineItems() {
106
        lineItems = new ArrayList<LineItem>();
107
 
108
        for (int i = 0; i < NUM_BULK__SCAN_ITEMS; i++) {
109
            LineItem lineItem = new LineItem();
110
            lineItem.setId(i);
111
            lineItem.setExtra_info("");
112
            lineItem.setSerial_number("");
113
            lineItem.setItem_number("");
5361 mandeep.dh 114
            lineItem.setQuantity(1);
5110 mandeep.dh 115
            lineItem.setItem_id(-1);
116
            lineItems.add(lineItem);
117
        }
118
    }
119
 
6630 amar.kumar 120
    public boolean createPurchase(){
121
        try {
122
        	logger.info("poId="+poId+" invoiceNumber="+invoiceNumber+" freightCharges="+freightCharges);
123
            PurchaseClient purchaseClient = new PurchaseClient();
124
            in.shop2020.purchase.PurchaseService.Client client = purchaseClient
125
                    .getClient();
126
            id = "" + client.startPurchase(poId, invoiceNumber, freightCharges);
127
            logger.info("id = "+id);
128
        } catch (TTransportException e) {
129
            errorMsg = "Error while establishing connection to the warehouse server";
130
            logger.error(errorMsg, e);
131
        } catch (TException e) {
132
            errorMsg = "Error while scanning in the item";
133
            logger.error(errorMsg, e);
134
        } catch (PurchaseServiceException e) {
135
            errorMsg = e.getMessage();
136
            logger.error(errorMsg, e);
137
        }
138
 
139
        if (errorMsg.isEmpty())
140
            return true;
141
        else {
142
            addActionError(errorMsg);
143
            return false;
144
        }
145
    }
146
 
4687 mandeep.dh 147
    public String update() {
6630 amar.kumar 148
        setItemsFromPO();
4687 mandeep.dh 149
 
150
        try {
5110 mandeep.dh 151
            if (!areValidScans()) {
152
                return SHOW;
153
            }
6641 amar.kumar 154
            if(id == null || Long.parseLong(id)==0) {
155
	            if(!createPurchase()) {
156
	        		return "new";
157
	        	}
158
            }
5110 mandeep.dh 159
 
4687 mandeep.dh 160
            WarehouseClient warehouseClient = new WarehouseClient();
161
            Client client = warehouseClient.getClient();
5110 mandeep.dh 162
 
163
            for (LineItem lineItem : lineItems) {
164
                if (ScanRecordType.BLANK.name().equals(lineItem.getExtra_info())) {
165
                    continue;
166
                }
167
 
5437 mandeep.dh 168
                InventoryItem inventoryItem = new InventoryItem();
169
                inventoryItem.setItemId(lineItem.getItem_id());
6641 amar.kumar 170
                inventoryItem.setPurchaseId(Long.parseLong(id));
5437 mandeep.dh 171
                inventoryItem.setCurrentQuantity(0);
172
                inventoryItem.setItemNumber(lineItem.getItem_number());
173
                inventoryItem.setSerialNumber(lineItem.getSerial_number());
5530 mandeep.dh 174
                inventoryItem.setInitialQuantity(new Double(lineItem.getQuantity()).longValue());
175
                client.scan(inventoryItem, ScanType.PURCHASE, new Double(lineItem.getQuantity()).longValue(), PurchaseOrderController.WAREHOUSE_ID);
5361 mandeep.dh 176
            }
5110 mandeep.dh 177
 
178
            resetLineItems();
4687 mandeep.dh 179
        } catch (TTransportException e) {
180
            errorMsg = "Error while establishing connection to the warehouse server";
181
            logger.error(errorMsg, e);
182
        } catch (WarehouseServiceException e) {
183
            errorMsg = e.getMessage();
184
            logger.error(errorMsg, e);
185
        } catch (TException e) {
186
            errorMsg = "Error while scanning in the item";
187
            logger.error(errorMsg, e);
6630 amar.kumar 188
        } catch (PurchaseServiceException e) {
189
            errorMsg = "Error while creating the purchase";
190
            logger.error(errorMsg, e);
4687 mandeep.dh 191
        }
5110 mandeep.dh 192
 
4687 mandeep.dh 193
        if (!errorMsg.isEmpty()) {
194
            addActionError(errorMsg);
195
        }
4846 mandeep.dh 196
 
5110 mandeep.dh 197
        return SHOW;
4687 mandeep.dh 198
    }
199
 
5110 mandeep.dh 200
    /**
201
     * @return
202
     * @throws TException 
203
     * @throws NumberFormatException 
6630 amar.kumar 204
     * @throws PurchaseServiceException 
5110 mandeep.dh 205
     */
6630 amar.kumar 206
    private boolean areValidScans() throws NumberFormatException, TException, PurchaseServiceException {
5110 mandeep.dh 207
        boolean areValidScans = true;
208
        in.shop2020.purchase.PurchaseService.Client purchaseClient = new PurchaseClient().getClient();
6630 amar.kumar 209
        //PurchaseOrder purchaseOrder = purchaseClient.getPurchaseOrderForPurchase(Long.parseLong(id));
210
        PurchaseOrder purchaseOrder = purchaseClient.getPurchaseOrder(poId);
5110 mandeep.dh 211
        Map<Long, Long> itemsQuantityMapFromPO = new HashMap<Long, Long>();
212
        for (in.shop2020.purchase.LineItem lineItem : purchaseOrder.getLineitems()) {
213
            itemsQuantityMapFromPO.put(lineItem.getItemId(), (long) lineItem.getUnfulfilledQuantity());
214
        }
215
 
216
        Client warehouseClient = new WarehouseClient().getClient();
217
        for (LineItem lineItem : lineItems) {
218
            if (lineItem.getItem_id() == -1 && lineItem.getItem_number().isEmpty() && lineItem.getSerial_number().isEmpty()) {
219
                lineItem.setExtra_info(ScanRecordType.BLANK.name());
220
            }
221
            else {
222
                lineItem.setExtra_info(ScanRecordType.VALID.name());
5496 mandeep.dh 223
                if (StringUtils.isNotBlank(lineItem.getSerial_number())) {
5361 mandeep.dh 224
                    try {
7321 amit.gupta 225
                    	InventoryItem inventoryItem = warehouseClient.getInventoryItem(lineItem.getSerial_number());
226
                        if(inventoryItem.getLastScanType()!=ScanType.PURCHASE_RETURN) {
227
	                       lineItem.setExtra_info("Item scanned already.");
228
	                       areValidScans = false;
229
	                       continue;
230
                        }
5496 mandeep.dh 231
                    } catch (Exception e) {
5361 mandeep.dh 232
                    }
5110 mandeep.dh 233
                }
234
 
5496 mandeep.dh 235
                if (lineItem.getItem_id() == -1 && 
236
                        (StringUtils.isBlank(lineItem.getItem_number()) || 
237
                         StringUtils.isBlank(lineItem.getSerial_number())))
238
                {
239
                    lineItem.setExtra_info("Item not selected/Item or serial number not present");
5110 mandeep.dh 240
                    areValidScans = false;
241
                    continue;
242
                }
243
 
6630 amar.kumar 244
                if (StringUtils.isBlank(lineItem.getItem_number())) {
245
                	lineItem.setExtra_info("Item number not entered");
246
                	areValidScans = false;
247
                	continue;
248
                }
249
 
5110 mandeep.dh 250
                if (lineItem.getItem_id() == -1) {
251
                    List<Long> itemIds = warehouseClient.getItemIds(lineItem.getItem_number());
252
                    if (itemIds.isEmpty()) {
253
                        lineItem.setExtra_info("Unknown item number");
254
                        areValidScans = false;
255
                        continue;
256
                    }
257
 
258
                    if (itemIds.size() > 0) {
259
                        int numItemsInPO = 0;
260
                        for (long itemId : itemIds) {
261
                            if (itemsQuantityMapFromPO.containsKey(itemId)) {
262
                                numItemsInPO++;
263
                                lineItem.setItem_id(itemId);
264
                            }
265
                        }
266
 
267
                        if (numItemsInPO > 1) {
268
                            lineItem.setExtra_info("Multiple items found for given item Number. Choose item explicitly.");
269
                            areValidScans = false;
5361 mandeep.dh 270
                            continue;
5110 mandeep.dh 271
                        }
272
                    }
273
                }
274
 
275
                if (!itemsQuantityMapFromPO.containsKey(lineItem.getItem_id())) {
276
                    lineItem.setExtra_info("Item not present in PO.");
277
                    areValidScans = false;
278
                    continue;
279
                }
280
 
5361 mandeep.dh 281
                itemsQuantityMapFromPO.put(lineItem.getItem_id(),
282
                        itemsQuantityMapFromPO.get(lineItem.getItem_id()) - new Double(lineItem.getQuantity()).longValue());
5110 mandeep.dh 283
 
284
                if (itemsQuantityMapFromPO.get(lineItem.getItem_id()) < 0) {
285
                    lineItem.setExtra_info("Item already fulfilled in PO.");
286
                    areValidScans = false;
287
                    continue;
288
                }
289
            }
290
        }
291
 
292
        return areValidScans;
293
    }
294
 
6630 amar.kumar 295
    private void setItemsFromPO() {
5110 mandeep.dh 296
        try {
297
            items = new ArrayList<Item>();
298
            in.shop2020.purchase.PurchaseService.Client purchaseClient = new PurchaseClient().getClient();
6630 amar.kumar 299
            //PurchaseOrder purchaseOrder = purchaseClient.getPurchaseOrderForPurchase(id);
300
            PurchaseOrder purchaseOrder = purchaseClient.getPurchaseOrder(poId);
5945 mandeep.dh 301
            in.shop2020.model.v1.catalog.CatalogService.Client catalogClient = new CatalogClient().getClient();
5361 mandeep.dh 302
 
5110 mandeep.dh 303
            for (in.shop2020.purchase.LineItem lineItem : purchaseOrder.getLineitems()) {
5496 mandeep.dh 304
                items.add(catalogClient.getItem(lineItem.getItemId()));
5110 mandeep.dh 305
            }
5496 mandeep.dh 306
 
5945 mandeep.dh 307
            in.shop2020.model.v1.inventory.InventoryService.Client inventoryClient = new InventoryClient().getClient();
308
            warehouse = inventoryClient.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, purchaseOrder.getSupplierId(), PurchaseOrderController.WAREHOUSE_ID, PurchaseOrderController.WAREHOUSE_ID).get(0);
5110 mandeep.dh 309
        } catch (Exception e) {
310
            logger.error("Could not find items in PO with purchase: " + id, e);
311
        }
312
    }
313
 
4687 mandeep.dh 314
    public String destroy() {
315
        long id = Long.parseLong(this.id);
316
 
317
        try {
318
            PurchaseClient warehouseClient = new PurchaseClient();
319
            in.shop2020.purchase.PurchaseService.Client client = warehouseClient
320
                    .getClient();
321
            client.closePurchase(id);
322
        } catch (TTransportException e) {
323
            errorMsg = "Error while establishing connection to the warehouse server";
324
            logger.error(errorMsg, e);
325
        } catch (TException e) {
326
            errorMsg = "Error while scanning in the item";
327
            logger.error(errorMsg, e);
328
        } catch (PurchaseServiceException e) {
329
            errorMsg = e.getMessage();
330
            logger.error(errorMsg, e);
331
        }
332
        return "redirect";
333
    }
334
 
335
    public String createItemNumberMapping() {
336
        long itemIdLong = Long.parseLong(itemId);
337
 
338
        try {
339
            Client warehouseClient = new WarehouseClient().getClient();
340
            warehouseClient.createItemNumberMapping(itemNo, itemIdLong);
341
        } catch (TTransportException e) {
342
            logger.error("Could not create thrift client", e);
343
        } catch (TException e) {
344
            logger.error("Could not create item number mapping", e);
345
        }
346
 
347
        return show();
348
    }
349
 
5110 mandeep.dh 350
    public String itemNumberMappingEditNew() {
351
        return "item-number-mapping";
352
    }
353
 
4846 mandeep.dh 354
    public String getName(Item item){
355
        return ModelUtils.extractProductNameFromItem(item);
356
    }
357
 
4687 mandeep.dh 358
    public void setId(String id) {
359
        this.id = id;
360
    }
361
 
362
    public String getId() {
363
        return id;
364
    }
365
 
366
    public String getErrorMessage() {
367
        return errorMsg;
368
    }
369
 
370
    public String getPurchaseOrderId() {
371
        return purchaseOrderId;
372
    }
373
 
374
    public String getServletContextPath() {
375
        return context.getContextPath();
376
    }
377
 
378
    public String getItemId() {
379
        return itemId;
380
    }
381
 
382
    public void setItemId(String itemId) {
383
        this.itemId = itemId;
384
    }
385
 
386
    public String getItemNo() {
387
        return itemNo;
388
    }
389
 
390
    public void setItemNo(String itemNo) {
391
        this.itemNo = itemNo;
392
    }
393
 
4846 mandeep.dh 394
    public List<Item> getItems() {
395
        return items;
396
    }
397
 
398
    public void setItems(List<Item> items) {
399
        this.items = items;
400
    }
401
 
5110 mandeep.dh 402
    public List<LineItem> getLineItems() {
403
        return lineItems;
404
    }
405
 
406
    public void setLineItems(List<LineItem> lineItems) {
407
        this.lineItems = lineItems;
408
    }
409
 
410
    public Warehouse getWarehouse() {
411
        return warehouse;
412
    }
5496 mandeep.dh 413
 
414
    public List<Invoice> getInvoices() {
415
        return invoices;
416
    }
417
 
418
    public void setInvoices(List<Invoice> invoices) {
419
        this.invoices = invoices;
420
    }
6630 amar.kumar 421
 
422
	public String getInvoiceNumber() {
423
		return invoiceNumber;
424
	}
425
 
426
	public void setInvoiceNumber(String invoiceNumber) {
427
		this.invoiceNumber = invoiceNumber;
428
	}
429
 
430
	public Double getFreightCharges() {
431
		return freightCharges;
432
	}
433
 
434
	public void setFreightCharges(Double freightCharges) {
435
		this.freightCharges = freightCharges;
436
	}
437
 
438
	public Long getPoId() {
439
		return poId;
440
	}
441
 
442
	public void setPoId(Long poId) {
443
		this.poId = poId;
444
	}
445
 
446
 
4687 mandeep.dh 447
}