Нумераторы (настройка системы ТЕЗИС)

В разделе описаны часто используемые скрипты при создании и настройки нумераторов.

Нумератор для присвоения номера дополнительного соглашения

Пример скрипта для создания нумератора, который присваивает номера дополнительного соглашения по следующему правилу: номер_основания-порядковый_номер.

import com.haulmont.cuba.core.app.DataService
import com.haulmont.cuba.core.global.LoadContext
import com.haulmont.thesis.core.entity.Doc
import com.haulmont.thesis.core.entity.DocOfficeData
DataService dataService= com.haulmont.cuba.core.Locator.lookup(DataService.NAME);
String numPrefix = "";
 
if(binding.variables.containsKey("docOfficeData")) {
 com.haulmont.thesis.core.entity.OfficeFile officeFile = ((DocOfficeData)binding.getProperty("docOfficeData")).getOfficeFile();
 if (officeFile && officeFile.getNomenclature().getIndex() != null && officeFile.getNomenclature().getIndex() != "") {
 numPrefix = officeFile.getNomenclature().getIndex() + "-"
 }
}
 
LoadContext ctx = new LoadContext(Doc.class);
Doc parent = binding.getVariable("entity").getParentCard();
String parentNumber = parent.getNumber();
 
ctx.setQueryString("""select doc1 from df\$Doc doc1 where doc1.docKind.id=:docKindId
 and doc1.parentCard.id=:parentCardId and doc1.parentCard is not null and doc1.id<>:exclId""");
 ctx.getQuery().setParameter("docKindId",binding.getVariable("entity").getDocKind())
 .setParameter("parentCardId",binding.getVariable("entity").getParentCard())
 .setParameter("exclId",binding.getVariable("entity").getId());
 
List<Doc> docs = dataService.loadList(ctx);
String number = null;
 
if (number==null)
 number=numPrefix+(docs.size()+1).toString().padLeft(5, "0");
 
return parentNumber+"-"+number;

Нумератор для договоров

Пример скрипта создания нумератора для договоров вида MM/YY/NNNN/codeDepart - docKindCode/docCategoryCode.

import com.haulmont.cuba.core.app.UniqueNumbersAPI
import com.haulmont.cuba.core.global.AppBeans
import com.haulmont.cuba.core.global.PersistenceHelper
import com.haulmont.cuba.core.global.TimeSource
import com.haulmont.thesis.core.entity.Department
import com.haulmont.thesis.core.entity.Doc
import com.haulmont.thesis.core.entity.DocCategory
 
import java.text.DecimalFormat
import java.text.SimpleDateFormat
 
EntityManager em = AppBeans.get(Persistence.class).getEntityManager();
UniqueNumbersAPI uniqueNumbersAPI = AppBeans.get(UniqueNumbersAPI.NAME);
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("MM/yy")
SimpleDateFormat sdfY = new SimpleDateFormat("yyyy")
calendar.setTime(AppBeans.get(TimeSource.class).currentTimestamp());
StringBuilder result = new StringBuilder()
String year = sdfY.format(AppBeans.get(TimeSource.class).currentTimestamp());
Doc doc = doc;
if (doc && !PersistenceHelper.isNew(doc))
    doc = em.find(Doc.class, doc.id);
//DocCategory docCategory = doc.docCategory;
//Department department = doc.getDepartment();
String seqName = 'doc_contarct_numerator' + "_" + year;
String date = sdf.format(AppBeans.get(TimeSource.class).currentTimestamp());
result.append(date)
        .append("/")
        .append(new DecimalFormat("0000").format(uniqueNumbersAPI.getNextNumber(seqName)))
        .append("/");
 
if(doc.department!=null)
    result.append(doc.department.code ? doc.department.code.substring(0, 1) : '');
 
result.append(" - ");
result.append(doc.docKind?.code ? doc.docKind.code.substring(0, 1) : '')
        .append(" / ")
if(doc.docCategory!=null)
    result.append(doc.docCategory.code ? doc.docCategory.code.substring(0, 1) : '');
 
return result.toString();

Нумератор по первой букве фамилии

Пример скрипта для создания нумератора входящих писем, для которых номер строится следующим образом: берется первая буква фамилии обратившегося (в системе ТЕЗИС для этого подойдет поле “Отправитель”) и добавляется порядковый номер внутри списка поступивших документов с такой же первой буквой, т.е. нумерация не сквозная, а только внутри одинаковых букв.

Например: поступила жалоба от условного Петрова, ей присваивается номер “П-1”, далее поступила жалоба от Павлова - номер “П-2”, далее жалоба от Иванова - номер “И-1”, далее жалоба от Пронина - номер “П-3”, далее жалоба от Сидорова - номер “С-1” и т.д.

Для нумератора входящих документов можно использовать скрипт ниже:

import com.haulmont.cuba.core.EntityManager
import com.haulmont.cuba.core.Persistence
Calendar calendar = Calendar.getInstance()
def un = com.haulmont.cuba.core.Locator.lookup("cuba_UniqueNumbers")
String numPrefix = ""
String nameCorr=""
String seqNum="zpz"
 
if(binding.variables.containsKey("docOfficeData")) {
    com.haulmont.thesis.core.entity.Correspondent correspondent = docOfficeData.getSender()
    if (correspondent && correspondent.getName()){
    nameCorr+=correspondent.getName()
    numPrefix+=nameCorr.substring(0,1)+"-"
    seqNum+=nameCorr.substring(0,1)+"_"+Calendar.getInstance().get(Calendar.YEAR)
    }
}
 
return numPrefix +String.valueOf( un.getNextNumber(seqNum))

Если нумерация для исходящих должна быть сквозной внутри одной буквы, как и для входящих, то можно использовать скрипт ниже:

Calendar calendar = Calendar.getInstance()
def un = com.haulmont.cuba.core.Locator.lookup("cuba_UniqueNumbers")
String numPrefix = ""
String nameCorr=""
String seqNum="zpz_outcome_"
 
if(binding.variables.containsKey("docOfficeData")) {
    com.haulmont.thesis.core.entity.Correspondent correspondent = docOfficeData.getResponseToDoc().getDocOfficeData().getSender()
    if (correspondent && correspondent.getName()){
    nameCorr+=correspondent.getName()
    numPrefix+=nameCorr.substring(0,1)+"-"
    seqNum+=nameCorr.substring(0,1)+"_"+Calendar.getInstance().get(Calendar.YEAR)
    }
}

Нумератор по категории

import com.haulmont.cuba.core.EntityManager
import com.haulmont.cuba.core.Persistence
import com.haulmont.cuba.core.app.UniqueNumbersAPI
import com.haulmont.cuba.core.global.AppBeans
import com.haulmont.cuba.core.global.PersistenceHelper
import com.haulmont.cuba.core.global.TimeSource
import com.haulmont.thesis.core.entity.Doc
import com.haulmont.thesis.core.entity.DocCategory
import java.text.DecimalFormat
 
EntityManager em = AppBeans.get(Persistence.class).getEntityManager();
UniqueNumbersAPI uniqueNumbersAPI = AppBeans.get(UniqueNumbersAPI.NAME);
Calendar calendar = Calendar.getInstance();
calendar.setTime(AppBeans.get(TimeSource.class).currentTimestamp());
String result = ''
 
Doc doc = doc;
if(doc && !PersistenceHelper.isNew(doc))
doc = em.find(Doc.class, doc.id);
DocCategory docCategory = doc.docCategory;
if (docCategory) {
String seqName = 'doc_category_numerator' + doc.docCategory.id.toString().replaceAll('-', '_');
result += (doc.docCategory.code ?: '') + new DecimalFormat("0000").format(uniqueNumbersAPI.getNextNumber(seqName));
}
 
return result;

Нумератор для регистрации по индексу

Пример скрипта для присвоения номера при регистрации по следующим правилам:
Если индекс дела не равен «181-06» или «181-07» или «181-08», то регистрационный номер = «Индекс дела» + «-» + «Порядковый номер в пределах года для данного дела» + «-» + «Год»;
Если индекс дела равен «181-07», то регистрационный номер = «Порядковый номер в пределах года для данного дела» + «/к»;
Если индекс дела равен «181-06» или «181-08», то регистрационный номер = «Порядковый номер в пределах года для данного дела».

import com.haulmont.cuba.core.app.UniqueNumbersService
import com.haulmont.cuba.core.global.AppBeans
import com.haulmont.thesis.core.entity.OfficeFile
import org.apache.commons.lang.StringUtils
 
Calendar calendar = Calendar.getInstance()
UniqueNumbersService un = AppBeans.get(UniqueNumbersService.NAME)
 
String index = ""
String domain = "mk_"
 
if (binding.variables.containsKey("docOfficeData")) {
    OfficeFile officeFile = docOfficeData.getOfficeFile()
    if (officeFile && StringUtils.isNotEmpty(officeFile.getNomenclature().getIndex())) {
        index = officeFile.getNomenclature().getIndex()
        domain = domain + index.replaceAll("\\W", "_") + String.valueOf(calendar.get(Calendar.YEAR))
        if ("181-06".equals(index) || "181-08".equals(index)) {
            return String.valueOf(un.getNextNumber(domain)).padLeft(1, "0")
        } else if ("181-07".equals(index)) {
        return String.valueOf(un.getNextNumber(domain)).padLeft(1, "0") + "/к"
        }
    }
}
return index + "-" + String.valueOf(un.getNextNumber(domain)).padLeft(1, "0") + "-" + String.valueOf(calendar.get(Calendar.YEAR))