wip mifosx-97 allow 'id' criteria for audit and makerchecker search + wip mifosx-270 audit/makerchecker api docs

This commit is contained in:
John Woodlock
2013-04-04 18:57:03 +01:00
parent da12288024
commit 0ade90b70c
3 changed files with 429 additions and 26 deletions
+346 -7
View File
@@ -1035,6 +1035,46 @@
<td><a href="#configs_codes_codevalues_update">Update a Code Value</a></td> <td><a href="#configs_codes_codevalues_update">Update a Code Value</a></td>
<td><a href="#configs_codes_codevalues_delete">Delete a Code Value</a></td> <td><a href="#configs_codes_codevalues_delete">Delete a Code Value</a></td>
</tr> </tr>
<tr>
<td><a href="#audits">Audits</a></td>
<td>audits</td>
<td></td>
<td><a href="#audits_list">List Audits</a></td>
<td></td>
<td></td>
</tr>
<tr class="alt">
<td></td>
<td>audits/{auditId}</td>
<td></td>
<td><a href="#audits_retrieve">Retrieve an Audit Entry</a></td>
<td></td>
<td></td>
</tr>
<tr>
<td><a href="#makercheckers">Makercheckers</a></td>
<td>makercheckers</td>
<td></td>
<td><a href="#makercheckers_list">List Maker Checker Entries</a></td>
<td></td>
<td></td>
</tr>
<tr class="alt">
<td></td>
<td>makercheckers/{auditId}</td>
<td></td>
<td></td>
<td></td>
<td><a href="#makercheckers_delete">Delete Maker Checker Entry</a></td>
</tr>
<tr>
<td></td>
<td>makercheckers/{auditId}?command=approve</td>
<td><a href="#makercheckers_approve">Approve Maker Checker Entry</a></td>
<td></td>
<td></td>
<td></td>
</tr>
</table> </table>
</div> </div>
</div> </div>
@@ -7010,18 +7050,277 @@ Content-Type: application/json
</div> </div>
<!-- Funds starts here--> <!-- Audit starts here -->
<a id="funds" name="funds" class="old-syle-anchor">&nbsp;</a> <a id="audits" name="audits" class="old-syle-anchor">&nbsp;</a>
<div class="method-section"> <div class="method-section">
<div class="method-description"> <div class="method-description">
<h3>Funds</h3> <h3>Audits</h3>
<p>Simple implementation of funds. At present funds can <p>
optionally be associated with a Loan.</p> <p />
<p>This information can then be used to produce reports on
loans/loan amounts drawn from a fund.</p>
</div> </div>
</div> </div>
<a id="audits_list" name="audits_list"
class="old-syle-anchor">&nbsp;</a>
<div class="method-section">
<div class="method-description">
<h4>List Audits</h4>
<p></p>
<p>Example Requests:</p>
<div class=apiClick>audits</div>
</div>
<div class="method-example">
<code class="method-declaration">
GET https://DomainName/api/v1/audits
</code>
<code class="method-response">
[
{
"id": 671,
"actionName": "PERMISSIONS",
"entityName": "ROLE",
"resourceId": 6,
"maker": "keithwoodlock",
"madeOnDate": 1365014262000,
"processingResult": "processed"
},
{
"id": 670,
"actionName": "CREATE",
"entityName": "CLIENTNOTE",
"resourceId": 287,
"maker": "keithwoodlock",
"madeOnDate": 1365014204000,
"processingResult": "awaiting.approval",
"officeName": "my office",
"clientName": "gg ggg"
},
{
"id": 668,
"actionName": "UPDATE",
"entityName": "PERMISSION",
"maker": "keithwoodlock",
"madeOnDate": 1365014186000,
"processingResult": "processed"
},
{
"id": 667,
"actionName": "CREATE",
"entityName": "CLIENTNOTE",
"resourceId": 286,
"maker": "keithwoodlock",
"madeOnDate": 1365014169000,
"processingResult": "processed",
"officeName": "my office name",
"clientName": "gg ggg"
},
{
"id": 666,
"actionName": "CREATE",
"entityName": "CLIENT",
"resourceId": 363,
"maker": "keithwoodlock",
"madeOnDate": 1365012843000,
"processingResult": "awaiting.approval",
"officeName": "my office name"
},
{
"id": 657,
"actionName": "CREATE",
"entityName": "CLIENT",
"resourceId": 362,
"maker": "ii",
"madeOnDate": 1364953928000,
"checker": "ii",
"checkedOnDate": 1365010060000,
"processingResult": "processed",
"officeName": "my office name",
"clientName": "gg ggg"
},
{
"id": 645,
"actionName": "CREATE",
"entityName": "LOAN",
"resourceId": 373,
"maker": "keithwoodlock",
"madeOnDate": 1364860260000,
"checker": "keithwoodlock",
"checkedOnDate": 1364861222000,
"processingResult": "processed",
"officeName": "another office",
"clientName": "another client",
"loanAccountNo": "000000373"
},...
]
</code>
</div>
</div>
<a id="audits_searchtemplate" name="audits_searchtemplate"
class="old-syle-anchor">&nbsp;</a>
<div class="method-section">
<div class="method-description">
<h4>Audit Search Template</h4>
<p>This is a convenience resource. It can be useful when
building an Audit Search UI. "appUsers" are data scoped to
the office/branch the requestor is associated with.
</p>
<p>Example Requests:</p>
<div class=apiClick>audits/searchtemplate</div>
<div class=apiClick>audits/searchtemplate?fields=actionNames</div>
</div>
<div class="method-example">
<code class="method-declaration">
GET https://DomainName/api/v1/audits/searchtemplate
</code>
<code class="method-response">
{
"appUsers": [
{
"id": 30,
"username": "user 1"
},
{
"id": 28,
"username": "user 2"
},
{
"id": 35,
"username": "user 3"
},...
],
"actionNames": [
"CREATE",
"DELETE",
"UPDATE",
"ACTIVATE",
"ADJUST",
"APPROVALUNDO",
"APPROVE",
"APPROVEINPAST",
"BULKREASSIGN",
"CALCULATEINTEREST",
"CLOSE",
"CLOSEASRESCHEDULED",
"CREATEHISTORIC",
"DEPOSIT",
"DEREGISTER",
"DISBURSALUNDO",
"DISBURSE",
"DISBURSEINPAST",
"INTEREST",
"PERMISSIONS",
"REGISTER",
"REJECT",...
],
"entityNames": [
"CALENDAR",
"CENTER",
"CHARGE",
"CLIENT",
"CLIENTIDENTIFIER",
"CLIENTIMAGE",
"CLIENTNOTE",
"CODE",
"CODEVALUE",
"COLLATERAL",
"CONFIGURATION",
"CURRENCY",
"DATATABLE",
"DEPOSITACCOUNT",
"DEPOSITNOTE",
"DEPOSITPRODUCT",
"DOCUMENT",
"FUND",
"GLACCOUNT",
"GLCLOSURE",
"GROUP",
"GROUPNOTE",...
],
"processingResults": [
{
"id": 0,
"processingResult": "invalid"
},
{
"id": 1,
"processingResult": "processed"
},
{
"id": 2,
"processingResult": "awaiting.approval"
},
{
"id": 3,
"processingResult": "rejected"
}
]
}
</code>
</div>
</div>
<a id="makercheckers_searchtemplate" name="makercheckers_searchtemplate"
class="old-syle-anchor">&nbsp;</a>
<div class="method-section">
<div class="method-description">
<h4>Maker Checker Search Template</h4>
<p>This is a convenience resource. It can be useful when
building a Checker Inbox UI. "appUsers" are data scoped to
the office/branch the requestor is associated with.
"actionNames" and "entityNames" returned are those that the
requestor has Checker approval permissions for.
</p>
<p>Example Requests:</p>
<div class=apiClick>makercheckers/searchtemplate</div>
<div class=apiClick>makercheckers/searchtemplate?fields=entityNames</div>
</div>
<div class="method-example">
<code class="method-declaration">
GET https://DomainName/api/v1/audits/searchtemplate
</code>
<code class="method-response">
{
"appUsers": [
{
"id": 30,
"username": "user 1"
},
{
"id": 28,
"username": "user 2"
},
{
"id": 35,
"username": "user 3"
},...
],
"actionNames": [
"CREATE",
"DELETE",
"UPDATE",
"ACTIVATE",
"ADJUST",
"APPROVALUNDO",
"APPROVE",...
],
"entityNames": [
"CALENDAR",
"CENTER",
"CHARGE",
"CLIENT",
"CLIENTIDENTIFIER",...
]
}
</code>
</div>
</div>
<!-- Fund starts here -->
<a id="funds_create" name="funds_create" class="old-syle-anchor">&nbsp;</a> <a id="funds_create" name="funds_create" class="old-syle-anchor">&nbsp;</a>
<div class="method-section"> <div class="method-section">
<div class="method-description"> <div class="method-description">
@@ -12686,6 +12985,46 @@ GET https://DomainName/api/v1/search?query=000000111
<td><a href="#configs_codes_codevalues_update">Update a Code Value</a></td> <td><a href="#configs_codes_codevalues_update">Update a Code Value</a></td>
<td><a href="#configs_codes_codevalues_delete">Delete a Code Value</a></td> <td><a href="#configs_codes_codevalues_delete">Delete a Code Value</a></td>
</tr> </tr>
<tr>
<td><a href="#audits">Audits</a></td>
<td>audits</td>
<td></td>
<td><a href="#audits_list">List Audits</a></td>
<td></td>
<td></td>
</tr>
<tr class="alt">
<td></td>
<td>audits/{auditId}</td>
<td></td>
<td><a href="#audits_retrieve">Retrieve an Audit Entry</a></td>
<td></td>
<td></td>
</tr>
<tr>
<td><a href="#makercheckers">Makercheckers</a></td>
<td>makercheckers</td>
<td></td>
<td><a href="#makercheckers_list">List Maker Checker Entries</a></td>
<td></td>
<td></td>
</tr>
<tr class="alt">
<td></td>
<td>makercheckers/{auditId}</td>
<td></td>
<td></td>
<td></td>
<td><a href="#makercheckers_delete">Delete Maker Checker Entry</a></td>
</tr>
<tr>
<td></td>
<td>makercheckers/{auditId}?command=approve</td>
<td><a href="#makercheckers_approve">Approve Maker Checker Entry</a></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr class="alt"> <tr class="alt">
<td><a href="#funds">Funds</a></td> <td><a href="#funds">Funds</a></td>
<td>funds</td> <td>funds</td>
@@ -39,9 +39,11 @@ import org.springframework.stereotype.Component;
public class AuditsApiResource { public class AuditsApiResource {
private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<String>( private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<String>(
Arrays.asList("id", "actionName", "entityName", "resourceId", "subresourceId", Arrays.asList("id", "actionName", "entityName", "resourceId",
"maker", "madeOnDate", "checker", "checkedOnDate", "processingResult", "subresourceId", "maker", "madeOnDate", "checker",
"commandAsJson", "officeName", "groupLevelName", "groupName", "clientName", "loanAccountNo", "savingsAccountNo")); "checkedOnDate", "processingResult", "commandAsJson",
"officeName", "groupLevelName", "groupName", "clientName",
"loanAccountNo", "savingsAccountNo"));
private final String resourceNameForPermissions = "AUDIT"; private final String resourceNameForPermissions = "AUDIT";
@@ -79,14 +81,21 @@ public class AuditsApiResource {
@QueryParam("checkerId") final Long checkerId, @QueryParam("checkerId") final Long checkerId,
@QueryParam("checkerDateTimeFrom") final String checkerDateTimeFrom, @QueryParam("checkerDateTimeFrom") final String checkerDateTimeFrom,
@QueryParam("checkerDateTimeTo") final String checkerDateTimeTo, @QueryParam("checkerDateTimeTo") final String checkerDateTimeTo,
@QueryParam("processingResult") final Integer processingResult) { @QueryParam("processingResult") final Integer processingResult,
@QueryParam("officeId") final Integer officeId,
@QueryParam("groupId") final Integer groupId,
@QueryParam("clientId") final Integer clientId,
@QueryParam("loanid") final Integer loanId,
@QueryParam("savingsAccountId") final Integer savingsAccountId) {
context.authenticatedUser().validateHasReadPermission( context.authenticatedUser().validateHasReadPermission(
resourceNameForPermissions); resourceNameForPermissions);
final String extraCriteria = getExtraCriteria(actionName, entityName, final String extraCriteria = getExtraCriteria(actionName, entityName,
resourceId, makerId, makerDateTimeFrom, makerDateTimeTo, resourceId, makerId, makerDateTimeFrom, makerDateTimeTo,
checkerId, checkerDateTimeFrom, checkerDateTimeTo, processingResult); checkerId, checkerDateTimeFrom, checkerDateTimeTo,
processingResult, officeId, groupId, clientId, loanId,
savingsAccountId);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper
.process(uriInfo.getQueryParameters()); .process(uriInfo.getQueryParameters());
@@ -133,7 +142,8 @@ public class AuditsApiResource {
.retrieveSearchTemplate("audit"); .retrieveSearchTemplate("audit");
final Set<String> RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE = new HashSet<String>( final Set<String> RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE = new HashSet<String>(
Arrays.asList("appUsers", "actionNames", "entityNames", "processingResults")); Arrays.asList("appUsers", "actionNames", "entityNames",
"processingResults"));
return this.toApiJsonSerializerSearchTemplate.serialize(settings, return this.toApiJsonSerializerSearchTemplate.serialize(settings,
auditSearchData, RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE); auditSearchData, RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE);
@@ -143,7 +153,10 @@ public class AuditsApiResource {
final String entityName, final Long resourceId, final Long makerId, final String entityName, final Long resourceId, final Long makerId,
final String makerDateTimeFrom, final String makerDateTimeTo, final String makerDateTimeFrom, final String makerDateTimeTo,
final Long checkerId, final String checkerDateTimeFrom, final Long checkerId, final String checkerDateTimeFrom,
final String checkerDateTimeTo, final Integer processingResult) { final String checkerDateTimeTo, final Integer processingResult,
final Integer officeId, final Integer groupId,
final Integer clientId, final Integer loanId,
final Integer savingsAccountId) {
String extraCriteria = ""; String extraCriteria = "";
@@ -183,7 +196,28 @@ public class AuditsApiResource {
} }
if (processingResult != null) { if (processingResult != null) {
extraCriteria += " and aud.processing_result_enum = " + processingResult; extraCriteria += " and aud.processing_result_enum = "
+ processingResult;
}
if (officeId != null) {
extraCriteria += " and aud.office_id = " + officeId;
}
if (groupId != null) {
extraCriteria += " and aud.group_id = " + groupId;
}
if (clientId != null) {
extraCriteria += " and aud.client_id = " + clientId;
}
if (loanId != null) {
extraCriteria += " and aud.loan_id = " + loanId;
}
if (savingsAccountId != null) {
extraCriteria += " and aud.savings_account_id = " + savingsAccountId;
} }
if (StringUtils.isNotBlank(extraCriteria)) { if (StringUtils.isNotBlank(extraCriteria)) {
@@ -87,13 +87,19 @@ public class MakercheckersApiResource {
@QueryParam("resourceId") final Long resourceId, @QueryParam("resourceId") final Long resourceId,
@QueryParam("makerId") final Long makerId, @QueryParam("makerId") final Long makerId,
@QueryParam("makerDateTimeFrom") final String makerDateTimeFrom, @QueryParam("makerDateTimeFrom") final String makerDateTimeFrom,
@QueryParam("makerDateTimeTo") final String makerDateTimeTo) { @QueryParam("makerDateTimeTo") final String makerDateTimeTo,
@QueryParam("officeId") final Integer officeId,
@QueryParam("groupId") final Integer groupId,
@QueryParam("clientId") final Integer clientId,
@QueryParam("loanid") final Integer loanId,
@QueryParam("savingsAccountId") final Integer savingsAccountId) {
context.authenticatedUser().validateHasReadPermission( context.authenticatedUser().validateHasReadPermission(
resourceNameForPermissions); resourceNameForPermissions);
final String extraCriteria = getExtraCriteria(actionName, entityName, final String extraCriteria = getExtraCriteria(actionName, entityName,
resourceId, makerId, makerDateTimeFrom, makerDateTimeTo); resourceId, makerId, makerDateTimeFrom, makerDateTimeTo,
officeId, groupId, clientId, loanId, savingsAccountId);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper
.process(uriInfo.getQueryParameters()); .process(uriInfo.getQueryParameters());
@@ -129,16 +135,16 @@ public class MakercheckersApiResource {
} }
@POST @POST
@Path("{commandId}") @Path("{auditId}")
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
public String approveMakerCheckerEntry( public String approveMakerCheckerEntry(
@PathParam("commandId") final Long commandId, @PathParam("auditId") final Long auditId,
@QueryParam("command") final String commandParam) { @QueryParam("command") final String commandParam) {
CommandProcessingResult result = null; CommandProcessingResult result = null;
if (is(commandParam, "approve")) { if (is(commandParam, "approve")) {
result = this.writePlatformService.approveEntry(commandId); result = this.writePlatformService.approveEntry(auditId);
} else { } else {
throw new UnrecognizedQueryParamException("command", commandParam); throw new UnrecognizedQueryParamException("command", commandParam);
} }
@@ -152,13 +158,13 @@ public class MakercheckersApiResource {
} }
@DELETE @DELETE
@Path("{commandId}") @Path("{auditId}")
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
public String deleteMakerCheckerEntry( public String deleteMakerCheckerEntry(
@PathParam("commandId") final Long commandId) { @PathParam("auditId") final Long auditId) {
final Long id = this.writePlatformService.deleteEntry(commandId); final Long id = this.writePlatformService.deleteEntry(auditId);
return this.toApiJsonSerializer.serialize(CommandProcessingResult return this.toApiJsonSerializer.serialize(CommandProcessingResult
.commandOnlyResult(id)); .commandOnlyResult(id));
@@ -166,7 +172,10 @@ public class MakercheckersApiResource {
private String getExtraCriteria(final String actionName, private String getExtraCriteria(final String actionName,
final String entityName, final Long resourceId, final Long makerId, final String entityName, final Long resourceId, final Long makerId,
final String makerDateTimeFrom, final String makerDateTimeTo) { final String makerDateTimeFrom, final String makerDateTimeTo,
final Integer officeId, final Integer groupId,
final Integer clientId, final Integer loanId,
final Integer savingsAccountId) {
String extraCriteria = ""; String extraCriteria = "";
@@ -194,6 +203,27 @@ public class MakercheckersApiResource {
+ ApiParameterHelper.sqlEncodeString(makerDateTimeTo); + ApiParameterHelper.sqlEncodeString(makerDateTimeTo);
} }
if (officeId != null) {
extraCriteria += " and aud.office_id = " + officeId;
}
if (groupId != null) {
extraCriteria += " and aud.group_id = " + groupId;
}
if (clientId != null) {
extraCriteria += " and aud.client_id = " + clientId;
}
if (loanId != null) {
extraCriteria += " and aud.loan_id = " + loanId;
}
if (savingsAccountId != null) {
extraCriteria += " and aud.savings_account_id = "
+ savingsAccountId;
}
if (StringUtils.isNotBlank(extraCriteria)) { if (StringUtils.isNotBlank(extraCriteria)) {
extraCriteria = extraCriteria.substring(4); extraCriteria = extraCriteria.substring(4);
} }