Subversion Repositories SmartDukaan

Rev

Rev 24871 | Rev 25074 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 24871 Rev 25072
Line 13... Line 13...
13
import org.apache.commons.io.output.ByteArrayOutputStream;
13
import org.apache.commons.io.output.ByteArrayOutputStream;
14
import org.springframework.beans.factory.annotation.Autowired;
14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.core.io.ByteArrayResource;
15
import org.springframework.core.io.ByteArrayResource;
16
import org.springframework.mail.javamail.JavaMailSender;
16
import org.springframework.mail.javamail.JavaMailSender;
17
import org.springframework.stereotype.Component;
17
import org.springframework.stereotype.Component;
-
 
18
import org.springframework.transaction.annotation.Transactional;
18
 
19
 
-
 
20
import com.google.common.collect.Sets;
19
import com.spice.profitmandi.common.util.FileUtil;
21
import com.spice.profitmandi.common.util.FileUtil;
20
import com.spice.profitmandi.common.util.FormattingUtils;
22
import com.spice.profitmandi.common.util.FormattingUtils;
21
import com.spice.profitmandi.common.util.Utils;
23
import com.spice.profitmandi.common.util.Utils;
22
import com.spice.profitmandi.dao.entity.catalog.Scheme;
24
import com.spice.profitmandi.dao.entity.catalog.Scheme;
23
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
25
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
24
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
26
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
-
 
27
import com.spice.profitmandi.dao.entity.fofo.Purchase;
-
 
28
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
25
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
29
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
26
import com.spice.profitmandi.dao.entity.transaction.Order;
30
import com.spice.profitmandi.dao.entity.transaction.Order;
27
import com.spice.profitmandi.dao.entity.transaction.ReturnOrder;
31
import com.spice.profitmandi.dao.entity.transaction.ReturnOrder;
28
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
32
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
29
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
33
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
30
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
34
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
-
 
35
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
31
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
36
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
32
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
37
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
33
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
38
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
34
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
39
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
35
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
40
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
-
 
41
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
-
 
42
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
36
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
43
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
37
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
44
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
38
import com.spice.profitmandi.dao.repository.transaction.ReturnOrderRepository;
45
import com.spice.profitmandi.dao.repository.transaction.ReturnOrderRepository;
39
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
46
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
40
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
47
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
Line 42... Line 49...
42
 
49
 
43
import in.shop2020.model.v1.order.OrderStatus;
50
import in.shop2020.model.v1.order.OrderStatus;
44
import in.shop2020.model.v1.order.WalletReferenceType;
51
import in.shop2020.model.v1.order.WalletReferenceType;
45
 
52
 
46
@Component
53
@Component
-
 
54
@Transactional(rollbackFor = Throwable.class)
47
public class Reconciliation {
55
public class Reconciliation {
48
	@Autowired
56
	@Autowired
49
	private FofoStoreRepository fofoStoreRepository;
57
	private FofoStoreRepository fofoStoreRepository;
-
 
58
 
-
 
59
	@Autowired
-
 
60
	private PurchaseRepository purchaseRepository;
-
 
61
	
50
	@Autowired
62
	@Autowired
51
	private FofoOrderItemRepository fofoOrderItemRepository;
63
	private FofoOrderItemRepository fofoOrderItemRepository;
52
	@Autowired
64
	@Autowired
53
	private FofoLineItemRepository fofoLineItemRepository;
65
	private FofoLineItemRepository fofoLineItemRepository;
54
	@Autowired
66
	@Autowired
55
	private UserWalletRepository userWalletRepository;
67
	private UserWalletRepository userWalletRepository;
-
 
68
 
-
 
69
	@Autowired
-
 
70
	private InventoryItemRepository inventoryItemRepository;
-
 
71
 
-
 
72
	@Autowired
-
 
73
	private ScanRecordRepository scanRecordRepository;
56
	@Autowired
74
	@Autowired
57
	private UserWalletHistoryRepository userWalletHistoryRepository;
75
	private UserWalletHistoryRepository userWalletHistoryRepository;
58
	@Autowired
76
	@Autowired
59
	private SchemeInOutRepository schemeInOutRepository;
77
	private SchemeInOutRepository schemeInOutRepository;
60
	@Autowired
78
	@Autowired
Line 72... Line 90...
72
 
90
 
73
	public void dailyReconciliation() throws Exception {
91
	public void dailyReconciliation() throws Exception {
74
		LocalDate date = LocalDate.now().minusDays(1);
92
		LocalDate date = LocalDate.now().minusDays(1);
75
		dailyReconciliation(date);
93
		dailyReconciliation(date);
76
	}
94
	}
77
	
95
 
78
	/*public void partnerDailyReconciliation(int fofoId) throws Exception {
-
 
79
		LocalDate startDate = LocalDate.of(2018, Month.JANUARY, 1);
-
 
80
		while(startDate.isBefore(LocalDate.now())) {
-
 
81
			dailyReconciliation();
-
 
82
			startDate.plusDays(1);
-
 
83
		}
-
 
84
	}*/
-
 
85
	
-
 
86
	private void dailyReconciliation(LocalDate localDate) throws Exception {
96
	private void dailyReconciliation(LocalDate localDate) throws Exception {
87
		Map<SchemeType, Set<Integer>> schemeTypeMap = schemeRepository.selectAll().stream()
97
		Map<SchemeType, Set<Integer>> schemeTypeMap = schemeRepository.selectAll().stream()
88
				.collect(Collectors.groupingBy(Scheme::getType, Collectors.mapping(Scheme::getId, Collectors.toSet())));
98
				.collect(Collectors.groupingBy(Scheme::getType, Collectors.mapping(Scheme::getId, Collectors.toSet())));
89
		boolean reconciled = true;
99
		boolean reconciled = true;
90
		Map<Integer, String> stores = fofoStoreRepository.getStoresMap();
100
		Map<Integer, String> stores = fofoStoreRepository.getStoresMap();
Line 105... Line 115...
105
						}
115
						}
106
					});
116
					});
107
 
117
 
108
			List<Serializable> reconciliation = new ArrayList<>();
118
			List<Serializable> reconciliation = new ArrayList<>();
109
			LocalDate dateToReconcile = yesterday;
119
			LocalDate dateToReconcile = yesterday;
110
			//"PartnerId", "Partner Name", "Reconciliation Date"
120
			// "PartnerId", "Partner Name", "Reconciliation Date"
111
			reconciliation.addAll(Arrays.asList(partnerId, retailerNameMap.get(partnerId), dateToReconcile));
121
			reconciliation.addAll(Arrays.asList(partnerId, retailerNameMap.get(partnerId), dateToReconcile));
112
 
122
 
113
			for (Map.Entry<WalletReferenceType, List<UserWalletHistory>> entry : referenceWiseWalletHistory
123
			for (Map.Entry<WalletReferenceType, List<UserWalletHistory>> entry : referenceWiseWalletHistory
114
					.entrySet()) {
124
					.entrySet()) {
115
				List<UserWalletHistory> history = entry.getValue();
125
				List<UserWalletHistory> history = entry.getValue();
116
				Map<Integer, Integer> referenceWalletMap = entry.getValue().stream().collect(
126
				Map<Integer, Integer> referenceWalletMap = entry.getValue().stream().collect(
117
						Collectors.groupingBy(x -> x.getReference(), Collectors.summingInt(x -> x.getAmount())));
127
						Collectors.groupingBy(x -> x.getReference(), Collectors.summingInt(x -> x.getAmount())));
118
				switch (entry.getKey()) {
128
				switch (entry.getKey()) {
119
				case PURCHASE:
129
				case PURCHASE:
120
					reconciliation.addAll(
-
 
121
							reconcileOrdersAndWallet(dateToReconcile, referenceWalletMap, history));
130
					reconciliation.addAll(reconcileOrdersAndWallet(dateToReconcile, referenceWalletMap, history));
122
					break;
131
					break;
123
				case SCHEME_IN:
132
				case SCHEME_IN:
124
					reconciliation.addAll(reconcileSchemeInAndWallet(dateToReconcile,
133
					reconciliation.addAll(reconcileSchemeInAndWallet(dateToReconcile, referenceWalletMap, history,
125
							referenceWalletMap, history, schemeTypeMap.get(SchemeType.IN)));
134
							schemeTypeMap.get(SchemeType.IN)));
126
					break;
135
					break;
127
				case SCHEME_OUT:
136
				case SCHEME_OUT:
128
					reconciliation.addAll(reconcileSchemeOutAndWallet(dateToReconcile,
137
					reconciliation.addAll(reconcileSchemeOutAndWallet(dateToReconcile, referenceWalletMap, history,
129
							referenceWalletMap, history, schemeTypeMap.get(SchemeType.OUT)));
138
							schemeTypeMap.get(SchemeType.OUT)));
130
					break;
139
					break;
131
				default:
140
				default:
132
					break;
141
					break;
133
 
142
 
134
				}
143
				}
135
			}
144
			}
136
			reconciled = reconciled || Boolean.TRUE.equals(reconciliation.get(0));
145
			reconciled = reconciled || Boolean.TRUE.equals(reconciliation.get(0));
137
			rows.add(reconciliation);
146
			rows.add(reconciliation);
138
		}
147
		}
139
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
148
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("PartnerId", "Partner Name",
140
				Arrays.asList("PartnerId", "Partner Name", "Reconciliation Date", 
149
				"Reconciliation Date", "Purchase Reconciled", "Wallet amount consumed", "Ordered Total",
141
				"Purchase Reconciled", "Wallet amount consumed", "Ordered Total", "Cancelled Total", "Refunded Total", 
150
				"Cancelled Total", "Refunded Total", "Scheme In Reconciled", "Scheme In to Wallet",
142
				"Scheme In Reconciled", "Scheme In to Wallet", "Scheme In disbursed", "Scheme In rolledback", 
151
				"Scheme In disbursed", "Scheme In rolledback", "SchemeOut Reconciled", "Scheme Out to Wallet",
143
				"SchemeOut Reconciled", "Scheme Out to Wallet", "Scheme Out Disbursed", "Scheme Out Rolledback"), rows);
152
				"Scheme Out Disbursed", "Scheme Out Rolledback"), rows);
144
 
153
 
-
 
154
		Utils.sendMailWithAttachment(mailSender,
145
		Utils.sendMailWithAttachment(mailSender, new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, new String[] {},
155
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, new String[] {},
146
				reconciled ? "Reconciled Successfully" : "Reconciliation failed", "Report attached",
156
				reconciled ? "Reconciled Successfully" : "Reconciliation failed", "Report attached",
147
				String.format("reconciliation-%s.csv", FormattingUtils.formatDate(yesterday.atStartOfDay())),
157
				String.format("reconciliation-%s.csv", FormattingUtils.formatDate(yesterday.atStartOfDay())),
148
				new ByteArrayResource(baos.toByteArray()));
158
				new ByteArrayResource(baos.toByteArray()));
149
	}
159
	}
150
 
160
 
Line 251... Line 261...
251
		boolean reconciled = Math
261
		boolean reconciled = Math
252
				.abs(totalSchemeOutWalletCredited - (schemeOutAmountAdded - schemeOutAmountRolledBack)) < 5;
262
				.abs(totalSchemeOutWalletCredited - (schemeOutAmountAdded - schemeOutAmountRolledBack)) < 5;
253
		return Arrays.asList(reconciled, totalSchemeOutWalletCredited, schemeOutAmountAdded, schemeOutAmountRolledBack,
263
		return Arrays.asList(reconciled, totalSchemeOutWalletCredited, schemeOutAmountAdded, schemeOutAmountRolledBack,
254
				"");
264
				"");
255
	}
265
	}
-
 
266
 
-
 
267
	public void reconcileExpiredFixedSchemes() throws Exception {
-
 
268
		List<Scheme> allSchemes = schemeRepository.selectAll();
-
 
269
		// .stream().filter(x ->
-
 
270
		// x.getAmountType().equals(AmountType.FIXED)).collect(Collectors.toList());
-
 
271
		
-
 
272
		System.out.println("InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tScheme Amount\tAmount Paid\tReference\tTransaction Time");
-
 
273
		for (Scheme scheme : allSchemes) {
-
 
274
			if (scheme.getExpireTimestamp() != null) {
-
 
275
				if (scheme.getExpireTimestamp().isBefore(scheme.getEndDateTime())) {
-
 
276
					List<SchemeInOut> inOuts = schemeInOutRepository
-
 
277
							.selectBySchemeIds(Sets.newHashSet(scheme.getId()));
-
 
278
					if (scheme.getType().equals(SchemeType.IN)) {
-
 
279
						for (SchemeInOut schemeInOut : inOuts) {
-
 
280
							ScanRecord inRecord = scanRecordRepository
-
 
281
									.selectByInventoryItemId(schemeInOut.getInventoryItemId()).stream()
-
 
282
									.filter(x -> x.getType().equals(ScanType.PURCHASE)).collect(Collectors.toList())
-
 
283
									.get(0);
-
 
284
							if (inRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())) {
-
 
285
								InventoryItem ii = inventoryItemRepository.selectById(inRecord.getInventoryItemId());
-
 
286
								Purchase purchase = purchaseRepository.selectByIdAndFofoId(ii.getPurchaseId(), ii.getFofoId());
-
 
287
								purchase.getPurchaseReference();
-
 
288
								ii.getSerialNumber();
-
 
289
								System.out.println(String.format("%d\t%s\t%d\t%d\t%s\t%s\t%f\t%f\t%d\t%s\t%s",
-
 
290
										ii.getId(), ii.getSerialNumber(), ii.getId(), schemeInOut.getSchemeId(), scheme.getName(), scheme.getType(),
-
 
291
										scheme.getAmount(), schemeInOut.getAmount(), purchase.getId(), inRecord.getCreateTimestamp()));
-
 
292
							}
-
 
293
 
-
 
294
						}
-
 
295
					}
-
 
296
					if (scheme.getType().equals(SchemeType.OUT)) {
-
 
297
						for (SchemeInOut schemeInOut : inOuts) {
-
 
298
							ScanRecord outRecord = scanRecordRepository
-
 
299
									.selectByInventoryItemId(schemeInOut.getInventoryItemId()).stream()
-
 
300
									.filter(x -> x.getType().equals(ScanType.SALE)).sorted((x1,x2)->x1.getId() - x2.getId()).collect(Collectors.toList()).get(0);
-
 
301
							if (outRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())) {
-
 
302
								InventoryItem ii = inventoryItemRepository.selectById(outRecord.getInventoryItemId());
-
 
303
								Order order = orderRepository.selectById(outRecord.getId());
-
 
304
								order.getInvoiceNumber();
-
 
305
								ii.getSerialNumber();
-
 
306
								System.out.println(String.format("%d\t%s\t%d\t%d\t%s\t%s\t%f\t%f\t%d\t%s\t%s",
-
 
307
										ii.getId(), ii.getSerialNumber(), ii.getId(), schemeInOut.getSchemeId(), scheme.getName(), scheme.getType(),
-
 
308
										scheme.getAmount(), schemeInOut.getAmount(), order.getId(), outRecord.getCreateTimestamp()));
-
 
309
								
-
 
310
							}
-
 
311
 
-
 
312
						}
-
 
313
					}
-
 
314
				}
-
 
315
			}
-
 
316
		}
-
 
317
 
-
 
318
	}
256
}
319
}