|
|||||||
Объединение договоров
Время создания: 10.12.2020 00:29
Раздел: INFO - JOB - rtneo - Работа над задачами
Запись: wwwlir/Tetra/master/base/16075313988tmzi295jf/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
import com.haulmont.cuba.core.global.* import com.groupstp.rtneo.entity.* import com.groupstp.rtneo.service.* import java.text.SimpleDateFormat import java.util.* import com.haulmont.cuba.core.global.ViewRepository; import java.util.stream.Collectors import java.util.function.* import com.groupstp.rtneo.core.bean.calculation.* helper = AppBeans.get(CalculationWorkerHelper.class) ViewRepository vRep = AppBeans.get(ViewRepository.class) df = new SimpleDateFormat("yyy-MM-dd"); View cpView = vRep.getView(ContractPosition.class, "_minimal") .addProperty("contract", vRep.getView(Contract.class, "_minimal") .addProperty("mainContract", vRep.getView(Contract.class, "_minimal")) .addProperty("number") ) .addProperty("contragent", vRep.getView(Contragent.class, "_minimal") .addProperty("personalAccount") ) .addProperty("contragentRealEstate", vRep.getView(ContragentRealEstate.class, "_minimal") .addProperty("contragent", vRep.getView(Contragent.class, "_minimal")) .addProperty("realEstate", vRep.getView(RealEstate.class, "_minimal") .addProperty("cadastralNumber") ) .addProperty("validityFrom") .addProperty("validityTo") ) def i=0 List<ContractPosition> cpList = dataManager.load(ContractPosition.class) .query('select cp from rtneo$ContractPosition cp join rtneo$EntityesTemporarySet t on cp.contract.id = t.entityId where t.setName = \'ContractForSeparation\' and (select count(rr) from rtneo$RealEstateRenter rr where rr.contragentRealEstate.contragent.id = cp.contragent.id) = 0 order by cp.contragent, cp.contract') // .query('select cp from rtneo$ContractPosition cp where cp.contract.contragent.id = \'0361f8b0-b3dd-1c6a-5ab7-9f061e240fe6\'') // .query('select cp from rtneo$ContractPosition cp where cp.contract.createdBy = \'a.kotvinskiy@groupstp.ru\' and cp.contract.createTs > \'2020-10-01\' and (select count(cp1.id) from rtneo$ContractPosition cp1 where cp1.contract.id = cp.contract.id)>1 order by cp.contragent.id') .view(cpView) .firstResult(i*1000) .maxResults(1000) .list() //_2(cpList) def groupCp = cpList.stream().collect(Collectors.groupingBy({p-> p.getContragent()}, Collectors.groupingBy({p-> p.getContragentRealEstate()}, Collectors.groupingBy({p-> getValidityFrom(p)}, Collectors.groupingBy({p-> p.getContract()}) ) ) ) ) //_(groupCp) _("*********************") //groupCp.each{_(it)} //["contractDate" : contractDate, "contractFrom" : contractFrom, "contractTo" : contractTo] //["contractFrom" : contractFrom, "contractDate" : contractDate, "positions", positions] List<ContractPosition> cp = new ArrayList<>() HashMap<Date, List<ContractPosition>> cpMap = new HashMap<>() HashMap<Contragent, HashMap<Date, ContractTemp>> contractsTemp = new HashMap<>() Contragent contragent; for(def contragentIt : groupCp.entrySet()){
HashMap<Date, ContractTemp> tempMap = new HashMap<>() _2("----------------------------------") contragent = contragentIt.getKey() _2(contragent.getPersonalAccount())
//Количество основных договоров у контрагента def contractCount = cpList.stream().filter{e -> e.getContragent().getId().equals(contragent.getId())}.map{e -> e.getContract()}.filter{e -> e.getMainContract() == null}.distinct().count() _2("Contracts count = ${contractCount}\n")
ContragentRealEstate realEstate for(def realEstateIt : contragentIt.getValue().entrySet()){ realEstate = realEstateIt.getKey() _2("\t"+realEstate.getRealEstate().getCadastralNumber())
Date validityFrom for(def validityFromIt : realEstateIt.getValue().entrySet()){ validityFrom = validityFromIt.getKey() _2("\t"+"\t"+df.format(validityFrom))
// validityFrom - это период, начало месяца tempMap.putIfAbsent(validityFrom, new ContractTemp()) tempMap.get(validityFrom).contragent = contragent tempMap.get(validityFrom).validityFrom = validityFrom
Contract contract for(def contractIt : validityFromIt.getValue().entrySet()){ contract = contractIt.getKey() _2("\t"+"\t"+"\t"+contract.getNumber()) _2("\t"+"\t"+"\t"+"\t"+contractIt.getValue())
for(def cpIt : contractIt.getValue()){ // Date vFrom = cpIt.getContragentRealEstate().getValidityFrom()
_2("\t"+"\t"+"\t"+"\t"+"\t"+"${cpIt.getContragentRealEstate().getValidityFrom()} - ${cpIt.getContragentRealEstate().getValidityTo()}")
Predicate<ContractPosition> pred = {e -> e.getContragent().getId().equals(contragent.getId()) && e.getContragentRealEstate().getRealEstate().getId().equals(realEstate.getId()) // && e.getContragentRealEstate().getOwnType().equals(TypeOwnership.RENT) } //Убрать контрагентов с оплатами if(!cpIt.getContragent().getId().equals(cpIt.getContragentRealEstate().getContragent().getId())){ // def fil = cpList.stream() // .filter{e -> pred.test(e)} // .map{e -> getValidityFrom(e)} // .sorted() // .findFirst().orElse(null) //// _("Is fil ${fil} ${cpIt.getContragentRealEstate().getValidityFrom()}") // validityFrom = getValidityFrom(fil) _("Renter!!!") } if(contract.getMainContract() == null){ tempMap.get(validityFrom).cpMainList.add(cpIt) }else{ tempMap.get(validityFrom).cpSuppList.add(cpIt) }
} } } } // tempMap.each{_(it.getValue().show())} // contractsTemp.putIfAbsent(contragent, new HashMap<Date, ContractTemp>()) //Исключаем контрагента если у него был один договор, и после разбиения у него все равно остается один договор. Значит он был правильный. if(contractCount == 1 && tempMap.size() == 1)continue contractsTemp.put(contragent, tempMap) } _(contractsTemp.size()) contractsTemp.each{ _("---------------------------------") it.getValue().each{_(it.getValue().show())} _("\n")} def count = 0 //for(def c1 : contractsTemp.entrySet()){ //// log.debug("${c1.getKey()} - ${c1.getValue().size()} : ${c1.getValue().size() > 1 ? 'OK' : 'FAL'}") // if(c1.getValue().size() > 1){ // count++ // _2("*********${c1.getKey()}***********") // for(def c2 : c1.getValue().entrySet()){ // _2(c2.getKey()) // _2(c2.getValue().show()) //// createContract(c1.getKey(), c2.getValue()) // // } // List<Contract> toRemove = dataManager.load(Contract.class) // .query('select c from rtneo$Contract c where size(c.positions) = 0 and c.contragent.id = :contragent_id') // .parameter('contragent_id', c1.getKey().getId()) // .view('_local') // .list() //// toRemove.each{dataManager.remove(it)} // } //} log.debug(count) def createContract(Contragent contragent, ContractTemp temp){ ContractCreatorService creator = AppBeans.get(ContractCreatorService.class) CommitContext contract_ctx = new CommitContext() Date from = temp.validityFrom // Date date = temp.date Date date = temp.cpMainList.stream().map{e -> e.getContragentRealEstate().getValidityFrom() == null ? df.parse("2019-01-01") : e.getContragentRealEstate().getValidityFrom()}.sorted().findFirst().orElse(null) date = getContractDate(date) _2(date) // if(date == null)date = from Contract contract = metadata.create(Contract.class) contract.setContragent(contragent) contract.setCompany(dataManager.getReference(Company.class, UUID.fromString("59794512-fe76-2699-f41e-a1948a94bbe7"))) contract.setDate(date) contract.setFrom(from) contract.setBefore(getEndYear(date)) contract.setNumber(creator.createContractNumber()) contract.setAccepted(true) contract.setPositions(temp.cpMainList)
contract_ctx.addInstanceToCommit(contract) temp.cpMainList.stream().peek{e -> e.setContract(contract)}.forEach{e -> contract_ctx.addInstanceToCommit(e)} dataManager.commit(contract_ctx)
List<Accrual> accruals = dataManager.load(Accrual.class) .query('select a from rtneo$Accrual a where a.contractPosition.contract.id = :contract_id') .parameter('contract_id', contract.getId()) .view("_local") .list() def groupAccrual = accruals.stream().collect(Collectors.groupingBy({p -> p.getPeriod()}))
CommitContext ctx = new CommitContext() for(def periodAcc : groupAccrual.entrySet()){ _(periodAcc.getKey()) _(periodAcc.getValue()) int number = helper.getNextAccrualNumber() for(def accrual : periodAcc.getValue()){ _(accrual.getDocumentNumber()) accrual.setDocumentNumber(number) ctx.addInstanceToCommit(accrual) } } dataManager.commit(ctx)
CommitContext contract_supp_ctx = new CommitContext() // Date from = temp.validityFrom // Date date = temp.date Date dateSupp = temp.cpSuppList.stream().map{e -> e.getContragentRealEstate().getValidityFrom() == null || e.getContragentRealEstate().getValidityFrom() < df.parse("2019-06-30") ? df.parse("2019-06-30") : e.getContragentRealEstate().getValidityFrom()}.sorted().findFirst().orElse(null) dateSupp = getContractDate(dateSupp) _2(dateSupp) // if(date == null)date = from Contract contractSupp = metadata.create(Contract.class) contractSupp.setContragent(contragent) contractSupp.setMainContract(contract) contractSupp.setCompany(dataManager.getReference(Company.class, UUID.fromString("59794512-fe76-2699-f41e-a1948a94bbe7"))) contractSupp.setDate(dateSupp) contractSupp.setFrom(from) contractSupp.setBefore(getEndYear(dateSupp)) contractSupp.setNumber(creator.createContractNumber()) contractSupp.setAccepted(true) contractSupp.setPositions(temp.cpSuppList) contractSupp.setTemplate('MSG310820')
contract_supp_ctx.addInstanceToCommit(contractSupp) temp.cpSuppList.stream().peek{e -> e.setContract(contractSupp)}.forEach{e -> contract_supp_ctx.addInstanceToCommit(e)} dataManager.commit(contract_supp_ctx)
List<Accrual> accrualsSupp = dataManager.load(Accrual.class) .query('select a from rtneo$Accrual a where a.contractPosition.contract.id = :contract_id') .parameter('contract_id', contractSupp.getId()) .view("_local") .list() def groupAccrualSupp = accrualsSupp.stream().collect(Collectors.groupingBy({p -> p.getPeriod()}))
CommitContext ctxSupp = new CommitContext() for(def periodAcc : groupAccrualSupp.entrySet()){ _(periodAcc.getKey()) _(periodAcc.getValue()) int number = helper.getNextAccrualNumber() for(def accrual : periodAcc.getValue()){ _(accrual.getDocumentNumber()) accrual.setDocumentNumber(number) ctxSupp.addInstanceToCommit(accrual) } } dataManager.commit(ctxSupp) } class ContractTemp{ Contragent contragent Contract contract List<ContractPosition> cpMainList = new ArrayList<>() List<ContractPosition> cpSuppList = new ArrayList<>() Date date Date validityFrom Date validityTo
String show(){ SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy"); Function<ContractPosition, Object> func = {e -> return e.getContragentRealEstate().getValidityFrom() == null ? null: df.format(e.getContragentRealEstate().getValidityFrom()) }
StringBuilder str = new StringBuilder() str.append("\ncontragent - ${contragent}") str.append("\ndate - ${df.format(validityFrom)}") str.append("\n\ncpMainList - ${cpMainList}") cpMainList.each{str.append("\n${func.apply(it)} : ${it.getContragentRealEstate().getRealEstate().getCadastralNumber()}")} str.append("\n\ncpSuppList - ${cpSuppList}") cpSuppList.each{str.append("\n${func.apply(it)} : ${it.getContragentRealEstate().getRealEstate().getCadastralNumber()}")} return str.toString() } } Date getValidityFrom(ContractPosition p){ return getValidityFrom(p.getContragentRealEstate().getValidityFrom()) } Date getValidityFrom(Date date){ Date validityNN = date == null ? df.parse('2019-01-01') : date if(validityNN.compareTo(df.parse('2019-01-01'))<= 0) validityNN = df.parse('2019-01-01') return getFirstDateDay(validityNN) } Date getContractDate(Date date){ Date validityNN = date == null ? df.parse('2019-01-01') : date if(validityNN.compareTo(df.parse('2019-01-01'))<= 0) validityNN = df.parse('2019-01-01') return validityNN } Date getFirstDateDay(Date date){ Calendar cal = Calendar.getInstance() cal.setTime(date) cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH)); return cal.getTime() } Date getEndYear(Date date){ Calendar cal = Calendar.getInstance() cal.setTime(date) cal.set(Calendar.MONTH, 11); cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); return cal.getTime() } /** * Логирование */ import com.haulmont.cuba.core.app.serialization.EntitySerializationAPI; import com.groupstp.rtneo.util.JsonUtil; import java.text.DateFormat; import java.text.SimpleDateFormat; private _2(Object obj, String... options){ // _(obj, options) } 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 log2(Object obj){log.debug(obj)} private log(Object obj){ log.result.append("${obj}\n") } |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|