Subversion Repositories SmartDukaan

Rev

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