MyTetra Share
Делитесь знаниями!
1
Время создания: 26.10.2020 00:57
Раздел: INFO - JOB - rtneo - Выгрузки - УПД
Запись: wwwlir/Tetra/master/base/1603645061jonxlp1icc/text.html на raw.githubusercontent.com

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

import com.groupstp.rtneo.entity.Accrual

import com.groupstp.rtneo.entity.Contract

import com.groupstp.rtneo.entity.ContractPosition

import com.groupstp.rtneo.entity.Contragent

import com.groupstp.rtneo.entity.ContragentRealEstate

import com.groupstp.rtneo.entity.Payment

import com.haulmont.cuba.core.app.FileStorageAPI

import com.haulmont.cuba.core.entity.FileDescriptor

import com.haulmont.cuba.core.entity.KeyValueEntity

import com.haulmont.cuba.core.global.AppBeans

import com.haulmont.cuba.core.global.DataManager

import com.haulmont.cuba.core.global.FluentLoader

import com.haulmont.cuba.core.global.UuidProvider

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

import com.haulmont.cuba.core.global.View

import com.opencsv.CSVReader

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import de.diedavids.cuba.runtimediagnose.groovy.*

import groovy.transform.InheritConstructors;

import java.text.SimpleDateFormat

import java.util.function.BiPredicate

import java.util.function.Predicate

import java.util.stream.Collectors;


long st = System.currentTimeMillis();


dataManager = AppBeans.get(DataManager.class)

//dateView = new SimpleDateFormat("dd-MM-yyyy")

dateView = new SimpleDateFormat("yyyy-MM-dd")

datePeriodTools = AppBeans.get(DatePeriodTools.class)


reportStart = dateView.parse("2020-07-01")

reportStop = to = dateView.parse("2020-09-30")


Date paymentLimitDate = dateView.parse('2020-10-23')

contractLimit = dateView.parse("2020-10-01")


Date from = dateView.parse("2019-01-01")

Date to = dateView.parse("2020-12-31")


tariffs = dataManager.loadValues('select t.tariff*1.2, t.dateSince, t.dateTill from rtneo$Tariff t where t.name = 1')

.properties("tariff", "from", "to")

.list()


//Коллекция исключенных объектов

Map<String, String> excluded = new HashMap<>()

long pr = System.currentTimeMillis();

_("Pre start ${pr-st}");


//ContragentsSupplier supplier = new ContragentById(log)

//supplier.setContragent_id('fabf3200-0a3f-3185-31c3-5137da056284')

ContragentsSupplier supplier = new ContragentsNoFact(log)

//supplier.setFirstResult(0)

//supplier.setMaxResults(100)

supplier.setFilter(true)

//supplier.setPredicates(getPredicators())

//FileDescriptor excludeFile = dataManager.load(FileDescriptor.class)

// .id(UuidProvider.fromString('308e6069-5d3a-aee2-01b5-e3d6761ce573'))

// .view(View.MINIMAL)

// .optional().orElse(null);

//supplier.setExcludeFileId(excludeFile)

List<Contragent> contragents = supplier.getContragents()

long ft = System.currentTimeMillis();

_("Get contragents ${ft-pr}");


TreeMap<String, Object> contragentsGroup = getContragentsGroup(contragents, paymentLimitDate, from, to)

long pa = System.currentTimeMillis();

_("Payments & Accruals ${pa-ft}");


//Форматируем данные для вывода

HashMap<String, Object> res = getFormatData(contragentsGroup)

long mr = System.currentTimeMillis();

_("More ${mr-pa}");


printUPD(from, res, excluded, contractLimit, reportStart, reportStop)

printSummary(res, excluded)


private void printUPD(Date from, HashMap<String, Object> res, HashMap<String, String> excluded, Date contractLimit, Date reportStart, Date reportStop) {

Calendar endMonth = Calendar.getInstance();

endMonth.setTime(from);

List<String> totalsNullAccrualContract = new ArrayList<>()

HashMap<String, List<Object>> zeroMap = new HashMap<>()

List<Object> zeroList = new ArrayList<>()

List<Object> excledeOutList = new ArrayList<>()


_("!Наименование услуги!Дата договора!Основной договор!Номер УПД!Дата УПД!Дата корр.!ИНН!КПП!ЛС!Объем!Цена без НДС!Сумма без НДС!НДС!Цена с НДС!Оплачен период!Остаток на начало периода")

for (def itemRes : res) {


if (excluded.keySet().stream().anyMatch { e -> e.equals(itemRes.getValue()['inn']) }) continue


List<Contract> contractList = dataManager.load(Contract.class)

.query('select c from rtneo$Contract c where c.contragent.id = :contragent and c.accepted is not null and c.accepted = true and not (c.createTs > :contractLimit and c.createdBy = \'a.kotvinskiy@groupstp.ru\') order by c.createTs')

.parameter("contragent", itemRes.getValue()['id'])

.parameter("contractLimit", contractLimit)

.view("contract-browse")

.list()


Boolean keyOutput = false

def excledeOut = false

HashMap<String, Object> excludeMap = new HashMap<>()


for (def item : itemRes.getValue()['accruals']) {

def total = item.getValue().getValue()


//Если период начислени я меньше даты начала, пропускаем

if (dateView.parse(item.getKey()).compareTo(reportStart) < 0) continue

if (dateView.parse(item.getKey()).compareTo(reportStop) > 0) continue

//Выводим один не оплаченный месяц

if (total['done'] != true && !keyOutput) {

keyOutput = true

} else if (total['done'] != true && keyOutput) {

continue

}


//Условие чтобы, за 2020 год не выводилоась запись, если оплаты кончились раньше. Переделать

if (from != reportStart) {

if (dateView.parse(total['period'].toString()).compareTo(reportStart) == 0 && total['residue'] <= 0 && !total['residue']) excledeOut = true

}


//Дата текстом и числом для вывода

endMonth.setTime(dateView.parse(total['period'].toString()));

endMonth.set(Calendar.DAY_OF_MONTH, endMonth.getActualMaximum(Calendar.DAY_OF_MONTH))

def month = getTextPeriod(dateView.parse(total['period']))



if (excledeOut) {

excludeMap.put("inn", itemRes.getValue()['inn'])

excludeMap.put("kpp", itemRes.getValue()['kpp'])

} else {

log.debug("!Услуга Регионального оператора по обращению с ТКО за ${month}!!!!${dateView.format(endMonth.getTime())}!!${itemRes.getValue()['inn']}!${itemRes.getValue()['kpp']}!${itemRes.getValue()['pa']}!!!!!!${total['done'] == true ? 'да' : 'нет'}!${total['residue']}")

}


List<HashMap> itemsList = getFormatFields(contractList, total, endMonth)

if (itemsList.isEmpty()) {

//Вынести сообщения

// _("${itemRes.getValue()['id']} itemList empty")

continue

}

//Порядок вывода реализации и исправления

//реализация

Boolean print1Contract = false

//Исправление

Boolean print2Contract = false

(print1Contract, print2Contract) = setRuleOutAccrual(itemsList)


if (excledeOut) {

if (print1Contract) {

excludeMap.put("number", itemsList.get(0).get("number"))

excledeOutList.add(excludeMap)

}

if (print2Contract) {

def excludeMapC = new HashMap<>(excludeMap)

excludeMapC.put("number", itemsList.get(itemsList.size() - 1).get("number"))

excledeOutList.add(excludeMapC)

}

} else {

if (print1Contract) printItemFromResultMap(itemsList.get(0))

if (print2Contract) printItemFromResultMap(itemsList.get(itemsList.size() - 1))

}

}

}

// excledeOutList.each{

// if(it instanceof HashMap){

// _("|${it.get('inn')}|${it.get('kpp')}|${it.get('number')}")

// }else{

// _(it)

// }

// }

}


private void printSummary(LinkedHashMap<Object, Object> res, HashMap<String, String> excluded) {

_("|Наименование|ЛС|ИНН|КПП|Объем|Сумма всего|Сумма 2019|Сумма 2020|Остаток|Последний оплаченный период")


for (def item : res) {


def rAmount = BigDecimal.ZERO

def rTotalSum = BigDecimal.ZERO

def payTotalSum = BigDecimal.ZERO

def period

def lastPeriod = false

def isHide = false



def totalSum19 = BigDecimal.ZERO

def totalSum20 = BigDecimal.ZERO

HashMap<String, Object> mapResults = new HashMap<>()


for (def accrual : item.getValue()['accruals']) {

// _(accrual)


if (lastPeriod) continue


if (!accrual.getValue().getValue()['done']) lastPeriod = true


if (!lastPeriod) {

period = accrual.getValue().getValue()['period']

payTotalSum += accrual.getValue().getValue()['totalSum']

}

def currPeriod = dateView.parse(accrual.getValue().getValue()['period'])

if (currPeriod.compareTo(dateView.parse('2020-07-01')) < 0) {

totalSum19 += accrual.getValue().getValue()['totalSum']

} else {

if(currPeriod.compareTo(dateView.parse('2020-10-01')) < 0)totalSum20 += accrual.getValue().getValue()['totalSum']

}


if(currPeriod.compareTo(dateView.parse('2020-10-01')) < 0){

rAmount += accrual.getValue().getValue()['amountBase']

rTotalSum += accrual.getValue().getValue()['totalSum']

}


}


// if(totalSum20 == 0)isHide = true

rTotalSum = rTotalSum.setScale(2, BigDecimal.ROUND_HALF_DOWN)

mapResults.put("name", item.getValue()['name'])

mapResults.put("pa", item.getValue()['pa'])

mapResults.put("inn", item.getValue()['inn'])

mapResults.put("kpp", item.getValue()['kpp'])

mapResults.put("amount", rAmount.setScale(5, BigDecimal.ROUND_HALF_DOWN))

mapResults.put("totalSum", rTotalSum.setScale(2, BigDecimal.ROUND_HALF_DOWN))

mapResults.put("totalSum19", totalSum19.setScale(2, BigDecimal.ROUND_HALF_DOWN))

mapResults.put("totalSum20", totalSum20.setScale(2, BigDecimal.ROUND_HALF_DOWN))

mapResults.put("payments", (item.getValue()['sumPayments'] as BigDecimal).setScale(2, BigDecimal.ROUND_HALF_DOWN))


// def balance = item.getValue()['sumPayments'].compareTo(rTotalSum) < 0 ? item.getValue()['sumPayments'] : item.getValue()['sumPayments'] - rTotalSum

def balance = item.getValue()['sumPayments'] - payTotalSum

mapResults.put("balance", balance.setScale(2, BigDecimal.ROUND_HALF_DOWN))


mapResults.put("period", period)

if(period == null)continue

if(period != null && (dateView.parse(period).compareTo(reportStart)<0))isHide = true

// _(mapResults)

if (excluded.keySet().stream().anyMatch { e -> e.equals(item.getValue()['inn']) }) continue

if (!isHide) printItemFromResultMapMin(mapResults)

}

}

_('****************************************************************************')



//HashSet(totalsNullAccrualContract).each{_(it)}

return true;


void printItemFromResultMapMin(HashMap<String, Object> current){

_("|${current.get('name')}|${current.get('pa')}|${current.get('inn')}|${current.get('kpp')}|${current.get('amount')}|${current.get('totalSum')}|${current.get('totalSum19')}|${current.get('totalSum20')}|${current.get('balance')}|${current.get('period')}".replaceAll("\\p{Cntrl}", ""))

}


abstract class ContragentsSupplier{

DataManager dataManager = AppBeans.get(DataManager.class)

List<Predicate<Contragent>> predicates = new ArrayList<>();

Boolean filter = false

FileDescriptor excludeFileId;

GroovyConsoleLogger log;

ContragentsSupplier(){


}

ContragentsSupplier(GroovyConsoleLogger log){

this.log = log

}

abstract List<Contragent> contragentsLoad()


List<Contragent> getContragents(){

List<Contragent> contragents;

contragents = contragentsLoad()

this.predicates = getPredicators(contragents)

if(filter){

contragents = filterContragent(contragents)

}

if(excludeFileId != null){

contragents = excludeFromFile()

}

return contragents;

}

View createView(){

ViewRepository vRep = AppBeans.get(ViewRepository.NAME)

return vRep.getView(Contragent.class, "_minimal")

.addProperty("inn")

.addProperty("kpp")

.addProperty("name")

.addProperty("personalAccount")

}

List<Contragent> filterContragent(List<Contragent> contragents){

return contragents.stream()

.filter{c -> predicates.stream().map{p->p as Predicate<Contragent>}.allMatch{p -> p.test(c)}}

.collect(Collectors.toList())

// .filter{allPredicates.stream().reduce{a,b -> a.and(b)}.get()}

// .filter{e -> allPredicates.inject(true, {a,b -> it.and})}

}

List<Contragent> excludeFromFile(List<Contragent> contragents){

List<String> exclude = inToFile(excludeFileId)

return contragents.stream().filter{e -> !exclude.contains(e.getInn())}.collect()

}


List<String> inToFile(FileDescriptor fd){

if(fd == null){throw new RuntimeException("fileNotFound")}


FileStorageAPI fileStorageAPI=AppBeans.get(FileStorageAPI.NAME);

InputStream inputStream=fileStorageAPI.openStream(fd)

CSVReader reader = new CSVReader(new InputStreamReader(inputStream, "UTF-8"));


return reader.readAll().stream()

.map{e->e[0]}.collect(Collectors.toList())

}

List<Predicate<Contragent>> getPredicators(List<Contragent> contragents){

List<Predicate<Contragent>> allPredicates = new ArrayList<>()

allPredicates.add({c->

if(contragents.stream().filter{e->e.getInn() == c.getInn()}.count() == 1){

return true

}else{

log.debug("Is filial ${c.getInn()}")

return false

}

})


return allPredicates

}

}

@InheritConstructors

class ContragentsNoFact extends ContragentsSupplier{

def firstResult = 0

def maxResults = 0

@Override

List<Contragent> contragentsLoad(){

String query = 'select distinct c ' +

'from rtneo$Payment e ' +

' join rtneo$Contragent c on e.inn = c.inn ' +

' where not e.inn is null and not c.type = 4 ' +

'order by c.inn ' +

'except ' +

'select distinct ct.contragent ' +

'from rtneo$Contragent c ' +

' join rtneo$Contract ct on c.id = ct.contragent.id ' +

'where ' +

' ct.isFactCalculation = true and ct.accepted = true ' +

'order by c.inn'

FluentLoader.ByQuery load = dataManager.load(Contragent.class)

.query(query)

.view(createView())

if(firstResult != 0)load.firstResult(firstResult)

if(maxResults != 0)load.maxResults(maxResults)

return load.list()

}

}

@InheritConstructors

class ContragentsImplOld extends ContragentsSupplier{

@Override

List<Contragent> contragentsLoad(){

String oldQuery = 'select ' +

'distinct c.id, c.inn, c.kpp, c.personalAccount, (select count(ct) from rtneo$Contract ct where ct.contragent.id = c.id and ct.accepted = true and ct.isFactCalculation = true) ' +

'from rtneo$Payment e join rtneo$Contragent c on e.inn = c.inn ' +

'where not e.inn is null and e.createTs <= :paymentLimitDate order by c.inn'

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

.query(query)

// .parameter("paymentLimitDate", paymentLimitDate)

.firstResult(0)

.maxResults(10)

.view(createView())

.list()

return contragents

}

}

@InheritConstructors

class ContragentById extends ContragentsSupplier{

String contragent_id;

@Override

List<Contragent> contragentsLoad() {

String query = 'select c from rtneo$Contragent c where c.id = :contragent_id'

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

.query(query)

.parameter("contragent_id", UUID.fromString(contragent_id))

.view(createView())

.list()

return contragents

}

}

def setRuleOutAccrual(List<HashMap> itemsList){

//реализация

Boolean print1Contract = false

//Исправление

Boolean print2Contract = false

if(itemsList.size()>=1){

//mapResults.put("cdate", contract.getMainContract() == null ? dateView.format(contract.getDate()) : '')

//Если это доп и он один, или это основной договор, выводим

if(itemsList.get(0).get('cdate').equals('')){

if(itemsList.size() == 1)print1Contract = true

}else{

print1Contract = true

}


if(itemsList.size()>1){

//Если начисление не по допу, и дата контракта меньше 20-го, реализацию по нему не выводим

//Только 20го года Сделать условие!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

if(!itemsList.get(0).get('cdate').equals('') && dateView.parse(itemsList.get(0).get('cdate')).compareTo(dateView.parse('01-01-2020')) < 0)print1Contract = false

//Если первое начисление не по допу и последнее не по допу, скрываем реализацию?? Странное условие

if(!itemsList.get(0).get('cdate').equals('') && !itemsList.get(itemsList.size()-1).get('cdate').equals('')){

print1Contract = false

}

// if(itemsList.get(0).get('cdate').equals('') && itemsList.get(itemsList.size()-1).get('cdate').equals(''))itemsList.get(itemsList.size()-1)['dateCor'] = ''

//Если сумма реализации(первое начисление) совпадает с исправлением, реализацию не выводим

if(itemsList.get(0).get('totalSum').equals(itemsList.get(itemsList.size()-1).get('totalSum')))print1Contract = false

//Исправление выводим всегда

print2Contract = true

}

return [print1Contract, print2Contract]

}

}


private List<HashMap> getFormatFields(List<Contract> contractList, total, Calendar endMonth) {

List<HashMap> itemsList = new ArrayList<>()

for (Contract contract : contractList) {

KeyValueEntity totalAccrualContract = dataManager.loadValues('select a.documentNumber, max(a.period), sum(a.amountBase), sum(a.amountBase)*max(a.price), max(a.price), sum(a.ndsSum), sum(a.totalSum), sum(a.totalSumBase) from rtneo$Accrual a where a.contractPosition.contract.id = :contract and a.period = :period group by a.documentNumber')

.properties("number", "period", "amount", "totalSumWithNDS", "price", "totalNDS", "totalSum", "totalSumBase")

.parameter("contract", contract.getId())

.parameter("period", dateView.parse(total['period']))

.optional()

.orElse(null)

// if(totalAccrualContract == null){

// totalsNullAccrualContract.add(itemRes.getValue()['inn'])

// continue

// }

String mainContractNumber = contract.getMainContract() != null ? contract.getMainContract().getNumber() : ''

HashMap<String, Object> mapResults = new HashMap<>()


if (totalAccrualContract == null) {

// _("!${contract.getNumber()}!No accruals in to period")

} else {

mapResults.put("cnumber", contract.getNumber())

mapResults.put("cdate", contract.getMainContract() == null ? dateView.format(contract.getDate()) : '')

mapResults.put("cmnumber", mainContractNumber)

mapResults.put("number", totalAccrualContract.getValue('number'))

mapResults.put("period", dateView.format(endMonth.getTime()))

mapResults.put("dateCor", contract.getMainContract() != null ? dateView.format(contract.getDate()) : '')

mapResults.put("amount", totalAccrualContract.getValue('amount'))

mapResults.put("price", totalAccrualContract.getValue('price') * 5 / 6)

def totalNDS = totalAccrualContract.getValue('totalNDS') == null ? BigDecimal.ZERO : totalAccrualContract.getValue('totalNDS')

mapResults.put("totalSumNoNDS", totalAccrualContract.getValue('totalSum') - totalNDS)

mapResults.put("totalNDS", totalNDS)

mapResults.put("totalSum", totalAccrualContract.getValue('totalSum'))


if (!(totalAccrualContract.getValue('totalSum').compareTo(totalAccrualContract.getValue('totalSumBase')) == 0)) {

mapResults.put('amount', totalAccrualContract.getValue('totalSum') / totalAccrualContract.getValue('price'))

}

// accrualsGroup.each{

// if(!(it.getValue()['totalSum'].compareTo(it.getValue()['totalSumBase']) == 0)){

// BigDecimal noNdsSum = it.getValue()['totalSum']/(100+it.getValue()['nds'])*100

// it.getValue().put('amountBase', noNdsSum/it.getValue()['tariff'])

// // excluded.putIfAbsent(contragent.getValue('inn'), "discount")

// }

// }



itemsList.add(mapResults)

}


}

return itemsList

}


void printItemFromResultMap(HashMap<String, Object> current){

_("!${current.get('cnumber')}!${current.get('cdate')}!${current.get('cmnumber')}!${current.get('number')}!${current.get('period')}!${current.get('dateCor')}!!!!${current.get('amount')}!${current.get('price')}!${current.get('totalSumNoNDS')}!${current.get('totalNDS')}!${current.get('totalSum')}")

}

def getTextPeriod(Date date) {

def result=''

if (date != null) {

def monthesRP = ['январь','февраль','март','апрель','май','июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь']

Calendar cal = Calendar.getInstance()

cal.setTime(date);

result+=monthesRP[cal.get(Calendar.MONTH)]

result+=" "+cal.get(Calendar.YEAR).toString()+" г."

}

return result

}


HashMap<String, Object> getFormatData(TreeMap<String, Object> contragentsGroup){

HashMap<String, Object> res = [:]

for(def contr : contragentsGroup){

def sumPay = 0

def residue = 0

contr.getValue()['payments'].each{p -> sumPay += p.getValue()['sum']}


res[contr.getValue()['inn']] = [

'id' : contr.getValue()['id'],

'inn' : contr.getValue()['inn'],

'kpp' : contr.getValue()['kpp'],

'name' : contr.getValue()['name'],

'pa' : contr.getValue()['pa'],

'sumPayments' : sumPay,

'accruals': [:]

]

// def accrual = []

//Проставляем признак оплаты за период

for(def accrualFor : contr.getValue()['accruals']){


if(sumPay > accrualFor.getValue()['totalSum']){

accrualFor.getValue()['done'] = true

}else{

accrualFor.getValue()['done'] = false

}

if(sumPay >= 0){

residue = sumPay

accrualFor.getValue()['residue'] = residue

}

sumPay -= accrualFor.getValue()['totalSum']


res[contr.getValue()['inn']]['accruals'][accrualFor.getValue()['period']]=accrualFor

}


}

return res

}

private TreeMap<String, Object> getContragentsGroup(List<Contragent> contragents, Date paymentLimitDate, Date from, Date to) {

TreeMap<String, Object> contragentsGroup = new TreeMap<>();

for (Contragent contragent : contragents) {


contragentsGroup.putIfAbsent(contragent.inn, [

'id' : contragent.id,

'inn' : contragent.inn,

'kpp' : contragent.kpp,

'name' : contragent.name,

'pa' : contragent.personalAccount,

'payments': [:],

'accruals': [:]

])

contragentsGroup[contragent.inn]['payments'] = getPayments(contragent, paymentLimitDate)

contragentsGroup[contragent.inn]['accruals'] = getAccruals(contragent, from, to)


contragentsGroup[contragent.inn]['accruals'].each {

if (!(it.getValue()['totalSum'].compareTo(it.getValue()['totalSumBase']) == 0)) {

BigDecimal noNdsSum = it.getValue()['totalSum'] / (100 + it.getValue()['nds']) * 100

it.getValue().put('amountBase', noNdsSum / it.getValue()['tariff'])

}

}


}

return contragentsGroup

}

HashMap<String, Object> getPayments(Contragent contragent, Date paymentLimitDate){

HashMap<String, Object> paymentsMap = new HashMap<>()

List<Payment> payments = getPaymentsContragent(contragent, paymentLimitDate)

for(def payment : payments){

String period = dateView.format(payment.getDate())


if(paymentsMap.get(period) == null){

paymentsMap[period] = ['purpose' : payment.purpose, 'sum' : payment.sum]

}else{

paymentsMap[period]['sum'] += payment.getSum()

}

}

return paymentsMap

}

HashMap<String, Object> getAccruals(Contragent contragent, Date dateFrom, Date dateTo){

Calendar from = dateFrom.toCalendar()

Calendar to = dateTo.toCalendar()

HashMap<String, Object> accrualsGroup = [:]

while(!from.after(to)){

List<Accrual> accruals = getBillsOnPeriod(UUID.fromString(contragent.id.toString()), from.getTime())

def roundingTarif = tariffs.stream()

.filter{e-> datePeriodTools.isPeriodIncluded(from.getTime(), e.getValue('from'), e.getValue('to'))}

.map{e-> e.getValue('tariff') as BigDecimal}.map{e-> e.setScale(5, BigDecimal.ROUND_HALF_UP)}

.findFirst().orElse(BigDecimal.ZERO)


for(def accrual : accruals){

if(accrual.getComment().equals("По факту")){

factAccrual = true

continue

}

if(accrual.getPrice() == null){

log.debug("${contragent.id} accrual.getPrice() is null !!!")

continue

}

def tariffNoNDS = NDStools.getSumWithoutNDS(accrual.getPrice())

String period = dateView.format(accrual.getPeriod())

if(accrualsGroup[period]==null){

accrualsGroup[period] = [

'period' : dateView.format(accrual.getPeriod()),

'number' : accrual.getDocumentNumber(),

'tariff' : tariffNoNDS,

'amountBase' : getNN(accrual.getAmountBase()),

'totalSumBaseNoNds' : getNN(accrual.getAmountBase())*tariffNoNDS,

'totalSumBase' : getNN(accrual.getTotalSumBase()),

'totalSum' : getNN(accrual.getTotalSum()),

'nds' : getNN(accrual.getNds()),

'residue' : 0,

'done' : false

]

}else{

accrualsGroup[period]['amountBase'] += getNN(accrual.getAmountBase())

accrualsGroup[period]['totalSumBaseNoNds'] += getNN(accrual.getAmountBase())*tariffNoNDS

accrualsGroup[period]['totalSumBase'] += getNN(accrual.getTotalSumBase())

accrualsGroup[period]['totalSum'] += getNN(accrual.getTotalSum())

}

}

from.add(Calendar.MONTH, 1)

}

return accrualsGroup

}


class NDStools{

static BigDecimal setNDS(BigDecimal sum){

return sum

}

static BigDecimal getNDS(BigDecimal sum){

return sum

}

static BigDecimal getSumWithoutNDS(BigDecimal sum){

return sum*5/6

}


}

List<Payment> getPaymentsContragent(Contragent contragent, Date paymentLimitDate){

//Нужно стандартизировать инн

return dataManager.load(Payment.class)

.query('select p from rtneo$Payment p where p.inn like :inn and p.createTs <= :paymentLimitDate')

.parameter('inn', "%%"+contragent.getValue('inn'))

.parameter("paymentLimitDate", paymentLimitDate)

.view('_local')

.list();

}


def getNN(BigDecimal value) {

return value == null ? BigDecimal.ZERO : value;

}


List<Accrual> getBillsOnPeriod(UUID contragentID, Date period) {

ViewRepository viewRepository = AppBeans.get(ViewRepository.NAME)


View acView = viewRepository.getView(Accrual.class, "_local");

acView.addProperty("contractPosition", viewRepository.getView(ContractPosition.class, "_local")

.addProperty("contragentRealEstate", viewRepository.getView(ContragentRealEstate.class, "_local")))

.addProperty("createTs")

.addProperty("createdBy");


List<Contract> contracts = dataManager.load(Contract.class)

.query('select e from rtneo$Contract e where e.contragent.id = :contragent and e.accepted=true and not (e.createTs > :contractLimit and e.createdBy = \'a.kotvinskiy@groupstp.ru\') order by e.createTs desc')

.parameter("contragent", contragentID)

.parameter("contractLimit", contractLimit)

.view("_local")

.list();

if (contracts.size() == 0) {

contracts = dataManager.load(Contract.class)

.query('select e from rtneo$Contract e where e.contragent.id = :contragent and not (e.createTs > :contractLimit and e.createdBy = \'a.kotvinskiy@groupstp.ru\') order by e.createTs')

.parameter("contragent", contragentID)

.parameter("contractLimit", contractLimit)

.view("_local")

.list();

}

if (contracts.size() > 0) {

int i = 0;

Contract contract = contracts.get(i);

if (contract.getFrom() == null) return null;

while (contract.getFrom() != null & period.before(contract.getFrom())) {

i = i + 1;

if (i == contracts.size()) break;

contract = contracts.get(i);

}

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

if (contract.getFrom() != null) {

List<Accrual> accruals = dataManager.load(Accrual.class)

.query('select e from rtneo$Accrual e where e.contractPosition.contract.id=:contractId and e.period=:period')

.parameter("contractId", contract.getId())

.parameter("period", period)

.view(acView)

.list();

return accruals;

}

}

return null;

}

public List<Accrual> getContragentBills(UUID contragentID) {

ViewRepository vRep = AppBeans.get(ViewRepository.NAME)


View viewAccrual = vRep.getView(Accrual.class, "_local")

.addProperty("category", vRep.getView(RealEstateCategory.class, "_local")

.addProperty("unit", vRep.getView(Unit.class, "_local"))

)

.addProperty("realEstate", vRep.getView(RealEstate.class, "_local")


)


String sqlQuery = 'select e from rtneo$Accrual e where 1=0';

List<Accrual> accruals = new ArrayList<Accrual>();

List<Contract> contracts = dataManager.load(Contract.class)

.query('select e from rtneo$Contract e where e.contragent.id = :contragent and e.accepted =true order by e.createTs desc')

.parameter("contragent", contragentID)

.view("contract-edit")

.list();

if (contracts.size() > 0) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

Contract lastContract = null;

for (Contract contract : contracts) {

if (lastContract == null) {

lastContract = contract;

sqlQuery = 'cast(a.contractPosition.contract.id text)=\'' + contract.getId().toString() + '\' ';

} else {

if (contract.getFrom().before(lastContract.getFrom())) {

sqlQuery = sqlQuery + ' or (cast(a.contractPosition.contract.id text)=\'' + contract.getId().toString() + '\' and a.period < \'' + sdf.format(lastContract.getFrom()) + '\' )';

lastContract = contract;

}

}

}

sqlQuery = 'select a from rtneo$Accrual a where a.contragent.id = :contragentID and (' + sqlQuery + ') order by a.period';


accruals = dataManager.load(Accrual.class)

.query(sqlQuery)

.parameter("contragentID", contragentID)

.view(viewAccrual)

.list();

}

return accruals;

}


public List<Accrual> getContragentBills(UUID contragentID, Date from, Date to) {

ViewRepository vRep = AppBeans.get(ViewRepository.NAME)

DataManager dataManager = AppBeans.get(DataManager.NAME)


View viewAccrual = vRep.getView(Accrual.class, "_local")

.addProperty("category", vRep.getView(RealEstateCategory.class, "_local")

.addProperty("unit", vRep.getView(Unit.class, "_local"))

)

.addProperty("realEstate", vRep.getView(RealEstate.class, "_local")


)


String sqlQuery = 'select e from rtneo$Accrual e where 1=0';

List<Accrual> accruals = new ArrayList<Accrual>();

List<Contract> contracts = dataManager.load(Contract.class)

.query('select e from rtneo$Contract e where e.contragent.id = :contragent and e.accepted =true order by e.createTs desc')

.parameter("contragent", contragentID)

.view("contract-edit")

.list();

if (contracts.size() > 0) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

Contract lastContract = null;

for (Contract contract : contracts) {

if (lastContract == null) {

lastContract = contract;

sqlQuery = 'cast(a.contractPosition.contract.id text)=\'' + contract.getId().toString() + '\' ';

} else {

if (from.before(lastContract.getFrom())) {

sqlQuery = sqlQuery + ' or (cast(a.contractPosition.contract.id text)=\'' + contract.getId().toString() + '\' and a.period < \'' + sdf.format(to) + '\' )';

lastContract = contract;

}

}

}

sqlQuery = 'select a from rtneo$Accrual a where a.contragent.id = :contragentID and (' + sqlQuery + ') order by a.period';


accruals = dataManager.load(Accrual.class)

.query(sqlQuery)

.parameter("contragentID", contragentID)

.view(viewAccrual)

.list();

}

return accruals;

}




/**

* Логирование

*/

import com.haulmont.cuba.core.app.serialization.EntitySerializationAPI;

import com.groupstp.rtneo.util.JsonUtil;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

private _(Object obj, String... options){

if(obj == null){log("LOG.ERROR: Object is null!!!");return}

if(options.size() == 0){log(obj)}

for(def option : options){

if(option.equals("str")){log(obj)}

if(option.equals("for")){obj.each({_(it)})}

if(option.equals("json")){

EntitySerializationAPI entitySerializationAPI = AppBeans.get(EntitySerializationAPI.NAME)

try{log(entitySerializationAPI.toJson(obj))}

catch(Exception e){log("LOG.ERROR: JSON entity serialization failed")}

}

if(option.equals("objJson")){

JsonUtil jsonUtil = AppBeans.get(JsonUtil.NAME)

try{log.(jsonUtil.toJson(obj))}

catch(Exception e){log("LOG.ERROR: JSON object serialization failed")}

}

if(option.equals("date")){

DateFormat df = new SimpleDateFormat("dd.MM.yyyy");

try{log(df.format(obj))}

catch(Exception e){log("LOG.ERROR: Failed date format")}

}

}

}

private log(Object obj){log.debug(obj)}

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