Commit b759774e03d10d3f5a172629642ef0ad0e67563f
1 parent
d8ea19a6
Exists in
master
Novo reource para restauração de template e pom.xml com deploy automatizado pelo Maven
Showing
8 changed files
with
251 additions
and
29 deletions
Show diff stats
.tern-project
| 1 | -{"ide":{},"libs":["ecma5","browser"],"plugins":{"guess-types":{},"angular":{}}} | |
| 2 | 1 | \ No newline at end of file |
| 2 | +{ | |
| 3 | + "libs": [ | |
| 4 | + "ecma5", | |
| 5 | + "browser" | |
| 6 | + ], | |
| 7 | + "plugins": { | |
| 8 | + "guess-types": { | |
| 9 | + | |
| 10 | + }, | |
| 11 | + "angular": { | |
| 12 | + | |
| 13 | + } | |
| 14 | + } | |
| 15 | +} | |
| 3 | 16 | \ No newline at end of file | ... | ... |
pom.xml
| ... | ... | @@ -3,24 +3,66 @@ |
| 3 | 3 | <modelVersion>4.0.0</modelVersion> |
| 4 | 4 | <groupId>br.gov.ans</groupId> |
| 5 | 5 | <artifactId>templates-broker</artifactId> |
| 6 | - <version>1.0</version> | |
| 6 | + <version>1.2</version> | |
| 7 | 7 | <packaging>war</packaging> |
| 8 | 8 | <name>templates-broker</name> |
| 9 | 9 | <description>Sistema de gerenciamento de templates.</description> |
| 10 | 10 | |
| 11 | - <!-- CONFIGURAR VERSÃO DO JAVA PARA 1.8 --> | |
| 12 | 11 | <build> |
| 13 | - <plugins> | |
| 14 | - <plugin> | |
| 15 | - <groupId>org.apache.maven.plugins</groupId> | |
| 16 | - <artifactId>maven-compiler-plugin</artifactId> | |
| 17 | - <version>3.1</version> | |
| 18 | - <configuration> | |
| 19 | - <source>1.8</source> | |
| 20 | - <target>1.8</target> | |
| 21 | - </configuration> | |
| 22 | - </plugin> | |
| 23 | - </plugins> | |
| 12 | + <plugins> | |
| 13 | + <plugin> | |
| 14 | + <groupId>org.wildfly.plugins</groupId> | |
| 15 | + <artifactId>wildfly-maven-plugin</artifactId> | |
| 16 | + <version>1.0.2.Final</version> | |
| 17 | + <configuration> | |
| 18 | + <timeout>60000</timeout> | |
| 19 | + <username>${username}</username> | |
| 20 | + <password>${password}</password> | |
| 21 | + <hostname>${hostname}</hostname> | |
| 22 | + <port>${port}</port> | |
| 23 | + </configuration> | |
| 24 | + | |
| 25 | + <executions> | |
| 26 | + <!-- Remover war implantado --> | |
| 27 | + <execution> | |
| 28 | + <id>remover-pacote-impantado</id> | |
| 29 | + <phase>install</phase> | |
| 30 | + <goals> | |
| 31 | + <goal>undeploy</goal> | |
| 32 | + </goals> | |
| 33 | + <configuration> | |
| 34 | + <domain> | |
| 35 | + <serverGroups> | |
| 36 | + <server-group>${domain.group}</server-group> | |
| 37 | + </serverGroups> | |
| 38 | + </domain> | |
| 39 | + <ignoreMissingDeployment>true</ignoreMissingDeployment> | |
| 40 | + <match-pattern>${project.name}.*</match-pattern> | |
| 41 | + <matchPatternStrategy>fail</matchPatternStrategy> | |
| 42 | + </configuration> | |
| 43 | + </execution> | |
| 44 | + | |
| 45 | + <!-- Implantar war --> | |
| 46 | + <execution> | |
| 47 | + <id>implantar-novo-pacote</id> | |
| 48 | + <phase>install</phase> | |
| 49 | + <goals> | |
| 50 | + <goal>deploy</goal> | |
| 51 | + </goals> | |
| 52 | + <configuration> | |
| 53 | + <runtimeName>${project.name}</runtimeName> | |
| 54 | + <deployEnabled>true</deployEnabled> | |
| 55 | + <force>true</force> | |
| 56 | + <domain> | |
| 57 | + <server-groups> | |
| 58 | + <server-group>${domain.group}</server-group> | |
| 59 | + </server-groups> | |
| 60 | + </domain> | |
| 61 | + </configuration> | |
| 62 | + </execution> | |
| 63 | + </executions> | |
| 64 | + </plugin> | |
| 65 | + </plugins> | |
| 24 | 66 | </build> |
| 25 | 67 | |
| 26 | 68 | <dependencies> | ... | ... |
src/main/java/br/gov/ans/templates/dao/TemplatesDAO.java
| ... | ... | @@ -48,6 +48,29 @@ public class TemplatesDAO { |
| 48 | 48 | return query.getResultList(); |
| 49 | 49 | } |
| 50 | 50 | |
| 51 | + @SuppressWarnings("unchecked") | |
| 52 | + public List<Template> getTemplatesExcluidos(String filtro, Integer pagina, Integer qtdRegistros){ | |
| 53 | + HashMap<String, Object> parametros = new HashMap<String, Object>(); | |
| 54 | + StringBuilder sql = new StringBuilder("SELECT t FROM Template t "); | |
| 55 | + | |
| 56 | + if(StringUtils.isNotBlank(filtro)){ | |
| 57 | + sql.append("WHERE upper(t.nome) LIKE upper(:filtro) "); | |
| 58 | + parametros.put("filtro", "%"+filtro+"%"); | |
| 59 | + } | |
| 60 | + | |
| 61 | + sql.append(AndOrWhere(sql) + " t.dataExclusao is not null "); | |
| 62 | + | |
| 63 | + sql.append("order by nome asc "); | |
| 64 | + | |
| 65 | + Query query = em.createQuery(sql.toString()); | |
| 66 | + | |
| 67 | + setParametrosQuery(query, parametros); | |
| 68 | + | |
| 69 | + setPaginacaoQuery(query, pagina, qtdRegistros); | |
| 70 | + | |
| 71 | + return query.getResultList(); | |
| 72 | + } | |
| 73 | + | |
| 51 | 74 | public Long countTemplates(String filtro){ |
| 52 | 75 | HashMap<String, Object> parametros = new HashMap<String, Object>(); |
| 53 | 76 | StringBuilder sql = new StringBuilder("SELECT count(t) FROM Template t "); |
| ... | ... | @@ -66,6 +89,24 @@ public class TemplatesDAO { |
| 66 | 89 | return (Long) query.getSingleResult(); |
| 67 | 90 | } |
| 68 | 91 | |
| 92 | + public Long countTemplatesExcluidos(String filtro){ | |
| 93 | + HashMap<String, Object> parametros = new HashMap<String, Object>(); | |
| 94 | + StringBuilder sql = new StringBuilder("SELECT count(t) FROM Template t "); | |
| 95 | + | |
| 96 | + if(StringUtils.isNotBlank(filtro)){ | |
| 97 | + sql.append("WHERE upper(t.nome) LIKE upper(:filtro) "); | |
| 98 | + parametros.put("filtro", "%"+filtro+"%"); | |
| 99 | + } | |
| 100 | + | |
| 101 | + sql.append(AndOrWhere(sql) + " t.dataExclusao is not null "); | |
| 102 | + | |
| 103 | + Query query = em.createQuery(sql.toString()); | |
| 104 | + | |
| 105 | + setParametrosQuery(query, parametros); | |
| 106 | + | |
| 107 | + return (Long) query.getSingleResult(); | |
| 108 | + } | |
| 109 | + | |
| 69 | 110 | public Template getTemplate(String nome){ |
| 70 | 111 | HashMap<String, Object> params = new HashMap<String, Object>(); |
| 71 | 112 | params.put("nome", nome); |
| ... | ... | @@ -79,6 +120,19 @@ public class TemplatesDAO { |
| 79 | 120 | return resultado.get(0); |
| 80 | 121 | } |
| 81 | 122 | |
| 123 | + public Template getTemplateExcluido(String nome){ | |
| 124 | + HashMap<String, Object> params = new HashMap<String, Object>(); | |
| 125 | + params.put("nome", nome); | |
| 126 | + | |
| 127 | + List<Template> resultado = dao.executeNamedQuery("Template.recuperarTemplateExcluidoPeloNome", params); | |
| 128 | + | |
| 129 | + if(resultado.size() < 1){ | |
| 130 | + return null; | |
| 131 | + } | |
| 132 | + | |
| 133 | + return resultado.get(0); | |
| 134 | + } | |
| 135 | + | |
| 82 | 136 | public String AndOrWhere(StringBuilder sql){ |
| 83 | 137 | if(sql.toString().contains("WHERE")){ |
| 84 | 138 | return "AND"; | ... | ... |
src/main/java/br/gov/ans/templates/modelo/Template.java
| ... | ... | @@ -29,7 +29,8 @@ import org.hibernate.annotations.Type; |
| 29 | 29 | @XmlRootElement |
| 30 | 30 | @Entity |
| 31 | 31 | @Table(schema="ANS_GERAL",name="TB_TEMPLATE_DOCUMENTO") |
| 32 | -@NamedQueries({@NamedQuery(name = "Template.recuperarPeloNome", query = "SELECT t FROM Template t WHERE upper(t.nome) = upper(:nome) AND t.dataExclusao is null")}) | |
| 32 | +@NamedQueries({@NamedQuery(name = "Template.recuperarPeloNome", query = "SELECT t FROM Template t WHERE upper(t.nome) = upper(:nome) AND t.dataExclusao is null"), | |
| 33 | + @NamedQuery(name = "Template.recuperarTemplateExcluidoPeloNome", query = "SELECT t FROM Template t WHERE upper(t.nome) = upper(:nome) AND t.dataExclusao is not null")}) | |
| 33 | 34 | public class Template implements Serializable{ |
| 34 | 35 | |
| 35 | 36 | private static final long serialVersionUID = 1L; | ... | ... |
src/main/java/br/gov/ans/templates/rest/TemplateResource.java
| ... | ... | @@ -81,7 +81,7 @@ public class TemplateResource { |
| 81 | 81 | * @apiSuccess (Sucesso - 200) {String} resultado.template.exemplo Exemplo de request para preenchimento do template. |
| 82 | 82 | * @apiSuccess (Sucesso - 200) {String} resultado.template.nome Identificador do template |
| 83 | 83 | * @apiSuccess (Sucesso - 200) {String} resultado.template.responsavel Analista responsável pelo template. |
| 84 | - * @apiSuccess (Sucesso - 200) {Boolean} resultado.template.restrito Flag identificando se a atualização deste template � restrita. | |
| 84 | + * @apiSuccess (Sucesso - 200) {Boolean} resultado.template.restrito Flag identificando se a atualização deste template é restrita. | |
| 85 | 85 | * |
| 86 | 86 | * @apiSuccessExample {json} Success-Response: |
| 87 | 87 | * HTTP/1.1 200 OK |
| ... | ... | @@ -139,7 +139,7 @@ public class TemplateResource { |
| 139 | 139 | * @apiSuccess (Sucesso - 200) {String} template.exemplo Exemplo de request para preenchimento do template. |
| 140 | 140 | * @apiSuccess (Sucesso - 200) {String} template.nome Identificador do template. |
| 141 | 141 | * @apiSuccess (Sucesso - 200) {String} template.responsavel Analista responsável pelo template. |
| 142 | - * @apiSuccess (Sucesso - 200) {Boolean} template.restrito Flag identificando se a atualização deste template � restrita. | |
| 142 | + * @apiSuccess (Sucesso - 200) {Boolean} template.restrito Flag identificando se a atualização deste template é restrita. | |
| 143 | 143 | * |
| 144 | 144 | * @apiSuccessExample {json} Success-Response: |
| 145 | 145 | * HTTP/1.1 200 OK |
| ... | ... | @@ -222,10 +222,10 @@ public class TemplateResource { |
| 222 | 222 | * @apiParam (Request Body) {String} exemplo Exemplo de request para preenchimento do template. |
| 223 | 223 | * @apiParam (Request Body) {String} nome Identificador do template. |
| 224 | 224 | * @apiParam (Request Body) {String} responsavel Analista responsável pelo template. |
| 225 | - * @apiParam (Request Body) {String} restrito Flag identificando se a atualização deste template � restrita. | |
| 225 | + * @apiParam (Request Body) {String} restrito Flag identificando se a atualização deste template é restrita. | |
| 226 | 226 | * |
| 227 | 227 | * @apiExample Exemplo de requisição: |
| 228 | - * endpoint: [PUT] http://<host>/templates-broker/service/templates/confirmacao-cadastro | |
| 228 | + * endpoint: [POST] http://<host>/templates-broker/service/templates/confirmacao-cadastro | |
| 229 | 229 | * |
| 230 | 230 | * body: |
| 231 | 231 | * { |
| ... | ... | @@ -286,7 +286,7 @@ public class TemplateResource { |
| 286 | 286 | * @apiParam (Request Body) {String} exemplo Exemplo de request para preenchimento do template. |
| 287 | 287 | * @apiParam (Request Body) {String} nome Identificador do template. |
| 288 | 288 | * @apiParam (Request Body) {String} responsavel Analista responsável pelo template. |
| 289 | - * @apiParam (Request Body) {String} restrito Flag identificando se a atualização deste template � restrita. | |
| 289 | + * @apiParam (Request Body) {String} restrito Flag identificando se a atualização deste template é restrita. | |
| 290 | 290 | * |
| 291 | 291 | * @apiExample Exemplo de requisição: |
| 292 | 292 | * endpoint: [PUT] http://<host>/templates-broker/service/templates/confirmacao-cadastro |
| ... | ... | @@ -610,6 +610,118 @@ public class TemplateResource { |
| 610 | 610 | return Response.ok().entity(entity).build(); |
| 611 | 611 | } |
| 612 | 612 | |
| 613 | + | |
| 614 | + /** | |
| 615 | + * @api {delete} /templates/excluidos/:template Recuperar template | |
| 616 | + * @apiName undeleteTemplate | |
| 617 | + * @apiGroup Template | |
| 618 | + * @apiVersion 1.0.0 | |
| 619 | + * @apiPermission RO_ADMIN_TEMPLATE | |
| 620 | + * | |
| 621 | + * @apiDescription Recupera um template excluído. | |
| 622 | + * | |
| 623 | + * @apiParam (Path Parameters) {String} template Identificador do template | |
| 624 | + * | |
| 625 | + * @apiExample Exemplo de requisição: | |
| 626 | + * curl -X DELETE http://<host>/templates-broker/service/templates/excluidos/admp-template-novo-usuario | |
| 627 | + * | |
| 628 | + * @apiSuccessExample {json} Success-Response: | |
| 629 | + * HTTP/1.1 200 OK | |
| 630 | + * | |
| 631 | + * @apiErrorExample {json} Error-Response: | |
| 632 | + * HTTP/1.1 500 Internal Server Error | |
| 633 | + * { | |
| 634 | + * "error":"Mensagem de erro." | |
| 635 | + * "code":"código do erro" | |
| 636 | + * } | |
| 637 | + */ | |
| 638 | + @DELETE | |
| 639 | + @Path("excluidos/{template}") | |
| 640 | + @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) | |
| 641 | + public Response undeleteTemplate(@PathParam("template") String nomeTemplate) throws ResourceNotFoundException{ | |
| 642 | + Template template = getTemplateExcluido(nomeTemplate); | |
| 643 | + | |
| 644 | + template.setDataExclusao(null); | |
| 645 | + | |
| 646 | + daoTemplate.merge(template); | |
| 647 | + | |
| 648 | + return Response.ok().build(); | |
| 649 | + } | |
| 650 | + | |
| 651 | + /** | |
| 652 | + * @api {get} /templates Listar templates excluídos | |
| 653 | + * @apiName listTemplatesExcluidos | |
| 654 | + * @apiGroup Template | |
| 655 | + * @apiVersion 1.0.0 | |
| 656 | + * @apiPermission RO_ADMIN_TEMPLATE, RO_USUARIO_TEMPLATE | |
| 657 | + * | |
| 658 | + * @apiDescription Consulta os templates que foram excluídos. | |
| 659 | + * | |
| 660 | + * @apiParam (Query Parameters) {String} [filtro] Valor utilizado para filtrar os templates. | |
| 661 | + * @apiParam (Query Parameters) {String} [itens = 20] Quantidade de templates que serão exibidos | |
| 662 | + * @apiParam (Query Parameters) {String} [pag = 1] Número da página | |
| 663 | + * | |
| 664 | + * @apiExample Exemplo de requisição: | |
| 665 | + * curl -i http://<host>/templates-broker/service/templates | |
| 666 | + * | |
| 667 | + * @apiSuccess (Sucesso - 200) {List} resultado Lista com os templates encontrados. | |
| 668 | + * @apiSuccess (Sucesso - 200) {Template} resultado.template Objeto representando o template. | |
| 669 | + * @apiSuccess (Sucesso - 200) {String} resultado.template.corpo Corpo do template, conteúdo que as aplicações usarão para preencher e exibir os dados. | |
| 670 | + * @apiSuccess (Sucesso - 200) {String} resultado.template.dataCadastro Data de cadastro do template. | |
| 671 | + * @apiSuccess (Sucesso - 200) {String} resultado.template.dataCadastro Data de exclusao do template. | |
| 672 | + * @apiSuccess (Sucesso - 200) {String} resultado.template.descricao Descrição do template. | |
| 673 | + * @apiSuccess (Sucesso - 200) {String} resultado.template.exemplo Exemplo de request para preenchimento do template. | |
| 674 | + * @apiSuccess (Sucesso - 200) {String} resultado.template.nome Identificador do template | |
| 675 | + * @apiSuccess (Sucesso - 200) {String} resultado.template.responsavel Analista responsável pelo template. | |
| 676 | + * @apiSuccess (Sucesso - 200) {Boolean} resultado.template.restrito Flag identificando se a atualização deste template é restrita. | |
| 677 | + * | |
| 678 | + * @apiSuccessExample {json} Success-Response: | |
| 679 | + * HTTP/1.1 200 OK | |
| 680 | + * { | |
| 681 | + * "corpo": "Prezado {{fulano}}, seu cadastro foi realizado com sucesso.", | |
| 682 | + * "dataCadastro": "2017-03-14T16:57:47.405-03:00", | |
| 683 | + * "descricao": "Template de confirmação de cadastro.", | |
| 684 | + * "exemplo": "{"fulano":"André Guimarães"}", | |
| 685 | + * "nome": "confirmacao-cadastro", | |
| 686 | + * "responsavel": "andre.guimaraes", | |
| 687 | + * "restrito": false, | |
| 688 | + * "dataExclusao":"2017-08-14T16:57:47.405-03:00" | |
| 689 | + * } | |
| 690 | + * | |
| 691 | + * @apiErrorExample {json} Error-Response: | |
| 692 | + * HTTP/1.1 500 Internal Server Error | |
| 693 | + * { | |
| 694 | + * "error":"Mensagem de erro." | |
| 695 | + * "code":"código do erro" | |
| 696 | + * } | |
| 697 | + */ | |
| 698 | + @GET | |
| 699 | + @Path("excluidos") | |
| 700 | + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) | |
| 701 | + public Response listTemplatesExcluidos(@QueryParam("filtro") String filtro, @QueryParam("pag") String pagina, @QueryParam("itens") String tamanhoPagina) throws BusinessException, ResourceNotFoundException{ | |
| 702 | + List<Template> templates = daoTemplate.getTemplatesExcluidos(filtro, pagina == null? null:parseInt(pagina), tamanhoPagina == null? null : parseInt(tamanhoPagina)); | |
| 703 | + | |
| 704 | + if(templates.isEmpty()){ | |
| 705 | + throw new ResourceNotFoundException(messages.getMessage("templates.nao.encontrados.filtro",filtro)); | |
| 706 | + } | |
| 707 | + | |
| 708 | + GenericEntity<List<Template>> entity = new GenericEntity<List<Template>>(templates){}; | |
| 709 | + | |
| 710 | + Long totalRegistros = daoTemplate.countTemplatesExcluidos(filtro); | |
| 711 | + | |
| 712 | + return Response.ok().entity(entity).header("total_registros", totalRegistros).build(); | |
| 713 | + } | |
| 714 | + | |
| 715 | + public Template getTemplateExcluido(String nomeTemplate) throws ResourceNotFoundException{ | |
| 716 | + Template template = daoTemplate.getTemplateExcluido(nomeTemplate); | |
| 717 | + | |
| 718 | + if(template == null){ | |
| 719 | + throw new ResourceNotFoundException(messages.getMessage("erro.template.nao.encontrado", nomeTemplate)); | |
| 720 | + } | |
| 721 | + | |
| 722 | + return template; | |
| 723 | + } | |
| 724 | + | |
| 613 | 725 | public void registrarHistoricoVersao(Template template){ |
| 614 | 726 | Versao versao = new Versao(template); |
| 615 | 727 | ... | ... |
src/main/java/br/gov/ans/templates/util/TemplatesUtils.java
| ... | ... | @@ -22,7 +22,7 @@ public class TemplatesUtils { |
| 22 | 22 | try{ |
| 23 | 23 | return Integer.parseInt(valor); |
| 24 | 24 | }catch(Exception e){ |
| 25 | - throw new BusinessException("O valor '"+valor+"' não pode ser convertido para int."); | |
| 25 | + throw new BusinessException("O valor '"+valor+"' não pode ser convertido para int."); | |
| 26 | 26 | } |
| 27 | 27 | } |
| 28 | 28 | } | ... | ... |
src/main/webapp/api-docs/api_data.js
| ... | ... | @@ -434,7 +434,7 @@ define({ "api": [ |
| 434 | 434 | "type": "String", |
| 435 | 435 | "optional": false, |
| 436 | 436 | "field": "restrito", |
| 437 | - "description": "<p>Flag identificando se a atualização deste template � restrita.</p>" | |
| 437 | + "description": "<p>Flag identificando se a atualização deste template é restrita.</p>" | |
| 438 | 438 | } |
| 439 | 439 | ] |
| 440 | 440 | } |
| ... | ... | @@ -604,7 +604,7 @@ define({ "api": [ |
| 604 | 604 | "type": "String", |
| 605 | 605 | "optional": false, |
| 606 | 606 | "field": "restrito", |
| 607 | - "description": "<p>Flag identificando se a atualização deste template � restrita.</p>" | |
| 607 | + "description": "<p>Flag identificando se a atualização deste template é restrita.</p>" | |
| 608 | 608 | } |
| 609 | 609 | ] |
| 610 | 610 | } |
| ... | ... | @@ -803,7 +803,7 @@ define({ "api": [ |
| 803 | 803 | "type": "Boolean", |
| 804 | 804 | "optional": false, |
| 805 | 805 | "field": "template.restrito", |
| 806 | - "description": "<p>Flag identificando se a atualização deste template � restrita.</p>" | |
| 806 | + "description": "<p>Flag identificando se a atualização deste template é restrita.</p>" | |
| 807 | 807 | } |
| 808 | 808 | ] |
| 809 | 809 | }, |
| ... | ... | @@ -1047,7 +1047,7 @@ define({ "api": [ |
| 1047 | 1047 | "type": "Boolean", |
| 1048 | 1048 | "optional": false, |
| 1049 | 1049 | "field": "resultado.template.restrito", |
| 1050 | - "description": "<p>Flag identificando se a atualização deste template � restrita.</p>" | |
| 1050 | + "description": "<p>Flag identificando se a atualização deste template é restrita.</p>" | |
| 1051 | 1051 | } |
| 1052 | 1052 | ] |
| 1053 | 1053 | }, | ... | ... |
src/main/webapp/api-docs/api_data.json
| ... | ... | @@ -434,7 +434,7 @@ |
| 434 | 434 | "type": "String", |
| 435 | 435 | "optional": false, |
| 436 | 436 | "field": "restrito", |
| 437 | - "description": "<p>Flag identificando se a atualização deste template � restrita.</p>" | |
| 437 | + "description": "<p>Flag identificando se a atualização deste template é restrita.</p>" | |
| 438 | 438 | } |
| 439 | 439 | ] |
| 440 | 440 | } |
| ... | ... | @@ -604,7 +604,7 @@ |
| 604 | 604 | "type": "String", |
| 605 | 605 | "optional": false, |
| 606 | 606 | "field": "restrito", |
| 607 | - "description": "<p>Flag identificando se a atualização deste template � restrita.</p>" | |
| 607 | + "description": "<p>Flag identificando se a atualização deste template é restrita.</p>" | |
| 608 | 608 | } |
| 609 | 609 | ] |
| 610 | 610 | } |
| ... | ... | @@ -803,7 +803,7 @@ |
| 803 | 803 | "type": "Boolean", |
| 804 | 804 | "optional": false, |
| 805 | 805 | "field": "template.restrito", |
| 806 | - "description": "<p>Flag identificando se a atualização deste template � restrita.</p>" | |
| 806 | + "description": "<p>Flag identificando se a atualização deste template é restrita.</p>" | |
| 807 | 807 | } |
| 808 | 808 | ] |
| 809 | 809 | }, |
| ... | ... | @@ -1047,7 +1047,7 @@ |
| 1047 | 1047 | "type": "Boolean", |
| 1048 | 1048 | "optional": false, |
| 1049 | 1049 | "field": "resultado.template.restrito", |
| 1050 | - "description": "<p>Flag identificando se a atualização deste template � restrita.</p>" | |
| 1050 | + "description": "<p>Flag identificando se a atualização deste template é restrita.</p>" | |
| 1051 | 1051 | } |
| 1052 | 1052 | ] |
| 1053 | 1053 | }, | ... | ... |