В разделе описаны часто используемые скрипты при создании и настройки нумераторов.
Нумератор для присвоения номера дополнительного соглашения
Пример скрипта для создания нумератора, который присваивает номера дополнительного соглашения по следующему правилу: номер_основания-порядковый_номер.
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))