Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 8.81 KB | None | 0 0
  1. import com.haulmont.cuba.core.global.*
  2. import com.groupstp.rtneo.entity.*
  3. import com.groupstp.rtneo.core.bean.tools.DatePeriodTools
  4. import java.text.SimpleDateFormat
  5. import com.groupstp.rtneo.core.bean.calculation.CalculationWorkerHelper
  6. import java.util.*
  7. import com.haulmont.cuba.core.global.ViewRepository;
  8. log.debug("createSupplementaryAggrements.START")
  9.  
  10. //a.kotvinskiy /--
  11. //Программное создание view
  12. ViewRepository vRep = AppBeans.get(ViewRepository.NAME)
  13.  
  14. View contractView = vRep.getView(Contract.class, "_minimal");
  15. contractView.addProperty("number");
  16. contractView.addProperty("contragent", vRep.getView(Contragent.class, "_minimal"));
  17. contractView.addProperty("positions", vRep.getView(ContractPosition.class, "_minimal"));
  18. contractView.addProperty("supplementaryAgreements", vRep.getView(Contract.class, "_minimal"));
  19.  
  20. View contractPositionView = vRep.getView(ContractPosition.class, "_minimal");
  21. contractPositionView.addProperty("relevance");
  22. contractPositionView.addProperty("volumeYear");
  23. contractPositionView.addProperty("accruals", vRep.getView(Accrual.class, "_minimal"));
  24. //a.kotvinskiy --/
  25.  
  26. //здесь, в переменную price нужно указать тариф, тестовое значение = 500
  27. //BigDecimal price = 464.8
  28. //Если contractId "", то доп генерируется для всех
  29. String contractId = "7114ec94-6d49-14d1-c66e-d98e6b77d891"
  30.  
  31. SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy")
  32. Date fromDate = format.parse("01.01.2019")
  33. Date beforeDate = format.parse("31.12.2019")
  34. Date contract_date = format.parse("01.01.2019")
  35.  
  36. DataManager dataManager = AppBeans.get(DataManager.NAME)
  37. Metadata metadata = AppBeans.get(Metadata.NAME)
  38.  
  39. String tableNameCompany = metadata.getClassNN(Company.class).getName()
  40. String tableNameContract = metadata.getClassNN(Contract.class).getName()
  41.  
  42. CommitContext commitContext = new CommitContext()
  43.  
  44. List<Company> listCompany = dataManager.load(Company.class)
  45.         .query("select comp from " + tableNameCompany + " comp")
  46.         .view("_minimal")
  47.         .list()
  48. Company company = listCompany.size() == 1 ? listCompany.get(0) : null
  49.  
  50. List<Contract> list = dataManager.load(Contract.class)
  51.         .query("select c from " + tableNameContract + " c where c.loadedFromBigTrio = true" + new StringBuilder(contractId != "" ? " and c.id = '${contractId}'" : "").toString())
  52.         .view(contractView)
  53.         .list()
  54.  
  55. log.debug("Будет обработано " + list.size() + " договоров, загруженных из BigTrio")
  56.  
  57. def numContract = 0
  58. def numContractPosition = 0
  59. def numAccrual = 0
  60. for (Contract baseContract : list) {
  61.     //if (numContract == 1)
  62.     //    break
  63.     log.debug((numContract + 1) + ") Договор № " + baseContract.getNumber())
  64.     Contragent contragent = baseContract.getContragent()
  65.  
  66.     Contract contract = new Contract()
  67.     contract.setDate(new Date())
  68.     contract.setFrom(fromDate)
  69.     contract.setBefore(beforeDate)
  70.     //a.kotvinskiy
  71.     contract.setNumber("${baseContract.getSupplementaryAgreements().size()+1}")
  72.     contract.setCompany(company)
  73.     contract.setContragent(contragent)
  74.     contract.setMainContract(baseContract)
  75.     contract.setPositions(new ArrayList<>())
  76.     commitContext.addInstanceToCommit(contract)
  77.     log.debug("Доп. соглашение $contract.id добавлено в CommitContext")
  78.     numContract = numContract + 1
  79.  
  80.     //для каждой позиции в base-договоре
  81.     for (ContractPosition baseContractPosition : baseContract.getPositions()) {
  82.         baseContractPosition = dataManager.reload(baseContractPosition, contractPositionView)
  83.         ContractPosition contractPosition = new ContractPosition()
  84.         contractPosition.setVolumeYear(baseContractPosition.getVolumeYear())
  85.         contractPosition.setPeriod(contract_date)
  86.         contractPosition.setContract(contract)
  87.         contractPosition.setRelevance(baseContractPosition.getRelevance())
  88.         contractPosition.setContragent(contragent)
  89.         contractPosition.setAccruals(new ArrayList<>())
  90.         commitContext.addInstanceToCommit(contractPosition)
  91.         log.debug("ContractPosition $contractPosition.id добавлена в CommitContext")
  92.         numContractPosition = numContractPosition + 1
  93.         contract.getPositions().add(contractPosition)
  94.  
  95.         //расчет начислений
  96.        
  97.         List<Accrual> listAccruals = calculateAccruals(fromDate,
  98.                 beforeDate,
  99.                 new Date(),
  100.                 contractPosition,
  101.                 price)
  102.         for (Accrual accrual:listAccruals)
  103.         {
  104.             commitContext.addInstanceToCommit(accrual)
  105.             log.debug("Accrual $accrual.id добавлена в CommitContext")
  106.             numAccrual = numAccrual + 1
  107.             contractPosition.getAccruals().add(accrual)
  108.         }
  109.     }
  110.     //делаем неактивным допик
  111.     //makeContractObsolete(contract, false);
  112.     //снова делаем активным последний договор
  113.     //makeContractObsolete(lastContract, true);
  114. }
  115. log.debug("Запись изменений в БД...")
  116. dataManager.commit(commitContext)
  117. log.debug("Всего создано:\nДоп.соглашений: " + numContract + "\nContractPosition: " + numContractPosition + "\nAccruals: " + numAccrual)
  118. log.debug("createSupplementaryAggrements.FINISH")
  119.  
  120.  
  121. //возвращает список начислений по переданной позици договора и указанной цене
  122. List<Accrual> calculateAccruals(Date from, Date to, Date billDate, ContractPosition position, BigDecimal price) {
  123.     DatePeriodTools datePeriodTools = AppBeans.get(DatePeriodTools.class)
  124.     CalculationWorkerHelper helper = AppBeans.get(CalculationWorkerHelper.class)
  125.     from = from == null ? new Date() : from
  126.     to = to == null ? from : to
  127.     billDate = billDate == null ? new Date() : billDate
  128.  
  129.     List<Accrual> result = new ArrayList<>()
  130.  
  131.     try {
  132.  
  133.         Calendar calendarFrom = datePeriodTools.getFirstDayOfMonth(from)
  134.         Calendar calendarTo = datePeriodTools.getFirstDayOfMonth(to)
  135.  
  136.         while ((calendarFrom.get(Calendar.YEAR) == calendarTo.get(Calendar.YEAR) &&
  137.                 calendarFrom.get(Calendar.MONTH) <= calendarTo.get(Calendar.MONTH)) ||
  138.                 (calendarFrom.get(Calendar.YEAR) < calendarTo.get(Calendar.YEAR))) {
  139.             int documentNumber = helper.getNextAccrualNumber()
  140.             Date period = calendarFrom.getTime()
  141. //Выбираем тариф в зависимости от периода
  142. price = calendarFrom.get(Calendar.MONTH)>5?464.8:435.74
  143.             Accrual accrual
  144.             try {
  145.                 accrual = calculateAverage(position, period, documentNumber, billDate, price)
  146.                 if (accrual != null)
  147.                     result.add(accrual)
  148.             } catch (Exception e) {
  149.                 log.error('не удалось создать начисление для ContractPosition: ' + position.getId())
  150.             }
  151.             calendarFrom.add(Calendar.MONTH, 1)
  152.         }
  153.     }
  154.     finally {
  155.         log.debug('Расчет начислений окончен')
  156.     }
  157.     return result
  158. }
  159.  
  160. //расчет по-среднему
  161. Accrual calculateAverage(ContractPosition position, Date period, int documentNumber, Date billDate, BigDecimal price) {
  162.     CalculationWorkerHelper helper = AppBeans.get(CalculationWorkerHelper.class)
  163.  
  164.     BigDecimal norm
  165.     if (position.getVolumeYear() != null && position.getVolumeYear() != BigDecimal.ZERO)
  166.         norm = helper.divide(position.getVolumeYear(), BigDecimal.valueOf(12))
  167.  
  168.     BigDecimal tariff = price
  169.     tariff = helper.addNdsTo(tariff)
  170.  
  171.     BigDecimal sum = helper.multiply(norm, tariff)
  172.     BigDecimal totalSum = sum
  173.     BigDecimal ndsSum = helper.getNdsFrom(sum)
  174.     //a.kotvinskiy Объем ТКО в месяц
  175.     BigDecimal amountBase = position.getVolumeYear()/12
  176.  
  177.     Accrual accrual = new Accrual()
  178.     accrual.setContractPosition(position)
  179.     accrual.setPeriod(period)
  180.     accrual.setContragent(position.getContragent())
  181.     accrual.setAmount(norm)
  182.     //a.kotvinskiy /--
  183.     // Недостающие атрибуты
  184.     accrual.setAmountBase(amountBase)
  185.     accrual.setTotalSumBase(totalSum)
  186.     accrual.setNdsSumBase(totalSum-price.multiply(amountBase))
  187.     //a.kotvinskiy --/
  188.     accrual.setPrice(tariff)
  189.     accrual.setReductionFactor(BigDecimal.ONE)
  190.     accrual.setZoneRatio(BigDecimal.ONE)
  191.     accrual.setNds(BigDecimal.valueOf(20))
  192.     accrual.setSum(sum)
  193.     accrual.setTotalSum(totalSum)
  194.     accrual.setNdsSum(ndsSum)
  195.     accrual.setComment('По-среднему')
  196.     accrual.setDebugComment('')
  197.     accrual.setDocumentNumber(documentNumber)
  198.     accrual.setDocumentDate(billDate)
  199.  
  200.     return accrual
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement