Skip to content

Commit

Permalink
Manufacturing Issue/Receipt: show BOM line attributes if any #319
Browse files Browse the repository at this point in the history
  • Loading branch information
teosarca committed Apr 25, 2017
1 parent bb6ed12 commit 77a06a2
Show file tree
Hide file tree
Showing 20 changed files with 382 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private HUDocumentView(final Builder builder)
final HUDocumentViewAttributesProvider attributesProvider = builder.getAttributesProviderOrNull();
if (attributesProvider != null)
{
final DocumentId attributesKey = DocumentId.of(huId);
final DocumentId attributesKey = attributesProvider.createAttributeKey(huId);
attributesSupplier = () -> attributesProvider.getAttributes(documentId, attributesKey);
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import de.metas.ui.web.window.datatypes.json.JSONDocumentChangedEvent;
import de.metas.ui.web.window.datatypes.json.JSONDocumentField;
import de.metas.ui.web.window.datatypes.json.JSONLayoutWidgetType;
import de.metas.ui.web.window.datatypes.json.JSONOptions;
import de.metas.ui.web.window.descriptor.DocumentFieldWidgetType;
import de.metas.ui.web.window.exceptions.DocumentFieldReadonlyException;
import de.metas.ui.web.window.model.IDocumentChangesCollector;
Expand Down Expand Up @@ -147,7 +148,7 @@ public DocumentPath getDocumentPath()
}

@Override
public JSONDocumentViewAttributes toJSONDocument()
public JSONDocumentViewAttributes toJSONDocument(final JSONOptions jsonOpts_NOTUSED)
{
final JSONDocumentViewAttributes jsonDocument = new JSONDocumentViewAttributes(documentPath);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ public HUDocumentViewAttributesProvider()
{
super();
}

public DocumentId createAttributeKey(final int huId)
{
return DocumentId.of(huId);
}

@Override
public HUDocumentViewAttributes getAttributes(final DocumentId viewRowId, final DocumentId huId)
Expand All @@ -83,7 +88,7 @@ private HUDocumentViewAttributes createDocumentViewAttributes(final DocumentView

final DocumentId documentTypeId = DocumentId.of(huId);
final DocumentId viewRowId = key.getViewRowId();
final DocumentPath documentPath = DocumentPath.rootDocumentPath(DocumentType.HUAttributes, documentTypeId, viewRowId);
final DocumentPath documentPath = DocumentPath.rootDocumentPath(DocumentType.ViewRecordAttributes, documentTypeId, viewRowId);

final boolean readonly = !X_M_HU.HUSTATUS_Planning.equals(hu.getHUStatus()); // readonly if not Planning, see https://github.com/metasfresh/metasfresh-webui-api/issues/314

Expand Down
16 changes: 8 additions & 8 deletions src/main/java/de/metas/ui/web/pattribute/ASIDocument.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
* #L%
*/

/* package */class ASIDocument
public class ASIDocument
{
private static final transient Logger logger = LogManager.getLogger(ASIDocument.class);

Expand Down Expand Up @@ -103,7 +103,7 @@ private final void assertNotCompleted()
}
}

public IAutoCloseable lockForReading()
IAutoCloseable lockForReading()
{
// assume _lock is not null
final ReadLock readLock = _lock.readLock();
Expand All @@ -117,7 +117,7 @@ public IAutoCloseable lockForReading()
};
}

public IAutoCloseable lockForWriting()
IAutoCloseable lockForWriting()
{
// assume _lock is not null
final WriteLock writeLock = _lock.writeLock();
Expand All @@ -137,9 +137,9 @@ public ASIDocument copy(final CopyMode copyMode)
return new ASIDocument(this, copyMode);
}

public ASIDescriptor getDescriptor()
public ASILayout getLayout()
{
return descriptor;
return descriptor.getLayout();
}

public DocumentId getDocumentId()
Expand All @@ -152,13 +152,13 @@ int getM_AttributeSet_ID()
return descriptor.getM_AttributeSet_ID();
}

public void processValueChanges(final List<JSONDocumentChangedEvent> events, final ReasonSupplier reason)
void processValueChanges(final List<JSONDocumentChangedEvent> events, final ReasonSupplier reason)
{
assertNotCompleted();
data.processValueChanges(events, reason);
}

private Collection<IDocumentFieldView> getFieldViews()
public Collection<IDocumentFieldView> getFieldViews()
{
return data.getFieldViews();
}
Expand All @@ -183,7 +183,7 @@ public boolean isCompleted()
return completed;
}

public IntegerLookupValue complete()
IntegerLookupValue complete()
{
assertNotCompleted();

Expand Down
60 changes: 50 additions & 10 deletions src/main/java/de/metas/ui/web/pattribute/ASIRepository.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package de.metas.ui.web.pattribute;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.function.Supplier;

import org.adempiere.ad.trx.api.ITrxManager;
import org.adempiere.mm.attributes.api.IAttributeDAO;
Expand Down Expand Up @@ -65,7 +65,7 @@ public class ASIRepository
@Lazy
private DocumentCollection documentsCollection;

private final AtomicInteger nextASIDocId = new AtomicInteger(1);
private final Supplier<DocumentId> nextASIDocId = DocumentId.supplier("N", 1);
private final CCache<DocumentId, ASIDocument> id2asiDoc = CCache.newLRUCache("ASIDocuments", 500, 0);

private static final String VERSION_DEFAULT = "0";
Expand All @@ -82,7 +82,7 @@ public ASIDocument createNewFrom(final JSONCreateASIRequest request)
//
// Create the new ASI document
final Document asiDocData = Document.builder(asiDescriptor.getEntityDescriptor())
.initializeAsNewDocument(nextASIDocId::getAndIncrement, VERSION_DEFAULT)
.initializeAsNewDocument(nextASIDocId, VERSION_DEFAULT)
.build();

//
Expand All @@ -107,9 +107,53 @@ public ASIDocument createNewFrom(final JSONCreateASIRequest request)
return asiDoc;
}

/**
* Retrieves {@link ASIDocument} for given ASI. The document will be readonly and not save-able.
*
* IMPORTANT: the retrieved document is not cached, so next time it will be retrieved again
*
* @param attributeSetInstanceId
* @return ASI document
*/
public ASIDocument loadReadonly(final int attributeSetInstanceId)
{
if (attributeSetInstanceId <= 0)
{
throw new EntityNotFoundException("ASI " + attributeSetInstanceId);
}

final ASIEditingInfo info = ASIEditingInfo.ofASI(attributeSetInstanceId);

//
// Get the ASI descriptor
final ASIDescriptor asiDescriptor = descriptorsFactory.getASIDescriptor(info);

//
// Create the new ASI document
final Document asiDocData = Document.builder(asiDescriptor.getEntityDescriptor())
.initializeAsNewDocument(() -> DocumentId.of(attributeSetInstanceId), VERSION_DEFAULT)
.build();

//
// If we have a template ASI, populate the ASI document from it
final MAttributeSetInstance templateASI = info.getM_AttributeSetInstance();
for (final I_M_AttributeInstance fromAI : Services.get(IAttributeDAO.class).retrieveAttributeInstances(templateASI))
{
loadASIDocumentField(asiDocData, fromAI);
}

//
// Validate, log and add the new ASI document to our index
asiDocData.checkAndGetValidStatus();
logger.trace("Created from ASI={}: {}", templateASI, asiDocData);

final ASIDocument asiDoc = new ASIDocument(asiDescriptor, asiDocData);
return asiDoc.copy(CopyMode.CheckInReadonly);
}

private ASIEditingInfo createASIEditingInfo(final JSONCreateASIRequest request)
{
final DocumentPath documentPath = request.getSource().toSingleDocumentPath();
final DocumentPath documentPath = request.getDocumentPath();

if (documentPath.getDocumentType() == DocumentType.Window)
{
Expand All @@ -125,12 +169,8 @@ private ASIEditingInfo createASIEditingInfo(final JSONCreateASIRequest request)
}
else if (documentPath.getDocumentType() == DocumentType.Process)
{
final int productId = -1;
final boolean isSOTrx = true;
final int attributeSetInstanceId = request.getTemplateId();
final String callerTableName = null;
final int callerColumnId = -1; // N/A
return ASIEditingInfo.of(productId, attributeSetInstanceId, callerTableName, callerColumnId, isSOTrx);
return ASIEditingInfo.ofASI(attributeSetInstanceId);
}
else
{
Expand All @@ -140,7 +180,7 @@ else if (documentPath.getDocumentType() == DocumentType.Process)

public ASILayout getLayout(final DocumentId asiDocId)
{
return forASIDocumentReadonly(asiDocId, asiDoc -> asiDoc.getDescriptor().getLayout());
return forASIDocumentReadonly(asiDocId, asiDoc -> asiDoc.getLayout());
}

private ASIDocument getASIDocumentNoLock(final DocumentId asiDocId)
Expand Down
24 changes: 12 additions & 12 deletions src/main/java/de/metas/ui/web/pattribute/ASIRestController.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,33 +74,33 @@ public JSONDocument createASIDocument(@RequestBody final JSONCreateASIRequest re
}

@GetMapping("/{asiDocId}/layout")
public JSONASILayout getLayout(@PathVariable("asiDocId") final int asiDocIdInt)
public JSONASILayout getLayout(@PathVariable("asiDocId") final String asiDocIdStr)
{
userSession.assertLoggedIn();

final DocumentId asiDocId = DocumentId.of(asiDocIdInt);
final DocumentId asiDocId = DocumentId.of(asiDocIdStr);
final ASILayout asiLayout = asiRepo.getLayout(asiDocId);
return JSONASILayout.of(asiLayout, newJsonOpts());
}

@GetMapping("/{asiDocId}")
public JSONDocument getASIDocument(@PathVariable("asiDocId") final int asiDocIdInt)
public JSONDocument getASIDocument(@PathVariable("asiDocId") final String asiDocIdStr)
{
userSession.assertLoggedIn();

final DocumentId asiDocId = DocumentId.of(asiDocIdInt);
final DocumentId asiDocId = DocumentId.of(asiDocIdStr);
return asiRepo.forASIDocumentReadonly(asiDocId, asiDoc -> asiDoc.toJSONDocument(newJsonOpts()));
}

@PatchMapping("/{asiDocId}")
public List<JSONDocument> processChanges(
@PathVariable("asiDocId") final int asiDocIdInt //
@PathVariable("asiDocId") final String asiDocIdStr //
, @RequestBody final List<JSONDocumentChangedEvent> events //
)
{
userSession.assertLoggedIn();

final DocumentId asiDocId = DocumentId.of(asiDocIdInt);
final DocumentId asiDocId = DocumentId.of(asiDocIdStr);

return Execution.callInNewExecution("processChanges", () -> {
asiRepo.processASIDocumentChanges(asiDocId, events);
Expand All @@ -110,37 +110,37 @@ public List<JSONDocument> processChanges(

@GetMapping("/{asiDocId}/attribute/{attributeName}/typeahead")
public JSONLookupValuesList getAttributeTypeahead(
@PathVariable("asiDocId") final int asiDocIdInt //
@PathVariable("asiDocId") final String asiDocIdStr //
, @PathVariable("attributeName") final String attributeName //
, @RequestParam(name = "query", required = true) final String query //
)
{
userSession.assertLoggedIn();

final DocumentId asiDocId = DocumentId.of(asiDocIdInt);
final DocumentId asiDocId = DocumentId.of(asiDocIdStr);
return asiRepo.forASIDocumentReadonly(asiDocId, asiDoc -> asiDoc.getFieldLookupValuesForQuery(attributeName, query))
.transform(JSONLookupValuesList::ofLookupValuesList);
}

@GetMapping("/{asiDocId}/attribute/{attributeName}/dropdown")
public JSONLookupValuesList getAttributeDropdown(
@PathVariable("asiDocId") final int asiDocIdInt //
@PathVariable("asiDocId") final String asiDocIdStr //
, @PathVariable("attributeName") final String attributeName //
)
{
userSession.assertLoggedIn();

final DocumentId asiDocId = DocumentId.of(asiDocIdInt);
final DocumentId asiDocId = DocumentId.of(asiDocIdStr);
return asiRepo.forASIDocumentReadonly(asiDocId, asiDoc -> asiDoc.getFieldLookupValues(attributeName))
.transform(JSONLookupValuesList::ofLookupValuesList);
}

@PostMapping(value = "/{asiDocId}/complete")
public JSONLookupValue complete(@PathVariable("asiDocId") final int asiDocIdInt)
public JSONLookupValue complete(@PathVariable("asiDocId") final String asiDocIdStr)
{
userSession.assertLoggedIn();

final DocumentId asiDocId = DocumentId.of(asiDocIdInt);
final DocumentId asiDocId = DocumentId.of(asiDocIdStr);

return Execution.callInNewExecution("complete", () -> asiRepo.complete(asiDocId))
.transform(JSONLookupValue::ofLookupValue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;

import de.metas.ui.web.window.datatypes.DocumentPath;
import de.metas.ui.web.window.datatypes.json.JSONDocumentPath;

/*
Expand All @@ -34,7 +35,7 @@
*/

@SuppressWarnings("serial")
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility = Visibility.NONE)
public final class JSONCreateASIRequest implements Serializable
{
@JsonProperty("templateId")
Expand Down Expand Up @@ -71,13 +72,14 @@ public int getTemplateId()
{
return templateId;
}

public JSONDocumentPath getSource()
public DocumentPath getDocumentPath()
{
if(source == null)
{
new IllegalStateException("source is not set for " + this);
}
return source;

return source.toSingleDocumentPath();
}
}
Loading

0 comments on commit 77a06a2

Please sign in to comment.