MyTetra Share
Делитесь знаниями!
Доп соглашение с оплатой за арендатора
Время создания: 23.10.2019 08:49
Раздел: INFO - JOB - CUBA - GroovyScripts
Запись: wwwlir/Tetra/master/base/1571791757guvrnyk5ed/text.html на raw.githubusercontent.com

import com.groupstp.datasupplier.data.BankData

import com.groupstp.datasupplier.service.BankDataSupplierService

import com.groupstp.rtneo.entity.*

import org.apache.commons.collections4.CollectionUtils

import java.math.RoundingMode;

import java.text.DecimalFormat;

import java.text.DecimalFormatSymbols;

import com.github.declinationofnames.*

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

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

import com.groupstp.rtneo.service.AccrualService

import com.groupstp.rtneo.data.ContainerYardSearchData

import com.groupstp.rtneo.core.bean.ContainerYardWorker

import org.apache.commons.lang.StringUtils

import com.groupstp.rtneo.service.CompanyService


import java.text.DateFormat;

import java.text.SimpleDateFormat;


def helper = AppBeans.get(CalculationWorkerHelper.NAME)

def service = AppBeans.get(AccrualService.NAME)

def containerYardWorker = AppBeans.get(ContainerYardWorker.NAME)

def bankDataService = AppBeans.get(BankDataSupplierService.NAME)

def companyService = AppBeans.get(CompanyService.NAME)


def contract = dataManager.reload(params['contract'],'contract-print')


//def params = [:]

//def contract = dataManager.load(Contract.class).id(UUID.fromString('4d8f3dab-abd6-68ad-0921-da6a267965c6')).view('contract-print').optional().orElse(null)

//Получаем реквизиты компании, действующие на момент даты договора

def company = contract.getCompany()

def companyRequisites = companyService.getCompanyRequisites(company, contract.getDate())

def companyManagerNameR = companyRequisites.getManagerName()

try{

companyManagerNameR = new RussianName(companyManagerNameR).fullName(RussianNameProcessor.gcaseRod)

} catch(e){


}

//заполняем шапку

def contragent = contract.getContragent()

//документ-основание

contragentPersonReasonText = ', действующего на основании '

if (contragent.getType() == ContragentType.PERSONAL){

contragentPersonReasonText = ''

}

contragentPersonReasonDoc = params['personReason']

if (contragentPersonReasonDoc == null){

contragentPersonReasonDoc = contragent.getHeadPersonReasonDoc()

}

contragentPersonReasonDocR = contragentPersonReasonDoc

try{

contragentPersonReasonDocR = new RussianName(contragentPersonReasonDoc).fullName(RussianNameProcessor.gcaseRod)

} catch(e){


}

if (contragentPersonReasonDocR == null){

if (getContragentType(contragent) == ContragentType.ORGANISATION){

contragentPersonReasonDocR = "устава"

} else if(getContragentType(contragent) == ContragentType.INDIVIDUAL){

contragentPersonReasonDocR = "свидетельства / выписки о государственной регистрации в качестве индивидуального предпринимателя"

}

}

//подписант

contragentPersonName = params['personName']

if (contragentPersonName == null){

contragentPersonName = contragent.getHeadPersonName()

if (contragent.getType() == ContragentType.PERSONAL){

contragentPersonName = contragent.getName()

}

}

contragentPersonNameR = contragentPersonName

try{

contragentPersonNameR = new RussianName(contragentPersonName).fullName(RussianNameProcessor.gcaseRod)

} catch(e){


}

//должность подписанта

contragentPersonPost = params['personPost']

if (contragentPersonPost == null){

contragentPersonPost = contragent.getHeadPersonPost()

}

contragentPersonPostR = contragentPersonPost

try{

contragentPersonPostR = new RussianName(contragentPersonPost).fullName(RussianNameProcessor.gcaseRod)

} catch(e){


}



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

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

//массив шапочных параметров

def props = [

'number': contract.getNumber(),

'date': getTextDate(contract.getDate()),

//a.kotvinskiy /--

'dateFromTKO': df2.format(contract.getFrom()),

'dateBeforeTKO': df.format(contract.getBefore()),

//a.kotvinskiy --/

'contragentName':contragent.getName(),

'contragentNameShort':contragent.getShortName(),

'contragentPersonName': contragentPersonName,

'contragentPersonNameR': contragentPersonNameR,

'contragentPersonNameShort': getShortFio(contragentPersonName),

'contragentPersonPost': contragentPersonPost,

'contragentPersonPostR': contragentPersonPostR,

'contragentPersonReasonDoc': contragentPersonReasonDoc,

'contragentPersonReasonDocR': contragentPersonReasonDocR,

'contragentPersonReasonText': contragentPersonReasonText,

'contragentShortName':contragent.getShortName(),

'legalAddress':contragent.getLegalAddress(),

'actualAddress':contragent.getActualAddress(),

'mailingAddress':contragent.getMailingAddress(),

'registrationAddrees': contragent.getRegistrationAddress(),

'passportSeries': contragent.getPassportSeries(),

'passportNumber': contragent.getPassportNumber(),

'passportGivenDate': contragent.getPassportGivenDate(),

'inn':contragent.getInn(),

'kpp':contragent.getKpp(),

'ogrn':contragent.getOgrn(),

'checkingAccount':contragent.getCheckingAccount(),

'bankName':contragent.getBankName(),

'correspondentAccount':contragent.getCorrespondentAccount(),

'bik':contragent.getBik()

,'companyShortName':company.shortName

,'companyFullName':company.fullName

,'companyInn':company.inn

,'companyEmail':company.email

,'companyOgrn':company.ogrn

,'companyPhone':company.phone

,'companyLegalAddress':companyRequisites.legalAddress

,'companyActualAddress':companyRequisites.actualAddress

,'companyPostalAddress':companyRequisites.postalAddress

,'companyKpp':companyRequisites.kpp

,'companyBankName':companyRequisites.bankName

,'companyBankAccount':companyRequisites.bankAccount

,'companyCorrespondentAccount':companyRequisites.correspondentAccount

,'companyRcbic':companyRequisites.rcbic

,'companyManagerTitle':companyRequisites.managerTitle

,'companyManagerTitleR':companyRequisites.managerTitleR

,'companyManagerName':companyRequisites.managerName

,'companyManagerNameR':companyManagerNameR

,'companyManagerNameShort':getShortFio(companyRequisites.managerName)

,'companyManagerDocumentR':getShortFio(companyRequisites.managerDocumentR)

]


if (!StringUtils.isBlank(props['bik']) && (StringUtils.isBlank(props['bankName']) || StringUtils.isBlank(props['correspondentAccount']))) {

BankData bank = bankDataService.getSuggestionBankDetails(props['bik'])

if (bank != null) {

if (StringUtils.isBlank(props['bankName'])) {

props['bankName'] = bank.getName()

}

if (StringUtils.isBlank(props['correspondentAccount'])) {

props['correspondentAccount'] = bank.getCorrespondentAccount()

}

}

}


//телефон + почта

def phone = ''

if (contragent.getHeadPersonPhone() != null){

phone = contragent.getHeadPersonPhone()

} else if (contragent.getContactPersonPhone()!=null){

phone = contragent.getContactPersonPhone()

}

def email = ''

if (contragent.getHeadPersonEmail()!=null){

email = contragent.getHeadPersonEmail()

} else if (contragent.getContactPersonEmail()!=null){

email = contragent.getContactPersonEmail()

}

props['phone'] = phone

props['email'] = email

//a.kotvinskiy 19-07-19/--

//В пункте 3 доп соглашения, указываем начало действия доп соглашения

props['dateFrom'] = getTextDate(contract.getFrom())

//a.kotvinskiy 19-07-19--/

//получаем номер и дату головного договора

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

props['mainContractNumber'] = contract.getMainContract().getNumber()

props['mainContractDate'] = getTextDate(contract.getMainContract().getDate())

}

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

def defaultDate = new Date().copyWith(year: 2019, month: Calendar.JANUARY, dayOfMonth: 17, hourOfDay: 0, minute: 0, second: 0);

def addressChangeDate = new Date().copyWith(year: 2019, month: Calendar.APRIL, dayOfMonth: 26, hourOfDay: 0, minute: 0, second: 0);

def contractDate = contract.getDate()

props['ourPersonPost'] = "Заместитель генерального директора по коммерческой работе"

props['ourPersonPostR'] = "Заместителя генерального директора по коммерческой работе"

props['ourPersonName'] = "Степанова Татьяна Анатольевна"

props['ourPersonNameR'] = "Степановой Татьяны Анатольевны"

props['ourPersonReasonDoc'] = "доверенность № РТ-05 от 11.01.2019 г"

props['ourPersonReasonDocR'] = "доверенности № РТ-05 от 11.01.2019 г"

props['ourPersonNameShort'] = "Степанова Т.А."

if (contractDate < addressChangeDate){

props['ourLegalAddress'] = '308000, Белгородская область, город Белгород, проспект Б. Хмельницкого, дом 131, помещение 15'

props['ourKpp'] = '312301001'

} else {

props['ourLegalAddress'] = '664033, Иркутская область, город Иркутск, улица Лермонтова, дом 337Б, помещение 8'

props['ourKpp'] = '381201001'

}

//позиции по договору

def units = [];

def realEstates = [];

def calculations = [];

//контейнерные площадки

def containers = [];

def containersUnique = [];

//

def accrualsGroup = new TreeMap<>();


//a.kotvinskiy /--

//Объемы арендаторов за которые оплачивает арендодатель

def renters = [:]

//a.kotvinskiy --/

//заполняем позиции

for (ContractPosition position: contract.getPositions()){

//a.kotvinskiy /--

//Оплата арендодателем

// def isPayLandlord = false;

// if(position.getContragentRealEstate() != null){

// List<RealEstateRenter> realEstateRenter = dataManager.load(RealEstateRenter)

// .query('select a from rtneo$RealEstateRenter a where a.renterRecord.id = :cr and a.payOwner = true')

// .parameter("cr", position.getContragentRealEstate().getId())

// .view('realEstateRenter-edit')

// .list()

// if(realEstateRenter.size()>0) isPayLandlord = true;

// }

def cre = position.getContragentRealEstate();

//a.kotvinskiy --/

if (CollectionUtils.isEmpty(position.getAccruals())) {

continue

}


realEstateNums = ""

realEstatePos = [:]

calculation = [:]

if (position.getCategory()!=null){

calculation['unitName'] = position.getUnit().getName()

}

if (position.getNorm()!=null){

//a.kotvinskiy /--

//calculation['norm'] = getNumber(position.getNorm(), false, true)

calculation['norm'] = getFormatNum(position.getNorm(), 4)

//a.kotvinskiy --/

}

if (position.getWasteProject()!=null){

calculation['unitName'] = 'ПНООЛР'

}

//бегаем по начислениям

BigDecimal totalVolumePosition = 0

//a.kotvinskiy /--

BigDecimal tariff = 0

//a.kotvinskiy --/

for (Accrual accrual: position.getAccruals()){

tariffNoNDS = round(getNN(accrual.getPrice())*5/6);

totalVolumePosition+=getNN(accrual.getAmountBase())

if (accrualsGroup[accrual.getPeriod()]==null){

accrualsGroup[accrual.getPeriod()] = [

'period' : getTextPeriod(accrual.getPeriod()),

'tariff': round(getNN(accrual.getPrice())*5/6),

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

//a.kotvinskiy /--

//'totalSumBaseNoNds': (getNN(accrual.getTotalSumBase().setScale(2, RoundingMode.HALF_UP))-getNN(accrual.getNdsSumBase().setScale(2, RoundingMode.HALF_UP))),

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

//a.kotvinskiy --/

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

'discount': getNN(accrual.getTotalSumBase())-getNN(accrual.getTotalSum()),

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

} else {

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

//a.kotvinskiy /--

//accrualsGroup[accrual.getPeriod()]['totalSumBaseNoNds']+=(getNN(accrual.getTotalSumBase().setScale(2, RoundingMode.HALF_UP))-getNN(accrual.getNdsSumBase().setScale(2, RoundingMode.HALF_UP)));

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

//a.kotvinskiy --/

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

accrualsGroup[accrual.getPeriod()]['discount']+=(getNN(accrual.getTotalSumBase())-getNN(accrual.getTotalSum()));

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

}

}

//a.kotvinskiy /--

//calculation['amount'] = getNumber(totalVolumePosition, false)

//calculation['calculationAmount'] = getNumber(position.getAccruals().get(0).getCalculationAmount(), false)

calculation['amount'] = getFormatNum(totalVolumePosition, 5);

calculation['calculationAmount'] = getFormatNum(position.getAccruals().get(0).getCalculationAmount(), 5);

//a.kotvinskiy --/



if (position.getContragentRealEstate()!=null && position.getContragentRealEstate().getRealEstate()){

RealEstate realEstate = position.getContragentRealEstate().getRealEstate()

realEstatePos['realEstateName'] = realEstate.getName()

realEstatePos['cadastralNumber'] = realEstate.getCadastralNumber()

realEstatePos['address'] = realEstate.getAddress()

}


def realEstatesWasteProject = [];

//бегаем по площадкам

if (position.getContainerYards()!=null){

//заполняем массив КП

for (ContractPositionContainerYard contractPositionContainerYard: position.getContainerYards()){

containerYard = contractPositionContainerYard.getContainerYard()

realEstatePos['containerYardNumber'] = containerYard.getCode();

//выдираем из проекта лимитов ОН

if (position.getWasteProject()!=null){

realEstateP = [:]

realEstateP['realEstateName'] = contractPositionContainerYard.getContragentRealEstate().getRealEstate().getName()

realEstateP['cadastralNumber'] = contractPositionContainerYard.getContragentRealEstate().getRealEstate().getCadastralNumber()

realEstateP['address'] = contractPositionContainerYard.getContragentRealEstate().getRealEstate().getAddress()

realEstateP['containerYardNumber'] = containerYard.getCode();

realEstateP['n'] = realEstates.size()+1

if (realEstateNums.length()>0){

realEstateNums+=','

}

realEstateNums+=realEstateP['n']

realEstatesWasteProject.add(contractPositionContainerYard.getContragentRealEstate().getId())

realEstates.push(realEstateP)

}


if (containersUnique.indexOf(containerYard.getId())<0){

containersUnique.push(containerYard.getId())


def containerWasteBuff = [:]

for (ContainerWaste container: containerYard.getContainers()){

String type = container.getType()?.getName() == null ? '' : container.getType().getName()

String volume = container.getType()?.getVolume() == null ? '' : getNumber(container.getType().getVolume(),false)

Integer count = container.getCount() == null ? 0 : container.getCount();


String key = type + volume


Map previous = containerWasteBuff[key]

if (previous == null) {

def current = [

'n': containers.size()+1,

'code':containerYard.getCode(),

'address':containerYard.getAddress(),

'longitude':containerYard.getLongitude(),

'latitude':containerYard.getLatitude(),

'owner': containerYard.getOwner(),

'type': type,

'volume': volume,

'count': count

]

containers.push(current)

containerWasteBuff[key] = current

} else {

previous['count'] += count

}

}

}

}

}

//добираем объекты недвижимости из ПЛООНР, для которых не найдены КП

if (position.getWasteProject() != null){

for (ContragentRealEstate cre: position.getWasteProject().getRealEstates()){

if (realEstatesWasteProject.indexOf(cre.getId())>=0){

continue;

}

realEstateP = [:]

realEstateP['realEstateName'] = cre.getRealEstate().getName()

realEstateP['cadastralNumber'] = cre.getRealEstate().getCadastralNumber()

realEstateP['address'] = cre.getRealEstate().getAddress()

realEstateP['n'] = realEstates.size()+1

if (realEstateNums.length()>0){

realEstateNums+=','

}

realEstateNums+=realEstateP['n']

realEstates.push(realEstateP)

}

}

if (realEstatePos!=[:] && position.getWasteProject() == null){

realEstatePos['n'] = realEstates.size()+1

realEstates.push(realEstatePos)

if (realEstateNums.length()>0){

realEstateNums+=','

}

realEstateNums+=realEstatePos['n']

}

calculation['n'] = realEstateNums

calculations.push(calculation)

}


//рассчет итогов

BigDecimal amountBaseAll = 0

//for (ContractPosition position: contract.getPositions()){

// amountBaseAll += position.getVolumeYear()

//}

BigDecimal amountBase = 0

BigDecimal totalSumBaseNoNds = 0

BigDecimal totalSumBase = 0

BigDecimal discount = 0

BigDecimal totalSum = 0


def accruals = []

for (item in accrualsGroup){

amountBase+=item.getValue()['amountBase']

totalSumBaseNoNds = totalSumBaseNoNds + item.getValue()['totalSumBaseNoNds'].setScale(2, RoundingMode.HALF_UP)

totalSumBase = totalSumBase + item.getValue()['totalSumBase'].setScale(2, RoundingMode.HALF_UP)

discount = discount + item.getValue()['discount'].setScale(2, RoundingMode.HALF_UP)

totalSum = totalSum + item.getValue()['totalSum'].setScale(2, RoundingMode.HALF_UP)


def accrual =[

'period' : item.getValue()['period'],

'tariff': getNumber(item.getValue()['tariff']),

//a.kotvinskiy /--

//'amountBase': getNumber(item.getValue()['amountBase'], false),

'amountBase': getFormatNum(item.getValue()['amountBase'], 5),

//a.kotvinskiy --/

'totalSumBaseNoNds': getNumber(item.getValue()['totalSumBaseNoNds']),

'totalSumBase': getNumber(item.getValue()['totalSumBase']),

'discount': getNumber(item.getValue()['discount']),

'totalSum': getNumber(item.getValue()['totalSum'])

]

accruals.push(accrual)

}


//массив итогов

def totals = [

//a.kotvinskiy /--

//'amountBaseAll' : getNumber(amountBaseAll, false),

//'amountBase' : getNumber(amountBase, false),

'amountBase' : getFormatNum(amountBase, 5),

//a.kotvinskiy --/

'totalSumBaseNoNds' : getNumber(totalSumBaseNoNds),

'totalSumBase' : getNumber(totalSumBase),

'discount' : getNumber(discount),

'totalSum' : getNumber(totalSum)

]

return [['props':props,'realEstates': realEstates, 'calculations': calculations, 'totals':totals, 'containers': containers, 'accruals': accruals]]


//получить дату словами

def getTextDate(Date date) {

def result=''

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

Calendar cal = Calendar.getInstance()

cal.setTime(date);

result = cal.get(Calendar.DAY_OF_MONTH).toString()

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

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

return result

}


//получить период словами

def getTextPeriod(Date date) {

def result=''

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

Calendar cal = Calendar.getInstance()

cal.setTime(date);

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

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

return result

}


//форматирование чисел

def getNumber(BigDecimal number, boolean money = true, boolean scale = false) {

if (number == null) {

return "-"

}

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance()

symbols.setGroupingSeparator((char) ' ')

symbols.setDecimalSeparator((char) ',')

if (money){

DecimalFormat formatter = new DecimalFormat('###,###.00', symbols)

String result = formatter.format(number);

return result.startsWith(",") ? "0" + result : result;

} else {

//Временное решение чтобы, вывести норматив. 4 знака после запятой

if(scale){

DecimalFormat formatter = new DecimalFormat('###,###.####', symbols)

return formatter.format(number);

}else{

DecimalFormat formatter = new DecimalFormat('###,###.###', symbols)

return formatter.format(number);

}


}

}

//a.kotvinskiy /--

//Временное решение, по формату отображения нулей после запятой

def getFormatNum(BigDecimal number, int s, boolean money = false){

if (number == null) {

return "-"

}

String formatString = '';


DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance()

symbols.setGroupingSeparator((char) ' ')

symbols.setDecimalSeparator((char) ',')


switch(s){

case 1:

formatString = '###,###,###.#';

break;

case 2:

formatString = '###,###,###.##';

break;

case 3:

formatString = '###,###,###.###';

break;

case 4:

formatString = '###,###,###.####';

break;

case 5:

formatString = '###,###,###.######';

break;

}

DecimalFormat formatter = new DecimalFormat(formatString, symbols);

String result = formatter.format(number);

return result.startsWith(",") ? "0" + result : result;

}

//a.kotvinskiy --/


def getShortFio(String fio) {

if (fio == null) return ""

String pattern = '(\\S+\\s)(\\S{1})\\S+\\s(\\S{1})\\S+'

String str = fio.replaceAll(pattern, '$1$2.$3.')

return str

}


def round(BigDecimal sum){

return sum == null ? BigDecimal.ZERO : sum.setScale(2, RoundingMode.HALF_UP);

}


def getContragentType(Contragent contragent) {

String name = contragent.getName();

if (name == null){

name = contragent.getShortName();

}

String inn = contragent.getInn();

ContragentType type = contragent.getType();


if (!StringUtils.isEmpty(name)) {

name = name.toLowerCase().trim();

if (name.startsWith("ип ") || name.endsWith(" ип") ||

name.contains(" ип ") ||

name.contains("инд.предп.") ||

name.contains("индивидуальный предприниматель")) {

type = ContragentType.INDIVIDUAL;

}

}


return type;

}


def getNN(BigDecimal value) {

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

}

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