Subversion Repositories SmartDukaan

Rev

Rev 27286 | Rev 27289 | 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;
23824 amit.gupta 4
import java.time.LocalDate;
23755 amit.gupta 5
import java.time.LocalDateTime;
23824 amit.gupta 6
import java.time.LocalTime;
24819 amit.gupta 7
import java.util.ArrayList;
23755 amit.gupta 8
import java.util.Arrays;
23827 amit.gupta 9
import java.util.Collections;
26928 amit.gupta 10
import java.util.Comparator;
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
 
26214 amit.gupta 35
import com.smartdukaan.cron.scheduled.SamsungIMEIActivationService;
25043 amit.gupta 36
import com.smartdukaan.cron.scheduled.ScheduledTasks;
26095 amit.gupta 37
import com.spice.profitmandi.common.enumuration.ItemType;
26033 amit.gupta 38
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
24819 amit.gupta 39
import com.spice.profitmandi.common.util.FileUtil;
25749 amit.gupta 40
import com.spice.profitmandi.common.util.FormattingUtils;
24819 amit.gupta 41
import com.spice.profitmandi.common.util.Utils;
26033 amit.gupta 42
import com.spice.profitmandi.dao.entity.catalog.Item;
25021 amit.gupta 43
import com.spice.profitmandi.dao.entity.catalog.Scheme;
26579 amit.gupta 44
import com.spice.profitmandi.dao.entity.catalog.TagListing;
27286 amit.gupta 45
import com.spice.profitmandi.dao.entity.dtr.PaymentOptionTransaction;
24716 amit.gupta 46
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
26759 amit.gupta 47
import com.spice.profitmandi.dao.entity.fofo.DebitNote;
27286 amit.gupta 48
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
24806 amit.gupta 49
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
50
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
25530 amit.gupta 51
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
24005 amit.gupta 52
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
24883 amit.gupta 53
import com.spice.profitmandi.dao.entity.fofo.PartnerTargetDetails;
26928 amit.gupta 54
import com.spice.profitmandi.dao.entity.fofo.PartnerType;
26033 amit.gupta 55
import com.spice.profitmandi.dao.entity.fofo.PrebookingOrder;
23898 amit.gupta 56
import com.spice.profitmandi.dao.entity.fofo.Purchase;
26759 amit.gupta 57
import com.spice.profitmandi.dao.entity.fofo.PurchaseReturnItem;
24716 amit.gupta 58
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
25034 amit.gupta 59
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
25021 amit.gupta 60
import com.spice.profitmandi.dao.entity.fofo.SchemeItem;
24883 amit.gupta 61
import com.spice.profitmandi.dao.entity.fofo.TargetSlab;
24953 amit.gupta 62
import com.spice.profitmandi.dao.entity.inventory.SaholicInventorySnapshot;
23824 amit.gupta 63
import com.spice.profitmandi.dao.entity.transaction.LineItem;
23755 amit.gupta 64
import com.spice.profitmandi.dao.entity.transaction.LineItemImei;
65
import com.spice.profitmandi.dao.entity.transaction.Order;
24802 amit.gupta 66
import com.spice.profitmandi.dao.entity.transaction.SellerWarehouse;
25046 amit.gupta 67
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
25034 amit.gupta 68
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
25530 amit.gupta 69
import com.spice.profitmandi.dao.entity.user.Address;
70
import com.spice.profitmandi.dao.entity.user.User;
25021 amit.gupta 71
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
25522 amit.gupta 72
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
27286 amit.gupta 73
import com.spice.profitmandi.dao.enumuration.dtr.PaymentOptionReferenceType;
26759 amit.gupta 74
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
26579 amit.gupta 75
import com.spice.profitmandi.dao.model.ContentPojo;
76
import com.spice.profitmandi.dao.model.MediaPojo;
24716 amit.gupta 77
import com.spice.profitmandi.dao.repository.GenericRepository;
25034 amit.gupta 78
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
25021 amit.gupta 79
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
26579 amit.gupta 80
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
25749 amit.gupta 81
import com.spice.profitmandi.dao.repository.cs.CsService;
23899 amit.gupta 82
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
27221 amit.gupta 83
import com.spice.profitmandi.dao.repository.dtr.LeadRepository;
26579 amit.gupta 84
import com.spice.profitmandi.dao.repository.dtr.Mongo;
27286 amit.gupta 85
import com.spice.profitmandi.dao.repository.dtr.PaymentOptionTransactionRepository;
24716 amit.gupta 86
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
24002 amit.gupta 87
import com.spice.profitmandi.dao.repository.fofo.DebitNoteRepository;
27286 amit.gupta 88
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
24806 amit.gupta 89
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
90
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
24002 amit.gupta 91
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
24806 amit.gupta 92
import com.spice.profitmandi.dao.repository.fofo.InvoiceNumberGenerationSequenceRepository;
24883 amit.gupta 93
import com.spice.profitmandi.dao.repository.fofo.PartnerTargetRepository;
26033 amit.gupta 94
import com.spice.profitmandi.dao.repository.fofo.PrebookingOrderRepository;
23898 amit.gupta 95
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
26759 amit.gupta 96
import com.spice.profitmandi.dao.repository.fofo.PurchaseReturnItemRepository;
24716 amit.gupta 97
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
24002 amit.gupta 98
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
25021 amit.gupta 99
import com.spice.profitmandi.dao.repository.fofo.SchemeItemRepository;
24883 amit.gupta 100
import com.spice.profitmandi.dao.repository.fofo.TargetSlabRepository;
101
import com.spice.profitmandi.dao.repository.fofo.TargetSlabRepositoryImpl;
24953 amit.gupta 102
import com.spice.profitmandi.dao.repository.inventory.SaholicInventorySnapshotRepository;
26928 amit.gupta 103
import com.spice.profitmandi.dao.repository.inventory.SaholicReservationSnapshotRepository;
23755 amit.gupta 104
import com.spice.profitmandi.dao.repository.transaction.LineItemImeisRepository;
23824 amit.gupta 105
import com.spice.profitmandi.dao.repository.transaction.LineItemRepository;
23755 amit.gupta 106
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
24772 amit.gupta 107
import com.spice.profitmandi.dao.repository.transaction.ReturnOrderRepository;
24802 amit.gupta 108
import com.spice.profitmandi.dao.repository.transaction.SellerWarehouseRepository;
24767 amit.gupta 109
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
110
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
25530 amit.gupta 111
import com.spice.profitmandi.dao.repository.user.AddressRepository;
24002 amit.gupta 112
import com.spice.profitmandi.dao.repository.user.UserRepository;
23899 amit.gupta 113
import com.spice.profitmandi.service.inventory.InventoryService;
26033 amit.gupta 114
import com.spice.profitmandi.service.inventory.PurchaseService;
24266 amit.gupta 115
import com.spice.profitmandi.service.order.OrderService;
24005 amit.gupta 116
import com.spice.profitmandi.service.pricing.PriceDropService;
117
import com.spice.profitmandi.service.scheme.SchemeService;
23899 amit.gupta 118
import com.spice.profitmandi.service.transaction.TransactionService;
119
import com.spice.profitmandi.service.user.RetailerService;
120
import com.spice.profitmandi.service.wallet.WalletService;
23755 amit.gupta 121
 
24953 amit.gupta 122
import in.shop2020.model.v1.order.OrderStatus;
24002 amit.gupta 123
import in.shop2020.model.v1.order.WalletReferenceType;
124
 
23755 amit.gupta 125
@Component
126
@Transactional(rollbackFor = Throwable.class)
127
public class RunOnceTasks {
128
 
129
	private static final Logger LOGGER = LogManager.getLogger(RunOnceTasks.class);
130
 
131
	@Autowired
23824 amit.gupta 132
	private LineItemRepository lineItemRepository;
24711 amit.gupta 133
 
23905 amit.gupta 134
	@Autowired
27221 amit.gupta 135
	private LeadRepository leadRepository;
27277 amit.gupta 136
 
27221 amit.gupta 137
	@Autowired
26759 amit.gupta 138
	private PurchaseReturnItemRepository purchaseReturnItemRepository;
26928 amit.gupta 139
 
26759 amit.gupta 140
	@Autowired
24953 amit.gupta 141
	private SaholicInventorySnapshotRepository saholicInventorySnapshotRepository;
25752 amit.gupta 142
 
25749 amit.gupta 143
	@Autowired
144
	private CsService csService;
26299 amit.gupta 145
 
26033 amit.gupta 146
	@Autowired
26579 amit.gupta 147
	private Mongo mongoClient;
27286 amit.gupta 148
 
149
	@Autowired
150
	private PaymentOptionTransactionRepository paymentOptionTransactionRepository;
26579 amit.gupta 151
 
152
	@Autowired
26195 amit.gupta 153
	private SamsungIMEIActivationService samsungActivationService;
26299 amit.gupta 154
 
26195 amit.gupta 155
	@Autowired
26033 amit.gupta 156
	private PrebookingOrderRepository prebookingOrderRepository;
24953 amit.gupta 157
 
158
	@Autowired
26928 amit.gupta 159
	private SaholicReservationSnapshotRepository saholicReservationInventorySnapshotRepository;
24953 amit.gupta 160
 
161
	@Autowired
24883 amit.gupta 162
	private TargetSlabRepository targetSlabRepository;
163
 
164
	@Autowired
165
	private PartnerTargetRepository partnerTargetRepository;
166
 
167
	@Autowired
24802 amit.gupta 168
	private SellerWarehouseRepository sellerWarehouseRepository;
24814 amit.gupta 169
 
24802 amit.gupta 170
	@Autowired
24806 amit.gupta 171
	private FofoOrderItemRepository fofoOrderItemRepository;
27286 amit.gupta 172
 
173
	@Autowired
174
	private FofoLineItemRepository fofoLineItemRepository;
24814 amit.gupta 175
 
24806 amit.gupta 176
	@Autowired
177
	private FofoOrderRepository fofoOrderRepository;
24814 amit.gupta 178
 
24806 amit.gupta 179
	@Autowired
24767 amit.gupta 180
	private UserWalletRepository userWalletRepository;
181
 
182
	@Autowired
183
	private UserWalletHistoryRepository userWalletHistoryRepository;
184
 
185
	@Autowired
24002 amit.gupta 186
	private UserRepository userRepository;
24711 amit.gupta 187
 
24002 amit.gupta 188
	@Autowired
23899 amit.gupta 189
	private WalletService walletService;
190
 
191
	@Autowired
25034 amit.gupta 192
	private ItemRepository itemRepository;
193
 
194
	@Autowired
23899 amit.gupta 195
	private InventoryService inventoryService;
196
 
197
	@Autowired
198
	private TransactionService transactionService;
26299 amit.gupta 199
 
26033 amit.gupta 200
	@Autowired
201
	private PurchaseService purchaseService;
23899 amit.gupta 202
 
24711 amit.gupta 203
	// Service for Tertiary/Partner Orders
24266 amit.gupta 204
	@Autowired
205
	private OrderService orderService;
23767 amit.gupta 206
 
23755 amit.gupta 207
	@Autowired
25021 amit.gupta 208
	private SchemeRepository schemeRepository;
25516 amit.gupta 209
 
25043 amit.gupta 210
	@Autowired
25530 amit.gupta 211
	private AddressRepository addressRepository;
25749 amit.gupta 212
 
25530 amit.gupta 213
	@Autowired
25043 amit.gupta 214
	private ScheduledTasks scheduledTasks;
25034 amit.gupta 215
 
25021 amit.gupta 216
	@Autowired
217
	private SchemeItemRepository schemeItemRepository;
218
 
219
	@Autowired
24772 amit.gupta 220
	private ReturnOrderRepository returnOrderRepository;
221
 
222
	@Autowired
23899 amit.gupta 223
	private FofoStoreRepository fofoStoreRepository;
224
 
225
	@Autowired
23755 amit.gupta 226
	private LineItemImeisRepository lineItemImeisRepository;
24711 amit.gupta 227
 
24002 amit.gupta 228
	@Autowired
229
	private InventoryItemRepository inventoryItemRepository;
24814 amit.gupta 230
 
24806 amit.gupta 231
	@Autowired
26579 amit.gupta 232
	private TagListingRepository tagListingRepository;
233
 
234
	@Autowired
24806 amit.gupta 235
	private InvoiceNumberGenerationSequenceRepository invoiceNumberGenerationSequenceRepository;
23901 amit.gupta 236
 
23898 amit.gupta 237
	@Autowired
23899 amit.gupta 238
	private RetailerService retailerService;
24711 amit.gupta 239
 
24002 amit.gupta 240
	@Autowired
241
	private SchemeInOutRepository schemeInOutRepository;
24711 amit.gupta 242
 
24002 amit.gupta 243
	@Autowired
244
	private DebitNoteRepository debitNoteRepository;
23899 amit.gupta 245
 
246
	@Autowired
24716 amit.gupta 247
	private GenericRepository genericRepository;
248
 
249
	@Autowired
23898 amit.gupta 250
	private PurchaseRepository purchaseRepository;
24711 amit.gupta 251
 
24005 amit.gupta 252
	@Autowired
253
	private PriceDropService priceDropService;
24883 amit.gupta 254
 
24819 amit.gupta 255
	@Autowired
256
	private JavaMailSender googleMailSender;
24711 amit.gupta 257
 
24005 amit.gupta 258
	@Autowired
259
	private SchemeService schemeService;
24711 amit.gupta 260
 
24716 amit.gupta 261
	@Autowired
262
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
263
 
264
	@Autowired
24767 amit.gupta 265
	private OrderRepository orderRepository;
266
 
267
	@Autowired
24716 amit.gupta 268
	private ScanRecordRepository scanRecordRepository;
269
 
24767 amit.gupta 270
	@Autowired
271
	private JavaMailSender mailSender;
272
 
23898 amit.gupta 273
	public void populateGrnTimestamp() {
274
		List<Purchase> allPurchases = purchaseRepository.selectAll();
23899 amit.gupta 275
		for (Purchase p : allPurchases) {
23898 amit.gupta 276
			String invoiceNumber = p.getPurchaseReference();
23899 amit.gupta 277
			if (p.getCompleteTimestamp() == null) {
23898 amit.gupta 278
				LOGGER.info("GRN for invoice {} is delivered but partially Completed.", p.getPurchaseReference());
279
			} else {
280
				List<Order> orders = orderRepository.selectByAirwayBillOrInvoiceNumber(invoiceNumber, p.getFofoId());
23899 amit.gupta 281
				for (Order order : orders) {
23902 amit.gupta 282
					if (order.getPartnerGrnTimestamp() == null) {
283
						order.setPartnerGrnTimestamp(p.getCompleteTimestamp());
23898 amit.gupta 284
						orderRepository.persist(order);
285
					}
286
				}
287
			}
288
		}
23899 amit.gupta 289
 
23898 amit.gupta 290
	}
23899 amit.gupta 291
 
26408 amit.gupta 292
	public void fetchImeiActivation(int ym) throws Exception {
293
		LocalDate endDate = LocalDate.now().minusMonths(ym);
26579 amit.gupta 294
		samsungActivationService.getActivationsBetweenNew(endDate.withDayOfMonth(1),
295
				endDate.withDayOfMonth(endDate.lengthOfMonth()));
26195 amit.gupta 296
	}
26299 amit.gupta 297
 
24716 amit.gupta 298
	public void migarateLineItemsToNewTable() throws Exception {
23755 amit.gupta 299
		LOGGER.info("Before Migrated LineItems Successfully");
23824 amit.gupta 300
		int lineItemImeiId = 0;
301
		LocalDateTime startDate = null;
302
		try {
303
			lineItemImeiId = lineItemImeisRepository.selectMaxId();
23899 amit.gupta 304
			LineItem lineItem = lineItemRepository
305
					.selectById(lineItemImeisRepository.selectById(lineItemImeiId).getLineItemId());
23824 amit.gupta 306
			Order order = orderRepository.selectById(lineItem.getOrderId());
307
			startDate = order.getBillingTimestamp();
308
		} catch (Exception e) {
309
			LOGGER.info("Running before first time");
23826 amit.gupta 310
			startDate = LocalDateTime.of(LocalDate.of(2017, 7, 1), LocalTime.MIDNIGHT);
23824 amit.gupta 311
		}
312
		List<Order> orders = orderRepository.selectAllByBillingDatesBetween(startDate, LocalDateTime.now());
23827 amit.gupta 313
		Collections.reverse(orders);
23899 amit.gupta 314
 
23755 amit.gupta 315
		for (Order order : orders) {
23824 amit.gupta 316
			try {
23767 amit.gupta 317
				String serialNumbers = order.getLineItem().getSerialNumber();
318
				if (!StringUtils.isEmpty(serialNumbers)) {
319
					List<String> serialNumberList = Arrays.asList(serialNumbers.split(","));
320
					for (String serialNumber : serialNumberList) {
321
						int lineItemId = order.getLineItem().getId();
322
						LineItemImei lineItemImei = new LineItemImei();
323
						lineItemImei.setSerialNumber(serialNumber);
324
						lineItemImei.setLineItemId(lineItemId);
325
						lineItemImeisRepository.persist(lineItemImei);
326
					}
327
				} else {
328
					LOGGER.info("Serial Numbers dont exist for Order {}", order.getId());
23755 amit.gupta 329
				}
23824 amit.gupta 330
			} catch (Exception e) {
23899 amit.gupta 331
				LOGGER.info("Error occurred while creating lineitem imei {}, because of {}", order.getId(),
332
						e.getMessage());
23755 amit.gupta 333
			}
334
		}
335
		LOGGER.info("Migrated LineItems Successfully");
336
	}
24266 amit.gupta 337
 
338
	public void cancelOrder(List<String> invoiceNumbers) throws Exception {
339
		orderService.cancelOrder(invoiceNumbers);
340
	}
24711 amit.gupta 341
 
24722 amit.gupta 342
	public void migratePurchase() throws Exception {
24641 amit.gupta 343
		List<Purchase> purchases = purchaseRepository.selectPurchaseAllPurchasesLessThanZero();
24706 amit.gupta 344
		System.out.printf("Total Purchases count is %s", purchases.size());
24711 amit.gupta 345
		for (Purchase purchase : purchases) {
346
			List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchase.getId());
347
			Map<Integer, List<InventoryItem>> itemIdInventoryMap = inventoryItems.stream()
348
					.collect(Collectors.groupingBy(InventoryItem::getItemId));
349
			List<Order> orders = orderRepository.selectByAirwayBillOrInvoiceNumber(purchase.getPurchaseReference(),
350
					purchase.getFofoId());
351
			Map<Integer, Integer> ourSaleItemQtyMap = orders.stream().collect(Collectors.groupingBy(
352
					x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
353
			Map<Integer, Integer> theirPurchaseItemQtyMap = inventoryItems.stream().collect(Collectors
354
					.groupingBy(InventoryItem::getItemId, Collectors.summingInt(InventoryItem::getInitialQuantity)));
24709 amit.gupta 355
			for (Map.Entry<Integer, Integer> itemQtyEntry : theirPurchaseItemQtyMap.entrySet()) {
24711 amit.gupta 356
				if (!ourSaleItemQtyMap.containsKey(itemQtyEntry.getKey())) {
357
					LOGGER.info("Cannot find in Invoice {} item {}", purchase.getPurchaseReference(),
358
							itemQtyEntry.getKey());
24646 amit.gupta 359
					continue;
24645 amit.gupta 360
				}
24709 amit.gupta 361
				int ourSale = ourSaleItemQtyMap.get(itemQtyEntry.getKey());
24713 amit.gupta 362
				int quantityToReduce = itemQtyEntry.getValue() - ourSale;
24716 amit.gupta 363
				List<InventoryItem> itemIis = itemIdInventoryMap.get(itemQtyEntry.getKey());
364
				if (itemIdInventoryMap != null) {
365
					for (InventoryItem ii : itemIis) {
24915 amit.gupta 366
						if (ii.getSerialNumber() == null && ii.getGoodQuantity() == ii.getInitialQuantity()
367
								&& quantityToReduce >= ii.getInitialQuantity()) {
24734 amit.gupta 368
							LOGGER.info("Changed in inventoryItems {}, {}, {}, {}, {}, {}",
24716 amit.gupta 369
									purchase.getPurchaseReference(), ii.getId(), ii.getItemId(),
24734 amit.gupta 370
									ii.getInitialQuantity(), ii.getGoodQuantity(), quantityToReduce);
24912 amit.gupta 371
							List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(ii.getId());
372
							for (ScanRecord scanRecord : scanRecords) {
24915 amit.gupta 373
								CurrentInventorySnapshot cis = currentInventorySnapshotRepository
374
										.selectByItemIdAndFofoId(itemQtyEntry.getKey(), purchase.getFofoId());
375
								scanRecord.setQuantity(0);
376
								ii.setGoodQuantity(0);
377
								quantityToReduce = quantityToReduce - ii.getInitialQuantity();
378
								cis.setAvailability(cis.getAvailability() - ii.getInitialQuantity());
379
								purchase.setUnfullfilledNonSerializedQuantity(
380
										purchase.getUnfullfilledNonSerializedQuantity() + quantityToReduce);
381
								LOGGER.info("Rectified {}, {}, {}, {}, {}, {}", purchase.getPurchaseReference(),
382
										ii.getId(), ii.getItemId(), ii.getInitialQuantity(), ii.getGoodQuantity(),
383
										quantityToReduce);
24711 amit.gupta 384
							}
24641 amit.gupta 385
						}
386
					}
387
				}
388
			}
389
		}
24953 amit.gupta 390
		// throw new Exception();
24641 amit.gupta 391
	}
24767 amit.gupta 392
 
24802 amit.gupta 393
	public void migrateChallansToInvoices() throws Exception {
24814 amit.gupta 394
		Map<String, List<Order>> invoiceOrdersMap = orderRepository.selectAllChallans().stream()
395
				.filter(x -> !x.getLineItem().getHsnCode().equals("NOGST"))
24794 amit.gupta 396
				.collect(Collectors.groupingBy(Order::getInvoiceNumber, Collectors.toList()));
24814 amit.gupta 397
 
25837 amit.gupta 398
		List<List<?>> rows = new ArrayList<>();
24814 amit.gupta 399
		for (String invoice : invoiceOrdersMap.keySet()) {
24794 amit.gupta 400
			Order oneOrder = invoiceOrdersMap.get(invoice).get(0);
401
			int totalOrders = invoiceOrdersMap.get(invoice).size();
402
			LineItem lineItem = oneOrder.getLineItem();
24802 amit.gupta 403
			oneOrder.setBillingTimestamp(LocalDateTime.now());
404
			oneOrder.setInvoiceNumber(getInvoiceNumber(oneOrder));
24819 amit.gupta 405
			rows.add(Arrays.asList(oneOrder.getId(), invoice, oneOrder.getInvoiceNumber(), lineItem.getQuantity()));
24883 amit.gupta 406
			LOGGER.info(invoice + "\t" + oneOrder.getInvoiceNumber() + oneOrder.getId() + "\t",
407
					"\t" + totalOrders + "\t" + lineItem.getQuantity());
24814 amit.gupta 408
			Purchase p = null;
409
			try {
410
				p = purchaseRepository.selectByPurchaseReferenceAndFofoId(invoice, oneOrder.getRetailerId());
411
			} catch (Exception e) {
24815 amit.gupta 412
				LOGGER.info("Could not find purchase for invoice {}", invoice);
24812 amit.gupta 413
			}
24814 amit.gupta 414
			if (p != null) {
415
				List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(p.getId());
416
				for (InventoryItem inventoryItem : inventoryItems) {
24815 amit.gupta 417
					LOGGER.info(inventoryItem.getItemId() + " " + inventoryItem.getGoodQuantity() + " "
24883 amit.gupta 418
							+ inventoryItem.getHsnCode() + " " + inventoryItem.getSerialNumber() + " "
419
							+ p.getPurchaseReference());
24814 amit.gupta 420
				}
421
			}
422
 
24794 amit.gupta 423
		}
24818 amit.gupta 424
		changePartnerInvoices();
24883 amit.gupta 425
		ByteArrayOutputStream baos = FileUtil
426
				.getCSVByteStream(Arrays.asList("Order id", "Challan", "Invoice", "Quantity"), rows);
427
 
24819 amit.gupta 428
		Utils.sendMailWithAttachment(googleMailSender,
429
				new String[] { "amit.gupta@shop2020.in", "sunny.yadav@smartdukaan.com" }, null,
24883 amit.gupta 430
				"Challans Converted to Invoice", "PFA", "Challans-To-Invoice.csv",
431
				new ByteArrayResource(baos.toByteArray()));
24916 amit.gupta 432
		throw new Exception();
24794 amit.gupta 433
	}
24767 amit.gupta 434
 
24802 amit.gupta 435
	private String getInvoiceNumber(Order oneOrder) {
24805 amit.gupta 436
		String prefix = oneOrder.getInvoiceNumber().split("-")[1].replaceAll("\\d*", "");
24803 amit.gupta 437
		System.out.println("Prefix is " + prefix);
24802 amit.gupta 438
		SellerWarehouse sellerWarehouse = sellerWarehouseRepository.selectByPrefix(prefix);
439
		int newSequence = sellerWarehouse.getInvoiceSequence() + 1;
440
		sellerWarehouse.setInvoiceSequence(newSequence);
24814 amit.gupta 441
		return prefix + newSequence;
24802 amit.gupta 442
	}
24814 amit.gupta 443
 
24806 amit.gupta 444
	private void changePartnerInvoices() throws Exception {
24814 amit.gupta 445
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectByInvoiceNumberLike("%SEC%");
446
		for (FofoOrder fofoOrder : fofoOrders) {
24806 amit.gupta 447
			FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
24814 amit.gupta 448
			if (fofoOrderItem.getBrand().equals("Vivo")) {
24806 amit.gupta 449
				String challanString = fofoOrder.getInvoiceNumber();
24814 amit.gupta 450
				String storeCode = invoiceNumberGenerationSequenceRepository.selectByFofoId(fofoOrder.getFofoId())
451
						.getPrefix();
24806 amit.gupta 452
				String invoiceNumber = orderService.getInvoiceNumber(fofoOrder.getFofoId(), storeCode);
453
				fofoOrder.setInvoiceNumber(invoiceNumber);
454
				fofoOrder.setCreateTimestamp(LocalDateTime.now());
24818 amit.gupta 455
				LOGGER.info(challanString + "\t" + invoiceNumber + "\t" + fofoOrderItem.getQuantity());
24806 amit.gupta 456
			}
24814 amit.gupta 457
 
24806 amit.gupta 458
		}
459
	}
24802 amit.gupta 460
 
24883 amit.gupta 461
	public void createMonthlyTargets() throws Exception {
462
		Map<String, List<TargetSlab>> defaultSlabs = targetSlabRepository.getAllDefaultSlabs();
463
		for (String memberType : defaultSlabs.keySet()) {
464
			PartnerTargetDetails ptd = new PartnerTargetDetails();
465
			ptd.setBrandName(null);
466
 
467
			LocalDate startDate = LocalDate.now().withDayOfMonth(1);
468
			int totalDays = startDate.lengthOfMonth();
469
			String monthName = startDate.getMonth().toString();
470
			ptd.setStartDate(startDate.atStartOfDay());
471
			ptd.setEndDate(startDate.plusDays(totalDays - 1).atTime(LocalTime.MAX));
472
			ptd.setTargetName(String.format("%s Sales Target for %s Partners", monthName, memberType));
473
			partnerTargetRepository.persist(ptd);
474
			TargetSlabRepositoryImpl.TYPE_PARTNER_MAPPING.get(memberType).forEach(x -> {
475
				x.setTargetId(ptd.getId());
476
				partnerTargetRepository.persist(x);
477
			});
478
 
479
			List<TargetSlab> slabs = defaultSlabs.get(memberType);
480
			slabs.stream().forEach(x -> {
481
				x.setTargetId(ptd.getId());
482
				targetSlabRepository.persist(x);
483
			});
484
		}
485
	}
486
 
25023 amit.gupta 487
	public void populateSchemes() {
25021 amit.gupta 488
		List<Integer> list05 = Arrays.asList(29093, 29094, 29095, 29096, 29097, 29098, 29099, 29101, 29102);
489
		List<Integer> list10 = Arrays.asList(29187, 29188);
490
		List<Integer> list13 = Arrays.asList(28095, 28097, 28098, 28101, 28102, 28104, 28106, 28107, 28108, 28227,
491
				28228, 28229, 28231, 29055, 29056, 29066, 29079);
492
		List<Integer> list15 = Arrays.asList(20891, 27938, 27939, 27940, 27941, 27943, 27947, 27948, 27953, 27954,
493
				27955, 28220, 28467, 29020, 29033, 29034, 29035, 29592, 29886, 29890, 29891, 29941, 29942, 27445, 27958,
494
				27960, 27961);
495
		List<Integer> list18 = Arrays.asList(28137, 28138, 28140, 28157, 28158, 28161, 28162, 28163, 28164, 28176,
496
				28177, 28178, 28199, 28200, 28208, 28209, 28210, 28211, 28215, 28216, 28217, 28230, 28380, 28381, 28382,
497
				28383, 28384, 28385, 28386, 28387, 28388, 28389, 28390, 28391, 28392, 28395, 28461, 28462, 28463, 28464,
498
				28465, 28466, 28488, 28489, 28490, 28491, 28564, 28565, 28762, 28773, 28871, 28872, 28873, 28874, 28880,
499
				28881, 28914, 28915, 28916, 28917, 28918, 28919, 28920, 29046, 29047, 29048, 29068, 29069, 29110, 29111,
500
				29112, 29113, 29114, 29115, 29116, 29117, 29207, 29208, 29217, 29218, 29225, 29474, 29475, 29476, 29477,
501
				29478, 29479, 29483, 29485, 29486, 29487, 29488, 29739, 29740, 29741, 29742, 29743, 29744, 29745, 29746,
502
				29747, 29748, 29749, 29753, 29756, 29757, 29758, 29760, 29761, 29762, 29763, 29764, 29765, 29766, 29767,
503
				29779, 29780, 29781, 29792, 29793, 29828, 29829, 29830, 29879, 29880, 29881, 29882, 29951);
504
		List<Integer> list20 = Arrays.asList(27975, 27976, 28091, 28363, 29023, 29024, 29025);
505
		List<Integer> list25 = Arrays.asList(28763, 28764, 28765, 29152, 29154, 29157, 29209, 29210, 29601, 29602,
506
				29720, 29721, 29722, 29723, 29725, 29726, 29727);
507
		List<Integer> list30 = Arrays.asList(27962, 27963, 27964, 27965, 27966, 27968, 27969, 28328, 28362, 28566,
508
				28567, 28568, 28571, 28572, 29073, 29074, 29075, 29080, 29081, 29120, 29121, 29122, 29124, 29189, 29190,
509
				29191, 29192, 29193, 29194, 29196, 29197, 29198, 29199, 29515, 29516, 29517, 29675, 29676, 29677, 29678,
510
				29679, 29707, 29708, 29794, 29795, 29883, 29884, 29885, 29887, 29888, 29889, 29931, 29932, 29935, 29936,
511
				29937, 29938, 29939, 29940);
512
		List<Integer> list35 = Arrays.asList(27996, 27998, 29067, 29071, 29643, 29644, 29945, 29946, 29987, 29052,
513
				29053, 29078, 29085, 29086, 29567, 29568, 29569, 29570, 29797, 29914, 29915, 29930, 28877, 28878, 29604,
514
				29605, 29606, 29775, 29776, 29777, 29778, 28862, 28863, 28864, 29026, 29103, 29104, 29105, 28979, 28980,
515
				28981, 28982, 28983, 29002, 29003, 29004, 29834, 29835, 29836, 29837, 29943);
516
		List<Integer> list40 = Arrays.asList(29082, 29083, 28766, 28767, 28768, 28769, 28771);
517
		List<Integer> list45 = Arrays.asList(28026, 28027, 28028, 29528, 29529, 29530, 29534, 29535, 29536, 29538,
518
				29755);
519
		List<Integer> list55 = Arrays.asList(28010, 28011, 28015, 28016, 28019, 28240, 28469, 28470, 28471, 28569,
520
				28570, 28674, 28759, 28761, 28909, 28910, 28911, 28912, 28913, 29108, 29109, 29143, 29144, 29145, 29146,
521
				29211, 29212, 29213, 29214, 29482, 29511, 29512, 29521, 29525, 29526, 29527, 29574, 29575, 29576, 29611,
522
				29612, 29616, 29641, 29642, 29728, 29729, 29750, 29771, 29782, 29783, 29784, 29923, 29924, 29944, 29953,
523
				29992, 29994, 27977, 27978, 28092, 28325, 28326, 28327, 28486, 28487, 29148, 29149, 29150, 29151, 29384,
524
				29385, 29386, 29427, 29489, 29518, 29519, 29520, 29577, 29578, 29579, 29580, 29586, 29660, 29661, 29662,
525
				29663, 29769, 29770, 29790, 29791, 29796, 29928, 29929, 29947, 29948, 28093, 28094, 28556, 28557, 28673,
526
				28867, 28868, 28870, 29089, 29090, 29091, 29106, 29107);
527
		List<Integer> list65 = Arrays.asList(28058, 28223, 28224, 28225, 28226, 28329, 29201, 29202, 29203, 29204,
528
				29205, 29206, 29466, 29467, 29468, 29469, 29470, 29471, 29472, 29573);
529
		Map<Float, List<Integer>> m = new HashMap<>();
530
		m.put(0.5f, list05);
531
		m.put(1.0f, list10);
532
		m.put(1.3f, list13);
533
		m.put(1.5f, list15);
534
		m.put(1.8f, list18);
535
		m.put(2.0f, list20);
536
		m.put(2.5f, list25);
537
		m.put(3.0f, list30);
538
		m.put(3.5f, list35);
539
		m.put(4.0f, list40);
540
		m.put(4.5f, list45);
541
		m.put(5.5f, list55);
542
		m.put(6.5f, list65);
543
		for (Map.Entry<Float, List<Integer>> itemsListEntry : m.entrySet()) {
544
			Scheme s1 = getScheme();
545
			s1.setAmount(itemsListEntry.getKey());
546
			schemeRepository.persist(s1);
25034 amit.gupta 547
			for (Integer itemId : itemsListEntry.getValue()) {
25021 amit.gupta 548
				SchemeItem schemeItem = new SchemeItem();
549
				schemeItem.setItemId(itemId);
550
				schemeItem.setSchemeId(s1.getId());
551
				schemeItemRepository.persist(schemeItem);
552
			}
553
		}
25034 amit.gupta 554
 
25021 amit.gupta 555
	}
556
 
557
	private Scheme getScheme() {
558
		Scheme s = new Scheme();
559
		s.setName("List Price Margin");
560
		s.setDescription("List Price Margin");
561
		s.setActiveTimestamp(null);
562
		s.setStartDateTime(LocalDate.of(2019, 6, 1).atStartOfDay());
563
		s.setEndDateTime(LocalDate.of(2019, 7, 1).atStartOfDay());
564
		s.setAmountType(AmountType.PERCENTAGE);
565
		s.setCreateTimestamp(LocalDateTime.now());
566
		s.setExpireTimestamp(null);
567
		s.setCreatedBy(175120474);
568
		return s;
569
	}
570
 
24957 amit.gupta 571
	public void findMismatchesInIndent() throws Exception {
572
		List<Order> allInProcessOrders = orderRepository.selectAllOrder(OrderStatus.SUBMITTED_FOR_PROCESSING);
24967 amit.gupta 573
 
25021 amit.gupta 574
		Map<String, Integer> lineItemWhQtyMap = allInProcessOrders.stream()
25734 amit.gupta 575
				.collect(Collectors.groupingBy(y -> y.getLineItem().getItemId() + "-" + y.getFulfilmentWarehouseId(),
24967 amit.gupta 576
						Collectors.summingInt(y -> y.getLineItem().getQuantity())));
25021 amit.gupta 577
 
578
		lineItemWhQtyMap.forEach((key, value) -> {
579
 
24967 amit.gupta 580
			int itemId = Integer.parseInt(key.split("-")[0]);
581
			int warehouseId = Integer.parseInt(key.split("-")[1]);
25021 amit.gupta 582
			System.out.printf("%d\t%d\t%d\n", itemId, warehouseId, value);
583
			SaholicInventorySnapshot cis = saholicInventorySnapshotRepository.selectByWarehouseIdandItemId(warehouseId,
584
					itemId);
585
			if (cis == null) {
24970 amit.gupta 586
				cis = new SaholicInventorySnapshot();
587
				cis.setItemId(itemId);
588
				cis.setWarehouseId(warehouseId);
589
				cis.setAvailability(0);
590
				saholicInventorySnapshotRepository.persist(cis);
591
			}
24967 amit.gupta 592
			cis.setReserved(value);
593
		});
24953 amit.gupta 594
	}
595
 
25034 amit.gupta 596
	public void fixSchemePayouts() throws Exception {
25524 amit.gupta 597
		LOGGER.info("In fix scheme Payouts");
25522 amit.gupta 598
		LocalDateTime startDate = LocalDate.of(2019, 9, 1).atStartOfDay();
599
		List<SchemeInOut> sios = schemeInOutRepository.selectAllByCreateDate(startDate, LocalDateTime.now());
25530 amit.gupta 600
 
25034 amit.gupta 601
		for (SchemeInOut sio : sios) {
25530 amit.gupta 602
			if (sio.getSchemeId() != 347) {
25523 amit.gupta 603
				LOGGER.info("Skipping {}", sio.getSchemeId());
25522 amit.gupta 604
				continue;
605
			}
25043 amit.gupta 606
			genericRepository.delete(sio);
25522 amit.gupta 607
			InventoryItem ii = inventoryItemRepository.selectById(sio.getInventoryItemId());
608
			UserWallet userWallet = userWalletRepository.selectByRetailerId(ii.getFofoId());
609
			Scheme scheme = schemeRepository.selectById(sio.getSchemeId());
610
			if (scheme.getType().equals(SchemeType.IN)) {
611
				List<UserWalletHistory> historyList = userWalletHistoryRepository
612
						.selectAllByreferenceIdandreferenceType(ii.getPurchaseId(), WalletReferenceType.SCHEME_IN);
613
				for (UserWalletHistory uwh : historyList) {
25530 amit.gupta 614
					if (uwh.getTimestamp().isAfter(startDate)) {
25522 amit.gupta 615
						genericRepository.delete(uwh);
616
						userWallet.setAmount(userWallet.getAmount() - uwh.getAmount());
617
					}
618
				}
619
			} else {
620
				List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(ii.getId());
621
				int orderId = scanRecords.get(0).getOrderId();
622
				List<UserWalletHistory> historyList = userWalletHistoryRepository
623
						.selectAllByreferenceIdandreferenceType(orderId, WalletReferenceType.SCHEME_OUT);
624
				for (UserWalletHistory uwh : historyList) {
25530 amit.gupta 625
					if (uwh.getTimestamp().isAfter(startDate)) {
25522 amit.gupta 626
						userWallet.setAmount(userWallet.getAmount() - uwh.getAmount());
627
						genericRepository.delete(uwh);
628
					}
629
				}
630
				List<UserWalletHistory> historyListBroken = userWalletHistoryRepository
25530 amit.gupta 631
						.selectAllByreferenceIdandreferenceType(ii.getPurchaseId(), WalletReferenceType.SCHEME_OUT);
25522 amit.gupta 632
				for (UserWalletHistory uwh : historyListBroken) {
25530 amit.gupta 633
					if (uwh.getTimestamp().isAfter(startDate)) {
25522 amit.gupta 634
						genericRepository.delete(uwh);
635
						userWallet.setAmount(userWallet.getAmount() - uwh.getAmount());
636
					}
637
				}
638
			}
639
 
25530 amit.gupta 640
			// System.out.println("Total Amount Rolled Back is " + totalRollbackAmount);
25516 amit.gupta 641
		}
25589 amit.gupta 642
		scheduledTasks.processScheme(startDate, startDate.plusDays(10), true);
25030 amit.gupta 643
	}
25530 amit.gupta 644
 
645
	public void fixWallet() throws Exception {
646
		List<FofoStore> fofoStores = fofoStoreRepository.selectAll();
25536 amit.gupta 647
		System.out.println("id\tcode\tactive\tname\tcity\tstate\twallet amount\tsum\twallet amount-sum");
25530 amit.gupta 648
		for (FofoStore fofoStore : fofoStores) {
649
			UserWallet uw = userWalletRepository.selectByRetailerId(fofoStore.getId());
650
			User user = userRepository.selectById(fofoStore.getId());
25749 amit.gupta 651
			if (user == null) {
25533 amit.gupta 652
				LOGGER.info("store does not exist", fofoStore.getCode());
25535 amit.gupta 653
				continue;
25533 amit.gupta 654
			}
25536 amit.gupta 655
			Address address = null;
656
			try {
657
				address = addressRepository.selectById(user.getAddressId());
25749 amit.gupta 658
			} catch (Exception e) {
25536 amit.gupta 659
				LOGGER.info("Could not find address for Store", fofoStore.getCode());
660
				address = new Address();
661
			}
25539 amit.gupta 662
			double sum = userWalletHistoryRepository.selectSumByWallet(uw.getId());
25749 amit.gupta 663
			int calculated = (int) sum;
664
			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(),
665
					fofoStore.isActive(), address.getName(), address.getCity(), address.getState(), uw.getAmount(),
666
					calculated, uw.getAmount() - calculated);
25530 amit.gupta 667
		}
668
	}
25749 amit.gupta 669
 
25734 amit.gupta 670
	public void changeWarehouse() throws Exception {
671
		transactionService.moveWarehouses();
672
	}
25749 amit.gupta 673
 
674
	public void mailDashboardScreenshots() throws Exception {
675
		System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
676
 
25752 amit.gupta 677
		ChromeOptions options = new ChromeOptions();
678
		options.addArguments("--headless");
679
		options.addArguments("--no-sandbox");
680
		options.addArguments("start-maximized");
681
		options.addArguments("disable-infobars");
682
		options.addArguments("--disable-extensions");
683
 
25753 amit.gupta 684
		WebDriver driver = new ChromeDriver(options);
25774 amit.gupta 685
		driver.manage().window().setSize(new Dimension(1600, 900));
25749 amit.gupta 686
		driver.manage().window().maximize();
25752 amit.gupta 687
		// Deleting all the cookies
25749 amit.gupta 688
		driver.manage().deleteAllCookies();
25752 amit.gupta 689
		// Specifiying pageLoadTimeout and Implicit wait
25749 amit.gupta 690
		driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
691
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
25752 amit.gupta 692
 
25749 amit.gupta 693
		Map<String, Set<Integer>> authUserPartnerIdMapping = csService.getAuthUserPartnerIdMapping();
694
		Set<Integer> allPartners = new HashSet<>();
25765 amit.gupta 695
		Map<Integer, File> partnerSnapshotMap = new HashMap<>();
25752 amit.gupta 696
		authUserPartnerIdMapping.values().stream().forEach(x -> allPartners.addAll(x));
25749 amit.gupta 697
		System.out.println(allPartners.size());
25752 amit.gupta 698
		for (int fofoId : allPartners) {
25749 amit.gupta 699
			driver.get("https://partners.smartdukaan.com/12dashboard34?fofoId=" + fofoId);
25765 amit.gupta 700
			File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
701
			partnerSnapshotMap.put(fofoId, file);
25752 amit.gupta 702
 
25749 amit.gupta 703
		}
25752 amit.gupta 704
		for (Map.Entry<String, Set<Integer>> entry : authUserPartnerIdMapping.entrySet()) {
25749 amit.gupta 705
			String email = entry.getKey();
25996 amit.gupta 706
			LOGGER.info("Sending mail start to {}", email);
25749 amit.gupta 707
			Set<Integer> partnerIds = entry.getValue();
708
			StringBuffer body = new StringBuffer();
25769 amit.gupta 709
			Map<Integer, File> emailSnapshotMap = new HashMap<>();
25752 amit.gupta 710
			for (int fofoId : partnerIds) {
25769 amit.gupta 711
				body.append(String.format("<br/><img src=\"cid:%d\"/>", fofoId));
712
				emailSnapshotMap.put(fofoId, partnerSnapshotMap.get(fofoId));
25749 amit.gupta 713
			}
25837 amit.gupta 714
			Utils.sendEmbeddedHtmlMail(mailSender, new String[] { email }, new String[] {},
25752 amit.gupta 715
					String.format("Franchise Screenshots - %s", FormattingUtils.formatDate(LocalDateTime.now())),
25837 amit.gupta 716
					body.toString(), emailSnapshotMap);
25996 amit.gupta 717
			LOGGER.info("Sent mail to {}", email);
25749 amit.gupta 718
		}
719
		driver.quit();
720
	}
26033 amit.gupta 721
 
26299 amit.gupta 722
	// Rollout prebooking orders amount in case the order is grned.
26033 amit.gupta 723
	public void pbfix() throws ProfitMandiBusinessException {
724
		List<Item> items = itemRepository.selectAllByCatalogItemId(1022304);
26299 amit.gupta 725
		for (Item item : items) {
26033 amit.gupta 726
			List<InventoryItem> inventoryItems = inventoryItemRepository.selectByItemId(item.getId(), 0, 500);
26299 amit.gupta 727
			for (InventoryItem inventoryItem : inventoryItems) {
26033 amit.gupta 728
				List<PrebookingOrder> prebookingOrders = prebookingOrderRepository
26299 amit.gupta 729
						.selectByFofoIdAndCatalogIds(inventoryItem.getFofoId(), item.getCatalogItemId()).stream()
730
						.collect(Collectors.toList());
731
				if (prebookingOrders.size() > 0) {
732
					purchaseService.sendPrebookingNotifyMessage(prebookingOrders.get(0));
26033 amit.gupta 733
				}
26299 amit.gupta 734
				// inventoryItem.getFofoId()
26033 amit.gupta 735
			}
736
		}
26299 amit.gupta 737
		// throw new ProfitMandiBusinessException("", "", "");
738
		// prebookingOrderRepository.select
26033 amit.gupta 739
		// TODO Auto-generated method stub
26299 amit.gupta 740
 
26033 amit.gupta 741
	}
26092 amit.gupta 742
 
26299 amit.gupta 743
	public void fixGrn() throws Exception {
26092 amit.gupta 744
		List<Purchase> incompletePurchases = purchaseRepository.selectIncompletePurchase();
26299 amit.gupta 745
		for (Purchase incompletePurchase : incompletePurchases) {
746
			List<Order> orders = orderRepository.selectByAirwayBillOrInvoiceNumber(
747
					incompletePurchase.getPurchaseReference(), incompletePurchase.getFofoId());
26093 amit.gupta 748
			List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(incompletePurchase.getId());
749
			Map<Integer, Integer> grnedItems = inventoryItems.stream().collect(
26299 amit.gupta 750
					Collectors.groupingBy(x -> x.getItemId(), Collectors.summingInt(x -> x.getInitialQuantity())));
751
			Map<Integer, Integer> billedItems = orders.stream().collect(Collectors.groupingBy(
752
					x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
753
			for (Integer billedItemId : billedItems.keySet()) {
754
				if (grnedItems.containsKey(billedItemId)) {
755
					if (grnedItems.get(billedItemId) > billedItems.get(billedItemId)) {
756
						LOGGER.info("Billed Qty {} ---- Grned {}, ItemId {}, Invoice Number {}({}), Grn Date {}",
757
								billedItems.get(billedItemId), grnedItems.get(billedItemId), billedItemId,
758
								incompletePurchase.getPurchaseReference(), incompletePurchase.getId(),
759
								incompletePurchase.getCreateTimestamp());
26095 amit.gupta 760
						Item item = itemRepository.selectById(billedItemId);
26299 amit.gupta 761
						if (item.getType().equals(ItemType.SERIALIZED)) {
762
 
26096 amit.gupta 763
						} else {
26299 amit.gupta 764
							for (InventoryItem inventoryItem : inventoryItems) {
765
								if (inventoryItem.getItemId() == billedItemId && inventoryItem.getGoodQuantity() == 0) {
766
									List<ScanRecord> scanRecords = scanRecordRepository
767
											.selectByInventoryItemId(inventoryItem.getId());
768
									if (scanRecords.size() == 1 && scanRecords.get(0).getQuantity() == 0) {
26096 amit.gupta 769
										LOGGER.info("Safe to remove InventoryItem Id {}", inventoryItem.getId());
26101 amit.gupta 770
										scanRecordRepository.delete(scanRecords.get(0));
771
										inventoryItemRepository.delete(inventoryItem);
26299 amit.gupta 772
										incompletePurchase.setUnfullfilledNonSerializedQuantity(
773
												incompletePurchase.getUnfullfilledNonSerializedQuantity()
774
														+ inventoryItem.getInitialQuantity());
26096 amit.gupta 775
									}
776
								}
777
							}
26095 amit.gupta 778
						}
26093 amit.gupta 779
					}
780
				}
26092 amit.gupta 781
			}
26299 amit.gupta 782
 
26092 amit.gupta 783
		}
26299 amit.gupta 784
 
26092 amit.gupta 785
	}
26265 amit.gupta 786
 
787
	public void fixDupGrns() throws Exception {
26412 amit.gupta 788
		List<Integer> duplicatePurchaseIds = Arrays.asList(14984);
26299 amit.gupta 789
		for (int duplicatePurchaseId : duplicatePurchaseIds) {
26265 amit.gupta 790
			Purchase purchase = purchaseRepository.selectById(duplicatePurchaseId);
791
			List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(duplicatePurchaseId);
26299 amit.gupta 792
			if (inventoryItems.size() == 0) {
26266 amit.gupta 793
				LOGGER.info("Could not find InventoryItems for {}", duplicatePurchaseId);
794
				continue;
795
			}
26299 amit.gupta 796
			schemeService.rollbackSchemes(inventoryItems.stream().map(x -> x.getId()).collect(Collectors.toList()),
797
					duplicatePurchaseId,
798
					"Rolled back duplicate grn for Purchase Invoice " + purchase.getPurchaseReference());
799
			for (InventoryItem inventoryItem : inventoryItems) {
26265 amit.gupta 800
				inventoryItemRepository.delete(inventoryItem);
801
				List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(inventoryItem.getId());
26299 amit.gupta 802
				for (ScanRecord scanRecord : scanRecords) {
26265 amit.gupta 803
					scanRecordRepository.delete(scanRecord);
804
				}
26299 amit.gupta 805
				List<SchemeInOut> sios = schemeInOutRepository
806
						.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
807
				for (SchemeInOut sio : sios) {
26265 amit.gupta 808
					LOGGER.info("SIO - {}", sio);
809
					schemeInOutRepository.delete(sio);
810
				}
26299 amit.gupta 811
 
26265 amit.gupta 812
			}
813
		}
26299 amit.gupta 814
		// throw new Exception();
26265 amit.gupta 815
	}
26579 amit.gupta 816
 
817
	public void mongom() {
818
		List<TagListing> tls = tagListingRepository.selectAll(false);
819
		Set<Integer> itemIds = tls.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
820
		Set<Integer> catalogIds = itemRepository.selectByIds(itemIds).stream().map(x -> x.getCatalogItemId())
821
				.collect(Collectors.toSet());
822
		for (int catalogId : catalogIds) {
823
			try {
824
				ContentPojo cp = mongoClient.getEntityById(catalogId);
26580 amit.gupta 825
				try {
826
					cp.setIconImageUrl(cp.getIconImageUrl().replace("saholic", "smartdukaan"));
26759 amit.gupta 827
				} catch (Exception e) {
828
 
26580 amit.gupta 829
				}
26759 amit.gupta 830
 
26580 amit.gupta 831
				try {
832
					cp.setThumbnailImageUrl(cp.getThumbnailImageUrl().replace("saholic", "smartdukaan"));
26759 amit.gupta 833
				} catch (Exception e) {
834
 
26580 amit.gupta 835
				}
26759 amit.gupta 836
 
26579 amit.gupta 837
				cp.setDefaultImageUrl(cp.getDefaultImageUrl().replace("saholic", "smartdukaan"));
838
				List<MediaPojo> mPojos = cp.getImages();
26759 amit.gupta 839
				if (mPojos != null) {
26580 amit.gupta 840
					mPojos.stream().forEach(mPojo -> {
841
						mPojo.setUrl(mPojo.getUrl().replace("saholic", "smartdukaan"));
842
					});
843
				}
26579 amit.gupta 844
				mongoClient.persistEntity(cp);
845
			} catch (Exception e) {
846
				continue;
847
			}
848
		}
849
	}
26759 amit.gupta 850
 
851
	public void cancelDn(String debitNoteNumber) throws Exception {
852
		DebitNote debitNote = debitNoteRepository.selectDebitNoteByNumber(debitNoteNumber);
26928 amit.gupta 853
 
854
		List<PurchaseReturnItem> purchaseReturnItems = purchaseReturnItemRepository
855
				.selectAllByDebitNoteId(debitNote.getId());
26759 amit.gupta 856
		// Select all inventory Item
857
		Set<Integer> inventoryItemIds = purchaseReturnItems.stream().map(x -> x.getInventoryItemId())
858
				.collect(Collectors.toSet());
859
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds);
860
		for (InventoryItem inventoryItem : inventoryItems) {
861
			if (!StringUtils.isEmpty(inventoryItem.getSerialNumber())) {
862
				inventoryItem.setGoodQuantity(1);
863
				inventoryItem.setLastScanType(ScanType.PURCHASE);
864
				ScanRecord sr = scanRecordRepository.selectByInventoryItemId(inventoryItem.getId()).stream()
865
						.filter(x -> x.getType().equals(ScanType.PURCHASE_RET)).findFirst().get();
866
				scanRecordRepository.delete(sr);
867
				CurrentInventorySnapshot cis = currentInventorySnapshotRepository
868
						.selectByItemAndFofoId(inventoryItem.getItemId(), inventoryItem.getFofoId());
869
				if (cis == null) {
870
					cis = new CurrentInventorySnapshot();
871
					cis.setFofoId(inventoryItem.getFofoId());
872
					cis.setItemId(inventoryItem.getId());
873
					currentInventorySnapshotRepository.persist(cis);
874
				}
875
				cis.setAvailability(cis.getAvailability() + 1);
876
				schemeService.processSchemeIn(inventoryItem.getPurchaseId(), inventoryItem.getFofoId());
877
			}
26928 amit.gupta 878
		}
879
		purchaseReturnItems.stream().forEach(x -> purchaseReturnItemRepository.delete(x));
26759 amit.gupta 880
	}
26799 amit.gupta 881
 
882
	public void processPd(int priceDropId) throws ProfitMandiBusinessException {
27079 amit.gupta 883
		priceDropService.processPriceDrop(priceDropId, false);
26799 amit.gupta 884
	}
26928 amit.gupta 885
 
886
	public void fixScheme() throws Exception {
26936 amit.gupta 887
		LOGGER.info("Partner Types found\tPartnerType To Remove\tAmout to Rollback");
26928 amit.gupta 888
		final Map<Integer, Scheme> schemesMap = schemeRepository.selectAll().stream()
889
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
890
		List<SchemeInOut> sios = schemeInOutRepository.selectAllByCreateDate(LocalDate.of(2019, 9, 1).atTime(0, 0),
891
				LocalDateTime.now());
27221 amit.gupta 892
		Map<SioTuple, Map<PartnerType, List<SchemeInOut>>> schemeTupleMap = sios.stream()
893
				.filter(x -> x.getRolledBackTimestamp() == null)
26928 amit.gupta 894
				.filter(x -> schemesMap.get(x.getSchemeId()).getPartnerType() != PartnerType.ALL)
895
				.collect(Collectors.groupingBy(
896
						x -> new SioTuple(x.getInventoryItemId(), schemesMap.get(x.getSchemeId()).getType()),
27221 amit.gupta 897
						Collectors.groupingBy(x -> schemesMap.get(x.getSchemeId()).getPartnerType(),
898
								Collectors.mapping(x -> x, Collectors.toList()))));
899
 
900
		schemeTupleMap.entrySet().stream().filter(x -> x.getValue().size() > 1).forEach(x -> {
26929 amit.gupta 901
			Map<PartnerType, List<SchemeInOut>> partnerTypeSchemeMap = x.getValue();
27221 amit.gupta 902
			PartnerType partnerTypeToRemove = partnerTypeSchemeMap.keySet().stream()
903
					.min(Comparator.comparing(y -> PartnerType.PartnerTypeRankMap.get(y))).get();
904
			LOGGER.info("{}\t{}\t{}\t{}\t{}\t{}", partnerTypeSchemeMap.keySet(), partnerTypeToRemove,
905
					partnerTypeSchemeMap.get(partnerTypeToRemove).stream()
906
							.collect(Collectors.summingDouble(SchemeInOut::getAmount)),
907
					FormattingUtils.formatDate(partnerTypeSchemeMap.get(partnerTypeToRemove).stream()
908
							.map(y -> y.getCreateTimestamp()).findFirst().get()));
909
 
26928 amit.gupta 910
		});
911
	}
912
 
913
	private class SioTuple {
914
		int inventoryId;
915
		SchemeType schemeType;
916
 
917
		public SioTuple(int inventoryItemId, SchemeType schemeType) {
918
			this.inventoryId = inventoryItemId;
919
			this.schemeType = schemeType;
920
		}
921
 
922
		public int getInventoryId() {
923
			return inventoryId;
924
		}
925
 
926
		public void setInventoryId(int inventoryId) {
927
			this.inventoryId = inventoryId;
928
		}
929
 
930
		public SchemeType getSchemeType() {
931
			return schemeType;
932
		}
933
 
934
		public void setSchemeType(SchemeType schemeType) {
935
			this.schemeType = schemeType;
936
		}
937
 
938
		@Override
939
		public int hashCode() {
940
			final int prime = 31;
941
			int result = 1;
942
			result = prime * result + getOuterType().hashCode();
943
			result = prime * result + inventoryId;
944
			result = prime * result + ((schemeType == null) ? 0 : schemeType.hashCode());
945
			return result;
946
		}
947
 
948
		@Override
949
		public boolean equals(Object obj) {
950
			if (this == obj)
951
				return true;
952
			if (obj == null)
953
				return false;
954
			if (getClass() != obj.getClass())
955
				return false;
956
			SioTuple other = (SioTuple) obj;
957
			if (!getOuterType().equals(other.getOuterType()))
958
				return false;
959
			if (inventoryId != other.inventoryId)
960
				return false;
961
			if (schemeType != other.schemeType)
962
				return false;
963
			return true;
964
		}
965
 
966
		private RunOnceTasks getOuterType() {
967
			return RunOnceTasks.this;
968
		}
969
 
970
	}
27221 amit.gupta 971
 
972
	public void printPendingLeads() {
27277 amit.gupta 973
		LOGGER.info("PENDING LEADES {}", leadRepository
974
				.selectLeadsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4)));
27221 amit.gupta 975
	}
27277 amit.gupta 976
 
27286 amit.gupta 977
	public void removeDuplicateOrders() throws Exception {
27277 amit.gupta 978
		List<String> invoiceNumbers = Arrays.asList("DLWE066/1108", "DLWE066/299", "DLWE066/348", "HRFB004/242",
979
				"HRFB004/243", "HRFB004/514", "HRFTB155/29", "HRJND076/1146", "HRJND076/966", "HRKA134/295",
980
				"HRKA134/421", "HRKK091/381", "HRMGH106/576", "HRSP056/139", "HRYN030/103", "UPGZ019/395",
981
				"UPHRD130/1299", "UPHRD130/456", "UPHRD130/634", "UPLKO063/897", "UPMRT149/54", "UPSJP119/748",
982
				"UPSJP119/980", "UPSTP065/1218", "UPSTP065/2039", "UPSTP090/437", "UPSTP120/164");
983
 
27288 amit.gupta 984
		int totalAmount = 0;
985
		float saleAmount = 0;
27277 amit.gupta 986
		for(String invoiceNumber : invoiceNumbers) {
27281 amit.gupta 987
			List<FofoOrder> orders = fofoOrderRepository.selectByInvoiceNumberLike(invoiceNumber);
27283 amit.gupta 988
			orders = orders.stream().skip(1).collect(Collectors.toList());
27286 amit.gupta 989
			for (FofoOrder fofoOrder : orders) {
990
				LOGGER.info("Invoice {}", invoiceNumber);
991
				int inventoryItemId = 0;
27288 amit.gupta 992
				saleAmount += fofoOrder.getTotalAmount();
27286 amit.gupta 993
				//fofoOrderRepository.delete(fofoOrder);
994
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
995
				List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
996
				for(PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
997
					//paymentOptionTransactionRepository.delete(paymentOptionTransaction);
998
				}
999
				for(FofoOrderItem foi : fofoOrderItems) {
1000
					//fofoOrderItemRepository.delete(foi);
1001
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getItemId());
1002
					for(FofoLineItem fli : flis) {
1003
						//fofoLineItemRepository.delete(fli);
1004
						inventoryItemId = fli.getInventoryItemId();
1005
					}
1006
				}
27277 amit.gupta 1007
				//Rollback entry with reversal reason
27286 amit.gupta 1008
				if(fofoOrder.getCreateTimestamp().isAfter(LocalDate.of(2020, 4, 1).atStartOfDay())) {
1009
					List<UserWalletHistory> userWalletHistory = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
1010
					totalAmount += userWalletHistory.stream().collect(Collectors.summingInt(y->y.getAmount()));
1011
					/*walletService.rollbackAmountFromWallet(fofoOrder.getFofoId(), totalAmount, fofoOrder.getId(), WalletReferenceType.SCHEME_OUT, 
1012
							"Same order for Invoice-"+ invoiceNumber + "created twice, duplicate invoice rollback", fofoOrder.getCancelledTimestamp());*/
1013
					List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId)));
1014
					for(SchemeInOut sio : schemeInOuts) {
1015
						LOGGER.info(sio);
1016
					}
1017
 
1018
				} 
27277 amit.gupta 1019
				//Remove order id
1020
				//Remove order item Id
1021
				//Remove lineitem id
27283 amit.gupta 1022
			}
27277 amit.gupta 1023
		}
27288 amit.gupta 1024
		LOGGER.info("Total Sale Amount Reversal - {}, Total Wallet Amount Reversal {}", saleAmount, totalAmount);
27277 amit.gupta 1025
	}
25043 amit.gupta 1026
}
1027
 
1028
//7015845171