Subversion Repositories SmartDukaan

Rev

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