| Line 1... |
Line 1... |
| 1 |
package com.spice.profitmandi.service.scheme;
|
1 |
package com.spice.profitmandi.service.scheme;
|
| 2 |
|
2 |
|
| 3 |
import java.text.MessageFormat;
|
3 |
import java.text.MessageFormat;
|
| 4 |
import java.time.LocalDate;
|
4 |
import java.time.LocalDate;
|
| 5 |
import java.time.LocalDateTime;
|
5 |
import java.time.LocalDateTime;
|
| - |
|
6 |
import java.time.YearMonth;
|
| 6 |
import java.util.ArrayList;
|
7 |
import java.util.ArrayList;
|
| 7 |
import java.util.Arrays;
|
8 |
import java.util.Arrays;
|
| 8 |
import java.util.Comparator;
|
9 |
import java.util.Comparator;
|
| 9 |
import java.util.HashMap;
|
10 |
import java.util.HashMap;
|
| 10 |
import java.util.HashSet;
|
11 |
import java.util.HashSet;
|
| Line 404... |
Line 405... |
| 404 |
|
405 |
|
| 405 |
@Override
|
406 |
@Override
|
| 406 |
public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
|
407 |
public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
|
| 407 |
LOGGER.info("Trying to process SchemeIn with purchaseId [{}] and retailerId [{}]", purchaseId, retailerId);
|
408 |
LOGGER.info("Trying to process SchemeIn with purchaseId [{}] and retailerId [{}]", purchaseId, retailerId);
|
| 408 |
Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
|
409 |
Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
|
| 409 |
PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
|
410 |
PartnerType partnerType = partnerTypeChangeService.getTypeOnMonth(retailerId, YearMonth.from(purchase.getCreateTimestamp()));
|
| 410 |
purchase.getCreateTimestamp().toLocalDate());
|
- |
|
| 411 |
List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.IN, partnerType,
|
411 |
List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.IN, partnerType,
|
| 412 |
purchase.getCreateTimestamp(), false);
|
412 |
purchase.getCreateTimestamp(), false);
|
| 413 |
float totalCashback = 0;
|
413 |
float totalCashback = 0;
|
| 414 |
if (schemes.isEmpty()) {
|
414 |
if (schemes.isEmpty()) {
|
| 415 |
return;
|
415 |
return;
|
| Line 473... |
Line 473... |
| 473 |
purchaseRepository.persist(purchase);
|
473 |
purchaseRepository.persist(purchase);
|
| 474 |
}
|
474 |
}
|
| 475 |
}
|
475 |
}
|
| 476 |
|
476 |
|
| 477 |
private float createSchemeInOut(Scheme scheme, InventoryItem inventoryItem) {
|
477 |
private float createSchemeInOut(Scheme scheme, InventoryItem inventoryItem) {
|
| 478 |
List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
|
478 |
List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAll(inventoryItem.getId());
|
| 479 |
float amountToCredit = 0;
|
479 |
float amountToCredit = 0;
|
| 480 |
if (schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.toList())
|
480 |
if (schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.toList())
|
| 481 |
.size() == 0) {
|
481 |
.size() == 0) {
|
| 482 |
SchemeInOut schemeInOut = new SchemeInOut();
|
482 |
SchemeInOut schemeInOut = new SchemeInOut();
|
| 483 |
amountToCredit = this.getAmount(inventoryItem, scheme);
|
483 |
amountToCredit = this.getAmount(inventoryItem, scheme);
|
| Line 497... |
Line 497... |
| 497 |
schemeInOut.setStatus(SchemePayoutStatus.CREDITED);
|
497 |
schemeInOut.setStatus(SchemePayoutStatus.CREDITED);
|
| 498 |
if (scheme.getType().equals(SchemeType.IN)) {
|
498 |
if (scheme.getType().equals(SchemeType.IN)) {
|
| 499 |
schemeInOut.setStatusDescription("Credited for GRN of IMEI#" + inventoryItem.getSerialNumber());
|
499 |
schemeInOut.setStatusDescription("Credited for GRN of IMEI#" + inventoryItem.getSerialNumber());
|
| 500 |
} else if(scheme.getType().equals(SchemeType.OUT) || scheme.getType().equals(SchemeType.CATEGORY)){
|
500 |
} else if(scheme.getType().equals(SchemeType.OUT) || scheme.getType().equals(SchemeType.CATEGORY)){
|
| 501 |
schemeInOut.setStatusDescription("Credited for sale of IMEI#" + inventoryItem.getSerialNumber());
|
501 |
schemeInOut.setStatusDescription("Credited for sale of IMEI#" + inventoryItem.getSerialNumber());
|
| - |
|
502 |
if(scheme.getType().equals(SchemeType.CATEGORY)) {
|
| - |
|
503 |
|
| - |
|
504 |
List<SchemeInOut> sios = schemeInOutRepository.selectAllByType(SchemeType.CATEGORY, inventoryItem.getId());
|
| - |
|
505 |
SchemeInOut sio = sios.stream().filter(x->x.getId()!=schemeInOut.getId()).findFirst().orElse(null);
|
| - |
|
506 |
if(sio != null) {
|
| - |
|
507 |
sio.setRolledBackTimestamp(LocalDateTime.now());
|
| - |
|
508 |
sio.setStatus(SchemePayoutStatus.REJECTED);
|
| - |
|
509 |
sio.setStatusDescription("Category upgraded, new entry added");
|
| - |
|
510 |
amountToCredit -= sio.getAmount();
|
| - |
|
511 |
schemeInOut.setStatusDescription("Category upgraded, higher margins credited for sale of IMEI#" + inventoryItem.getSerialNumber());
|
| - |
|
512 |
}
|
| - |
|
513 |
}
|
| - |
|
514 |
|
| 502 |
}
|
515 |
}
|
| 503 |
schemeInOut.setCreditTimestamp(LocalDateTime.now());
|
516 |
schemeInOut.setCreditTimestamp(LocalDateTime.now());
|
| 504 |
}
|
517 |
}
|
| 505 |
}
|
518 |
}
|
| 506 |
return amountToCredit;
|
519 |
return amountToCredit;
|
| Line 547... |
Line 560... |
| 547 |
}
|
560 |
}
|
| 548 |
|
561 |
|
| 549 |
@Override
|
562 |
@Override
|
| 550 |
public void processSchemeOut(int fofoOrderId, int retailerId) throws ProfitMandiBusinessException {
|
563 |
public void processSchemeOut(int fofoOrderId, int retailerId) throws ProfitMandiBusinessException {
|
| 551 |
FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(retailerId, fofoOrderId);
|
564 |
FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(retailerId, fofoOrderId);
|
| 552 |
|
- |
|
| - |
|
565 |
//Process only if order is not cancelled
|
| - |
|
566 |
if(fofoOrder.getCancelledTimestamp()==null) {
|
| 553 |
PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
|
567 |
//PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
|
| 554 |
fofoOrder.getCreateTimestamp().toLocalDate());
|
568 |
// fofoOrder.getCreateTimestamp().toLocalDate());
|
| - |
|
569 |
|
| - |
|
570 |
PartnerType partnerType = partnerTypeChangeService.getTypeOnMonth(retailerId, YearMonth.from(fofoOrder.getCreateTimestamp()));
|
| 555 |
|
571 |
|
| 556 |
List<ScanRecord> scanRecords = scanRecordRepository.selectAllByOrderId(fofoOrderId);
|
572 |
List<ScanRecord> scanRecords = scanRecordRepository.selectAllByOrderId(fofoOrderId);
|
| 557 |
Set<Integer> inventoryItemIds = scanRecords.stream().map(x -> x.getInventoryItemId())
|
573 |
Set<Integer> inventoryItemIds = scanRecords.stream().map(x -> x.getInventoryItemId())
|
| 558 |
.collect(Collectors.toSet());
|
574 |
.collect(Collectors.toSet());
|
| 559 |
Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
|
575 |
Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
|
| 560 |
.filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
|
576 |
.filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
|
| 561 |
.collect(Collectors.toSet());
|
577 |
.collect(Collectors.toSet());
|
| 562 |
if (inventoryItems.size() == 0) {
|
578 |
if (inventoryItems.size() == 0) {
|
| 563 |
return;
|
579 |
return;
|
| 564 |
}
|
580 |
}
|
| 565 |
Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
|
581 |
Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
|
| 566 |
|
582 |
|
| - |
|
583 |
//Remove Items that are eol now.
|
| 567 |
Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
|
584 |
Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
|
| 568 |
.filter(x -> x.getEolDate() == null || x.getEolDate().isAfter(fofoOrder.getCreateTimestamp()))
|
585 |
.filter(x -> x.getEolDate() == null || x.getEolDate().isAfter(fofoOrder.getCreateTimestamp()))
|
| 569 |
.map(x -> x.getItemId()).collect(Collectors.toSet());
|
586 |
.map(x -> x.getItemId()).collect(Collectors.toSet());
|
| 570 |
// Only consider inventory items that were not returned
|
587 |
// Only consider inventory items that were not returned
|
| 571 |
inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
|
588 |
inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
|
| 572 |
.collect(Collectors.toSet());
|
589 |
.collect(Collectors.toSet());
|
| 573 |
|
590 |
|
| 574 |
if (inventoryItems.size() == 0) {
|
591 |
if (inventoryItems.size() == 0) {
|
| 575 |
return;
|
592 |
return;
|
| 576 |
}
|
593 |
}
|
| 577 |
|
594 |
|
| 578 |
float totalCashback = 0;
|
595 |
float totalCashback = 0;
|
| 579 |
int count = 0;
|
596 |
int count = 0;
|
| 580 |
|
597 |
|
| 581 |
List<Scheme> allActiveSchemes = schemeRepository.selectActiveAll(SchemeType.OUT, partnerType,
|
598 |
List<Scheme> allActiveSchemes = schemeRepository.selectActiveAll(SchemeType.OUT, partnerType,
|
| 582 |
fofoOrder.getCreateTimestamp(), false);
|
599 |
fofoOrder.getCreateTimestamp(), false);
|
| 583 |
allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.ACTIVATION, partnerType,
|
600 |
allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.ACTIVATION, partnerType,
|
| 584 |
fofoOrder.getCreateTimestamp(), false));
|
601 |
fofoOrder.getCreateTimestamp(), false));
|
| 585 |
allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.INVESTMENT, partnerType,
|
602 |
allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.INVESTMENT, partnerType,
|
| 586 |
fofoOrder.getCreateTimestamp(), false));
|
603 |
fofoOrder.getCreateTimestamp(), false));
|
| 587 |
allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.CATEGORY, partnerType,
|
604 |
allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.CATEGORY, partnerType,
|
| 588 |
fofoOrder.getCreateTimestamp(), false));
|
605 |
fofoOrder.getCreateTimestamp(), false));
|
| 589 |
|
606 |
|
| 590 |
for (InventoryItem inventoryItem : inventoryItems) {
|
607 |
for (InventoryItem inventoryItem : inventoryItems) {
|
| 591 |
float itemCashback = 0;
|
608 |
float itemCashback = 0;
|
| 592 |
Set<Integer> schemeIds = new HashSet<>(
|
609 |
Set<Integer> schemeIds = new HashSet<>(
|
| 593 |
schemeItemRepository.selectSchemeIdByItemId(inventoryItem.getItemId()));
|
610 |
schemeItemRepository.selectSchemeIdByItemId(inventoryItem.getItemId()));
|
| 594 |
allActiveSchemes = allActiveSchemes.stream().filter(x -> schemeIds.contains(x.getId()))
|
611 |
allActiveSchemes = allActiveSchemes.stream().filter(x -> schemeIds.contains(x.getId()))
|
| 595 |
.collect(Collectors.toList());
|
612 |
.collect(Collectors.toList());
|
| 596 |
for (Scheme scheme : allActiveSchemes) {
|
613 |
for (Scheme scheme : allActiveSchemes) {
|
| 597 |
itemCashback += this.createSchemeInOut(scheme, inventoryItem);
|
614 |
itemCashback += this.createSchemeInOut(scheme, inventoryItem);
|
| 598 |
}
|
615 |
}
|
| 599 |
if (itemCashback > 0) {
|
616 |
if (itemCashback > 0) {
|
| 600 |
count++;
|
617 |
count++;
|
| 601 |
totalCashback += itemCashback;
|
618 |
totalCashback += itemCashback;
|
| 602 |
}
|
619 |
}
|
| 603 |
}
|
620 |
}
|
| 604 |
if (count > 0) {
|
621 |
if (count > 0) {
|
| 605 |
walletService.addAmountToWallet(retailerId, fofoOrderId, WalletReferenceType.SCHEME_OUT,
|
622 |
walletService.addAmountToWallet(retailerId, fofoOrderId, WalletReferenceType.SCHEME_OUT,
|
| 606 |
"Sales margin for invoice number " + fofoOrder.getInvoiceNumber() + ". Total " + count + " pc(s)",
|
623 |
"Sales margin for invoice number " + fofoOrder.getInvoiceNumber() + ". Total " + count + " pc(s)",
|
| 607 |
totalCashback, fofoOrder.getCreateTimestamp());
|
624 |
totalCashback, fofoOrder.getCreateTimestamp());
|
| 608 |
fofoOrder.setCashback(totalCashback);
|
625 |
fofoOrder.setCashback(totalCashback);
|
| 609 |
fofoOrderRepository.persist(fofoOrder);
|
626 |
fofoOrderRepository.persist(fofoOrder);
|
| - |
|
627 |
}
|
| 610 |
}
|
628 |
}
|
| 611 |
}
|
629 |
}
|
| 612 |
|
630 |
|
| 613 |
@Override
|
631 |
@Override
|
| 614 |
public void rollbackSchemes(List<Integer> inventoryItemIds, int rollbackReference, String rollbackReason)
|
632 |
public void rollbackSchemes(List<Integer> inventoryItemIds, int rollbackReference, String rollbackReason)
|