Subversion Repositories SmartDukaan

Rev

Rev 6630 | Rev 7321 | 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 {
225
                        warehouseClient.getInventoryItem(lineItem.getSerial_number());
226
                        lineItem.setExtra_info("Item scanned already.");
227
                        areValidScans = false;
228
                        continue;
5496 mandeep.dh 229
                    } catch (Exception e) {
5361 mandeep.dh 230
                    }
5110 mandeep.dh 231
                }
232
 
5496 mandeep.dh 233
                if (lineItem.getItem_id() == -1 && 
234
                        (StringUtils.isBlank(lineItem.getItem_number()) || 
235
                         StringUtils.isBlank(lineItem.getSerial_number())))
236
                {
237
                    lineItem.setExtra_info("Item not selected/Item or serial number not present");
5110 mandeep.dh 238
                    areValidScans = false;
239
                    continue;
240
                }
241
 
6630 amar.kumar 242
                if (StringUtils.isBlank(lineItem.getItem_number())) {
243
                	lineItem.setExtra_info("Item number not entered");
244
                	areValidScans = false;
245
                	continue;
246
                }
247
 
5110 mandeep.dh 248
                if (lineItem.getItem_id() == -1) {
249
                    List<Long> itemIds = warehouseClient.getItemIds(lineItem.getItem_number());
250
                    if (itemIds.isEmpty()) {
251
                        lineItem.setExtra_info("Unknown item number");
252
                        areValidScans = false;
253
                        continue;
254
                    }
255
 
256
                    if (itemIds.size() > 0) {
257
                        int numItemsInPO = 0;
258
                        for (long itemId : itemIds) {
259
                            if (itemsQuantityMapFromPO.containsKey(itemId)) {
260
                                numItemsInPO++;
261
                                lineItem.setItem_id(itemId);
262
                            }
263
                        }
264
 
265
                        if (numItemsInPO > 1) {
266
                            lineItem.setExtra_info("Multiple items found for given item Number. Choose item explicitly.");
267
                            areValidScans = false;
5361 mandeep.dh 268
                            continue;
5110 mandeep.dh 269
                        }
270
                    }
271
                }
272
 
273
                if (!itemsQuantityMapFromPO.containsKey(lineItem.getItem_id())) {
274
                    lineItem.setExtra_info("Item not present in PO.");
275
                    areValidScans = false;
276
                    continue;
277
                }
278
 
5361 mandeep.dh 279
                itemsQuantityMapFromPO.put(lineItem.getItem_id(),
280
                        itemsQuantityMapFromPO.get(lineItem.getItem_id()) - new Double(lineItem.getQuantity()).longValue());
5110 mandeep.dh 281
 
282
                if (itemsQuantityMapFromPO.get(lineItem.getItem_id()) < 0) {
283
                    lineItem.setExtra_info("Item already fulfilled in PO.");
284
                    areValidScans = false;
285
                    continue;
286
                }
287
            }
288
        }
289
 
290
        return areValidScans;
291
    }
292
 
6630 amar.kumar 293
    private void setItemsFromPO() {
5110 mandeep.dh 294
        try {
295
            items = new ArrayList<Item>();
296
            in.shop2020.purchase.PurchaseService.Client purchaseClient = new PurchaseClient().getClient();
6630 amar.kumar 297
            //PurchaseOrder purchaseOrder = purchaseClient.getPurchaseOrderForPurchase(id);
298
            PurchaseOrder purchaseOrder = purchaseClient.getPurchaseOrder(poId);
5945 mandeep.dh 299
            in.shop2020.model.v1.catalog.CatalogService.Client catalogClient = new CatalogClient().getClient();
5361 mandeep.dh 300
 
5110 mandeep.dh 301
            for (in.shop2020.purchase.LineItem lineItem : purchaseOrder.getLineitems()) {
5496 mandeep.dh 302
                items.add(catalogClient.getItem(lineItem.getItemId()));
5110 mandeep.dh 303
            }
5496 mandeep.dh 304
 
5945 mandeep.dh 305
            in.shop2020.model.v1.inventory.InventoryService.Client inventoryClient = new InventoryClient().getClient();
306
            warehouse = inventoryClient.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, purchaseOrder.getSupplierId(), PurchaseOrderController.WAREHOUSE_ID, PurchaseOrderController.WAREHOUSE_ID).get(0);
5110 mandeep.dh 307
        } catch (Exception e) {
308
            logger.error("Could not find items in PO with purchase: " + id, e);
309
        }
310
    }
311
 
4687 mandeep.dh 312
    public String destroy() {
313
        long id = Long.parseLong(this.id);
314
 
315
        try {
316
            PurchaseClient warehouseClient = new PurchaseClient();
317
            in.shop2020.purchase.PurchaseService.Client client = warehouseClient
318
                    .getClient();
319
            client.closePurchase(id);
320
        } catch (TTransportException e) {
321
            errorMsg = "Error while establishing connection to the warehouse server";
322
            logger.error(errorMsg, e);
323
        } catch (TException e) {
324
            errorMsg = "Error while scanning in the item";
325
            logger.error(errorMsg, e);
326
        } catch (PurchaseServiceException e) {
327
            errorMsg = e.getMessage();
328
            logger.error(errorMsg, e);
329
        }
330
        return "redirect";
331
    }
332
 
333
    public String createItemNumberMapping() {
334
        long itemIdLong = Long.parseLong(itemId);
335
 
336
        try {
337
            Client warehouseClient = new WarehouseClient().getClient();
338
            warehouseClient.createItemNumberMapping(itemNo, itemIdLong);
339
        } catch (TTransportException e) {
340
            logger.error("Could not create thrift client", e);
341
        } catch (TException e) {
342
            logger.error("Could not create item number mapping", e);
343
        }
344
 
345
        return show();
346
    }
347
 
5110 mandeep.dh 348
    public String itemNumberMappingEditNew() {
349
        return "item-number-mapping";
350
    }
351
 
4846 mandeep.dh 352
    public String getName(Item item){
353
        return ModelUtils.extractProductNameFromItem(item);
354
    }
355
 
4687 mandeep.dh 356
    public void setId(String id) {
357
        this.id = id;
358
    }
359
 
360
    public String getId() {
361
        return id;
362
    }
363
 
364
    public String getErrorMessage() {
365
        return errorMsg;
366
    }
367
 
368
    public String getPurchaseOrderId() {
369
        return purchaseOrderId;
370
    }
371
 
372
    public String getServletContextPath() {
373
        return context.getContextPath();
374
    }
375
 
376
    public String getItemId() {
377
        return itemId;
378
    }
379
 
380
    public void setItemId(String itemId) {
381
        this.itemId = itemId;
382
    }
383
 
384
    public String getItemNo() {
385
        return itemNo;
386
    }
387
 
388
    public void setItemNo(String itemNo) {
389
        this.itemNo = itemNo;
390
    }
391
 
4846 mandeep.dh 392
    public List<Item> getItems() {
393
        return items;
394
    }
395
 
396
    public void setItems(List<Item> items) {
397
        this.items = items;
398
    }
399
 
5110 mandeep.dh 400
    public List<LineItem> getLineItems() {
401
        return lineItems;
402
    }
403
 
404
    public void setLineItems(List<LineItem> lineItems) {
405
        this.lineItems = lineItems;
406
    }
407
 
408
    public Warehouse getWarehouse() {
409
        return warehouse;
410
    }
5496 mandeep.dh 411
 
412
    public List<Invoice> getInvoices() {
413
        return invoices;
414
    }
415
 
416
    public void setInvoices(List<Invoice> invoices) {
417
        this.invoices = invoices;
418
    }
6630 amar.kumar 419
 
420
	public String getInvoiceNumber() {
421
		return invoiceNumber;
422
	}
423
 
424
	public void setInvoiceNumber(String invoiceNumber) {
425
		this.invoiceNumber = invoiceNumber;
426
	}
427
 
428
	public Double getFreightCharges() {
429
		return freightCharges;
430
	}
431
 
432
	public void setFreightCharges(Double freightCharges) {
433
		this.freightCharges = freightCharges;
434
	}
435
 
436
	public Long getPoId() {
437
		return poId;
438
	}
439
 
440
	public void setPoId(Long poId) {
441
		this.poId = poId;
442
	}
443
 
444
 
4687 mandeep.dh 445
}