Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
32952 amit.gupta 1
package com.spice.profitmandi.service.catalog;
2
 
3
 
4
import com.spice.profitmandi.common.enumuration.ItemType;
5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
6
import com.spice.profitmandi.common.util.Utils;
7
import com.spice.profitmandi.dao.entity.catalog.Item;
8
import com.spice.profitmandi.dao.entity.inventory.VendorItemPricing;
9
import com.spice.profitmandi.dao.entity.warehouse.Supplier;
10
import com.spice.profitmandi.dao.model.StateGstRateModel;
11
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
12
import com.spice.profitmandi.dao.repository.catalog.StateGstRateRepository;
13
import com.spice.profitmandi.dao.repository.inventory.VendorItemPricingRepository;
14
import com.spice.profitmandi.dao.repository.warehouse.SupplierRepository;
15
import in.shop2020.model.v1.catalog.status;
16
import org.apache.logging.log4j.LogManager;
17
import org.apache.logging.log4j.Logger;
18
import org.apache.poi.ss.usermodel.Cell;
19
import org.apache.poi.ss.usermodel.DateUtil;
20
import org.apache.poi.ss.usermodel.Row;
21
import org.apache.poi.xssf.usermodel.XSSFRow;
22
import org.apache.poi.xssf.usermodel.XSSFSheet;
23
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
24
import org.springframework.beans.factory.annotation.Autowired;
25
import org.springframework.stereotype.Component;
26
import org.springframework.web.multipart.MultipartFile;
27
 
28
import java.io.FileInputStream;
29
import java.time.LocalDateTime;
30
import java.util.Arrays;
31
import java.util.List;
32
import java.util.Map;
33
import java.util.stream.Collectors;
34
 
35
 
36
@Component
37
public class ItemLoaderService {
38
 
39
    private static List<Character> ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".chars().mapToObj(c -> (char) c).collect(Collectors.toList());
40
    @Autowired
41
    ItemRepository itemRepository;
42
 
43
    @Autowired
44
    StateGstRateRepository stateGstRateRepository;
45
 
46
    @Autowired
47
    VendorItemPricingRepository vendorItemPricingRepository;
48
 
49
    private static final Logger LOGGER = LogManager.getLogger(ItemLoaderService.class);
50
 
51
    public void parse(MultipartFile file) throws Exception {
52
        XSSFWorkbook myWorkBook = new XSSFWorkbook(file.getInputStream());
53
 
54
        myWorkBook.setMissingCellPolicy(Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
55
        // Return first sheet from the XLSX workbook
56
        XSSFSheet mySheet = myWorkBook.getSheetAt(0);
57
        LOGGER.info("rowCellNum {}", mySheet.getLastRowNum());
58
        for (int rowNumber = 1; rowNumber <= mySheet.getLastRowNum(); rowNumber++) {
59
            XSSFRow row = mySheet.getRow(rowNumber);
60
            ItemLoaderModel itemLoaderModel = this.createLoaderModel(row);
61
            try {
62
                this.addItem(itemLoaderModel);
63
            } catch (ProfitMandiBusinessException e) {
64
                throw new ProfitMandiBusinessException(e.getRejectedType(), e.getRejectedValue(), e.getCode() + "at " + itemLoaderModel.getRowIndex());
65
            }
66
        }
67
    }
68
 
69
 
70
    private String toAlphabet(int number) {
71
        StringBuffer sb = new StringBuffer();
72
        boolean loop = true;
73
        while (loop) {
74
            sb.append(ALPHABETS.get(number % 26));
75
            number = number / 26;
76
            loop = number > 0;
77
 
78
        }
79
        return sb.reverse().toString();
80
    }
81
 
82
    private ItemLoaderModel createLoaderModel(XSSFRow row) throws ProfitMandiBusinessException {
83
        ItemLoaderModel itemLoaderModel = new ItemLoaderModel();
84
        int i = 0;
85
        itemLoaderModel.setRowIndex(row.getRowNum());
86
        try {
87
            itemLoaderModel.setProductGroup(row.getCell(i++).getStringCellValue());
88
            itemLoaderModel.setCategoryId((int) row.getCell(i++).getNumericCellValue());
89
            itemLoaderModel.setCategory(row.getCell(i++).getStringCellValue());
90
            itemLoaderModel.setHsnCode(String.valueOf((int) row.getCell(i++).getNumericCellValue()));
91
            itemLoaderModel.setBrand(row.getCell(i++).getStringCellValue());
92
            itemLoaderModel.setModelNumber(row.getCell(i++).getStringCellValue());
32959 amit.gupta 93
            Cell modelCell = row.getCell(i++);
94
            if (modelCell == null) {
95
                itemLoaderModel.setModelName("");
96
            } else {
97
                itemLoaderModel.setModelName(row.getCell(i++).getStringCellValue());
98
            }
32952 amit.gupta 99
            itemLoaderModel.setColor(row.getCell(i++).getStringCellValue());
100
            //MRP	SP	MOP	DP	TP	NLC	Startdate	Preferred Vendor	Risky
101
            // Weight	Item type(1 for Serialized and 2 for non-serialized)	TaxRate
102
            itemLoaderModel.setMrp(row.getCell(i++).getNumericCellValue());
103
            itemLoaderModel.setSp(row.getCell(i++).getNumericCellValue());
104
            itemLoaderModel.setMop(row.getCell(i++).getNumericCellValue());
105
            itemLoaderModel.setDp(row.getCell(i++).getNumericCellValue());
106
            itemLoaderModel.setTp(row.getCell(i++).getNumericCellValue());
107
            itemLoaderModel.setNlc(row.getCell(i++).getNumericCellValue());
108
            itemLoaderModel.setStartDate(Utils.convertToLocalDateTime(row.getCell(i++).getDateCellValue()));
109
            itemLoaderModel.setPreferredVendor((int) (row.getCell(i++).getNumericCellValue()));
110
            itemLoaderModel.setRisky(row.getCell(i++).getNumericCellValue() == 0 ? false : true);
111
            itemLoaderModel.setWeight(row.getCell(i++).getNumericCellValue());
112
            itemLoaderModel.setItemType((int) row.getCell(i++).getNumericCellValue());
113
            itemLoaderModel.setTaxRate(row.getCell(i++).getNumericCellValue() * 100);
114
        } catch (Throwable e) {
115
            throw new ProfitMandiBusinessException("Field", "Field at row - " + row.getRowNum() + ", column - " + (i - 1),
116
                    "Invalid field value at - " + this.toAlphabet(i - 1) + (row.getRowNum() + 1) + ", " + this.getCellValue(row.getCell(i - 1)));
117
        }
118
        return itemLoaderModel;
119
    }
120
 
121
    @Autowired
122
    SupplierRepository supplierRepository;
123
 
124
    private void validateItemLoaderModel(ItemLoaderModel itemLoaderModel) throws ProfitMandiBusinessException {
125
        if (itemLoaderModel.getTaxRate() > 28)
126
            throw new ProfitMandiBusinessException("Tax Rate should not be above 28%", "", "");
127
        if (itemLoaderModel.getMrp() < itemLoaderModel.getSp())
128
            throw new ProfitMandiBusinessException("Selling Price should not be greater than MRP", "", "");
129
        Supplier supplier = supplierRepository.selectById(itemLoaderModel.getPreferredVendor());
130
        if (supplier == null) throw new ProfitMandiBusinessException("Invalid Supplier", "", "");
131
 
132
    }
133
 
134
    private String getCellValue(Cell cell) {
135
        if (cell == null) {
136
            return "Null cell";
137
        }
138
        switch (cell.getCellTypeEnum()) {
139
            case STRING:
140
                return cell.getStringCellValue();
141
            case NUMERIC:
142
                if (DateUtil.isCellDateFormatted(cell)) {
143
                    return cell.getDateCellValue().toString();
144
                } else {
145
                    return Double.toString(cell.getNumericCellValue());
146
                }
147
            case BOOLEAN:
148
                return Boolean.toString(cell.getBooleanCellValue());
149
            case FORMULA:
150
                return cell.getCellFormula();
151
            default:
152
                return "";
153
        }
154
    }
155
 
156
    //@Autowired
157
 
158
    private void addItem(ItemLoaderModel itemLoaderModel) throws ProfitMandiBusinessException {
159
        this.validateItemLoaderModel(itemLoaderModel);
160
        List<Item> items = itemRepository.selectAll(itemLoaderModel.getBrand(), itemLoaderModel.getModelName(), itemLoaderModel.getModelNumber());
161
        int catalogId = 0;
162
        if (items.size() > 0) {
163
            List<Integer> categoryIds = items.stream().map(x -> x.getCategoryId()).distinct().collect(Collectors.toList());
164
            if (categoryIds.size() > 1) {
165
                throw new ProfitMandiBusinessException("Model Wrongly Mapped to different categories", "Pls check", categoryIds.toString());
166
            } else if (categoryIds.get(0) != itemLoaderModel.getCategoryId()) {
167
                throw new ProfitMandiBusinessException("Model already Mapped to different category", "Pls check", categoryIds.toString());
168
            }
169
            List<Integer> catalogIds = items.stream().map(x -> x.getCategoryId()).distinct().collect(Collectors.toList());
170
            if (catalogIds.size() > 1) {
171
                throw new ProfitMandiBusinessException("Model Wrongly Mapped to different CatalogIds", "Pls check", catalogIds.toString());
172
            }
173
            Map<String, Long> colorsCount = items.stream().collect(Collectors.groupingBy(x -> x.getColor(), Collectors.counting()));
174
            for (Map.Entry<String, Long> colorCountEntrySet : colorsCount.entrySet()) {
175
                if (colorCountEntrySet.getValue() > 1) {
176
                    throw new ProfitMandiBusinessException("Model repeats the same color", "Pls check", colorCountEntrySet.getKey());
177
                }
178
            }
179
            catalogId = items.get(0).getCatalogItemId();
180
        } else {
181
            catalogId = itemRepository.getNextEntity();
182
        }
183
        //Finally either got valid existing model or new model altogether
184
        Item item = new Item();
185
        item.setBrand(itemLoaderModel.getBrand());
186
        item.setModelName(itemLoaderModel.getModelName());
187
        item.setModelNumber(itemLoaderModel.getModelNumber());
188
        item.setColor(itemLoaderModel.getColor());
189
        item.setSellingPrice(new Float(Math.round(itemLoaderModel.getSp())));
190
        item.setMrp(new Float(Math.round(itemLoaderModel.getMrp())));
191
        item.setStartDate(itemLoaderModel.getStartDate());
192
        item.setCategoryId(itemLoaderModel.getCategoryId());
193
        item.setPreferredVendor(itemLoaderModel.getPreferredVendor());
194
        item.setRisky(itemLoaderModel.isRisky());
195
        item.setCatalogItemId(catalogId);
196
        if (itemLoaderModel.getWeight() <= 0) {
197
            throw new ProfitMandiBusinessException("Weight", "0", "Weight should be greater than 0");
198
        }
199
        item.setWeight(itemLoaderModel.getWeight());
200
        item.setStatus(status.PARTIALLY_ACTIVE);
201
        item.setUpdatedOn(LocalDateTime.now());
202
        item.setAddedOn(LocalDateTime.now());
203
 
204
        //if(item.getHsnCode())
205
        item.setHsnCode(itemLoaderModel.getHsnCode());
206
        ItemType itemType = ItemType.findByValue(itemLoaderModel.getItemType());
207
        if (itemType == null) {
208
            throw new ProfitMandiBusinessException("Item Type", "Invalid", "Should be 1 for SERIALIZED or 2 for Non Serialized");
209
        }
210
        item.setType(itemType);
211
        itemRepository.persist(item);
212
        //Logic for model here
213
 
214
        //Set Tax Rate
215
        StateGstRateModel stateGstRateModel = new StateGstRateModel();
216
        stateGstRateModel.setItemId(item.getId());
217
        stateGstRateModel.setIgstRate(itemLoaderModel.getTaxRate());
218
        stateGstRateRepository.addStateGstRates(Arrays.asList(stateGstRateModel));
219
 
220
        //Add Vendor
221
        VendorItemPricing vendorItemPricing = new VendorItemPricing();
222
        vendorItemPricing.setItemId(item.getId());
223
        vendorItemPricing.setVendorId(item.getPreferredVendor());
224
        vendorItemPricing.setDp((float) itemLoaderModel.getDp());
225
        vendorItemPricing.setMop((float) itemLoaderModel.getMop());
226
        vendorItemPricing.setNlc((float) itemLoaderModel.getNlc());
227
        vendorItemPricing.setTp((float) itemLoaderModel.getTp());
228
        vendorItemPricingRepository.persist(vendorItemPricing);
229
    }
230
    /*
231
 
232
    item = Item()
233
    item.productGroup = product_group
234
    item.brand = brand
235
    item.modelNumber = model_number
236
    item.modelName = model_name
237
    item.color = color
238
            try:
239
    item.mrp = round(mrp)
240
    except:
241
    pass
242
            #if item is risky
243
            if categoryMap.has_key(category_name.strip()):
244
    item.category = categoryMap[category_name.strip()]
245
    item.itemStatus = 8
246
            else:
247
    print "can't find {0} at row {1}".format(category_name, rownum)
248
                continue
249
    item.sellingPrice = round(sp)
250
    item.startDate = long(to_java_date(datetime.datetime(1899, 12, 30) + timedelta(days=int(start_date))))
251
    item.preferredVendor = preferred_vendor
252
    item.risky = int(risky)
253
    item.weight = weight
254
    item.updatedOn = updatedOn
255
    item.type = int(item_type)
256
 
257
    cclient = CatalogClient().get_client()
258
                    for c1 in (5,5,5,5,5):
259
            try:
260
            prodClient.addItem(item)
261
            if len(states) > 0:
262
            for c3 in (1,2,3,4,5):
263
            try:
264
            prodClient.updateItemStateVat(item_id, states)
265
    print "break 1"
266
            break
267
    except Exception as e:
268
    prodClient = CatalogClient("catalog_service_server_host_prod").get_client()
269
    print "break 2"
270
            break
271
    except:
272
    prodClient = CatalogClient("catalog_service_server_host_prod").get_client()
273
    print "break 3"
274
            break
275
    except Exception as e:
276
    cclient = CatalogClient().get_client()
277
    vip = VendorItemPricing()
278
    vip.itemId = item_id
279
    vip.dealerPrice = round(dp)
280
    vip.mop = round(mop)
281
    vip.nlc = round(nlc)
282
    vip.transferPrice = round(tp)
283
    vip.vendorId = preferred_vendor
284
            for c in (1,2,3,4,5):
285
            try:
286
            iclient.addVendorItemPricing(vip)
287
            break
288
    except Exception as e:
289
    iclient = InventoryClient().get_client()
290
 
291
    except:
292
            traceback.print_exc()
293
    message = message + "\t" + str(brand) + "\t" + str(model_name) + "\t" + str(model_number) + "\t" + "\n"
294
    print message
295
    mail("build@shop2020.in", "cafe@nes", ["amit.gupta@shop2020.in", "chandan.kumar@shop2020.in"], "Problem while adding items", message, [], [], [])
296
    print "Successfully updated the item list information."
297
 
298
 
299
    def main():
300
    parser = optparse.OptionParser()
301
            parser.add_option("-f", "--file", dest="filename",
302
    default="ItemList.xls", type="string",
303
    help="Read the item list from FILE",
304
    metavar="FILE")
305
            (options, args) = parser.parse_args()
306
            if len(args) != 0:
307
            parser.error("You've supplied extra arguments. Are you sure you want to run this program?")
308
    filename = options.filename
309
    load_item_data(filename)
310
 
311
if __name__ == '__main__':
312
    main()
313
*/
314
}