Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
23755 amit.gupta 1
package com.smartdukaan.cron.migrations;
2
 
25765 amit.gupta 3
import java.io.File;
24819 amit.gupta 4
import java.io.Serializable;
23824 amit.gupta 5
import java.time.LocalDate;
23755 amit.gupta 6
import java.time.LocalDateTime;
23824 amit.gupta 7
import java.time.LocalTime;
24819 amit.gupta 8
import java.util.ArrayList;
23755 amit.gupta 9
import java.util.Arrays;
23827 amit.gupta 10
import java.util.Collections;
24002 amit.gupta 11
import java.util.HashMap;
24005 amit.gupta 12
import java.util.HashSet;
23755 amit.gupta 13
import java.util.List;
24002 amit.gupta 14
import java.util.Map;
25749 amit.gupta 15
import java.util.Set;
16
import java.util.concurrent.TimeUnit;
24641 amit.gupta 17
import java.util.stream.Collectors;
23755 amit.gupta 18
 
24819 amit.gupta 19
import org.apache.commons.io.output.ByteArrayOutputStream;
23755 amit.gupta 20
import org.apache.commons.lang.StringUtils;
21
import org.apache.logging.log4j.LogManager;
22
import org.apache.logging.log4j.Logger;
25773 amit.gupta 23
import org.openqa.selenium.Dimension;
25749 amit.gupta 24
import org.openqa.selenium.OutputType;
25
import org.openqa.selenium.TakesScreenshot;
26
import org.openqa.selenium.WebDriver;
27
import org.openqa.selenium.chrome.ChromeDriver;
25752 amit.gupta 28
import org.openqa.selenium.chrome.ChromeOptions;
23755 amit.gupta 29
import org.springframework.beans.factory.annotation.Autowired;
24819 amit.gupta 30
import org.springframework.core.io.ByteArrayResource;
24767 amit.gupta 31
import org.springframework.mail.javamail.JavaMailSender;
23755 amit.gupta 32
import org.springframework.stereotype.Component;
33
import org.springframework.transaction.annotation.Transactional;
34
 
25043 amit.gupta 35
import com.smartdukaan.cron.scheduled.ScheduledTasks;
24819 amit.gupta 36
import com.spice.profitmandi.common.util.FileUtil;
25749 amit.gupta 37
import com.spice.profitmandi.common.util.FormattingUtils;
24819 amit.gupta 38
import com.spice.profitmandi.common.util.Utils;
25021 amit.gupta 39
import com.spice.profitmandi.dao.entity.catalog.Scheme;
24716 amit.gupta 40
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
24806 amit.gupta 41
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
42
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
25530 amit.gupta 43
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
24005 amit.gupta 44
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
24883 amit.gupta 45
import com.spice.profitmandi.dao.entity.fofo.PartnerTargetDetails;
23898 amit.gupta 46
import com.spice.profitmandi.dao.entity.fofo.Purchase;
24716 amit.gupta 47
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
25034 amit.gupta 48
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
25021 amit.gupta 49
import com.spice.profitmandi.dao.entity.fofo.SchemeItem;
24883 amit.gupta 50
import com.spice.profitmandi.dao.entity.fofo.TargetSlab;
24953 amit.gupta 51
import com.spice.profitmandi.dao.entity.inventory.SaholicInventorySnapshot;
23824 amit.gupta 52
import com.spice.profitmandi.dao.entity.transaction.LineItem;
23755 amit.gupta 53
import com.spice.profitmandi.dao.entity.transaction.LineItemImei;
54
import com.spice.profitmandi.dao.entity.transaction.Order;
24802 amit.gupta 55
import com.spice.profitmandi.dao.entity.transaction.SellerWarehouse;
25046 amit.gupta 56
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
25034 amit.gupta 57
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
25530 amit.gupta 58
import com.spice.profitmandi.dao.entity.user.Address;
59
import com.spice.profitmandi.dao.entity.user.User;
25021 amit.gupta 60
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
25522 amit.gupta 61
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
24716 amit.gupta 62
import com.spice.profitmandi.dao.repository.GenericRepository;
25034 amit.gupta 63
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
25021 amit.gupta 64
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
25749 amit.gupta 65
import com.spice.profitmandi.dao.repository.cs.CsService;
23899 amit.gupta 66
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
24716 amit.gupta 67
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
24002 amit.gupta 68
import com.spice.profitmandi.dao.repository.fofo.DebitNoteRepository;
24806 amit.gupta 69
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
70
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
24002 amit.gupta 71
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
24806 amit.gupta 72
import com.spice.profitmandi.dao.repository.fofo.InvoiceNumberGenerationSequenceRepository;
24883 amit.gupta 73
import com.spice.profitmandi.dao.repository.fofo.PartnerTargetRepository;
23898 amit.gupta 74
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
24716 amit.gupta 75
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
24002 amit.gupta 76
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
25021 amit.gupta 77
import com.spice.profitmandi.dao.repository.fofo.SchemeItemRepository;
24883 amit.gupta 78
import com.spice.profitmandi.dao.repository.fofo.TargetSlabRepository;
79
import com.spice.profitmandi.dao.repository.fofo.TargetSlabRepositoryImpl;
24953 amit.gupta 80
import com.spice.profitmandi.dao.repository.inventory.SaholicInventorySnapshotRepository;
81
import com.spice.profitmandi.dao.repository.inventory.SaholicReservationInventorySnapshotRepository;
23755 amit.gupta 82
import com.spice.profitmandi.dao.repository.transaction.LineItemImeisRepository;
23824 amit.gupta 83
import com.spice.profitmandi.dao.repository.transaction.LineItemRepository;
23755 amit.gupta 84
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
24772 amit.gupta 85
import com.spice.profitmandi.dao.repository.transaction.ReturnOrderRepository;
24802 amit.gupta 86
import com.spice.profitmandi.dao.repository.transaction.SellerWarehouseRepository;
24767 amit.gupta 87
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
88
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
25530 amit.gupta 89
import com.spice.profitmandi.dao.repository.user.AddressRepository;
24002 amit.gupta 90
import com.spice.profitmandi.dao.repository.user.UserRepository;
23899 amit.gupta 91
import com.spice.profitmandi.service.inventory.InventoryService;
24266 amit.gupta 92
import com.spice.profitmandi.service.order.OrderService;
24005 amit.gupta 93
import com.spice.profitmandi.service.pricing.PriceDropService;
94
import com.spice.profitmandi.service.scheme.SchemeService;
23899 amit.gupta 95
import com.spice.profitmandi.service.transaction.TransactionService;
96
import com.spice.profitmandi.service.user.RetailerService;
97
import com.spice.profitmandi.service.wallet.WalletService;
23755 amit.gupta 98
 
24953 amit.gupta 99
import in.shop2020.model.v1.order.OrderStatus;
24002 amit.gupta 100
import in.shop2020.model.v1.order.WalletReferenceType;
101
 
23755 amit.gupta 102
@Component
103
@Transactional(rollbackFor = Throwable.class)
104
public class RunOnceTasks {
105
 
106
	private static final Logger LOGGER = LogManager.getLogger(RunOnceTasks.class);
107
 
108
	@Autowired
23824 amit.gupta 109
	private LineItemRepository lineItemRepository;
24711 amit.gupta 110
 
23905 amit.gupta 111
	@Autowired
24953 amit.gupta 112
	private SaholicInventorySnapshotRepository saholicInventorySnapshotRepository;
25752 amit.gupta 113
 
25749 amit.gupta 114
	@Autowired
115
	private CsService csService;
24953 amit.gupta 116
 
117
	@Autowired
118
	private SaholicReservationInventorySnapshotRepository saholicReservationInventorySnapshotRepository;
119
 
120
	@Autowired
24883 amit.gupta 121
	private TargetSlabRepository targetSlabRepository;
122
 
123
	@Autowired
124
	private PartnerTargetRepository partnerTargetRepository;
125
 
126
	@Autowired
24802 amit.gupta 127
	private SellerWarehouseRepository sellerWarehouseRepository;
24814 amit.gupta 128
 
24802 amit.gupta 129
	@Autowired
24806 amit.gupta 130
	private FofoOrderItemRepository fofoOrderItemRepository;
24814 amit.gupta 131
 
24806 amit.gupta 132
	@Autowired
133
	private FofoOrderRepository fofoOrderRepository;
24814 amit.gupta 134
 
24806 amit.gupta 135
	@Autowired
24767 amit.gupta 136
	private UserWalletRepository userWalletRepository;
137
 
138
	@Autowired
139
	private UserWalletHistoryRepository userWalletHistoryRepository;
140
 
141
	@Autowired
24002 amit.gupta 142
	private UserRepository userRepository;
24711 amit.gupta 143
 
24002 amit.gupta 144
	@Autowired
23899 amit.gupta 145
	private WalletService walletService;
146
 
147
	@Autowired
25034 amit.gupta 148
	private ItemRepository itemRepository;
149
 
150
	@Autowired
23899 amit.gupta 151
	private InventoryService inventoryService;
152
 
153
	@Autowired
154
	private TransactionService transactionService;
155
 
24711 amit.gupta 156
	// Service for Tertiary/Partner Orders
24266 amit.gupta 157
	@Autowired
158
	private OrderService orderService;
23767 amit.gupta 159
 
23755 amit.gupta 160
	@Autowired
25021 amit.gupta 161
	private SchemeRepository schemeRepository;
25516 amit.gupta 162
 
25043 amit.gupta 163
	@Autowired
25530 amit.gupta 164
	private AddressRepository addressRepository;
25749 amit.gupta 165
 
25530 amit.gupta 166
	@Autowired
25043 amit.gupta 167
	private ScheduledTasks scheduledTasks;
25034 amit.gupta 168
 
25021 amit.gupta 169
	@Autowired
170
	private SchemeItemRepository schemeItemRepository;
171
 
172
	@Autowired
24772 amit.gupta 173
	private ReturnOrderRepository returnOrderRepository;
174
 
175
	@Autowired
23899 amit.gupta 176
	private FofoStoreRepository fofoStoreRepository;
177
 
178
	@Autowired
23755 amit.gupta 179
	private LineItemImeisRepository lineItemImeisRepository;
24711 amit.gupta 180
 
24002 amit.gupta 181
	@Autowired
182
	private InventoryItemRepository inventoryItemRepository;
24814 amit.gupta 183
 
24806 amit.gupta 184
	@Autowired
185
	private InvoiceNumberGenerationSequenceRepository invoiceNumberGenerationSequenceRepository;
23901 amit.gupta 186
 
23898 amit.gupta 187
	@Autowired
23899 amit.gupta 188
	private RetailerService retailerService;
24711 amit.gupta 189
 
24002 amit.gupta 190
	@Autowired
191
	private SchemeInOutRepository schemeInOutRepository;
24711 amit.gupta 192
 
24002 amit.gupta 193
	@Autowired
194
	private DebitNoteRepository debitNoteRepository;
23899 amit.gupta 195
 
196
	@Autowired
24716 amit.gupta 197
	private GenericRepository genericRepository;
198
 
199
	@Autowired
23898 amit.gupta 200
	private PurchaseRepository purchaseRepository;
24711 amit.gupta 201
 
24005 amit.gupta 202
	@Autowired
203
	private PriceDropService priceDropService;
24883 amit.gupta 204
 
24819 amit.gupta 205
	@Autowired
206
	private JavaMailSender googleMailSender;
24711 amit.gupta 207
 
24005 amit.gupta 208
	@Autowired
209
	private SchemeService schemeService;
24711 amit.gupta 210
 
24716 amit.gupta 211
	@Autowired
212
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
213
 
214
	@Autowired
24767 amit.gupta 215
	private OrderRepository orderRepository;
216
 
217
	@Autowired
24716 amit.gupta 218
	private ScanRecordRepository scanRecordRepository;
219
 
24767 amit.gupta 220
	@Autowired
221
	private JavaMailSender mailSender;
222
 
24005 amit.gupta 223
	public void dropCorrection() throws Exception {
224
 
24711 amit.gupta 225
		walletService.rollbackAmountFromWallet(175128034, 274, 4, WalletReferenceType.PRICE_DROP,
226
				"Scheme  differential for Price Drop of Rs.712 on Samsung J6 J600GG, on 01-08-2018 for missing 1pc");
227
		walletService.rollbackAmountFromWallet(175128034, -259, 4, WalletReferenceType.PRICE_DROP,
228
				"Scheme  differential for Price Drop of Rs.712 on Samsung J6 J600GG, on 01-08-2018 for missing 1pc");
229
		List<InventoryItem> iis = inventoryItemRepository.selectByIds(new HashSet<>(Arrays.asList(3518, 3516)));
230
		schemeService.reverseSchemes(iis, 8,
231
				"Scheme  differential for Price Drop of Rs.712 on Samsung J6 J600GG, on 01-08-2018. Total 2 item(s)");
232
		List<InventoryItem> iis1 = inventoryItemRepository.selectByIds(new HashSet<>(Arrays.asList(3502, 3334, 3503)));
233
		schemeService.reverseSchemes(iis1, 13,
234
				"Scheme  differential for Price Drop of Rs.485 on Samsung Galaxy J4 J400FD, on 18-07-2018. Total 3 item(s)");
235
 
236
		List<InventoryItem> iis2 = inventoryItemRepository.selectByIds(new HashSet<>(Arrays.asList(3319)));
237
		schemeService.reverseSchemes(iis2, 13,
238
				"Scheme  differential for Price Drop of Rs.485 on Samsung Galaxy J4 J400FD, on 18-07-2018. Total 1 item(s)");
24005 amit.gupta 239
	}
24711 amit.gupta 240
 
25268 amit.gupta 241
	public void schemeRollback() throws Exception {
24002 amit.gupta 242
		Map<Integer, Float> fofoIdAmount = new HashMap<>();
24003 amit.gupta 243
		fofoIdAmount.put(175135218, 1942f);
244
		String description = "Price drop/differential rolled out as, they were already returned, Total 2pcs.";
24711 amit.gupta 245
		for (Map.Entry<Integer, Float> fofoIdAmountEntry : fofoIdAmount.entrySet()) {
246
			Integer fofoId = fofoIdAmountEntry.getKey();
24002 amit.gupta 247
			Float amount = fofoIdAmountEntry.getValue();
24003 amit.gupta 248
			walletService.rollbackAmountFromWallet(fofoId, amount, 4, WalletReferenceType.PRICE_DROP, description);
24002 amit.gupta 249
		}
24004 amit.gupta 250
		fofoIdAmount.put(175135218, 438f);
24711 amit.gupta 251
		for (Map.Entry<Integer, Float> fofoIdAmountEntry : fofoIdAmount.entrySet()) {
252
			Integer fofoId = fofoIdAmountEntry.getKey();
24004 amit.gupta 253
			Float amount = fofoIdAmountEntry.getValue();
254
			walletService.rollbackAmountFromWallet(fofoId, amount, 4, WalletReferenceType.PRICE_DROP, description);
255
		}
24002 amit.gupta 256
	}
23755 amit.gupta 257
 
23898 amit.gupta 258
	public void populateGrnTimestamp() {
259
		List<Purchase> allPurchases = purchaseRepository.selectAll();
23899 amit.gupta 260
		for (Purchase p : allPurchases) {
23898 amit.gupta 261
			String invoiceNumber = p.getPurchaseReference();
23899 amit.gupta 262
			if (p.getCompleteTimestamp() == null) {
23898 amit.gupta 263
				LOGGER.info("GRN for invoice {} is delivered but partially Completed.", p.getPurchaseReference());
264
			} else {
265
				List<Order> orders = orderRepository.selectByAirwayBillOrInvoiceNumber(invoiceNumber, p.getFofoId());
23899 amit.gupta 266
				for (Order order : orders) {
23902 amit.gupta 267
					if (order.getPartnerGrnTimestamp() == null) {
268
						order.setPartnerGrnTimestamp(p.getCompleteTimestamp());
23898 amit.gupta 269
						orderRepository.persist(order);
270
					}
271
				}
272
			}
273
		}
23899 amit.gupta 274
 
23898 amit.gupta 275
	}
23899 amit.gupta 276
 
24716 amit.gupta 277
	public void migarateLineItemsToNewTable() throws Exception {
23755 amit.gupta 278
		LOGGER.info("Before Migrated LineItems Successfully");
23824 amit.gupta 279
		int lineItemImeiId = 0;
280
		LocalDateTime startDate = null;
281
		try {
282
			lineItemImeiId = lineItemImeisRepository.selectMaxId();
23899 amit.gupta 283
			LineItem lineItem = lineItemRepository
284
					.selectById(lineItemImeisRepository.selectById(lineItemImeiId).getLineItemId());
23824 amit.gupta 285
			Order order = orderRepository.selectById(lineItem.getOrderId());
286
			startDate = order.getBillingTimestamp();
287
		} catch (Exception e) {
288
			LOGGER.info("Running before first time");
23826 amit.gupta 289
			startDate = LocalDateTime.of(LocalDate.of(2017, 7, 1), LocalTime.MIDNIGHT);
23824 amit.gupta 290
		}
291
		List<Order> orders = orderRepository.selectAllByBillingDatesBetween(startDate, LocalDateTime.now());
23827 amit.gupta 292
		Collections.reverse(orders);
23899 amit.gupta 293
 
23755 amit.gupta 294
		for (Order order : orders) {
23824 amit.gupta 295
			try {
23767 amit.gupta 296
				String serialNumbers = order.getLineItem().getSerialNumber();
297
				if (!StringUtils.isEmpty(serialNumbers)) {
298
					List<String> serialNumberList = Arrays.asList(serialNumbers.split(","));
299
					for (String serialNumber : serialNumberList) {
300
						int lineItemId = order.getLineItem().getId();
301
						LineItemImei lineItemImei = new LineItemImei();
302
						lineItemImei.setSerialNumber(serialNumber);
303
						lineItemImei.setLineItemId(lineItemId);
304
						lineItemImeisRepository.persist(lineItemImei);
305
					}
306
				} else {
307
					LOGGER.info("Serial Numbers dont exist for Order {}", order.getId());
23755 amit.gupta 308
				}
23824 amit.gupta 309
			} catch (Exception e) {
23899 amit.gupta 310
				LOGGER.info("Error occurred while creating lineitem imei {}, because of {}", order.getId(),
311
						e.getMessage());
23755 amit.gupta 312
			}
313
		}
314
		LOGGER.info("Migrated LineItems Successfully");
315
	}
24266 amit.gupta 316
 
317
	public void cancelOrder(List<String> invoiceNumbers) throws Exception {
318
		orderService.cancelOrder(invoiceNumbers);
319
	}
24711 amit.gupta 320
 
24722 amit.gupta 321
	public void migratePurchase() throws Exception {
24641 amit.gupta 322
		List<Purchase> purchases = purchaseRepository.selectPurchaseAllPurchasesLessThanZero();
24706 amit.gupta 323
		System.out.printf("Total Purchases count is %s", purchases.size());
24711 amit.gupta 324
		for (Purchase purchase : purchases) {
325
			List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchase.getId());
326
			Map<Integer, List<InventoryItem>> itemIdInventoryMap = inventoryItems.stream()
327
					.collect(Collectors.groupingBy(InventoryItem::getItemId));
328
			List<Order> orders = orderRepository.selectByAirwayBillOrInvoiceNumber(purchase.getPurchaseReference(),
329
					purchase.getFofoId());
330
			Map<Integer, Integer> ourSaleItemQtyMap = orders.stream().collect(Collectors.groupingBy(
331
					x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
332
			Map<Integer, Integer> theirPurchaseItemQtyMap = inventoryItems.stream().collect(Collectors
333
					.groupingBy(InventoryItem::getItemId, Collectors.summingInt(InventoryItem::getInitialQuantity)));
24709 amit.gupta 334
			for (Map.Entry<Integer, Integer> itemQtyEntry : theirPurchaseItemQtyMap.entrySet()) {
24711 amit.gupta 335
				if (!ourSaleItemQtyMap.containsKey(itemQtyEntry.getKey())) {
336
					LOGGER.info("Cannot find in Invoice {} item {}", purchase.getPurchaseReference(),
337
							itemQtyEntry.getKey());
24646 amit.gupta 338
					continue;
24645 amit.gupta 339
				}
24709 amit.gupta 340
				int ourSale = ourSaleItemQtyMap.get(itemQtyEntry.getKey());
24713 amit.gupta 341
				int quantityToReduce = itemQtyEntry.getValue() - ourSale;
24716 amit.gupta 342
				List<InventoryItem> itemIis = itemIdInventoryMap.get(itemQtyEntry.getKey());
343
				if (itemIdInventoryMap != null) {
344
					for (InventoryItem ii : itemIis) {
24915 amit.gupta 345
						if (ii.getSerialNumber() == null && ii.getGoodQuantity() == ii.getInitialQuantity()
346
								&& quantityToReduce >= ii.getInitialQuantity()) {
24734 amit.gupta 347
							LOGGER.info("Changed in inventoryItems {}, {}, {}, {}, {}, {}",
24716 amit.gupta 348
									purchase.getPurchaseReference(), ii.getId(), ii.getItemId(),
24734 amit.gupta 349
									ii.getInitialQuantity(), ii.getGoodQuantity(), quantityToReduce);
24912 amit.gupta 350
							List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(ii.getId());
351
							for (ScanRecord scanRecord : scanRecords) {
24915 amit.gupta 352
								CurrentInventorySnapshot cis = currentInventorySnapshotRepository
353
										.selectByItemIdAndFofoId(itemQtyEntry.getKey(), purchase.getFofoId());
354
								scanRecord.setQuantity(0);
355
								ii.setGoodQuantity(0);
356
								quantityToReduce = quantityToReduce - ii.getInitialQuantity();
357
								cis.setAvailability(cis.getAvailability() - ii.getInitialQuantity());
358
								purchase.setUnfullfilledNonSerializedQuantity(
359
										purchase.getUnfullfilledNonSerializedQuantity() + quantityToReduce);
360
								LOGGER.info("Rectified {}, {}, {}, {}, {}, {}", purchase.getPurchaseReference(),
361
										ii.getId(), ii.getItemId(), ii.getInitialQuantity(), ii.getGoodQuantity(),
362
										quantityToReduce);
24711 amit.gupta 363
							}
24641 amit.gupta 364
						}
365
					}
366
				}
367
			}
368
		}
24953 amit.gupta 369
		// throw new Exception();
24641 amit.gupta 370
	}
24767 amit.gupta 371
 
24802 amit.gupta 372
	public void migrateChallansToInvoices() throws Exception {
24814 amit.gupta 373
		Map<String, List<Order>> invoiceOrdersMap = orderRepository.selectAllChallans().stream()
374
				.filter(x -> !x.getLineItem().getHsnCode().equals("NOGST"))
24794 amit.gupta 375
				.collect(Collectors.groupingBy(Order::getInvoiceNumber, Collectors.toList()));
24814 amit.gupta 376
 
25837 amit.gupta 377
		List<List<?>> rows = new ArrayList<>();
24814 amit.gupta 378
		for (String invoice : invoiceOrdersMap.keySet()) {
24794 amit.gupta 379
			Order oneOrder = invoiceOrdersMap.get(invoice).get(0);
380
			int totalOrders = invoiceOrdersMap.get(invoice).size();
381
			LineItem lineItem = oneOrder.getLineItem();
24802 amit.gupta 382
			oneOrder.setBillingTimestamp(LocalDateTime.now());
383
			oneOrder.setInvoiceNumber(getInvoiceNumber(oneOrder));
24819 amit.gupta 384
			rows.add(Arrays.asList(oneOrder.getId(), invoice, oneOrder.getInvoiceNumber(), lineItem.getQuantity()));
24883 amit.gupta 385
			LOGGER.info(invoice + "\t" + oneOrder.getInvoiceNumber() + oneOrder.getId() + "\t",
386
					"\t" + totalOrders + "\t" + lineItem.getQuantity());
24814 amit.gupta 387
			Purchase p = null;
388
			try {
389
				p = purchaseRepository.selectByPurchaseReferenceAndFofoId(invoice, oneOrder.getRetailerId());
390
			} catch (Exception e) {
24815 amit.gupta 391
				LOGGER.info("Could not find purchase for invoice {}", invoice);
24812 amit.gupta 392
			}
24814 amit.gupta 393
			if (p != null) {
394
				List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(p.getId());
395
				for (InventoryItem inventoryItem : inventoryItems) {
24815 amit.gupta 396
					LOGGER.info(inventoryItem.getItemId() + " " + inventoryItem.getGoodQuantity() + " "
24883 amit.gupta 397
							+ inventoryItem.getHsnCode() + " " + inventoryItem.getSerialNumber() + " "
398
							+ p.getPurchaseReference());
24814 amit.gupta 399
				}
400
			}
401
 
24794 amit.gupta 402
		}
24818 amit.gupta 403
		changePartnerInvoices();
24883 amit.gupta 404
		ByteArrayOutputStream baos = FileUtil
405
				.getCSVByteStream(Arrays.asList("Order id", "Challan", "Invoice", "Quantity"), rows);
406
 
24819 amit.gupta 407
		Utils.sendMailWithAttachment(googleMailSender,
408
				new String[] { "amit.gupta@shop2020.in", "sunny.yadav@smartdukaan.com" }, null,
24883 amit.gupta 409
				"Challans Converted to Invoice", "PFA", "Challans-To-Invoice.csv",
410
				new ByteArrayResource(baos.toByteArray()));
24916 amit.gupta 411
		throw new Exception();
24794 amit.gupta 412
	}
24767 amit.gupta 413
 
24802 amit.gupta 414
	private String getInvoiceNumber(Order oneOrder) {
24805 amit.gupta 415
		String prefix = oneOrder.getInvoiceNumber().split("-")[1].replaceAll("\\d*", "");
24803 amit.gupta 416
		System.out.println("Prefix is " + prefix);
24802 amit.gupta 417
		SellerWarehouse sellerWarehouse = sellerWarehouseRepository.selectByPrefix(prefix);
418
		int newSequence = sellerWarehouse.getInvoiceSequence() + 1;
419
		sellerWarehouse.setInvoiceSequence(newSequence);
24814 amit.gupta 420
		return prefix + newSequence;
24802 amit.gupta 421
	}
24814 amit.gupta 422
 
24806 amit.gupta 423
	private void changePartnerInvoices() throws Exception {
24814 amit.gupta 424
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectByInvoiceNumberLike("%SEC%");
425
		for (FofoOrder fofoOrder : fofoOrders) {
24806 amit.gupta 426
			FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
24814 amit.gupta 427
			if (fofoOrderItem.getBrand().equals("Vivo")) {
24806 amit.gupta 428
				String challanString = fofoOrder.getInvoiceNumber();
24814 amit.gupta 429
				String storeCode = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoOrder.getFofoId())
430
						.getPrefix();
24806 amit.gupta 431
				String invoiceNumber = orderService.getInvoiceNumber(fofoOrder.getFofoId(), storeCode);
432
				fofoOrder.setInvoiceNumber(invoiceNumber);
433
				fofoOrder.setCreateTimestamp(LocalDateTime.now());
24818 amit.gupta 434
				LOGGER.info(challanString + "\t" + invoiceNumber + "\t" + fofoOrderItem.getQuantity());
24806 amit.gupta 435
			}
24814 amit.gupta 436
 
24806 amit.gupta 437
		}
438
	}
24802 amit.gupta 439
 
24883 amit.gupta 440
	public void createMonthlyTargets() throws Exception {
441
		Map<String, List<TargetSlab>> defaultSlabs = targetSlabRepository.getAllDefaultSlabs();
442
		for (String memberType : defaultSlabs.keySet()) {
443
			PartnerTargetDetails ptd = new PartnerTargetDetails();
444
			ptd.setBrandName(null);
445
 
446
			LocalDate startDate = LocalDate.now().withDayOfMonth(1);
447
			int totalDays = startDate.lengthOfMonth();
448
			String monthName = startDate.getMonth().toString();
449
			ptd.setStartDate(startDate.atStartOfDay());
450
			ptd.setEndDate(startDate.plusDays(totalDays - 1).atTime(LocalTime.MAX));
451
			ptd.setTargetName(String.format("%s Sales Target for %s Partners", monthName, memberType));
452
			partnerTargetRepository.persist(ptd);
453
			TargetSlabRepositoryImpl.TYPE_PARTNER_MAPPING.get(memberType).forEach(x -> {
454
				x.setTargetId(ptd.getId());
455
				partnerTargetRepository.persist(x);
456
			});
457
 
458
			List<TargetSlab> slabs = defaultSlabs.get(memberType);
459
			slabs.stream().forEach(x -> {
460
				x.setTargetId(ptd.getId());
461
				targetSlabRepository.persist(x);
462
			});
463
		}
464
	}
465
 
25023 amit.gupta 466
	public void populateSchemes() {
25021 amit.gupta 467
		List<Integer> list05 = Arrays.asList(29093, 29094, 29095, 29096, 29097, 29098, 29099, 29101, 29102);
468
		List<Integer> list10 = Arrays.asList(29187, 29188);
469
		List<Integer> list13 = Arrays.asList(28095, 28097, 28098, 28101, 28102, 28104, 28106, 28107, 28108, 28227,
470
				28228, 28229, 28231, 29055, 29056, 29066, 29079);
471
		List<Integer> list15 = Arrays.asList(20891, 27938, 27939, 27940, 27941, 27943, 27947, 27948, 27953, 27954,
472
				27955, 28220, 28467, 29020, 29033, 29034, 29035, 29592, 29886, 29890, 29891, 29941, 29942, 27445, 27958,
473
				27960, 27961);
474
		List<Integer> list18 = Arrays.asList(28137, 28138, 28140, 28157, 28158, 28161, 28162, 28163, 28164, 28176,
475
				28177, 28178, 28199, 28200, 28208, 28209, 28210, 28211, 28215, 28216, 28217, 28230, 28380, 28381, 28382,
476
				28383, 28384, 28385, 28386, 28387, 28388, 28389, 28390, 28391, 28392, 28395, 28461, 28462, 28463, 28464,
477
				28465, 28466, 28488, 28489, 28490, 28491, 28564, 28565, 28762, 28773, 28871, 28872, 28873, 28874, 28880,
478
				28881, 28914, 28915, 28916, 28917, 28918, 28919, 28920, 29046, 29047, 29048, 29068, 29069, 29110, 29111,
479
				29112, 29113, 29114, 29115, 29116, 29117, 29207, 29208, 29217, 29218, 29225, 29474, 29475, 29476, 29477,
480
				29478, 29479, 29483, 29485, 29486, 29487, 29488, 29739, 29740, 29741, 29742, 29743, 29744, 29745, 29746,
481
				29747, 29748, 29749, 29753, 29756, 29757, 29758, 29760, 29761, 29762, 29763, 29764, 29765, 29766, 29767,
482
				29779, 29780, 29781, 29792, 29793, 29828, 29829, 29830, 29879, 29880, 29881, 29882, 29951);
483
		List<Integer> list20 = Arrays.asList(27975, 27976, 28091, 28363, 29023, 29024, 29025);
484
		List<Integer> list25 = Arrays.asList(28763, 28764, 28765, 29152, 29154, 29157, 29209, 29210, 29601, 29602,
485
				29720, 29721, 29722, 29723, 29725, 29726, 29727);
486
		List<Integer> list30 = Arrays.asList(27962, 27963, 27964, 27965, 27966, 27968, 27969, 28328, 28362, 28566,
487
				28567, 28568, 28571, 28572, 29073, 29074, 29075, 29080, 29081, 29120, 29121, 29122, 29124, 29189, 29190,
488
				29191, 29192, 29193, 29194, 29196, 29197, 29198, 29199, 29515, 29516, 29517, 29675, 29676, 29677, 29678,
489
				29679, 29707, 29708, 29794, 29795, 29883, 29884, 29885, 29887, 29888, 29889, 29931, 29932, 29935, 29936,
490
				29937, 29938, 29939, 29940);
491
		List<Integer> list35 = Arrays.asList(27996, 27998, 29067, 29071, 29643, 29644, 29945, 29946, 29987, 29052,
492
				29053, 29078, 29085, 29086, 29567, 29568, 29569, 29570, 29797, 29914, 29915, 29930, 28877, 28878, 29604,
493
				29605, 29606, 29775, 29776, 29777, 29778, 28862, 28863, 28864, 29026, 29103, 29104, 29105, 28979, 28980,
494
				28981, 28982, 28983, 29002, 29003, 29004, 29834, 29835, 29836, 29837, 29943);
495
		List<Integer> list40 = Arrays.asList(29082, 29083, 28766, 28767, 28768, 28769, 28771);
496
		List<Integer> list45 = Arrays.asList(28026, 28027, 28028, 29528, 29529, 29530, 29534, 29535, 29536, 29538,
497
				29755);
498
		List<Integer> list55 = Arrays.asList(28010, 28011, 28015, 28016, 28019, 28240, 28469, 28470, 28471, 28569,
499
				28570, 28674, 28759, 28761, 28909, 28910, 28911, 28912, 28913, 29108, 29109, 29143, 29144, 29145, 29146,
500
				29211, 29212, 29213, 29214, 29482, 29511, 29512, 29521, 29525, 29526, 29527, 29574, 29575, 29576, 29611,
501
				29612, 29616, 29641, 29642, 29728, 29729, 29750, 29771, 29782, 29783, 29784, 29923, 29924, 29944, 29953,
502
				29992, 29994, 27977, 27978, 28092, 28325, 28326, 28327, 28486, 28487, 29148, 29149, 29150, 29151, 29384,
503
				29385, 29386, 29427, 29489, 29518, 29519, 29520, 29577, 29578, 29579, 29580, 29586, 29660, 29661, 29662,
504
				29663, 29769, 29770, 29790, 29791, 29796, 29928, 29929, 29947, 29948, 28093, 28094, 28556, 28557, 28673,
505
				28867, 28868, 28870, 29089, 29090, 29091, 29106, 29107);
506
		List<Integer> list65 = Arrays.asList(28058, 28223, 28224, 28225, 28226, 28329, 29201, 29202, 29203, 29204,
507
				29205, 29206, 29466, 29467, 29468, 29469, 29470, 29471, 29472, 29573);
508
		Map<Float, List<Integer>> m = new HashMap<>();
509
		m.put(0.5f, list05);
510
		m.put(1.0f, list10);
511
		m.put(1.3f, list13);
512
		m.put(1.5f, list15);
513
		m.put(1.8f, list18);
514
		m.put(2.0f, list20);
515
		m.put(2.5f, list25);
516
		m.put(3.0f, list30);
517
		m.put(3.5f, list35);
518
		m.put(4.0f, list40);
519
		m.put(4.5f, list45);
520
		m.put(5.5f, list55);
521
		m.put(6.5f, list65);
522
		for (Map.Entry<Float, List<Integer>> itemsListEntry : m.entrySet()) {
523
			Scheme s1 = getScheme();
524
			s1.setAmount(itemsListEntry.getKey());
525
			schemeRepository.persist(s1);
25034 amit.gupta 526
			for (Integer itemId : itemsListEntry.getValue()) {
25021 amit.gupta 527
				SchemeItem schemeItem = new SchemeItem();
528
				schemeItem.setItemId(itemId);
529
				schemeItem.setSchemeId(s1.getId());
530
				schemeItemRepository.persist(schemeItem);
531
			}
532
		}
25034 amit.gupta 533
 
25021 amit.gupta 534
	}
535
 
536
	private Scheme getScheme() {
537
		Scheme s = new Scheme();
538
		s.setName("List Price Margin");
539
		s.setDescription("List Price Margin");
540
		s.setActiveTimestamp(null);
541
		s.setStartDateTime(LocalDate.of(2019, 6, 1).atStartOfDay());
542
		s.setEndDateTime(LocalDate.of(2019, 7, 1).atStartOfDay());
543
		s.setAmountType(AmountType.PERCENTAGE);
544
		s.setCreateTimestamp(LocalDateTime.now());
545
		s.setExpireTimestamp(null);
546
		s.setCreatedBy(175120474);
547
		return s;
548
	}
549
 
24957 amit.gupta 550
	public void findMismatchesInIndent() throws Exception {
551
		List<Order> allInProcessOrders = orderRepository.selectAllOrder(OrderStatus.SUBMITTED_FOR_PROCESSING);
24967 amit.gupta 552
 
25021 amit.gupta 553
		Map<String, Integer> lineItemWhQtyMap = allInProcessOrders.stream()
25734 amit.gupta 554
				.collect(Collectors.groupingBy(y -> y.getLineItem().getItemId() + "-" + y.getFulfilmentWarehouseId(),
24967 amit.gupta 555
						Collectors.summingInt(y -> y.getLineItem().getQuantity())));
25021 amit.gupta 556
 
557
		lineItemWhQtyMap.forEach((key, value) -> {
558
 
24967 amit.gupta 559
			int itemId = Integer.parseInt(key.split("-")[0]);
560
			int warehouseId = Integer.parseInt(key.split("-")[1]);
25021 amit.gupta 561
			System.out.printf("%d\t%d\t%d\n", itemId, warehouseId, value);
562
			SaholicInventorySnapshot cis = saholicInventorySnapshotRepository.selectByWarehouseIdandItemId(warehouseId,
563
					itemId);
564
			if (cis == null) {
24970 amit.gupta 565
				cis = new SaholicInventorySnapshot();
566
				cis.setItemId(itemId);
567
				cis.setWarehouseId(warehouseId);
568
				cis.setAvailability(0);
569
				saholicInventorySnapshotRepository.persist(cis);
570
			}
24967 amit.gupta 571
			cis.setReserved(value);
572
		});
24953 amit.gupta 573
	}
574
 
25034 amit.gupta 575
	public void fixSchemePayouts() throws Exception {
25524 amit.gupta 576
		LOGGER.info("In fix scheme Payouts");
25522 amit.gupta 577
		LocalDateTime startDate = LocalDate.of(2019, 9, 1).atStartOfDay();
578
		List<SchemeInOut> sios = schemeInOutRepository.selectAllByCreateDate(startDate, LocalDateTime.now());
25530 amit.gupta 579
 
25034 amit.gupta 580
		for (SchemeInOut sio : sios) {
25530 amit.gupta 581
			if (sio.getSchemeId() != 347) {
25523 amit.gupta 582
				LOGGER.info("Skipping {}", sio.getSchemeId());
25522 amit.gupta 583
				continue;
584
			}
25043 amit.gupta 585
			genericRepository.delete(sio);
25522 amit.gupta 586
			InventoryItem ii = inventoryItemRepository.selectById(sio.getInventoryItemId());
587
			UserWallet userWallet = userWalletRepository.selectByRetailerId(ii.getFofoId());
588
			Scheme scheme = schemeRepository.selectById(sio.getSchemeId());
589
			if (scheme.getType().equals(SchemeType.IN)) {
590
				List<UserWalletHistory> historyList = userWalletHistoryRepository
591
						.selectAllByreferenceIdandreferenceType(ii.getPurchaseId(), WalletReferenceType.SCHEME_IN);
592
				for (UserWalletHistory uwh : historyList) {
25530 amit.gupta 593
					if (uwh.getTimestamp().isAfter(startDate)) {
25522 amit.gupta 594
						genericRepository.delete(uwh);
595
						userWallet.setAmount(userWallet.getAmount() - uwh.getAmount());
596
					}
597
				}
598
			} else {
599
				List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(ii.getId());
600
				int orderId = scanRecords.get(0).getOrderId();
601
				List<UserWalletHistory> historyList = userWalletHistoryRepository
602
						.selectAllByreferenceIdandreferenceType(orderId, WalletReferenceType.SCHEME_OUT);
603
				for (UserWalletHistory uwh : historyList) {
25530 amit.gupta 604
					if (uwh.getTimestamp().isAfter(startDate)) {
25522 amit.gupta 605
						userWallet.setAmount(userWallet.getAmount() - uwh.getAmount());
606
						genericRepository.delete(uwh);
607
					}
608
				}
609
				List<UserWalletHistory> historyListBroken = userWalletHistoryRepository
25530 amit.gupta 610
						.selectAllByreferenceIdandreferenceType(ii.getPurchaseId(), WalletReferenceType.SCHEME_OUT);
25522 amit.gupta 611
				for (UserWalletHistory uwh : historyListBroken) {
25530 amit.gupta 612
					if (uwh.getTimestamp().isAfter(startDate)) {
25522 amit.gupta 613
						genericRepository.delete(uwh);
614
						userWallet.setAmount(userWallet.getAmount() - uwh.getAmount());
615
					}
616
				}
617
			}
618
 
25530 amit.gupta 619
			// System.out.println("Total Amount Rolled Back is " + totalRollbackAmount);
25516 amit.gupta 620
		}
25589 amit.gupta 621
		scheduledTasks.processScheme(startDate, startDate.plusDays(10), true);
25030 amit.gupta 622
	}
25530 amit.gupta 623
 
624
	public void fixWallet() throws Exception {
625
		List<FofoStore> fofoStores = fofoStoreRepository.selectAll();
25536 amit.gupta 626
		System.out.println("id\tcode\tactive\tname\tcity\tstate\twallet amount\tsum\twallet amount-sum");
25530 amit.gupta 627
		for (FofoStore fofoStore : fofoStores) {
628
			UserWallet uw = userWalletRepository.selectByRetailerId(fofoStore.getId());
629
			User user = userRepository.selectById(fofoStore.getId());
25749 amit.gupta 630
			if (user == null) {
25533 amit.gupta 631
				LOGGER.info("store does not exist", fofoStore.getCode());
25535 amit.gupta 632
				continue;
25533 amit.gupta 633
			}
25536 amit.gupta 634
			Address address = null;
635
			try {
636
				address = addressRepository.selectById(user.getAddressId());
25749 amit.gupta 637
			} catch (Exception e) {
25536 amit.gupta 638
				LOGGER.info("Could not find address for Store", fofoStore.getCode());
639
				address = new Address();
640
			}
25539 amit.gupta 641
			double sum = userWalletHistoryRepository.selectSumByWallet(uw.getId());
25749 amit.gupta 642
			int calculated = (int) sum;
643
			System.out.printf("%d\t%s\t%b\t%s\t%s\t%s\t%d\t%d\t%d%n", fofoStore.getId(), fofoStore.getCode(),
644
					fofoStore.isActive(), address.getName(), address.getCity(), address.getState(), uw.getAmount(),
645
					calculated, uw.getAmount() - calculated);
25530 amit.gupta 646
		}
647
	}
25749 amit.gupta 648
 
25734 amit.gupta 649
	public void changeWarehouse() throws Exception {
650
		transactionService.moveWarehouses();
651
	}
25749 amit.gupta 652
 
653
	public void mailDashboardScreenshots() throws Exception {
654
		System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
655
 
25752 amit.gupta 656
		ChromeOptions options = new ChromeOptions();
657
		options.addArguments("--headless");
658
		options.addArguments("--no-sandbox");
659
		options.addArguments("start-maximized");
660
		options.addArguments("disable-infobars");
661
		options.addArguments("--disable-extensions");
662
 
25753 amit.gupta 663
		WebDriver driver = new ChromeDriver(options);
25774 amit.gupta 664
		driver.manage().window().setSize(new Dimension(1600, 900));
25749 amit.gupta 665
		driver.manage().window().maximize();
25752 amit.gupta 666
		// Deleting all the cookies
25749 amit.gupta 667
		driver.manage().deleteAllCookies();
25752 amit.gupta 668
		// Specifiying pageLoadTimeout and Implicit wait
25749 amit.gupta 669
		driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
670
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
25752 amit.gupta 671
 
25749 amit.gupta 672
		Map<String, Set<Integer>> authUserPartnerIdMapping = csService.getAuthUserPartnerIdMapping();
673
		Set<Integer> allPartners = new HashSet<>();
25765 amit.gupta 674
		Map<Integer, File> partnerSnapshotMap = new HashMap<>();
25752 amit.gupta 675
		authUserPartnerIdMapping.values().stream().forEach(x -> allPartners.addAll(x));
25749 amit.gupta 676
		System.out.println(allPartners.size());
25752 amit.gupta 677
		for (int fofoId : allPartners) {
25749 amit.gupta 678
			driver.get("https://partners.smartdukaan.com/12dashboard34?fofoId=" + fofoId);
25765 amit.gupta 679
			File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
680
			partnerSnapshotMap.put(fofoId, file);
25752 amit.gupta 681
 
25749 amit.gupta 682
		}
25752 amit.gupta 683
		for (Map.Entry<String, Set<Integer>> entry : authUserPartnerIdMapping.entrySet()) {
25749 amit.gupta 684
			String email = entry.getKey();
25996 amit.gupta 685
			LOGGER.info("Sending mail start to {}", email);
25749 amit.gupta 686
			Set<Integer> partnerIds = entry.getValue();
687
			StringBuffer body = new StringBuffer();
25769 amit.gupta 688
			Map<Integer, File> emailSnapshotMap = new HashMap<>();
25752 amit.gupta 689
			for (int fofoId : partnerIds) {
25769 amit.gupta 690
				body.append(String.format("<br/><img src=\"cid:%d\"/>", fofoId));
691
				emailSnapshotMap.put(fofoId, partnerSnapshotMap.get(fofoId));
25749 amit.gupta 692
			}
25837 amit.gupta 693
			Utils.sendEmbeddedHtmlMail(mailSender, new String[] { email }, new String[] {},
25752 amit.gupta 694
					String.format("Franchise Screenshots - %s", FormattingUtils.formatDate(LocalDateTime.now())),
25837 amit.gupta 695
					body.toString(), emailSnapshotMap);
25996 amit.gupta 696
			LOGGER.info("Sent mail to {}", email);
25749 amit.gupta 697
		}
698
		driver.quit();
699
	}
25043 amit.gupta 700
}
701
 
702
//7015845171