7ae7cfe8 by Ean Schuessler

Fix PartyMessages docs and add missing required param detection

- Updated PartyMessages wiki docs to emphasize partyId is required
- Added missingRequired and error fields to compact format when
  required parameters are missing
- This helps LLMs understand why a screen shows no forms/grids
1 parent 5dbeedb0
......@@ -536,24 +536,35 @@ This screen manages: Party, Person/Organization, PartyRole, PartyClassification,
Send and view messages to/from parties. Use for internal communications about orders, products, or customers.
## Required Parameter
**partyId** is required to view this screen. Always pass a party ID:
```
path: PopCommerce/PopCommerceAdmin/Party/PartyMessages/FindMessage
parameters: {partyId: "JohnSales"}
```
## Send a Message
```
action: createMessage
parameters: {
partyId: "JohnSales",
toPartyId: "JohnSales",
subject: "New product available",
body: "The green variant of DEMO_VAR is now in stock."
}
```
## Filter Messages
## View Messages for a Party
Pass `partyId` to see messages for a specific party:
```
path: PopCommerce/PopCommerceAdmin/Party/PartyMessages/FindMessage
parameters: {partyId: "JohnSales"}
```
This shows all messages to or from the specified party.
## Message Types
Messages are stored as CommunicationEvent entities with:
......@@ -564,8 +575,8 @@ Messages are stored as CommunicationEvent entities with:
## Difference from User/Messages
- **Party/PartyMessages**: Admin screen for messaging any party in the system
- **User/Messages**: User-facing screen for current user's own messages
- **Party/PartyMessages**: Admin screen for messaging any party in the system (requires partyId)
- **User/Messages**: User-facing screen for current user's own messages (no partyId needed)
Use PartyMessages when you need to send messages on behalf of the system or to parties who may not have user accounts.]]></fileData>
</moqui.resource.DbResourceFile>
......
......@@ -906,11 +906,21 @@ def convertToCompactFormat = { semanticState, targetScreenPath ->
def data = semanticState.data
def formMetadata = data?.formMetadata ?: [:]
def actions = semanticState.actions ?: []
def params = semanticState.parameters ?: [:]
def result = [
screen: targetScreenPath?.split('/')?.last() ?: "Screen"
]
// Check for missing required parameters
def missingRequired = params.findAll { name, info ->
info.required == true && info.value == null
}
if (missingRequired) {
result.missingRequired = missingRequired.keySet().toList()
result.error = "Required parameters missing: ${missingRequired.keySet().join(', ')}. Pass these parameters to view the screen."
}
// Build summary
def formCount = formMetadata.count { k, v -> v.type != "form-list" }
def listCount = formMetadata.count { k, v -> v.type == "form-list" }
......