MyTetra Share
Делитесь знаниями!
Создание допа по среднему
Время создания: 02.12.2020 16:58
Раздел: INFO - JOB - rtneo - Accruals
Запись: wwwlir/Tetra/master/base/1606899536915sp9kpne/text.html на raw.githubusercontent.com

import com.haulmont.cuba.core.global.*

import com.groupstp.rtneo.entity.*

import com.groupstp.rtneo.core.bean.tools.DatePeriodTools

import java.text.SimpleDateFormat

import com.groupstp.rtneo.core.bean.calculation.CalculationWorkerHelper

import java.util.*

import com.haulmont.cuba.core.global.ViewRepository;

log.debug("createSupplementaryAggrements.START")

CalculationWorkerHelper helper = AppBeans.get(CalculationWorkerHelper.class)

//a.kotvinskiy /--

//Программное создание view

ViewRepository vRep = AppBeans.get(ViewRepository.NAME)


View contractView = vRep.getView(Contract.class, "_minimal");

contractView.addProperty("number");

contractView.addProperty("contragent", vRep.getView(Contragent.class, "_minimal"));

contractView.addProperty("positions", vRep.getView(ContractPosition.class, "_minimal"));

contractView.addProperty("supplementaryAgreements", vRep.getView(Contract.class, "_minimal"));


View contractPositionView = vRep.getView(ContractPosition.class, "_minimal");

contractPositionView.addProperty("relevance");

contractPositionView.addProperty("volumeYear");

contractPositionView.addProperty("accruals", vRep.getView(Accrual.class, "_minimal"));

//a.kotvinskiy --/


//здесь, в переменную price нужно указать тариф, тестовое значение = 500

BigDecimal price = 464.8

//Если contractId "", то доп генерируется для всех

String contractId = "477bb6e0-3d9f-1030-87ab-681a0e5489b7"

String contragentId = "d17b27c2-b161-fc09-8946-5fa56aac0f5d"

SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy")

Date fromDate = format.parse("01.01.2020")

Date beforeDate = format.parse("31.12.2020")

Date contract_date = format.parse("01.01.2019")


DataManager dataManager = AppBeans.get(DataManager.NAME)

Metadata metadata = AppBeans.get(Metadata.NAME)


String tableNameCompany = metadata.getClassNN(Company.class).getName()

String tableNameContract = metadata.getClassNN(Contract.class).getName()


CommitContext commitContext = new CommitContext()


List<Company> listCompany = dataManager.load(Company.class)

.query("select comp from " + tableNameCompany + " comp")

.view("_minimal")

.list()

Company company = listCompany.size() == 1 ? listCompany.get(0) : null


//List<Contract> list = dataManager.load(Contract.class)

// .query("select c from " + tableNameContract + " c where (c.loadedFromBigTrio = false or c.loadedFromBigTrio is null)" + new StringBuilder(contractId != "" ? " and c.id = '${contractId}'" : "").toString())

// .view(contractView)

// .list()

//List<Contract> list = dataManager.load(Contract.class)

// .query('select c from rtneo$Contract c where (c.loadedFromBigTrio = false or c.loadedFromBigTrio is null) and c.id = :contractId')

// .parameter("contractId", UUID.fromString(contractId))

// .view(contractView)

// .list()


//List<Contragent> contragents = dataManager.load(Contragent.class)

// .query('select c from rtneo$Contragent c where c.id in :contragents')

// .parameter("contragents", UUID.fromString(contragentIds))

// .view("_local")

// .list()


List<Contragent> contragents = dataManager.load(Contragent.class)

.query('select c from rtneo$Contragent c where c.id = :contragent')

.parameter("contragent", UUID.fromString(contragentId))

.view("_local")

.list()


//log.debug("Будет обработано " + list.size() + " договоров, загруженных из BigTrio")


def numContract = 0

def numContractPosition = 0

def numAccrual = 0

//for(Contragent contragent : contragents){

// def baseContract = dataManager.load(Contract.class)

// .query("select c from rtneo$Contract c where c.contragent.id = :id and c.mainContract is null")

// .parameter("id", contragent.getId())

// .view("_local")

// .one()

//}

//for (Contract baseContract : list) {

// //if (numContract == 1)

// // break

// log.debug((numContract + 1) + ") Договор № " + baseContract.getNumber())

// Contragent contragent = baseContract.getContragent()

for(Contragent contragent : contragents){

def baseContract = dataManager.load(Contract.class)

.query('select c from rtneo$Contract c where c.contragent.id = :id and c.mainContract is null')

.parameter("id", contragent.getId())

.view(contractView)

.one()

Contract contract = new Contract()

contract.setDate(new Date())

contract.setFrom(fromDate)

contract.setBefore(beforeDate)

//a.kotvinskiy

contract.setNumber("${baseContract.getSupplementaryAgreements().size()+1}")

contract.setCompany(company)

contract.setContragent(contragent)

contract.setMainContract(baseContract)

contract.setPositions(new ArrayList<>())

commitContext.addInstanceToCommit(contract)

log.debug("Доп. соглашение $contract.id добавлено в CommitContext")

numContract = numContract + 1


//для каждой позиции в base-договоре

for (ContractPosition baseContractPosition : baseContract.getPositions()) {

baseContractPosition = dataManager.reload(baseContractPosition, contractPositionView)

ContractPosition contractPosition = new ContractPosition()

contractPosition.setVolumeYear(baseContractPosition.getVolumeYear())

contractPosition.setPeriod(contract_date)

contractPosition.setContract(contract)

contractPosition.setRelevance(baseContractPosition.getRelevance())

contractPosition.setContragent(contragent)

contract.setAccepted(false)

contract.setRelevance(false)

contractPosition.setAccruals(new ArrayList<>())

commitContext.addInstanceToCommit(contractPosition)

log.debug("ContractPosition $contractPosition.id добавлена в CommitContext")

numContractPosition = numContractPosition + 1

contract.getPositions().add(contractPosition)


//расчет начислений

calculateAverage(contractPosition,

fromDate,

helper.getNextAccrualNumber(),

new Date(),

price)


// calculateAverage(ContractPosition position, Date period, helper.getNextAccrualNumber(), Date billDate, BigDecimal price)

// for (Accrual accrual:listAccruals)

// {

// commitContext.addInstanceToCommit(accrual)

// log.debug("Accrual $accrual.id добавлена в CommitContext")

// numAccrual = numAccrual + 1

// contractPosition.getAccruals().add(accrual)

// }

}

//делаем неактивным допик

//makeContractObsolete(contract, false);

//снова делаем активным последний договор

//makeContractObsolete(lastContract, true);

}

log.debug("Запись изменений в БД...")

dataManager.commit(commitContext)

log.debug("Всего создано:\nДоп.соглашений: " + numContract + "\nContractPosition: " + numContractPosition + "\nAccruals: " + numAccrual)

log.debug("createSupplementaryAggrements.FINISH")



//возвращает список начислений по переданной позици договора и указанной цене

List<Accrual> calculateAccruals(Date from, Date to, Date billDate, ContractPosition position, BigDecimal price) {

DatePeriodTools datePeriodTools = AppBeans.get(DatePeriodTools.class)

CalculationWorkerHelper helper = AppBeans.get(CalculationWorkerHelper.class)

from = from == null ? new Date() : from

to = to == null ? from : to

billDate = billDate == null ? new Date() : billDate


List<Accrual> result = new ArrayList<>()


try {


Calendar calendarFrom = datePeriodTools.getFirstDayOfMonth(from)

Calendar calendarTo = datePeriodTools.getFirstDayOfMonth(to)


while ((calendarFrom.get(Calendar.YEAR) == calendarTo.get(Calendar.YEAR) &&

calendarFrom.get(Calendar.MONTH) <= calendarTo.get(Calendar.MONTH)) ||

(calendarFrom.get(Calendar.YEAR) < calendarTo.get(Calendar.YEAR))) {

int documentNumber = helper.getNextAccrualNumber()

Date period = calendarFrom.getTime()

price = helper.getTariff(period);

Accrual accrual

try {

accrual = calculateAverage(position, period, documentNumber, billDate, price)

if (accrual != null)

result.add(accrual)

} catch (Exception e) {

log.error('не удалось создать начисление для ContractPosition: ' + position.getId())

}

calendarFrom.add(Calendar.MONTH, 1)

}

}

finally {

log.debug('Расчет начислений окончен')

}

return result

}


//расчет по-среднему

Accrual calculateAverage(ContractPosition position, Date period, int documentNumber, Date billDate, BigDecimal price) {

CalculationWorkerHelper helper = AppBeans.get(CalculationWorkerHelper.class)


BigDecimal norm

if (position.getVolumeYear() != null && position.getVolumeYear() != BigDecimal.ZERO)

norm = helper.divide(position.getVolumeYear(), BigDecimal.valueOf(12))


BigDecimal tariff = price

tariff = helper.addNdsTo(tariff)


BigDecimal sum = helper.multiply(norm, tariff)

BigDecimal totalSum = sum

BigDecimal ndsSum = helper.getNdsFrom(sum)

//a.kotvinskiy Объем ТКО в месяц

BigDecimal amountBase = position.getVolumeYear()/12


Accrual accrual = new Accrual()

accrual.setContractPosition(position)

accrual.setPeriod(period)

accrual.setContragent(position.getContragent())

accrual.setAmount(norm)

//a.kotvinskiy /--

// Недостающие атрибуты

accrual.setAmountBase(amountBase)

accrual.setTotalSumBase(totalSum)

accrual.setNdsSumBase(totalSum-price.multiply(amountBase))

//a.kotvinskiy --/

accrual.setPrice(tariff)

accrual.setReductionFactor(BigDecimal.ONE)

accrual.setZoneRatio(BigDecimal.ONE)

accrual.setNds(BigDecimal.valueOf(20))

accrual.setSum(sum)

accrual.setTotalSum(totalSum)

accrual.setNdsSum(ndsSum)

accrual.setComment('По-среднему')

accrual.setDebugComment('')

accrual.setDocumentNumber(documentNumber)

accrual.setDocumentDate(billDate)


return accrual

}

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования