|
|||||||
GroovyReport_SupplementaryRefactoring
Время создания: 02.10.2019 15:36
Раздел: INFO - JOB - CUBA - GroovyScripts
Запись: wwwlir/Tetra/master/base/1570001764ik39oguxse/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 params = [:] def contract = dataManager.load(Contract.class).id(UUID.fromString('b5b3e6bd-3599-06ff-bd34-1a216aff3188')).view('contract-print').optional().orElse(null) //def contract = dataManager.reload(params['contract'],'contract-print') def props = fillProps(contract); //позиции по договору def units = []; def realEstates = []; def calculations = []; //контейнерные площадки def containers = []; def containersUnique = []; // def accrualsGroup = new TreeMap<>(); //заполняем позиции for (ContractPosition position: contract.getPositions()){ //a.kotvinskiy /-- //Оплата арендодателем def isPayLandlord = checkPayLandlord(position); //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': tariffNoNDS, 'amountBase': getNN(accrual.getAmountBase()), //a.kotvinskiy /-- 'amountBaseMinus': isPayLandlord?BigDecimal.ZERO:getNN(accrual.getAmountBase()), //'totalSumBaseNoNds': isPayLandlord?BigDecimal.ZERO:(getNN(accrual.getTotalSumBase().setScale(2, RoundingMode.HALF_UP))-getNN(accrual.getNdsSumBase().setScale(2, RoundingMode.HALF_UP))), 'totalSumBaseNoNds': isPayLandlord?BigDecimal.ZERO:(getNN(accrual.getAmountBase())*tariffNoNDS), //a.kotvinskiy --/ 'totalSumBase': isPayLandlord?BigDecimal.ZERO:getNN(accrual.getTotalSumBase()), 'discount': getNN(accrual.getTotalSumBase())-getNN(accrual.getTotalSum()), 'totalSum': isPayLandlord?BigDecimal.ZERO:getNN(accrual.getTotalSum())] } else { accrualsGroup[accrual.getPeriod()]['amountBase']+=getNN(accrual.getAmountBase()); //a.kotvinskiy /-- accrualsGroup[accrual.getPeriod()]['amountBaseMinus']+=isPayLandlord?BigDecimal.ZERO:getNN(accrual.getAmountBase()); //accrualsGroup[accrual.getPeriod()]['totalSumBaseNoNds']+=isPayLandlord?BigDecimal.ZERO:(getNN(accrual.getTotalSumBase().setScale(2, RoundingMode.HALF_UP))-getNN(accrual.getNdsSumBase().setScale(2, RoundingMode.HALF_UP))); accrualsGroup[accrual.getPeriod()]['totalSumBaseNoNds']+=isPayLandlord?BigDecimal.ZERO:(getNN(accrual.getAmountBase())*tariffNoNDS); //a.kotvinskiy --/ accrualsGroup[accrual.getPeriod()]['totalSumBase']+=isPayLandlord?BigDecimal.ZERO:getNN(accrual.getTotalSumBase()); accrualsGroup[accrual.getPeriod()]['discount']+=(getNN(accrual.getTotalSumBase())-getNN(accrual.getTotalSum())); accrualsGroup[accrual.getPeriod()]['totalSum']+=isPayLandlord?BigDecimal.ZERO: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){ //amountBaseAll+=item.getValue()['amountBase'] amountBase+=item.getValue()['amountBaseMinus'] 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()['amountBaseMinus'], false), 'amountBase': getFormatNum(item.getValue()['amountBaseMinus'], 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), 'amountBaseAll' : getFormatNum(amountBaseAll, 5), 'amountBase' : getFormatNum(amountBase > amountBaseAll ? amountBaseAll : amountBase, 5), //a.kotvinskiy --/ 'totalSumBaseNoNds' : getNumber(totalSumBaseNoNds), 'totalSumBase' : getNumber(totalSumBase), 'discount' : getNumber(discount), 'totalSum' : getNumber(totalSum) ] log.debug(totals) return [['props':props,'realEstates': realEstates, 'calculations': calculations, 'totals':totals, 'containers': containers, 'accruals': accruals]] //============================================================================== def fillProps(Contract contract){
def companyService = AppBeans.get(CompanyService.NAME) def bankDataService = AppBeans.get(BankDataSupplierService.NAME)
def params = [:];////////////////////////////////////////////////////////////////////////////////////////////////////////////////Закомментировать //Получаем реквизиты компании, действующие на момент даты договора 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' } return props; } //============================================================================== def checkPayLandlord(ContractPosition position){ 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; } return isPayLandlord; } //получить дату словами 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; } |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|