Commit a77349db47513526b94783bac07f75c308c828ce
1 parent
d92c249e
Exists in
master
and in
1 other branch
Integrated SEI-BROKER_HM #66 (from Jenkins)
http://ansprsvn01.ans.gov.br/03_ARQUITETURA/projetos/sei-broker/Fontes/branches/branch_homologacao@2115
Showing
10 changed files
with
564 additions
and
21 deletions
Show diff stats
pom.xml
@@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
4 | <modelVersion>4.0.0</modelVersion> | 4 | <modelVersion>4.0.0</modelVersion> |
5 | <groupId>br.gov.ans</groupId> | 5 | <groupId>br.gov.ans</groupId> |
6 | <artifactId>sei-broker</artifactId> | 6 | <artifactId>sei-broker</artifactId> |
7 | - <version>2.4.1</version> | 7 | + <version>2.4.2</version> |
8 | <packaging>war</packaging> | 8 | <packaging>war</packaging> |
9 | <name>sei-broker</name> | 9 | <name>sei-broker</name> |
10 | <description>Projeto demonstrativo de webservice Rest</description> | 10 | <description>Projeto demonstrativo de webservice Rest</description> |
src/main/java/br/gov/ans/integracao/sei/dao/DocumentoDAO.java
@@ -84,7 +84,7 @@ public class DocumentoDAO { | @@ -84,7 +84,7 @@ public class DocumentoDAO { | ||
84 | parametros.put("codigoTipo", codigoTipo); | 84 | parametros.put("codigoTipo", codigoTipo); |
85 | } | 85 | } |
86 | 86 | ||
87 | - builder.append("GROUP BY numero "); | 87 | + builder.append("GROUP BY pr.protocolo_formatado_pesquisa "); |
88 | 88 | ||
89 | if(orderByProcesso){ | 89 | if(orderByProcesso){ |
90 | builder.append("ORDER BY processo "); | 90 | builder.append("ORDER BY processo "); |
@@ -102,6 +102,7 @@ public class DocumentoDAO { | @@ -102,6 +102,7 @@ public class DocumentoDAO { | ||
102 | 102 | ||
103 | setPaginacaoQuery(query, pagina, qtdRegistros); | 103 | setPaginacaoQuery(query, pagina, qtdRegistros); |
104 | 104 | ||
105 | + @SuppressWarnings("unchecked") | ||
105 | List<Object[]> results = query.getResultList(); | 106 | List<Object[]> results = query.getResultList(); |
106 | 107 | ||
107 | List<DocumentoResumido> documentos = new ArrayList<DocumentoResumido>(); | 108 | List<DocumentoResumido> documentos = new ArrayList<DocumentoResumido>(); |
@@ -152,7 +153,8 @@ public class DocumentoDAO { | @@ -152,7 +153,8 @@ public class DocumentoDAO { | ||
152 | } | 153 | } |
153 | 154 | ||
154 | @SuppressWarnings("unchecked") | 155 | @SuppressWarnings("unchecked") |
155 | - public List<DocumentoResumido> getDocumentosProcesso(String idProcedimento, String codigoTipo, String origem, boolean somenteAssinados){ | 156 | + public List<DocumentoResumido> getDocumentosProcesso(String idProcedimento, String codigoTipo, String origem, boolean somenteAssinados, |
157 | + Integer pagina, Integer qtdRegistros){ | ||
156 | HashMap<String, Object> parametros = new HashMap<String, Object>(); | 158 | HashMap<String, Object> parametros = new HashMap<String, Object>(); |
157 | 159 | ||
158 | StringBuilder builder = new StringBuilder("SELECT pr.protocolo_formatado_pesquisa numero, s.nome tipoNome, s.id_serie tipoCodigo, d.numero numeroInformado, "); | 160 | StringBuilder builder = new StringBuilder("SELECT pr.protocolo_formatado_pesquisa numero, s.nome tipoNome, s.id_serie tipoCodigo, d.numero numeroInformado, "); |
@@ -183,11 +185,12 @@ public class DocumentoDAO { | @@ -183,11 +185,12 @@ public class DocumentoDAO { | ||
183 | parametros.put("origem", origem); | 185 | parametros.put("origem", origem); |
184 | } | 186 | } |
185 | 187 | ||
186 | - builder.append("GROUP BY numero ORDER BY pr.dta_geracao ASC"); | 188 | + builder.append("GROUP BY pr.protocolo_formatado_pesquisa ORDER BY pr.dta_geracao, pr.protocolo_formatado_pesquisa ASC"); |
187 | 189 | ||
188 | Query query = em.createNativeQuery(builder.toString(), "DocumentoResumidoMapping"); | 190 | Query query = em.createNativeQuery(builder.toString(), "DocumentoResumidoMapping"); |
189 | 191 | ||
190 | setQueryParameters(query, parametros); | 192 | setQueryParameters(query, parametros); |
193 | + setPaginacaoQuery(query, pagina, qtdRegistros); | ||
191 | 194 | ||
192 | List<Object[]> results = null; | 195 | List<Object[]> results = null; |
193 | List<DocumentoResumido> documentos = new ArrayList<DocumentoResumido>(); | 196 | List<DocumentoResumido> documentos = new ArrayList<DocumentoResumido>(); |
@@ -205,5 +208,69 @@ public class DocumentoDAO { | @@ -205,5 +208,69 @@ public class DocumentoDAO { | ||
205 | 208 | ||
206 | return documentos; | 209 | return documentos; |
207 | } | 210 | } |
211 | + | ||
212 | + public Long countDocumentosProcesso(String idProcedimento, String codigoTipo, String origem, boolean somenteAssinados){ | ||
213 | + HashMap<String, Object> parametros = new HashMap<String, Object>(); | ||
214 | + | ||
215 | + StringBuilder builder = new StringBuilder("SELECT count(pr.protocolo_formatado_pesquisa) "); | ||
216 | + builder.append("FROM documento AS d "); | ||
217 | + | ||
218 | + if(somenteAssinados){ | ||
219 | + builder.append("RIGHT JOIN assinatura AS a ON d.id_documento = a.id_documento "); | ||
220 | + }else{ | ||
221 | + builder.append("LEFT JOIN assinatura AS a ON d.id_documento = a.id_documento "); | ||
222 | + } | ||
223 | + | ||
224 | + builder.append("JOIN protocolo AS pr ON pr.id_protocolo = d.id_documento "); | ||
225 | + builder.append("JOIN serie AS s ON d.id_serie = s.id_serie "); | ||
226 | + builder.append("WHERE d.id_procedimento = :idProcedimento "); | ||
208 | 227 | ||
228 | + parametros.put("idProcedimento", idProcedimento); | ||
229 | + | ||
230 | + if(StringUtils.isNotBlank(codigoTipo)){ | ||
231 | + builder.append("AND s.id_serie in (:codigoTipo) "); | ||
232 | + parametros.put("codigoTipo", codigoTipo); | ||
233 | + } | ||
234 | + | ||
235 | + if(StringUtils.isNotBlank(origem)){ | ||
236 | + builder.append("AND pr.sta_protocolo = :origem "); | ||
237 | + parametros.put("origem", origem); | ||
238 | + } | ||
239 | + | ||
240 | + Query query = em.createNativeQuery(builder.toString()); | ||
241 | + | ||
242 | + setQueryParameters(query, parametros); | ||
243 | + | ||
244 | + try{ | ||
245 | + return Long.valueOf(query.getSingleResult().toString()); | ||
246 | + }catch(NoResultException ex){ | ||
247 | + return 0L; | ||
248 | + } | ||
249 | + } | ||
250 | + | ||
251 | + public DocumentoResumido getDocumentoProcesso(String idProcedimento, String documento){ | ||
252 | + HashMap<String, Object> parametros = new HashMap<String, Object>(); | ||
253 | + | ||
254 | + StringBuilder builder = new StringBuilder("SELECT pr.protocolo_formatado_pesquisa numero, s.nome tipoNome, s.id_serie tipoCodigo, d.numero numeroInformado, "); | ||
255 | + builder.append("CASE pr.sta_protocolo WHEN 'G' THEN 'GERADO' ELSE 'RECEBIDO' END origem, d.id_tipo_conferencia tipoConferencia, "); | ||
256 | + builder.append("pr.dta_geracao dataGeracao, null as processo, null as unidade, "); | ||
257 | + builder.append("CASE WHEN a.id_assinatura is null THEN false ELSE true END assinado "); | ||
258 | + builder.append("FROM documento AS d "); | ||
259 | + builder.append("LEFT JOIN assinatura AS a ON d.id_documento = a.id_documento "); | ||
260 | + builder.append("JOIN protocolo AS pr ON pr.id_protocolo = d.id_documento "); | ||
261 | + builder.append("JOIN serie AS s ON d.id_serie = s.id_serie "); | ||
262 | + builder.append("WHERE d.id_procedimento = :idProcedimento "); | ||
263 | + builder.append("AND pr.protocolo_formatado_pesquisa = :documento "); | ||
264 | + | ||
265 | + parametros.put("idProcedimento", idProcedimento); | ||
266 | + parametros.put("documento", documento); | ||
267 | + | ||
268 | + Query query = em.createNativeQuery(builder.toString(), "DocumentoResumidoMapping"); | ||
269 | + | ||
270 | + setQueryParameters(query, parametros); | ||
271 | + | ||
272 | + Object result = query.getSingleResult(); | ||
273 | + | ||
274 | + return (DocumentoResumido) ((Object[]) result)[0]; | ||
275 | + } | ||
209 | } | 276 | } |
src/main/java/br/gov/ans/integracao/sei/dao/SiparDAO.java
@@ -56,7 +56,10 @@ public class SiparDAO { | @@ -56,7 +56,10 @@ public class SiparDAO { | ||
56 | + "WHERE " | 56 | + "WHERE " |
57 | + "TR.DT_RECEBIMENTO IS NULL " | 57 | + "TR.DT_RECEBIMENTO IS NULL " |
58 | + "AND TR.CO_DOCUMENTO = :numero " | 58 | + "AND TR.CO_DOCUMENTO = :numero " |
59 | - + "AND TR.NU_ANO_DOCUMENTO = :ano "; | 59 | + + "AND TR.NU_ANO_DOCUMENTO = :ano " |
60 | + + "AND TR.DT_ENVIO = (" | ||
61 | + + " SELECT MAX(TR2.DT_ENVIO) FROM DBPSIPAR.TB_TRAMITACAO TR2 WHERE TR2.CO_DOCUMENTO = :numero AND TR2.NU_ANO_DOCUMENTO = :ano" | ||
62 | + + ")"; | ||
60 | 63 | ||
61 | Query query = em.createNativeQuery(sql); | 64 | Query query = em.createNativeQuery(sql); |
62 | query.setParameter("numero", numero); | 65 | query.setParameter("numero", numero); |
src/main/java/br/gov/ans/integracao/sei/rest/ProcessoResource.java
@@ -51,6 +51,7 @@ import br.gov.ans.integracao.sei.dao.ProcessoDAO; | @@ -51,6 +51,7 @@ import br.gov.ans.integracao.sei.dao.ProcessoDAO; | ||
51 | import br.gov.ans.integracao.sei.dao.SiparDAO; | 51 | import br.gov.ans.integracao.sei.dao.SiparDAO; |
52 | import br.gov.ans.integracao.sei.modelo.DocumentoResumido; | 52 | import br.gov.ans.integracao.sei.modelo.DocumentoResumido; |
53 | import br.gov.ans.integracao.sei.modelo.EnvioDeProcesso; | 53 | import br.gov.ans.integracao.sei.modelo.EnvioDeProcesso; |
54 | +import br.gov.ans.integracao.sei.modelo.InclusaoDocumento; | ||
54 | import br.gov.ans.integracao.sei.modelo.Motivo; | 55 | import br.gov.ans.integracao.sei.modelo.Motivo; |
55 | import br.gov.ans.integracao.sei.modelo.NovoAndamento; | 56 | import br.gov.ans.integracao.sei.modelo.NovoAndamento; |
56 | import br.gov.ans.integracao.sei.modelo.NovoProcesso; | 57 | import br.gov.ans.integracao.sei.modelo.NovoProcesso; |
@@ -1165,6 +1166,8 @@ public class ProcessoResource { | @@ -1165,6 +1166,8 @@ public class ProcessoResource { | ||
1165 | * @apiParam (Query Parameters) {String} [tipo=null] Identificador do tipo do documento, caso seja necessário filtrar pelo tipo | 1166 | * @apiParam (Query Parameters) {String} [tipo=null] Identificador do tipo do documento, caso seja necessário filtrar pelo tipo |
1166 | * @apiParam (Query Parameters) {String = "G (gerado/interno), R (recebido/externo)"} [origem=null] Filtra os documentos por gerados ou recebidos | 1167 | * @apiParam (Query Parameters) {String = "G (gerado/interno), R (recebido/externo)"} [origem=null] Filtra os documentos por gerados ou recebidos |
1167 | * @apiParam (Query Parameters) {boolean} [somenteAssinados=false] Exibir somente documentos assinados | 1168 | * @apiParam (Query Parameters) {boolean} [somenteAssinados=false] Exibir somente documentos assinados |
1169 | + * @apiParam (Query Parameters) {String} [pagina=1] Número da página | ||
1170 | + * @apiParam (Query Parameters) {String} [qtdRegistros = 50] Quantidade de registros que serão exibidos por página | ||
1168 | * | 1171 | * |
1169 | * @apiExample Exemplo de requisição: | 1172 | * @apiExample Exemplo de requisição: |
1170 | * curl -i https://<host>/sei-broker/service/processos/33910003149201793/documentos | 1173 | * curl -i https://<host>/sei-broker/service/processos/33910003149201793/documentos |
@@ -1181,6 +1184,8 @@ public class ProcessoResource { | @@ -1181,6 +1184,8 @@ public class ProcessoResource { | ||
1181 | * @apiSuccess (Sucesso Response Body - 200) {String} documentos.documentoResumido.tipoConferencia Tipo de conferência do documento. | 1184 | * @apiSuccess (Sucesso Response Body - 200) {String} documentos.documentoResumido.tipoConferencia Tipo de conferência do documento. |
1182 | * @apiSuccess (Sucesso Response Body - 200) {boolean} documentos.documentoResumido.assinado Boolean indicando se o documento foi assinado. | 1185 | * @apiSuccess (Sucesso Response Body - 200) {boolean} documentos.documentoResumido.assinado Boolean indicando se o documento foi assinado. |
1183 | * | 1186 | * |
1187 | + * @apiSuccess (Sucesso Response Header- 200) {header} total_registros Quantidade de registros que existem para essa consulta | ||
1188 | + * | ||
1184 | * @apiSuccessExample {json} Success-Response: | 1189 | * @apiSuccessExample {json} Success-Response: |
1185 | * HTTP/1.1 200 OK | 1190 | * HTTP/1.1 200 OK |
1186 | * { | 1191 | * { |
@@ -1206,21 +1211,88 @@ public class ProcessoResource { | @@ -1206,21 +1211,88 @@ public class ProcessoResource { | ||
1206 | @GET | 1211 | @GET |
1207 | @Path("/processos/{processo:\\d+}/documentos") | 1212 | @Path("/processos/{processo:\\d+}/documentos") |
1208 | @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) | 1213 | @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) |
1209 | - public List<DocumentoResumido> listarDocumentosPorProcesso(@PathParam("processo") String processo, @QueryParam("tipo")String tipo, | ||
1210 | - @QueryParam("origem") String origem, @QueryParam("somenteAssinados") boolean somenteAssinados) throws RemoteException, Exception{ | ||
1211 | - try{ | ||
1212 | - BigInteger idProcedimento = processoDAO.getIdProcedimento(formatarNumeroProcesso(processo)); | ||
1213 | - | ||
1214 | - List<DocumentoResumido> documentosProcesso = documentoDAO.getDocumentosProcesso(idProcedimento.toString(), tipo, origem, somenteAssinados); | ||
1215 | - | ||
1216 | - if(documentosProcesso.isEmpty()){ | ||
1217 | - throw new ResourceNotFoundException(messages.getMessage("erro.processo.sem.documentos", formatarNumeroProcesso(processo))); | ||
1218 | - } | 1214 | + public Response listarDocumentosPorProcesso(@PathParam("processo") String processo, @QueryParam("tipo")String tipo, |
1215 | + @QueryParam("origem") String origem, @QueryParam("somenteAssinados") boolean somenteAssinados, @QueryParam("pagina") String pagina, | ||
1216 | + @QueryParam("qtdRegistros") String qtdRegistros)throws RemoteException, Exception{ | ||
1217 | + | ||
1218 | + Integer tamanhoPagina = (qtdRegistros == null ? null : parseInt(qtdRegistros)); | ||
1219 | + | ||
1220 | + String idProcedimento = consultarIdProcedimento(processo); | ||
1219 | 1221 | ||
1220 | - return documentosProcesso; | ||
1221 | - }catch(NoResultException ex){ | ||
1222 | - throw new BusinessException(messages.getMessage("erro.processo.nao.pertence.sei", formatarNumeroProcesso(processo))); | 1222 | + Long totalDocumentosProcesso = documentoDAO.countDocumentosProcesso(idProcedimento, tipo, origem, somenteAssinados); |
1223 | + | ||
1224 | + if(totalDocumentosProcesso < 1L){ | ||
1225 | + throw new ResourceNotFoundException(messages.getMessage("erro.processo.sem.documentos", formatarNumeroProcesso(processo))); | ||
1223 | } | 1226 | } |
1227 | + | ||
1228 | + List<DocumentoResumido> documentosProcesso = documentoDAO.getDocumentosProcesso(idProcedimento, tipo, origem, somenteAssinados, | ||
1229 | + pagina == null ? null : parseInt(pagina), tamanhoPagina); | ||
1230 | + | ||
1231 | + return Response.status(getStatus(totalDocumentosProcesso.intValue(), tamanhoPagina)).header("total_registros", totalDocumentosProcesso) | ||
1232 | + .entity(new GenericEntity<List<DocumentoResumido>>(documentosProcesso){}).build(); | ||
1233 | + } | ||
1234 | + | ||
1235 | + /** | ||
1236 | + * @api {get} /processos/:processo/documentos/:documento Consultar documento | ||
1237 | + * @apiName consultarDocumentoDoProcesso | ||
1238 | + * @apiGroup Processo | ||
1239 | + * @apiVersion 2.0.0 | ||
1240 | + * | ||
1241 | + * @apiPermission RO_SEI_BROKER ou RO_SEI_BROKER_CONSULTA | ||
1242 | + * | ||
1243 | + * @apiDescription Consulta um documento de determinado processo. | ||
1244 | + * | ||
1245 | + * @apiParam (Path Parameters) {String} processo Número do processo. | ||
1246 | + * @apiParam (Path Parameters) {String} documento Número do documento. | ||
1247 | + * | ||
1248 | + * @apiExample Exemplo de requisição: | ||
1249 | + * curl -i https://<host>/sei-broker/service/processos/33910002924201874/documentos/55737058 | ||
1250 | + * | ||
1251 | + * @apiSuccess (Sucesso Response Body - 200) {DocumentoResumido} documentoResumido Resumo do documento encontrado no SEI. | ||
1252 | + * @apiSuccess (Sucesso Response Body - 200) {String} documentoResumido.numero Número do documento. | ||
1253 | + * @apiSuccess (Sucesso Response Body - 200) {String} documentoResumido.numeroInformado Número informado na inclusão do documento, também conhecido como número de árvore. | ||
1254 | + * @apiSuccess (Sucesso Response Body - 200) {String="GERADO","RECEBIDO"} documentoResumido.origem Origem do documento, se o mesmo é um documento "GERADO" internamente ou "RECEBIDO" de uma fonte externa. | ||
1255 | + * @apiSuccess (Sucesso Response Body - 200) {Data} documentoResumido.dataGeracao Data de geração do documento. | ||
1256 | + * @apiSuccess (Sucesso Response Body - 200) {Tipo} documentoResumido.tipo Objeto representando o tipo do documento. | ||
1257 | + * @apiSuccess (Sucesso Response Body - 200) {String} documentoResumido.tipo.codigo Identificados do tipo do documento, também conhecido como série. | ||
1258 | + * @apiSuccess (Sucesso Response Body - 200) {String} documentoResumido.tipo.nome Nome do tipo do documento. | ||
1259 | + * @apiSuccess (Sucesso Response Body - 200) {String} documentoResumido.tipoConferencia Tipo de conferência do documento. | ||
1260 | + * @apiSuccess (Sucesso Response Body - 200) {boolean} documentoResumido.assinado Boolean indicando se o documento foi assinado. | ||
1261 | + * | ||
1262 | + * @apiSuccessExample {json} Success-Response: | ||
1263 | + * HTTP/1.1 200 OK | ||
1264 | + * { | ||
1265 | + * "numero": "0670949", | ||
1266 | + * "numeroInformado": "594", | ||
1267 | + * "origem": "RECEBIDO", | ||
1268 | + * "dataGeracao": "2015-08-10T00:00:00-03:00", | ||
1269 | + * "tipo": { | ||
1270 | + * "codigo": "629", | ||
1271 | + * "nome": "Relatório de Arquivamento-SIF" | ||
1272 | + * } | ||
1273 | + * "tipoConferencia": "4", | ||
1274 | + * "assinado": true | ||
1275 | + * } | ||
1276 | + * | ||
1277 | + * @apiErrorExample {json} Error-Response: | ||
1278 | + * HTTP/1.1 500 Internal Server Error | ||
1279 | + * { | ||
1280 | + * "error":"Mensagem de erro." | ||
1281 | + * "code":"código do erro" | ||
1282 | + * } | ||
1283 | + */ | ||
1284 | + @GET | ||
1285 | + @Path("/processos/{processo:\\d+}/documentos/{documento:\\d+}") | ||
1286 | + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) | ||
1287 | + public DocumentoResumido consultarDocumentoDoProcesso(@PathParam("processo") String processo, @PathParam("documento") String documento)throws RemoteException, Exception{ | ||
1288 | + String idProcedimento = consultarIdProcedimento(processo); | ||
1289 | + try { | ||
1290 | + DocumentoResumido documentoProcesso = documentoDAO.getDocumentoProcesso(idProcedimento, documento); | ||
1291 | + | ||
1292 | + return documentoProcesso; | ||
1293 | + } catch (Exception e) { | ||
1294 | + throw new ResourceNotFoundException(messages.getMessage("erro.documento.nao.encontrado", documento, formatarNumeroProcesso(processo))); | ||
1295 | + } | ||
1224 | } | 1296 | } |
1225 | 1297 | ||
1226 | public URI getResourcePath(String resourceId){ | 1298 | public URI getResourcePath(String resourceId){ |
@@ -1253,4 +1325,20 @@ public class ProcessoResource { | @@ -1253,4 +1325,20 @@ public class ProcessoResource { | ||
1253 | 1325 | ||
1254 | return atributos.toArray(new AtributoAndamento[atributos.size()]); | 1326 | return atributos.toArray(new AtributoAndamento[atributos.size()]); |
1255 | } | 1327 | } |
1328 | + | ||
1329 | + public String consultarIdProcedimento(String processo) throws Exception{ | ||
1330 | + try{ | ||
1331 | + return ((BigInteger) processoDAO.getIdProcedimento(formatarNumeroProcesso(processo))).toString(); | ||
1332 | + }catch(NoResultException ex){ | ||
1333 | + throw new BusinessException(messages.getMessage("erro.processo.nao.pertence.sei", formatarNumeroProcesso(processo))); | ||
1334 | + } | ||
1335 | + } | ||
1336 | + | ||
1337 | + public Status getStatus(Integer quantidadeItens, Integer tamanhoPagina){ | ||
1338 | + if(quantidadeItens > (tamanhoPagina == null ? Constantes.TAMANHO_PAGINA_PADRAO : tamanhoPagina )){ | ||
1339 | + return Status.PARTIAL_CONTENT; | ||
1340 | + } | ||
1341 | + | ||
1342 | + return Status.OK; | ||
1343 | + } | ||
1256 | } | 1344 | } |
src/main/resources/config.properties
src/main/resources/messages.properties
@@ -18,6 +18,7 @@ erro.desanexar.processo = Ocorreu um erro ao desanexar o processo. | @@ -18,6 +18,7 @@ erro.desanexar.processo = Ocorreu um erro ao desanexar o processo. | ||
18 | erro.desbloquear.processo = Ocorreu um erro ao desbloquear o processo. | 18 | erro.desbloquear.processo = Ocorreu um erro ao desbloquear o processo. |
19 | erro.desrelacionar.processo = Ocorreu um erro ao remover o relacionamento. | 19 | erro.desrelacionar.processo = Ocorreu um erro ao remover o relacionamento. |
20 | erro.documento.incluir.bloco = Não foi possivel incluir o documento no bloco. | 20 | erro.documento.incluir.bloco = Não foi possivel incluir o documento no bloco. |
21 | +erro.documento.nao.encontrado = Não existe documento com o identificador {0} no processo {1}. | ||
21 | erro.documento.sem.processo = É necessário informar um número de processo para incluir um documento. | 22 | erro.documento.sem.processo = É necessário informar um número de processo para incluir um documento. |
22 | erro.estado.nao.encontrado = Não foi encontrado um estado para a sigla {0}. | 23 | erro.estado.nao.encontrado = Não foi encontrado um estado para a sigla {0}. |
23 | erro.inesperado = Ocorreu um erro inesperado no SEI-Broker, contacte a equipe responsável. | 24 | erro.inesperado = Ocorreu um erro inesperado no SEI-Broker, contacte a equipe responsável. |
src/main/webapp/api-docs/api_data.js
@@ -1330,6 +1330,34 @@ define({ "api": [ | @@ -1330,6 +1330,34 @@ define({ "api": [ | ||
1330 | "name": "" | 1330 | "name": "" |
1331 | }, | 1331 | }, |
1332 | { | 1332 | { |
1333 | + "success": { | ||
1334 | + "fields": { | ||
1335 | + "Success 200": [ | ||
1336 | + { | ||
1337 | + "group": "Success 200", | ||
1338 | + "optional": false, | ||
1339 | + "field": "varname1", | ||
1340 | + "description": "<p>No type.</p>" | ||
1341 | + }, | ||
1342 | + { | ||
1343 | + "group": "Success 200", | ||
1344 | + "type": "String", | ||
1345 | + "optional": false, | ||
1346 | + "field": "varname2", | ||
1347 | + "description": "<p>With type.</p>" | ||
1348 | + } | ||
1349 | + ] | ||
1350 | + } | ||
1351 | + }, | ||
1352 | + "type": "", | ||
1353 | + "url": "", | ||
1354 | + "version": "0.0.0", | ||
1355 | + "filename": "sei-broker/target/sei-broker-2.4.2/api-docs/main.js", | ||
1356 | + "group": "C__ANS_sei_broker_Fontes_branches_desenvolvimento_versao_3_sei_broker_target_sei_broker_2_4_2_api_docs_main_js", | ||
1357 | + "groupTitle": "C__ANS_sei_broker_Fontes_branches_desenvolvimento_versao_3_sei_broker_target_sei_broker_2_4_2_api_docs_main_js", | ||
1358 | + "name": "" | ||
1359 | + }, | ||
1360 | + { | ||
1333 | "type": "get", | 1361 | "type": "get", |
1334 | "url": "/:unidade/cargos", | 1362 | "url": "/:unidade/cargos", |
1335 | "title": "Listar cargos", | 1363 | "title": "Listar cargos", |
@@ -5772,6 +5800,145 @@ define({ "api": [ | @@ -5772,6 +5800,145 @@ define({ "api": [ | ||
5772 | }, | 5800 | }, |
5773 | { | 5801 | { |
5774 | "type": "get", | 5802 | "type": "get", |
5803 | + "url": "/processos/:processo/documentos/:documento", | ||
5804 | + "title": "Consultar documento", | ||
5805 | + "name": "consultarDocumentoDoProcesso", | ||
5806 | + "group": "Processo", | ||
5807 | + "version": "2.0.0", | ||
5808 | + "permission": [ | ||
5809 | + { | ||
5810 | + "name": "RO_SEI_BROKER ou RO_SEI_BROKER_CONSULTA" | ||
5811 | + } | ||
5812 | + ], | ||
5813 | + "description": "<p>Consulta um documento de determinado processo.</p>", | ||
5814 | + "parameter": { | ||
5815 | + "fields": { | ||
5816 | + "Path Parameters": [ | ||
5817 | + { | ||
5818 | + "group": "Path Parameters", | ||
5819 | + "type": "String", | ||
5820 | + "optional": false, | ||
5821 | + "field": "processo", | ||
5822 | + "description": "<p>Número do processo.</p>" | ||
5823 | + }, | ||
5824 | + { | ||
5825 | + "group": "Path Parameters", | ||
5826 | + "type": "String", | ||
5827 | + "optional": false, | ||
5828 | + "field": "documento", | ||
5829 | + "description": "<p>Número do documento.</p>" | ||
5830 | + } | ||
5831 | + ] | ||
5832 | + } | ||
5833 | + }, | ||
5834 | + "examples": [ | ||
5835 | + { | ||
5836 | + "title": "Exemplo de requisição:\t", | ||
5837 | + "content": "curl -i https://<host>/sei-broker/service/processos/33910002924201874/documentos/55737058", | ||
5838 | + "type": "json" | ||
5839 | + } | ||
5840 | + ], | ||
5841 | + "success": { | ||
5842 | + "fields": { | ||
5843 | + "Sucesso Response Body - 200": [ | ||
5844 | + { | ||
5845 | + "group": "Sucesso Response Body - 200", | ||
5846 | + "type": "DocumentoResumido", | ||
5847 | + "optional": false, | ||
5848 | + "field": "documentoResumido", | ||
5849 | + "description": "<p>Resumo do documento encontrado no SEI.</p>" | ||
5850 | + }, | ||
5851 | + { | ||
5852 | + "group": "Sucesso Response Body - 200", | ||
5853 | + "type": "String", | ||
5854 | + "optional": false, | ||
5855 | + "field": "documentoResumido.numero", | ||
5856 | + "description": "<p>Número do documento.</p>" | ||
5857 | + }, | ||
5858 | + { | ||
5859 | + "group": "Sucesso Response Body - 200", | ||
5860 | + "type": "String", | ||
5861 | + "optional": false, | ||
5862 | + "field": "documentoResumido.numeroInformado", | ||
5863 | + "description": "<p>Número informado na inclusão do documento, também conhecido como número de árvore.</p>" | ||
5864 | + }, | ||
5865 | + { | ||
5866 | + "group": "Sucesso Response Body - 200", | ||
5867 | + "type": "String", | ||
5868 | + "allowedValues": [ | ||
5869 | + "\"GERADO\"", | ||
5870 | + "\"RECEBIDO\"" | ||
5871 | + ], | ||
5872 | + "optional": false, | ||
5873 | + "field": "documentoResumido.origem", | ||
5874 | + "description": "<p>Origem do documento, se o mesmo é um documento "GERADO" internamente ou "RECEBIDO" de uma fonte externa.</p>" | ||
5875 | + }, | ||
5876 | + { | ||
5877 | + "group": "Sucesso Response Body - 200", | ||
5878 | + "type": "Data", | ||
5879 | + "optional": false, | ||
5880 | + "field": "documentoResumido.dataGeracao", | ||
5881 | + "description": "<p>Data de geração do documento.</p>" | ||
5882 | + }, | ||
5883 | + { | ||
5884 | + "group": "Sucesso Response Body - 200", | ||
5885 | + "type": "Tipo", | ||
5886 | + "optional": false, | ||
5887 | + "field": "documentoResumido.tipo", | ||
5888 | + "description": "<p>Objeto representando o tipo do documento.</p>" | ||
5889 | + }, | ||
5890 | + { | ||
5891 | + "group": "Sucesso Response Body - 200", | ||
5892 | + "type": "String", | ||
5893 | + "optional": false, | ||
5894 | + "field": "documentoResumido.tipo.codigo", | ||
5895 | + "description": "<p>Identificados do tipo do documento, também conhecido como série.</p>" | ||
5896 | + }, | ||
5897 | + { | ||
5898 | + "group": "Sucesso Response Body - 200", | ||
5899 | + "type": "String", | ||
5900 | + "optional": false, | ||
5901 | + "field": "documentoResumido.tipo.nome", | ||
5902 | + "description": "<p>Nome do tipo do documento.</p>" | ||
5903 | + }, | ||
5904 | + { | ||
5905 | + "group": "Sucesso Response Body - 200", | ||
5906 | + "type": "String", | ||
5907 | + "optional": false, | ||
5908 | + "field": "documentoResumido.tipoConferencia", | ||
5909 | + "description": "<p>Tipo de conferência do documento.</p>" | ||
5910 | + }, | ||
5911 | + { | ||
5912 | + "group": "Sucesso Response Body - 200", | ||
5913 | + "type": "boolean", | ||
5914 | + "optional": false, | ||
5915 | + "field": "documentoResumido.assinado", | ||
5916 | + "description": "<p>Boolean indicando se o documento foi assinado.</p>" | ||
5917 | + } | ||
5918 | + ] | ||
5919 | + }, | ||
5920 | + "examples": [ | ||
5921 | + { | ||
5922 | + "title": "Success-Response:", | ||
5923 | + "content": "HTTP/1.1 200 OK\n{\n \"numero\": \"0670949\",\n \"numeroInformado\": \"594\",\n \"origem\": \"RECEBIDO\",\n \"dataGeracao\": \"2015-08-10T00:00:00-03:00\",\n \"tipo\": {\n \t\"codigo\": \"629\",\n \t\"nome\": \"Relatório de Arquivamento-SIF\"\n }\n \"tipoConferencia\": \"4\",\n \"assinado\": true\n}", | ||
5924 | + "type": "json" | ||
5925 | + } | ||
5926 | + ] | ||
5927 | + }, | ||
5928 | + "error": { | ||
5929 | + "examples": [ | ||
5930 | + { | ||
5931 | + "title": "Error-Response:", | ||
5932 | + "content": "HTTP/1.1 500 Internal Server Error\n{\n\t\"error\":\"Mensagem de erro.\"\n\t\"code\":\"código do erro\"\n}", | ||
5933 | + "type": "json" | ||
5934 | + } | ||
5935 | + ] | ||
5936 | + }, | ||
5937 | + "filename": "sei-broker/src/main/java/br/gov/ans/integracao/sei/rest/ProcessoResource.java", | ||
5938 | + "groupTitle": "Processo" | ||
5939 | + }, | ||
5940 | + { | ||
5941 | + "type": "get", | ||
5775 | "url": "/:unidade/processos/:processo", | 5942 | "url": "/:unidade/processos/:processo", |
5776 | "title": "Consultar processo", | 5943 | "title": "Consultar processo", |
5777 | "name": "consultarProcesso", | 5944 | "name": "consultarProcesso", |
@@ -7490,6 +7657,22 @@ define({ "api": [ | @@ -7490,6 +7657,22 @@ define({ "api": [ | ||
7490 | "field": "somenteAssinados", | 7657 | "field": "somenteAssinados", |
7491 | "defaultValue": "false", | 7658 | "defaultValue": "false", |
7492 | "description": "<p>Exibir somente documentos assinados</p>" | 7659 | "description": "<p>Exibir somente documentos assinados</p>" |
7660 | + }, | ||
7661 | + { | ||
7662 | + "group": "Query Parameters", | ||
7663 | + "type": "String", | ||
7664 | + "optional": true, | ||
7665 | + "field": "pagina", | ||
7666 | + "defaultValue": "1", | ||
7667 | + "description": "<p>Número da página</p>" | ||
7668 | + }, | ||
7669 | + { | ||
7670 | + "group": "Query Parameters", | ||
7671 | + "type": "String", | ||
7672 | + "optional": true, | ||
7673 | + "field": "qtdRegistros", | ||
7674 | + "defaultValue": "50", | ||
7675 | + "description": "<p>Quantidade de registros que serão exibidos por página</p>" | ||
7493 | } | 7676 | } |
7494 | ] | 7677 | ] |
7495 | } | 7678 | } |
@@ -7585,6 +7768,15 @@ define({ "api": [ | @@ -7585,6 +7768,15 @@ define({ "api": [ | ||
7585 | "field": "documentos.documentoResumido.assinado", | 7768 | "field": "documentos.documentoResumido.assinado", |
7586 | "description": "<p>Boolean indicando se o documento foi assinado.</p>" | 7769 | "description": "<p>Boolean indicando se o documento foi assinado.</p>" |
7587 | } | 7770 | } |
7771 | + ], | ||
7772 | + "Sucesso Response Header- 200": [ | ||
7773 | + { | ||
7774 | + "group": "Sucesso Response Header- 200", | ||
7775 | + "type": "header", | ||
7776 | + "optional": false, | ||
7777 | + "field": "total_registros", | ||
7778 | + "description": "<p>Quantidade de registros que existem para essa consulta</p>" | ||
7779 | + } | ||
7588 | ] | 7780 | ] |
7589 | }, | 7781 | }, |
7590 | "examples": [ | 7782 | "examples": [ |
src/main/webapp/api-docs/api_data.json
@@ -1330,6 +1330,34 @@ | @@ -1330,6 +1330,34 @@ | ||
1330 | "name": "" | 1330 | "name": "" |
1331 | }, | 1331 | }, |
1332 | { | 1332 | { |
1333 | + "success": { | ||
1334 | + "fields": { | ||
1335 | + "Success 200": [ | ||
1336 | + { | ||
1337 | + "group": "Success 200", | ||
1338 | + "optional": false, | ||
1339 | + "field": "varname1", | ||
1340 | + "description": "<p>No type.</p>" | ||
1341 | + }, | ||
1342 | + { | ||
1343 | + "group": "Success 200", | ||
1344 | + "type": "String", | ||
1345 | + "optional": false, | ||
1346 | + "field": "varname2", | ||
1347 | + "description": "<p>With type.</p>" | ||
1348 | + } | ||
1349 | + ] | ||
1350 | + } | ||
1351 | + }, | ||
1352 | + "type": "", | ||
1353 | + "url": "", | ||
1354 | + "version": "0.0.0", | ||
1355 | + "filename": "sei-broker/target/sei-broker-2.4.2/api-docs/main.js", | ||
1356 | + "group": "C__ANS_sei_broker_Fontes_branches_desenvolvimento_versao_3_sei_broker_target_sei_broker_2_4_2_api_docs_main_js", | ||
1357 | + "groupTitle": "C__ANS_sei_broker_Fontes_branches_desenvolvimento_versao_3_sei_broker_target_sei_broker_2_4_2_api_docs_main_js", | ||
1358 | + "name": "" | ||
1359 | + }, | ||
1360 | + { | ||
1333 | "type": "get", | 1361 | "type": "get", |
1334 | "url": "/:unidade/cargos", | 1362 | "url": "/:unidade/cargos", |
1335 | "title": "Listar cargos", | 1363 | "title": "Listar cargos", |
@@ -5772,6 +5800,145 @@ | @@ -5772,6 +5800,145 @@ | ||
5772 | }, | 5800 | }, |
5773 | { | 5801 | { |
5774 | "type": "get", | 5802 | "type": "get", |
5803 | + "url": "/processos/:processo/documentos/:documento", | ||
5804 | + "title": "Consultar documento", | ||
5805 | + "name": "consultarDocumentoDoProcesso", | ||
5806 | + "group": "Processo", | ||
5807 | + "version": "2.0.0", | ||
5808 | + "permission": [ | ||
5809 | + { | ||
5810 | + "name": "RO_SEI_BROKER ou RO_SEI_BROKER_CONSULTA" | ||
5811 | + } | ||
5812 | + ], | ||
5813 | + "description": "<p>Consulta um documento de determinado processo.</p>", | ||
5814 | + "parameter": { | ||
5815 | + "fields": { | ||
5816 | + "Path Parameters": [ | ||
5817 | + { | ||
5818 | + "group": "Path Parameters", | ||
5819 | + "type": "String", | ||
5820 | + "optional": false, | ||
5821 | + "field": "processo", | ||
5822 | + "description": "<p>Número do processo.</p>" | ||
5823 | + }, | ||
5824 | + { | ||
5825 | + "group": "Path Parameters", | ||
5826 | + "type": "String", | ||
5827 | + "optional": false, | ||
5828 | + "field": "documento", | ||
5829 | + "description": "<p>Número do documento.</p>" | ||
5830 | + } | ||
5831 | + ] | ||
5832 | + } | ||
5833 | + }, | ||
5834 | + "examples": [ | ||
5835 | + { | ||
5836 | + "title": "Exemplo de requisição:\t", | ||
5837 | + "content": "curl -i https://<host>/sei-broker/service/processos/33910002924201874/documentos/55737058", | ||
5838 | + "type": "json" | ||
5839 | + } | ||
5840 | + ], | ||
5841 | + "success": { | ||
5842 | + "fields": { | ||
5843 | + "Sucesso Response Body - 200": [ | ||
5844 | + { | ||
5845 | + "group": "Sucesso Response Body - 200", | ||
5846 | + "type": "DocumentoResumido", | ||
5847 | + "optional": false, | ||
5848 | + "field": "documentoResumido", | ||
5849 | + "description": "<p>Resumo do documento encontrado no SEI.</p>" | ||
5850 | + }, | ||
5851 | + { | ||
5852 | + "group": "Sucesso Response Body - 200", | ||
5853 | + "type": "String", | ||
5854 | + "optional": false, | ||
5855 | + "field": "documentoResumido.numero", | ||
5856 | + "description": "<p>Número do documento.</p>" | ||
5857 | + }, | ||
5858 | + { | ||
5859 | + "group": "Sucesso Response Body - 200", | ||
5860 | + "type": "String", | ||
5861 | + "optional": false, | ||
5862 | + "field": "documentoResumido.numeroInformado", | ||
5863 | + "description": "<p>Número informado na inclusão do documento, também conhecido como número de árvore.</p>" | ||
5864 | + }, | ||
5865 | + { | ||
5866 | + "group": "Sucesso Response Body - 200", | ||
5867 | + "type": "String", | ||
5868 | + "allowedValues": [ | ||
5869 | + "\"GERADO\"", | ||
5870 | + "\"RECEBIDO\"" | ||
5871 | + ], | ||
5872 | + "optional": false, | ||
5873 | + "field": "documentoResumido.origem", | ||
5874 | + "description": "<p>Origem do documento, se o mesmo é um documento "GERADO" internamente ou "RECEBIDO" de uma fonte externa.</p>" | ||
5875 | + }, | ||
5876 | + { | ||
5877 | + "group": "Sucesso Response Body - 200", | ||
5878 | + "type": "Data", | ||
5879 | + "optional": false, | ||
5880 | + "field": "documentoResumido.dataGeracao", | ||
5881 | + "description": "<p>Data de geração do documento.</p>" | ||
5882 | + }, | ||
5883 | + { | ||
5884 | + "group": "Sucesso Response Body - 200", | ||
5885 | + "type": "Tipo", | ||
5886 | + "optional": false, | ||
5887 | + "field": "documentoResumido.tipo", | ||
5888 | + "description": "<p>Objeto representando o tipo do documento.</p>" | ||
5889 | + }, | ||
5890 | + { | ||
5891 | + "group": "Sucesso Response Body - 200", | ||
5892 | + "type": "String", | ||
5893 | + "optional": false, | ||
5894 | + "field": "documentoResumido.tipo.codigo", | ||
5895 | + "description": "<p>Identificados do tipo do documento, também conhecido como série.</p>" | ||
5896 | + }, | ||
5897 | + { | ||
5898 | + "group": "Sucesso Response Body - 200", | ||
5899 | + "type": "String", | ||
5900 | + "optional": false, | ||
5901 | + "field": "documentoResumido.tipo.nome", | ||
5902 | + "description": "<p>Nome do tipo do documento.</p>" | ||
5903 | + }, | ||
5904 | + { | ||
5905 | + "group": "Sucesso Response Body - 200", | ||
5906 | + "type": "String", | ||
5907 | + "optional": false, | ||
5908 | + "field": "documentoResumido.tipoConferencia", | ||
5909 | + "description": "<p>Tipo de conferência do documento.</p>" | ||
5910 | + }, | ||
5911 | + { | ||
5912 | + "group": "Sucesso Response Body - 200", | ||
5913 | + "type": "boolean", | ||
5914 | + "optional": false, | ||
5915 | + "field": "documentoResumido.assinado", | ||
5916 | + "description": "<p>Boolean indicando se o documento foi assinado.</p>" | ||
5917 | + } | ||
5918 | + ] | ||
5919 | + }, | ||
5920 | + "examples": [ | ||
5921 | + { | ||
5922 | + "title": "Success-Response:", | ||
5923 | + "content": "HTTP/1.1 200 OK\n{\n \"numero\": \"0670949\",\n \"numeroInformado\": \"594\",\n \"origem\": \"RECEBIDO\",\n \"dataGeracao\": \"2015-08-10T00:00:00-03:00\",\n \"tipo\": {\n \t\"codigo\": \"629\",\n \t\"nome\": \"Relatório de Arquivamento-SIF\"\n }\n \"tipoConferencia\": \"4\",\n \"assinado\": true\n}", | ||
5924 | + "type": "json" | ||
5925 | + } | ||
5926 | + ] | ||
5927 | + }, | ||
5928 | + "error": { | ||
5929 | + "examples": [ | ||
5930 | + { | ||
5931 | + "title": "Error-Response:", | ||
5932 | + "content": "HTTP/1.1 500 Internal Server Error\n{\n\t\"error\":\"Mensagem de erro.\"\n\t\"code\":\"código do erro\"\n}", | ||
5933 | + "type": "json" | ||
5934 | + } | ||
5935 | + ] | ||
5936 | + }, | ||
5937 | + "filename": "sei-broker/src/main/java/br/gov/ans/integracao/sei/rest/ProcessoResource.java", | ||
5938 | + "groupTitle": "Processo" | ||
5939 | + }, | ||
5940 | + { | ||
5941 | + "type": "get", | ||
5775 | "url": "/:unidade/processos/:processo", | 5942 | "url": "/:unidade/processos/:processo", |
5776 | "title": "Consultar processo", | 5943 | "title": "Consultar processo", |
5777 | "name": "consultarProcesso", | 5944 | "name": "consultarProcesso", |
@@ -7490,6 +7657,22 @@ | @@ -7490,6 +7657,22 @@ | ||
7490 | "field": "somenteAssinados", | 7657 | "field": "somenteAssinados", |
7491 | "defaultValue": "false", | 7658 | "defaultValue": "false", |
7492 | "description": "<p>Exibir somente documentos assinados</p>" | 7659 | "description": "<p>Exibir somente documentos assinados</p>" |
7660 | + }, | ||
7661 | + { | ||
7662 | + "group": "Query Parameters", | ||
7663 | + "type": "String", | ||
7664 | + "optional": true, | ||
7665 | + "field": "pagina", | ||
7666 | + "defaultValue": "1", | ||
7667 | + "description": "<p>Número da página</p>" | ||
7668 | + }, | ||
7669 | + { | ||
7670 | + "group": "Query Parameters", | ||
7671 | + "type": "String", | ||
7672 | + "optional": true, | ||
7673 | + "field": "qtdRegistros", | ||
7674 | + "defaultValue": "50", | ||
7675 | + "description": "<p>Quantidade de registros que serão exibidos por página</p>" | ||
7493 | } | 7676 | } |
7494 | ] | 7677 | ] |
7495 | } | 7678 | } |
@@ -7585,6 +7768,15 @@ | @@ -7585,6 +7768,15 @@ | ||
7585 | "field": "documentos.documentoResumido.assinado", | 7768 | "field": "documentos.documentoResumido.assinado", |
7586 | "description": "<p>Boolean indicando se o documento foi assinado.</p>" | 7769 | "description": "<p>Boolean indicando se o documento foi assinado.</p>" |
7587 | } | 7770 | } |
7771 | + ], | ||
7772 | + "Sucesso Response Header- 200": [ | ||
7773 | + { | ||
7774 | + "group": "Sucesso Response Header- 200", | ||
7775 | + "type": "header", | ||
7776 | + "optional": false, | ||
7777 | + "field": "total_registros", | ||
7778 | + "description": "<p>Quantidade de registros que existem para essa consulta</p>" | ||
7779 | + } | ||
7588 | ] | 7780 | ] |
7589 | }, | 7781 | }, |
7590 | "examples": [ | 7782 | "examples": [ |
src/main/webapp/api-docs/api_project.js
@@ -8,7 +8,7 @@ define({ | @@ -8,7 +8,7 @@ define({ | ||
8 | "apidoc": "0.2.0", | 8 | "apidoc": "0.2.0", |
9 | "generator": { | 9 | "generator": { |
10 | "name": "apidoc", | 10 | "name": "apidoc", |
11 | - "time": "2018-03-23T14:42:37.240Z", | 11 | + "time": "2018-04-09T12:23:09.782Z", |
12 | "url": "http://apidocjs.com", | 12 | "url": "http://apidocjs.com", |
13 | "version": "0.15.1" | 13 | "version": "0.15.1" |
14 | } | 14 | } |
src/main/webapp/api-docs/api_project.json
@@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
8 | "apidoc": "0.2.0", | 8 | "apidoc": "0.2.0", |
9 | "generator": { | 9 | "generator": { |
10 | "name": "apidoc", | 10 | "name": "apidoc", |
11 | - "time": "2018-03-23T14:42:37.240Z", | 11 | + "time": "2018-04-09T12:23:09.782Z", |
12 | "url": "http://apidocjs.com", | 12 | "url": "http://apidocjs.com", |
13 | "version": "0.15.1" | 13 | "version": "0.15.1" |
14 | } | 14 | } |