Search in sources :

Example 11 with DocumentEntityDescriptor

use of de.metas.ui.web.window.descriptor.DocumentEntityDescriptor in project metasfresh-webui-api by metasfresh.

the class DocumentDescriptorFactory method getTableRecordReference.

default TableRecordReference getTableRecordReference(final DocumentPath documentPath) {
    final DocumentEntityDescriptor rootEntityDescriptor = getDocumentEntityDescriptor(documentPath.getWindowId());
    if (documentPath.isRootDocument()) {
        final String tableName = rootEntityDescriptor.getTableName();
        final int recordId = documentPath.getDocumentId().toInt();
        return TableRecordReference.of(tableName, recordId);
    }
    final DocumentEntityDescriptor includedEntityDescriptor = rootEntityDescriptor.getIncludedEntityByDetailId(documentPath.getDetailId());
    final String tableName = includedEntityDescriptor.getTableName();
    final int recordId = documentPath.getSingleRowId().toInt();
    return TableRecordReference.of(tableName, recordId);
}
Also used : DocumentEntityDescriptor(de.metas.ui.web.window.descriptor.DocumentEntityDescriptor)

Example 12 with DocumentEntityDescriptor

use of de.metas.ui.web.window.descriptor.DocumentEntityDescriptor in project metasfresh-webui-api by metasfresh.

the class ADProcessInstancesRepository method createNewProcessInstance0.

/**
 * @param request
 * @param shadowParentDocumentEvaluatee optional shadowParentDocumentEvaluatee which will be
 * @return
 */
private IProcessInstanceController createNewProcessInstance0(@NonNull final CreateProcessInstanceRequest request, @Nullable final IDocumentEvaluatee evalCtx) {
    // 
    // Save process info together with it's parameters and get the the newly created AD_PInstance_ID
    final ProcessInfo processInfo = createProcessInfo(request);
    Services.get(IADPInstanceDAO.class).saveProcessInfo(processInfo);
    final DocumentId adPInstanceId = DocumentId.of(processInfo.getAD_PInstance_ID());
    final Object processClassInstance = processInfo.newProcessClassInstanceOrNull();
    try (final IAutoCloseable c = JavaProcess.temporaryChangeCurrentInstance(processClassInstance)) {
        // 
        // Build the parameters document
        final ProcessDescriptor processDescriptor = getProcessDescriptor(request.getProcessId());
        final DocumentEntityDescriptor parametersDescriptor = processDescriptor.getParametersDescriptor();
        final Document parametersDoc = ADProcessParametersRepository.instance.createNewParametersDocument(parametersDescriptor, adPInstanceId, evalCtx);
        final int windowNo = parametersDoc.getWindowNo();
        // Set parameters's default values
        ProcessDefaultParametersUpdater.newInstance().addDefaultParametersProvider(processClassInstance instanceof IProcessDefaultParametersProvider ? (IProcessDefaultParametersProvider) processClassInstance : null).onDefaultValue((parameter, value) -> parametersDoc.processValueChange(parameter.getColumnName(), value, () -> "default parameter value")).updateDefaultValue(parametersDoc.getFieldViews(), field -> DocumentFieldAsProcessDefaultParameter.of(windowNo, field));
        // 
        // Create (webui) process instance and add it to our internal cache.
        final ADProcessInstanceController pinstance = ADProcessInstanceController.builder().caption(processDescriptor.getCaption()).instanceId(adPInstanceId).parameters(parametersDoc).processClassInstance(processClassInstance).contextSingleDocumentPath(request.getSingleDocumentPath()).viewId(request.getViewRowIdsSelection() != null ? request.getViewRowIdsSelection().getViewId() : null).build();
        processInstances.put(adPInstanceId, pinstance.copyReadonly());
        return pinstance;
    }
}
Also used : Env(org.compiere.util.Env) Autowired(org.springframework.beans.factory.annotation.Autowired) DocumentCollection(de.metas.ui.web.window.model.DocumentCollection) ProcessDefaultParametersUpdater(de.metas.process.ProcessDefaultParametersUpdater) IProcessInstancesRepository(de.metas.ui.web.process.IProcessInstancesRepository) IView(de.metas.ui.web.view.IView) IRangeAwareParams(org.adempiere.util.api.IRangeAwareParams) ProcessDescriptor(de.metas.ui.web.process.descriptor.ProcessDescriptor) TableRecordReference(org.adempiere.util.lang.impl.TableRecordReference) ImmutableSet(com.google.common.collect.ImmutableSet) ProcessInfoBuilder(de.metas.process.ProcessInfo.ProcessInfoBuilder) NonNull(lombok.NonNull) Set(java.util.Set) JavaProcess(de.metas.process.JavaProcess) UserSession(de.metas.ui.web.session.UserSession) Services(org.adempiere.util.Services) I_AD_Process(org.compiere.model.I_AD_Process) Stream(java.util.stream.Stream) ProcessId(de.metas.ui.web.process.ProcessId) IDocumentChangesCollector(de.metas.ui.web.window.model.IDocumentChangesCollector) CacheBuilder(com.google.common.cache.CacheBuilder) IProcessInstanceController(de.metas.ui.web.process.IProcessInstanceController) IViewsRepository(de.metas.ui.web.view.IViewsRepository) ProcessInfo(de.metas.process.ProcessInfo) DocumentPath(de.metas.ui.web.window.datatypes.DocumentPath) CreateProcessInstanceRequest(de.metas.ui.web.process.CreateProcessInstanceRequest) DocumentId(de.metas.ui.web.window.datatypes.DocumentId) SqlOptions(de.metas.ui.web.window.model.sql.SqlOptions) IDocumentEvaluatee(de.metas.ui.web.window.model.IDocumentEvaluatee) Function(java.util.function.Function) NullDocumentChangesCollector(de.metas.ui.web.window.model.NullDocumentChangesCollector) Strings(com.google.common.base.Strings) SqlDocumentEntityDataBindingDescriptor(de.metas.ui.web.window.descriptor.sql.SqlDocumentEntityDataBindingDescriptor) DocumentEntityDescriptor(de.metas.ui.web.window.descriptor.DocumentEntityDescriptor) Nullable(javax.annotation.Nullable) DocumentIdsSelection(de.metas.ui.web.window.datatypes.DocumentIdsSelection) ViewRowIdsSelection(de.metas.ui.web.view.ViewRowIdsSelection) DocumentDescriptorFactory(de.metas.ui.web.window.descriptor.factory.DocumentDescriptorFactory) IUserRolePermissions(org.adempiere.ad.security.IUserRolePermissions) IADPInstanceDAO(de.metas.process.IADPInstanceDAO) IAutoCloseable(org.adempiere.util.lang.IAutoCloseable) WebuiRelatedProcessDescriptor(de.metas.ui.web.process.descriptor.WebuiRelatedProcessDescriptor) ExecutionException(java.util.concurrent.ExecutionException) TimeUnit(java.util.concurrent.TimeUnit) Component(org.springframework.stereotype.Component) AdempiereException(org.adempiere.exceptions.AdempiereException) WebuiPreconditionsContext(de.metas.ui.web.process.WebuiPreconditionsContext) Check(de.metas.printing.esb.base.util.Check) IProcessDefaultParametersProvider(de.metas.process.IProcessDefaultParametersProvider) Cache(com.google.common.cache.Cache) Document(de.metas.ui.web.window.model.Document) ViewId(de.metas.ui.web.view.ViewId) IProcessDefaultParametersProvider(de.metas.process.IProcessDefaultParametersProvider) DocumentId(de.metas.ui.web.window.datatypes.DocumentId) IAutoCloseable(org.adempiere.util.lang.IAutoCloseable) ProcessDescriptor(de.metas.ui.web.process.descriptor.ProcessDescriptor) WebuiRelatedProcessDescriptor(de.metas.ui.web.process.descriptor.WebuiRelatedProcessDescriptor) ProcessInfo(de.metas.process.ProcessInfo) IADPInstanceDAO(de.metas.process.IADPInstanceDAO) DocumentEntityDescriptor(de.metas.ui.web.window.descriptor.DocumentEntityDescriptor) Document(de.metas.ui.web.window.model.Document)

Example 13 with DocumentEntityDescriptor

use of de.metas.ui.web.window.descriptor.DocumentEntityDescriptor in project metasfresh-webui-api by metasfresh.

the class BoardDescriptorRepository method createBoardDescriptor.

private BoardDescriptor createBoardDescriptor(final int boardId) {
    // 
    // Retrieve the board PO
    final IQueryBL queryBL = Services.get(IQueryBL.class);
    final I_WEBUI_Board boardPO = queryBL.createQueryBuilderOutOfTrx(I_WEBUI_Board.class).addEqualsFilter(I_WEBUI_Board.COLUMN_WEBUI_Board_ID, boardId).addOnlyActiveRecordsFilter().create().firstOnly(I_WEBUI_Board.class);
    if (boardPO == null) {
        throw new EntityNotFoundException("No board found for ID=" + boardId);
    }
    // 
    // Board document mappings
    final String tableName = Services.get(IADTableDAO.class).retrieveTableName(boardPO.getAD_Table_ID());
    final String keyColumnName = InterfaceWrapperHelper.getKeyColumnName(tableName);
    // TODO: hardcoded
    final String userIdColumnName = "UpdatedBy";
    // 
    // Board document info
    // TODO boardPO.getAD_Window_ID();
    int adWindowId = 0;
    if (adWindowId <= 0) {
        adWindowId = RecordZoomWindowFinder.findAD_Window_ID(tableName);
    }
    final WindowId documentWindowId = WindowId.of(adWindowId);
    final DocumentEntityDescriptor documentEntityDescriptor = documentDescriptors.getDocumentEntityDescriptor(documentWindowId);
    final SqlDocumentEntityDataBindingDescriptor documentBinding = documentEntityDescriptor.getDataBinding(SqlDocumentEntityDataBindingDescriptor.class);
    final String tableAlias = documentBinding.getTableAlias();
    // 
    // Board document lookup provider
    final int adValRuleId = boardPO.getAD_Val_Rule_ID();
    final LookupDescriptorProvider documentLookupDescriptorProvider = SqlLookupDescriptor.builder().setCtxTableName(null).setCtxColumnName(keyColumnName).setDisplayType(DisplayType.Search).setWidgetType(DocumentFieldWidgetType.Lookup).setAD_Val_Rule_ID(adValRuleId).buildProvider();
    // 
    // Board descriptor
    final IModelTranslationMap boardTrlMap = InterfaceWrapperHelper.getModelTranslationMap(boardPO);
    final BoardDescriptorBuilder boardDescriptor = BoardDescriptor.builder().boardId(boardPO.getWEBUI_Board_ID()).caption(boardTrlMap.getColumnTrl(I_WEBUI_Board.COLUMNNAME_Name, boardPO.getName())).documentWindowId(documentWindowId).documentLookupDescriptorProvider(documentLookupDescriptorProvider).tableName(tableName).tableAlias(tableAlias).keyColumnName(keyColumnName).userIdColumnName(userIdColumnName).websocketEndpoint(WebSocketConfig.buildBoardTopicName(boardId));
    // Source document filters: AD_Val_Rule_ID
    if (adValRuleId > 0) {
        final IValidationRule validationRule = Services.get(IValidationRuleFactory.class).create(tableName, adValRuleId, // ctx table name
        null, // ctx column name
        null);
        final String sqlWhereClause = validationRule.getPrefilterWhereClause().evaluate(Evaluatees.ofCtx(Env.getCtx()), OnVariableNotFound.Fail);
        final DocumentFilter adValRuleFilter = DocumentFilter.builder().setFilterId("AD_Val_Rule_" + adValRuleId).addParameter(DocumentFilterParam.ofSqlWhereClause(true, sqlWhereClause)).build();
        boardDescriptor.documentFilter(adValRuleFilter);
    }
    // 
    // Lanes
    {
        queryBL.createQueryBuilderOutOfTrx(I_WEBUI_Board_Lane.class).addEqualsFilter(I_WEBUI_Board_Lane.COLUMN_WEBUI_Board_ID, boardId).addOnlyActiveRecordsFilter().orderBy().addColumn(I_WEBUI_Board_Lane.COLUMN_SeqNo).addColumn(// just have a predictable order
        I_WEBUI_Board_Lane.COLUMN_WEBUI_Board_Lane_ID).endOrderBy().create().stream(I_WEBUI_Board_Lane.class).map(this::createBoardLaneDescriptor).forEach(lane -> boardDescriptor.lane(lane.getLaneId(), lane));
    }
    // 
    // Board card fields
    {
        queryBL.createQueryBuilderOutOfTrx(I_WEBUI_Board_CardField.class).addEqualsFilter(I_WEBUI_Board_CardField.COLUMN_WEBUI_Board_ID, boardId).addOnlyActiveRecordsFilter().orderBy().addColumn(I_WEBUI_Board_CardField.COLUMN_SeqNo).addColumn(I_WEBUI_Board_CardField.COLUMN_WEBUI_Board_CardField_ID).endOrderBy().create().stream(I_WEBUI_Board_CardField.class).map(cardFieldPO -> createBoardCardFieldDescriptor(cardFieldPO, documentEntityDescriptor)).forEach(cardField -> boardDescriptor.cardFieldByFieldName(cardField.getFieldName(), cardField));
    }
    // 
    return boardDescriptor.build();
}
Also used : CCache(org.compiere.util.CCache) DBUniqueConstraintException(org.adempiere.exceptions.DBUniqueConstraintException) I_WEBUI_Board_CardField(de.metas.ui.web.base.model.I_WEBUI_Board_CardField) JSONBoardChangedEventsList(de.metas.ui.web.board.json.events.JSONBoardChangedEventsList) ITrx(org.adempiere.ad.trx.api.ITrx) Env(org.compiere.util.Env) Autowired(org.springframework.beans.factory.annotation.Autowired) JSONBoardChangedEventsListBuilder(de.metas.ui.web.board.json.events.JSONBoardChangedEventsList.JSONBoardChangedEventsListBuilder) BigDecimal(java.math.BigDecimal) IStringExpression(org.adempiere.ad.expression.api.IStringExpression) InterfaceWrapperHelper(org.adempiere.model.InterfaceWrapperHelper) ResultSet(java.sql.ResultSet) Map(java.util.Map) ToString(lombok.ToString) Repository(org.springframework.stereotype.Repository) RecordZoomWindowFinder(org.adempiere.model.RecordZoomWindowFinder) ImmutableSet(com.google.common.collect.ImmutableSet) WindowConstants(de.metas.ui.web.window.WindowConstants) ITranslatableString(de.metas.i18n.ITranslatableString) NonNull(lombok.NonNull) Collection(java.util.Collection) Set(java.util.Set) PreparedStatement(java.sql.PreparedStatement) I_WEBUI_Board_RecordAssignment(de.metas.ui.web.base.model.I_WEBUI_Board_RecordAssignment) EqualsAndHashCode(lombok.EqualsAndHashCode) ITrxManager(org.adempiere.ad.trx.api.ITrxManager) DocumentFieldDescriptor(de.metas.ui.web.window.descriptor.DocumentFieldDescriptor) DBException(org.adempiere.exceptions.DBException) Services(org.adempiere.util.Services) EntityNotFoundException(de.metas.ui.web.exceptions.EntityNotFoundException) List(java.util.List) DateTimeTranslatableString(de.metas.i18n.DateTimeTranslatableString) WebsocketSender(de.metas.ui.web.websocket.WebsocketSender) NumberTranslatableString(de.metas.i18n.NumberTranslatableString) LookupScope(de.metas.ui.web.window.descriptor.LookupDescriptorProvider.LookupScope) DocumentFieldWidgetType(de.metas.ui.web.window.descriptor.DocumentFieldWidgetType) IMsgBL(de.metas.i18n.IMsgBL) IADTableDAO(org.adempiere.ad.table.api.IADTableDAO) Joiner(com.google.common.base.Joiner) ImmutableTranslatableString(de.metas.i18n.ImmutableTranslatableString) LogManager(de.metas.logging.LogManager) I_WEBUI_Board_Lane(de.metas.ui.web.base.model.I_WEBUI_Board_Lane) BoardDescriptorBuilder(de.metas.ui.web.board.BoardDescriptor.BoardDescriptorBuilder) DocumentPath(de.metas.ui.web.window.datatypes.DocumentPath) SqlDocumentFieldDataBindingDescriptor(de.metas.ui.web.window.descriptor.sql.SqlDocumentFieldDataBindingDescriptor) DocumentId(de.metas.ui.web.window.datatypes.DocumentId) LookupDescriptorProvider(de.metas.ui.web.window.descriptor.LookupDescriptorProvider) SqlLookupDescriptor(de.metas.ui.web.window.descriptor.sql.SqlLookupDescriptor) JSONBoardLaneChangedEvent(de.metas.ui.web.board.json.events.JSONBoardLaneChangedEvent) I_WEBUI_Board(de.metas.ui.web.base.model.I_WEBUI_Board) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) SQLException(java.sql.SQLException) DB(org.compiere.util.DB) ICurrencyDAO(de.metas.currency.ICurrencyDAO) LookupDescriptor(de.metas.ui.web.window.descriptor.LookupDescriptor) ImmutableList(com.google.common.collect.ImmutableList) SqlDocumentEntityDataBindingDescriptor(de.metas.ui.web.window.descriptor.sql.SqlDocumentEntityDataBindingDescriptor) DisplayType(org.compiere.util.DisplayType) DocumentEntityDescriptor(de.metas.ui.web.window.descriptor.DocumentEntityDescriptor) DocumentFilter(de.metas.ui.web.document.filter.DocumentFilter) I_AD_User(org.compiere.model.I_AD_User) DocumentFieldValueLoader(de.metas.ui.web.window.descriptor.sql.DocumentFieldValueLoader) LinkedHashSet(java.util.LinkedHashSet) OnVariableNotFound(org.adempiere.ad.expression.api.IExpressionEvaluator.OnVariableNotFound) JSONLookupValue(de.metas.ui.web.window.datatypes.json.JSONLookupValue) LookupValue(de.metas.ui.web.window.datatypes.LookupValue) Logger(org.slf4j.Logger) BoardFieldLoader(de.metas.ui.web.board.BoardCardFieldDescriptor.BoardFieldLoader) Evaluatees(org.compiere.util.Evaluatees) DocumentDescriptorFactory(de.metas.ui.web.window.descriptor.factory.DocumentDescriptorFactory) DocumentFilterParam(de.metas.ui.web.document.filter.DocumentFilterParam) IModelTranslationMap(de.metas.i18n.IModelTranslationMap) WindowId(de.metas.ui.web.window.datatypes.WindowId) IQueryBL(org.adempiere.ad.dao.IQueryBL) Amount(de.metas.currency.Amount) Consumer(java.util.function.Consumer) NumberUtils(org.adempiere.util.NumberUtils) AdempiereException(org.adempiere.exceptions.AdempiereException) ListUtils(org.adempiere.util.collections.ListUtils) IValidationRuleFactory(org.adempiere.ad.validationRule.IValidationRuleFactory) Preconditions(com.google.common.base.Preconditions) IValidationRule(org.adempiere.ad.validationRule.IValidationRule) WebSocketConfig(de.metas.ui.web.websocket.WebSocketConfig) CompositeStringExpression(org.adempiere.ad.expression.api.impl.CompositeStringExpression) IModelTranslationMap(de.metas.i18n.IModelTranslationMap) SqlDocumentEntityDataBindingDescriptor(de.metas.ui.web.window.descriptor.sql.SqlDocumentEntityDataBindingDescriptor) EntityNotFoundException(de.metas.ui.web.exceptions.EntityNotFoundException) ToString(lombok.ToString) ITranslatableString(de.metas.i18n.ITranslatableString) DateTimeTranslatableString(de.metas.i18n.DateTimeTranslatableString) NumberTranslatableString(de.metas.i18n.NumberTranslatableString) ImmutableTranslatableString(de.metas.i18n.ImmutableTranslatableString) DocumentFilter(de.metas.ui.web.document.filter.DocumentFilter) IValidationRuleFactory(org.adempiere.ad.validationRule.IValidationRuleFactory) LookupDescriptorProvider(de.metas.ui.web.window.descriptor.LookupDescriptorProvider) IQueryBL(org.adempiere.ad.dao.IQueryBL) BoardDescriptorBuilder(de.metas.ui.web.board.BoardDescriptor.BoardDescriptorBuilder) WindowId(de.metas.ui.web.window.datatypes.WindowId) IADTableDAO(org.adempiere.ad.table.api.IADTableDAO) IValidationRule(org.adempiere.ad.validationRule.IValidationRule) I_WEBUI_Board(de.metas.ui.web.base.model.I_WEBUI_Board) I_WEBUI_Board_Lane(de.metas.ui.web.base.model.I_WEBUI_Board_Lane) I_WEBUI_Board_CardField(de.metas.ui.web.base.model.I_WEBUI_Board_CardField) DocumentEntityDescriptor(de.metas.ui.web.window.descriptor.DocumentEntityDescriptor)

Example 14 with DocumentEntityDescriptor

use of de.metas.ui.web.window.descriptor.DocumentEntityDescriptor in project metasfresh-webui-api by metasfresh.

the class ASIDescriptorFactory method createASIDescriptor.

private ASIDescriptor createASIDescriptor(final ASIEditingInfo info) {
    final DocumentId asiDescriptorId = DocumentId.ofString(info.getWindowType() + "_" + info.getM_AttributeSet_ID());
    final DocumentEntityDescriptor entityDescriptor = createDocumentEntityDescriptor(// 
    asiDescriptorId, // name
    info.getM_AttributeSet_Name(), // description
    info.getM_AttributeSet_Description(), // attributes
    info.getAvailableAttributes());
    final ASILayout layout = createLayout(asiDescriptorId, entityDescriptor);
    return ASIDescriptor.builder().setM_AttributeSet_ID(info.getM_AttributeSet_ID()).setEntityDescriptor(entityDescriptor).setLayout(layout).build();
}
Also used : DocumentId(de.metas.ui.web.window.datatypes.DocumentId) DocumentEntityDescriptor(de.metas.ui.web.window.descriptor.DocumentEntityDescriptor)

Example 15 with DocumentEntityDescriptor

use of de.metas.ui.web.window.descriptor.DocumentEntityDescriptor in project metasfresh-webui-api by metasfresh.

the class ASIDescriptorFactory method createDocumentEntityDescriptor.

private final // 
DocumentEntityDescriptor createDocumentEntityDescriptor(// 
DocumentId asiDescriptorId, // 
final String name, // 
final String description, // 
final List<MAttribute> attributes) {
    if (attributes.isEmpty()) {
        throw new AdempiereException("No attributes are configured").setParameter("asiDescriptorId", asiDescriptorId);
    }
    final DocumentEntityDescriptor.Builder attributeSetDescriptor = DocumentEntityDescriptor.builder().setDocumentType(DocumentType.ProductAttributes, asiDescriptorId).setCaption(name).setDescription(description).setDataBinding(getASIBindingsBuilder()).disableCallouts().setDetailId(null);
    for (final I_M_Attribute attribute : attributes) {
        final DocumentFieldDescriptor.Builder fieldDescriptor = createDocumentFieldDescriptor(attribute);
        attributeSetDescriptor.addField(fieldDescriptor);
    }
    return attributeSetDescriptor.build();
}
Also used : DocumentFieldDescriptor(de.metas.ui.web.window.descriptor.DocumentFieldDescriptor) AdempiereException(org.adempiere.exceptions.AdempiereException) I_M_Attribute(org.compiere.model.I_M_Attribute) DocumentEntityDescriptor(de.metas.ui.web.window.descriptor.DocumentEntityDescriptor)

Aggregations

DocumentEntityDescriptor (de.metas.ui.web.window.descriptor.DocumentEntityDescriptor)33 DocumentPath (de.metas.ui.web.window.datatypes.DocumentPath)9 WindowId (de.metas.ui.web.window.datatypes.WindowId)8 DocumentId (de.metas.ui.web.window.datatypes.DocumentId)7 ArrayList (java.util.ArrayList)5 NonNull (lombok.NonNull)5 AdempiereException (org.adempiere.exceptions.AdempiereException)5 Services (org.adempiere.util.Services)5 ImmutableList (com.google.common.collect.ImmutableList)4 IMsgBL (de.metas.i18n.IMsgBL)4 ProcessId (de.metas.ui.web.process.ProcessId)4 QuickInputLayoutDescriptor (de.metas.ui.web.quickinput.QuickInputLayoutDescriptor)4 ViewId (de.metas.ui.web.view.ViewId)4 SqlDocumentEntityDataBindingDescriptor (de.metas.ui.web.window.descriptor.sql.SqlDocumentEntityDataBindingDescriptor)4 Document (de.metas.ui.web.window.model.Document)4 List (java.util.List)4 Env (org.compiere.util.Env)4 ITranslatableString (de.metas.i18n.ITranslatableString)3 SourceDocument (de.metas.letters.model.MADBoilerPlate.SourceDocument)3 EntityNotFoundException (de.metas.ui.web.exceptions.EntityNotFoundException)3