Bonus Scheduler

 1. Transaction-un job_status-lari: WITHOUT_ADJUST_FOR_PO, PO_CALCULATED, PENDING, WAITING_FOR_PO, WAITING_FOR_SO olmalidir. Hemcinin status: SUCCESS olmalidir ve nomrenin(msisdn) activation_date null olmamalidir. Ilk once bu transaction listi bazadan cekilir. 

Query:


select *
from scm_sales_process.transaction tr
inner join scm_sales_process.msisdn m on m.id = tr.msisdn_id
where tr.job_status in ('WITHOUT_ADJUST_FOR_PO',
'PO_CALCULATED', 'PENDING',
'WAITING_FOR_PO', 'WAITING_FOR_SO')
and tr.status = 'SUCCESS'
and m.activation_date is not null;

Burada men ozum daha advance query yazmiwam. Awagidaki query nomrenin aliwdan sonra 
aktivlewme zamani 24 saat icinde baw tutub:
SELECT *
FROM scm_sales_process.transaction tr
INNER JOIN scm_sales_process.msisdn m ON m.id = tr.msisdn_id
WHERE tr.job_status IN ('WITHOUT_ADJUST_FOR_PO', 'PO_CALCULATED', 'PENDING', 'WAITING_FOR_PO', 'WAITING_FOR_SO')
AND tr.status = 'SUCCESS'
AND m.activation_date IS NOT NULL
AND m.activation_date >= LOCALTIMESTAMP - INTERVAL '24 hours';

24 saati kecen activation TIME_EXPIRED_FOR_BONUS set olunur ve bazaya yazilir.

2. 24 saat daxilinde olan activation awagidaki metoda gonderilir:

public void calculatePerUserBonus(List<Transaction> transactions) {
for (var transaction : transactions) {
Msisdn msisdn = transaction.getMsisdn();
try {
log.info(String.format("Getting offers of msisdn: %s, provider: , organization: %s",
PROVIDER_AZF.equals(msisdn.getMsisdn()) ? PROVIDER_AZF : PROVIDER_BKC,
transaction.getOrganizationName()));

List<Tariff> offerList = tariffRepository.getTarrifListByMsisdnId(msisdn.getId());

proceedBonusCalculation(transaction, msisdn, offerList);
} catch (Exception ex) {
log.error("calculatePerUserBonus msisdn: " + msisdn.getId());
log.error("Exception happened calculatePerUserBonus: " + ex.getMessage());
}
}
}

1) Her bir transaction-un icinden msisd goturulur. Her bir nomrenin tariff listi olur.
Sonra awagidaki query-ye esasen hemin nomrenin tariff-lerini getirir:
select t.*
from scm_sales_process.tariff t
inner join
scm_sales_process.msisdn_tariff mt
on mt.tariff_id = t.id
where mt.msisdn_id = '1393438';
Buradan bilirikki nomre ile tarifler many-to-many elaqededir:
msisdn - msisdn_tariff - tariff. Burada msisdn_tariff pivot table sayilir. 

3. Novbeti etap olaraq ise proceedBonusCalculation metodu cagrilir:

private void proceedBonusCalculation(Transaction transaction, Msisdn msisdn, List<Tariff> offerList) {
if (!offerList.isEmpty()) {
BonusCalculator calculator = calculatorFactory.getCalculator(msisdn.getProviderId());
if (!calculator.checkTariffListAndOrganization(offerList, transaction.getDealerCode())) {
transactionRepository.updateTransactionByMsisdn(msisdn.getId(), JobStatus.WITHOUT_ADJUST_FOR_ALL.name());
return;
}
if (transaction.getProductType().equals(FREE_COMPOUND) &&
List.of(WAITING_FOR_PO.name(), PENDING.name())
.contains(transaction.getJobStatus())) {
analysePoBonus(calculator, msisdn, offerList, transaction.getDealerCode(), transaction);
} else {
analyseSoBonus(calculator, msisdn, offerList, transaction.getDealerCode(), transaction);
}
} else {
transactionRepository.updateTransactionByMsisdn(msisdn.getId(), JobStatus.EMPTY_OFFERS.name());
}
}


@Override
public boolean checkTariffListAndOrganization(List<Tariff> tariffs, String organization) {
return bonusHelper.checkIfOrganizationValidForBonus(organization, Provider.AZF.getKey()) &&
bonusHelper.checkIfTariffWithBonusExists(tariffs, Provider.AZF.getKey());
}
1) ilk once dealer_id esasen yoxlayiriqki dealer_phone_map (bu bonus duwecek dealerler 
listidir) cedvelinde hemin dealer var ya yox. 

public Boolean checkIfDealerPhoneMap(int providerId, String organizationCode){
return getDealerPhoneMapService(providerId).checkIfOrganizationExists(organizationCode);
}

2) ikincisi ise yoxlamaliyiq ki, tariff_bonus cedvelinde muwterinin secdiyi tarif varmi 
yoxsa yox.
public boolean checkIfTariffWithBonusExists(List<Tariff> tariffs, int providerId) {
// tarifin external id goturdu
List<String> offers = tariffs.stream()
.map(Tariff::getExtId).collect(Collectors.toList());

List<? extends TariffBonus> bonusTariffs = tariffBonusCreater.getTariffBonuses(providerId);

return bonusTariffs.stream()
.filter(tariffBonus ->
BonusType.SALE_NEW_NUMBER.equals(tariffBonus.getBonusType()) ||
BonusType.ALL.equals(tariffBonus.getBonusType())
)
.map(TariffBonus::getTariffId)
.collect(Collectors.toList()).stream()
.anyMatch(offers::contains);
}

3) Eger hemin dealer bonus listde yoxdursa veya PO ya SO bonus tarif listde yoxdursa, 
o zaman WITHOU_ADJUST_FOR_ALL job_status olaraq set olunur ve bazaya yazilir.
if (!calculator.checkTariffListAndOrganization(offerList, transaction.getDealerCode())) {
transactionRepository.updateTransactionByMsisdn(msisdn.getId(), JobStatus.WITHOUT_ADJUST_FOR_ALL.name());
return;
}

4) Eger heamin dealer bonus listde ve PO ya SO bonus tarif listde varsa o zaman:
if (transaction.getProductType().equals(FREE_COMPOUND) &&
List.of(WAITING_FOR_PO.name(), PENDING.name())
.contains(transaction.getJobStatus())) {
analysePoBonus(calculator, msisdn, offerList, transaction.getDealerCode(), transaction);
}

private void analysePoBonus(BonusCalculator calculator, Msisdn msisdn, List<Tariff> offerList, String organization,
Transaction transaction) {
var poBonus = calculator.calculateBonuses(msisdn, offerList, PO_TARIF);
var poBonusValue = poBonus.getLeft();
var poBonusStatus = poBonus.getMiddle();
var offerId = poBonus.getRight();
if (poBonusStatus.equals(BonusStatus.PO_IS_CALCULATED)) {
saveBonusValue(calculator, msisdn, organization, poBonusValue, offerId);
}
transactionRepository.updateTransactionByMsisdn(msisdn.getId(),
poBonusStatus.defineJobStatus(transaction.getJobStatus(), poBonusValue).name());

}





















































Комментарии

Популярные сообщения из этого блога

IoC:ApplicationContext, BeanFactory. Bean

Lesson1: JDK, JVM, JRE

Lesson_2: Operations in Java