-
-
-
+
+
+
-
-
+
+
+
- ${mensagem}
+ ${mensagemRelatorio}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${mensagemPlano}
+
+
+
+
+
+
+
+ Deseja enviar o Relatório para o Ministério Público Federal - MPF?
+
+
+
+ Atenção! Após o envio do Relatório ao MPF não mais será possível alterar seus dados.
+
+
+
+ Não
+
+ Sim
+
+
+
+
+
+
Aviso:
ATENÇÃO: O simples upload do arquivo não faz o envio do plano de trabalho para os órgãos de controle, o plano de trabalho deverá ser enviado para a Procuradoria Federal dos Direitos do Cidadão do Ministério Público Federal até a data limite
-
+
+
-
Página Inicial
+
Página Inicial
+
+
diff --git a/WebContent/WEB-INF/jsp/questionario/listaQuestionario.jsp b/WebContent/WEB-INF/jsp/questionario/listaQuestionario.jsp
index 0c3412e..b558222 100644
--- a/WebContent/WEB-INF/jsp/questionario/listaQuestionario.jsp
+++ b/WebContent/WEB-INF/jsp/questionario/listaQuestionario.jsp
@@ -54,6 +54,8 @@
Relatório Respondido
Plano de Trabalho Enviado
download Plano de Trabalho
+
download Relatório Assinado
+
Visualizar Relatório
@@ -95,8 +97,12 @@
-
Recuperar
+
+ Plano de Trabalho
+
+ Relatório Assinado
+
Visualizar Relatório
diff --git a/WebContent/WEB-INF/mail.properties b/WebContent/WEB-INF/mail.properties
index 1136fcb..e7170d4 100644
--- a/WebContent/WEB-INF/mail.properties
+++ b/WebContent/WEB-INF/mail.properties
@@ -7,4 +7,5 @@ prop.email.authpass = ""
prop.email.auth = false
prop.email.to = govbr@planejamento.gov.br
prop.email.from = govbr@planejamento.gov.br
-prop.email.copiaEmailTo = fabricio.souza@planejamento.gov.br
\ No newline at end of file
+prop.email.copiaEmailTo = fabricio.souza@planejamento.gov.br
+prop.email.anexosTo = gibran.sodre@planejamento.gov.br
\ No newline at end of file
diff --git a/src/br/com/controller/PlanoTrabalhoController.java b/src/br/com/controller/PlanoTrabalhoController.java
index 43b0c73..607863e 100644
--- a/src/br/com/controller/PlanoTrabalhoController.java
+++ b/src/br/com/controller/PlanoTrabalhoController.java
@@ -1,6 +1,8 @@
package br.com.controller;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
@@ -13,6 +15,7 @@ import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.multipart.DefaultMultipartConfig;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
+import br.com.caelum.vraptor.ioc.spring.VRaptorRequestHolder;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.dao.HashDao;
import br.com.dao.PlanoTrabalhoDao;
@@ -21,7 +24,7 @@ import br.com.model.entity.Questionario;
@Resource
-public class PlanoTrabalhoController extends DefaultMultipartConfig {
+public class PlanoTrabalhoController extends DefaultMultipartConfig {
private Validator validator;
private Result result;
@@ -34,10 +37,10 @@ public class PlanoTrabalhoController extends DefaultMultipartConfig {
this.path = this.application.getRealPath("") + "/WEB-INF/conexao.properties";
this.result = result;
}
-
+
// alteramos o tamanho total do upload para 50MB
public long getSizeLimit() {
- return 50 * 1024 * 1024;
+ return 50 * 1024 * 1024;
}
@Path("/planoTrabalho-site")
@@ -50,72 +53,158 @@ public class PlanoTrabalhoController extends DefaultMultipartConfig {
}
-
- @Path("/salvar-plano-trabalho")
- public void enviarPlanoTrabalho(String valorHash, UploadedFile file) {
- String mensagem = "Não foi possível enviar o plano de trabalho!";
- boolean status = false;
-
- if(file != null)
- {
- String tipoArquivo = file.getContentType();
-
- int idPlanoTrabalho = -1;
-
- if (!tipoArquivo.equalsIgnoreCase("application/msword")
- && !tipoArquivo.equalsIgnoreCase("application/vnd.ms-excel")
- && !tipoArquivo.equalsIgnoreCase("application/vnd.oasis.opendocument.text")
- && !tipoArquivo.equalsIgnoreCase("text/plain")
- && !tipoArquivo.equalsIgnoreCase("application/pdf")
- && !tipoArquivo.equalsIgnoreCase("image/png") && !tipoArquivo.equalsIgnoreCase("image/gif")
- && !tipoArquivo.equalsIgnoreCase("image/jpeg")) {
-
- mensagem = "Formato de Arquivo inválido!";
- status = false;
-
- } else {
- HashDao hashDao = new HashDao();
- Questionario questionario = new Questionario();
- questionario = hashDao.verificarHash(path, valorHash);
- String nomeExtensao = file.getFileName();
-
+ @Path("/salvar-plano-trabalho")
+ public void enviarPlanoTrabalho(String valorHash, UploadedFile filePlano,
+ UploadedFile fileRelatorio) {
+
+ String mensagemPlano = null;
+ String mensagemRelatorio = null;
+ boolean statusPlano = false;
+ boolean statusRelatorio = false;
+ boolean existeRelatorioAnexado = false;
+ Questionario questionario = new Questionario();
+ PlanoTrabalho planoTrabalho = new PlanoTrabalho();
+
+ if (filePlano != null) {
+ String tipoArquivo = filePlano.getContentType();
+
+
+ if (!tipoArquivo.equalsIgnoreCase("application/msword")
+ && !tipoArquivo.equalsIgnoreCase("application/vnd.ms-excel")
+ && !tipoArquivo.equalsIgnoreCase("application/vnd.oasis.opendocument.text")
+ && !tipoArquivo.equalsIgnoreCase("text/plain")
+ && !tipoArquivo.equalsIgnoreCase("application/pdf")
+ && !tipoArquivo.equalsIgnoreCase("image/png")
+ && !tipoArquivo.equalsIgnoreCase("image/gif")
+ && !tipoArquivo.equalsIgnoreCase("image/jpeg")
+ && !tipoArquivo.equalsIgnoreCase("application/zip")
+ && !tipoArquivo.equalsIgnoreCase("application/x-rar-compressed")
+ && !tipoArquivo.equalsIgnoreCase("application/octet-stream")) {
+
+ mensagemPlano = "Formato de Arquivo para plano de trabalho inválido!";
+ statusPlano = false;
+
+ } else {
+ HashDao hashDao = new HashDao();
+ questionario = new Questionario();
+ questionario = hashDao.verificarHash(path, valorHash);
+ String nomeExtensaoPlanoTrabalho = filePlano.getFileName();
+
if (questionario != null && questionario.getDtInicioQuestionario() != null) {
PlanoTrabalhoDao planoTrabalhoDao = new PlanoTrabalhoDao();
- idPlanoTrabalho =
- planoTrabalhoDao.verificaPlanoTrabalho(path, questionario.getIdQuestionario());
+ planoTrabalho =
+ planoTrabalhoDao.recuperarPlanoTrabalho(path, questionario);
- if (idPlanoTrabalho == -1) {
- if (planoTrabalhoDao.salvarPlanoTrabalho(path, file.getFile(), questionario,
- nomeExtensao)) {
- mensagem = "Plano de trabalho enviado com sucesso!";
- status = true;
+ if (planoTrabalho.getArquivoPlanoTrabalho() == null) {
+ if (planoTrabalhoDao.salvarPlanoTrabalho(path, filePlano.getFile(), questionario,
+ nomeExtensaoPlanoTrabalho)) {
+ mensagemPlano = "Plano de trabalho anexado com sucesso!";
+ statusPlano = true;
} else {
- mensagem = "Não foi possível enviar o plano de trabalho!";
+ mensagemPlano = "Não foi possível anexar o plano de trabalho!";
}
} else {
- if (planoTrabalhoDao.atualizarPlanoTrabalho(path, file.getFile(), questionario,
- idPlanoTrabalho, nomeExtensao)) {
- mensagem = "Plano de trabalho enviado com sucesso!";
- status = true;
+ if (planoTrabalhoDao.atualizarPlanoTrabalho(path, filePlano.getFile(), questionario,
+ planoTrabalho.getIdPlanoTrabalho(), nomeExtensaoPlanoTrabalho)) {
+ mensagemPlano = "Plano de trabalho anexado com sucesso!";
+ statusPlano = true;
} else {
- mensagem = "Não foi possível enviar o plano de trabalho!";
+ mensagemPlano = "Não foi possível anexar o plano de trabalho!";
}
}
} else {
- mensagem = "Favor verificar o Código de Acesso!";
+ mensagemPlano = "Favor verificar o Código de Acesso!";
}
+
+ }
+
+ if(planoTrabalho.getArquivoRelatorioAss() != null)
+ {
+ existeRelatorioAnexado = true;
+ }
+ result.include("mensagemPlano", mensagemPlano);
+ result.include("statusPlano", statusPlano);
+ result.include("existeRelatorioAnexado", existeRelatorioAnexado);
}
+
+
+ // /Relatório Assinado
+
+ if (fileRelatorio != null) {
+ String tipoArquivo = fileRelatorio.getContentType();
+
+ if (!tipoArquivo.equalsIgnoreCase("application/msword")
+ && !tipoArquivo.equalsIgnoreCase("application/vnd.ms-excel")
+ && !tipoArquivo.equalsIgnoreCase("application/vnd.oasis.opendocument.text")
+ && !tipoArquivo.equalsIgnoreCase("text/plain")
+ && !tipoArquivo.equalsIgnoreCase("application/pdf")
+ && !tipoArquivo.equalsIgnoreCase("image/png")
+ && !tipoArquivo.equalsIgnoreCase("image/gif")
+ && !tipoArquivo.equalsIgnoreCase("image/jpeg")
+ && !tipoArquivo.equalsIgnoreCase("application/zip")
+ && !tipoArquivo.equalsIgnoreCase("application/x-rar-compressed")
+ && !tipoArquivo.equalsIgnoreCase("application/octet-stream")) {
+
+ mensagemRelatorio = "Formato de Arquivo para Relatório é inválido!";
+ statusRelatorio = false;
+
+ } else {
+ HashDao hashDao = new HashDao();
+ questionario = new Questionario();
+ questionario = hashDao.verificarHash(path, valorHash);
+ String nomeExtensaoRelatorio = fileRelatorio.getFileName();
+
+ if (questionario != null && questionario.getDtInicioQuestionario() != null) {
+ PlanoTrabalhoDao planoTrabalhoDao = new PlanoTrabalhoDao();
+ planoTrabalho = new PlanoTrabalho();
+
+ planoTrabalho = planoTrabalhoDao.recuperarPlanoTrabalho(path, questionario);
+
+ if (planoTrabalho.getArquivoRelatorioAss() == null) {
+ if (planoTrabalhoDao.salvarRelatorioAss(path, fileRelatorio.getFile(), questionario,
+ nomeExtensaoRelatorio)) {
+ mensagemRelatorio = "Relatório anexado com sucesso!";
+ statusRelatorio = true;
+ } else {
+ mensagemRelatorio = "Não foi possível anexar o Relatório!";
+ }
+ } else {
+ if (planoTrabalhoDao.atualizarRelatorioAss(path, fileRelatorio.getFile(), questionario,
+ planoTrabalho.getIdPlanoTrabalho(), nomeExtensaoRelatorio)) {
+ mensagemRelatorio = "Relatório anexado com sucesso!";
+ statusRelatorio = true;
+ } else {
+ mensagemRelatorio = "Não foi possível anexar o Relatório!";
+ }
+ }
+
+ } else {
+ mensagemRelatorio = "Favor verificar o Código de Acesso!";
+ }
+
+ }
+ result.include("mensagemRelatorio", mensagemRelatorio);
+ result.include("statusRelatorio", statusRelatorio);
+ VRaptorRequestHolder.currentRequest().getServletContext()
+ .setAttribute("questionario", questionario);
+ VRaptorRequestHolder.currentRequest().getServletContext()
+ .setAttribute("fileRelatorio", fileRelatorio);
}
- else
- {
- mensagem = "O arquivo não pode ser maior que 50Mb!";
+
+
+ if (filePlano == null && fileRelatorio == null) {
+ mensagemPlano = "Não foi possível anexar o Plano de Trabalho!";
+ mensagemRelatorio = "Não foi possível anexar o Relatório!";
+ result.include("mensagemPlano", mensagemPlano);
+ result.include("statusPlano", statusPlano);
+ result.include("mensagemRelatorio", mensagemRelatorio);
+ result.include("statusRelatorio", statusRelatorio);
}
- result.include("mensagem", mensagem);
- result.include("status", status);
+
this.validator.add(new ValidationMessage("", ""));
this.validator.onErrorUsePageOf(PlanoTrabalhoController.class).planoTrabalhoConfirmacao();
}
@@ -132,12 +221,11 @@ public class PlanoTrabalhoController extends DefaultMultipartConfig {
if (questionario != null && questionario.getIdQuestionario() > 0) {
planoTrabalho = planoTrabalhoDao.recuperarPlanoTrabalho(path, questionario);
-
- if(planoTrabalho != null)
- {
+
+ if (planoTrabalho != null) {
try {
- String nome = planoTrabalho.getNomeExtensao();
- dados = planoTrabalho.getArquivoPlanoTrabalho();
+ String nome = planoTrabalho.getNomeExtensaoPlanoTrabalho();
+ dados = planoTrabalho.getArquivoPlanoTrabalho();
response.setContentType("inline/download");
String arq = "attachment;filename=" + nome;
response.setHeader("Content-Disposition", arq);
@@ -146,7 +234,38 @@ public class PlanoTrabalhoController extends DefaultMultipartConfig {
os.flush();
os.close();
} catch (Exception e) {
-
+
+ }
+ }
+ }
+ }
+
+ @Get("/recuperar-relatorio/{id}")
+ public void recuperarRelatorio(int id, HttpServletResponse response) throws IOException {
+
+ Questionario questionario = new Questionario(path, id);
+
+ PlanoTrabalhoDao planoTrabalhoDao = new PlanoTrabalhoDao();
+ PlanoTrabalho planoTrabalho = new PlanoTrabalho();
+
+ byte[] dados = null;
+
+ if (questionario != null && questionario.getIdQuestionario() > 0) {
+ planoTrabalho = planoTrabalhoDao.recuperarPlanoTrabalho(path, questionario);
+
+ if (planoTrabalho != null) {
+ try {
+ String nome = planoTrabalho.getNomeExtensaoRelatorioAss();
+ dados = planoTrabalho.getArquivoRelatorioAss();
+ response.setContentType("inline/download");
+ String arq = "attachment;filename=" + nome;
+ response.setHeader("Content-Disposition", arq);
+ ServletOutputStream os = response.getOutputStream();
+ os.write(dados);
+ os.flush();
+ os.close();
+ } catch (Exception e) {
+
}
}
}
diff --git a/src/br/com/controller/QuestionarioController.java b/src/br/com/controller/QuestionarioController.java
index cc922a1..6586c12 100644
--- a/src/br/com/controller/QuestionarioController.java
+++ b/src/br/com/controller/QuestionarioController.java
@@ -62,7 +62,7 @@ public class QuestionarioController {
@Path("/lista-questionario")
public void listaQuestionario() {
-
+ listarQuestionarioComFiltro("todos", "todos","");
}
@Path("/listar-questionario")
@@ -81,8 +81,6 @@ public class QuestionarioController {
this.validator.onErrorUsePageOf(QuestionarioController.class).listaQuestionario();
-
-
}
@Path("/salvar-questionario")
diff --git a/src/br/com/controller/formularioOrgaoController.java b/src/br/com/controller/formularioOrgaoController.java
index 028858a..77e3d46 100644
--- a/src/br/com/controller/formularioOrgaoController.java
+++ b/src/br/com/controller/formularioOrgaoController.java
@@ -66,7 +66,9 @@ public class formularioOrgaoController {
questionario = new Questionario();
questionario = hashDao.verificarHash(path, valorHash);
-
+ if(!questionario.isFlagEnviado())
+ {
+
if (questionario.getDtInicioQuestionario() != null && !valorHash.equalsIgnoreCase("")) {
VRaptorRequestHolder.currentRequest().getServletContext()
@@ -119,6 +121,20 @@ public class formularioOrgaoController {
}
}
}
+ }
+ else
+ {
+ validacao = new Validacao();
+ validacao.setCampo("valorHash");
+ validacao
+ .setMensagem("Não é mais permitido alterar seus dados!");
+
+ mensagemValidacaoCampos.add(validacao);
+
+ result.include("mensagemValidacaoCampos", mensagemValidacaoCampos);
+ this.validator.add(new ValidationMessage("", ""));
+ this.validator.onErrorUsePageOf(loginController.class).login();
+ }
}
private void setValorCamposUrl(String nomeCampo, String valorCampo)
diff --git a/src/br/com/controller/relatorioController.java b/src/br/com/controller/relatorioController.java
index 5da5637..8f22bb0 100644
--- a/src/br/com/controller/relatorioController.java
+++ b/src/br/com/controller/relatorioController.java
@@ -1,214 +1,357 @@
package br.com.controller;
+import java.io.File;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
import javax.servlet.ServletContext;
+import org.apache.commons.fileupload.FileUpload;
+
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
+import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
+import br.com.caelum.vraptor.ioc.spring.VRaptorRequestHolder;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.dao.HashDao;
+import br.com.dao.PlanoTrabalhoDao;
+import br.com.dao.QuestionarioDao;
import br.com.dao.RespostaQuestionarioDao;
import br.com.model.entity.AmostragemSiteQuestionario;
+import br.com.model.entity.EnvioEmailSemAutenticacao;
+import br.com.model.entity.PlanoTrabalho;
import br.com.model.entity.Questionario;
import br.com.model.entity.RespostaQuestionario;
+import br.com.model.utilities.Email;
import br.com.util.Validacao;
@Resource
public class relatorioController {
-
+
private List
mensagemValidacaoCampos = new ArrayList();
private Result result;
private Validator validator;
private Questionario questionario;
private ServletContext application;
private String path;
-
+
public relatorioController(Result result, Validator validator, ServletContext application) {
this.result = result;
this.validator = validator;
this.application = application;
this.path = this.application.getRealPath("") + "/WEB-INF/conexao.properties";
}
-
-
- @Path("/relatorio-site")
- public void relatorio(){
-
-
- }
-
- @Path("/relatorio-imprimir")
- @Get("/relatorio-imprimir/{idQuestionario}")
- public void relatorioImprimir(String idQuestionario, String valorHash)
- {
- if (idQuestionario != null) {
- gerarRelatorio(Integer.parseInt(idQuestionario));
+
+
+ @Path("/relatorio-site")
+ public void relatorio() {
+
+ }
+
+ @Path("/relatorio-imprimir")
+ public void relatorioImprimir(String idQuestionario, String valorHash) {
+ if (idQuestionario != null) {
+ gerarRelatorio(Integer.parseInt(idQuestionario));
+ } else if (valorHash != null) {
+ Validacao validacao = new Validacao();
+ mensagemValidacaoCampos = new ArrayList();
+ mensagemValidacaoCampos = validacao.validarHashEmitirRelatorio(path, valorHash);
+
+ if (mensagemValidacaoCampos.size() > 0) {
+ result.include("mensagemValidacaoCampos", mensagemValidacaoCampos);
+ this.validator.add(new ValidationMessage("", ""));
+ this.validator.onErrorUsePageOf(relatorioController.class).relatorio();
}
- else if (valorHash != null)
- {
- Validacao validacao = new Validacao();
- mensagemValidacaoCampos = new ArrayList();
- mensagemValidacaoCampos = validacao.validarHashEmitirRelatorio(path, valorHash);
-
- if (mensagemValidacaoCampos.size() > 0) {
- result.include("mensagemValidacaoCampos", mensagemValidacaoCampos);
- this.validator.add(new ValidationMessage("", ""));
- this.validator.onErrorUsePageOf(relatorioController.class).relatorio();
- }
- HashDao hashDao = new HashDao();
- questionario = new Questionario();
- questionario = hashDao.verificarHash(path, valorHash);
-
- if (questionario.getDtInicioQuestionario() != null && questionario.isQuestionario_respondido()) {
- gerarRelatorio(questionario.getIdQuestionario());
- }
-
+ HashDao hashDao = new HashDao();
+ questionario = new Questionario();
+ questionario = hashDao.verificarHash(path, valorHash);
+
+ if (questionario.getDtInicioQuestionario() != null
+ && questionario.isQuestionario_respondido()) {
+ gerarRelatorio(questionario.getIdQuestionario());
}
+
}
+ }
+
+ @Path("/enviar-email-mpf")
+ public void enviarEmailMPF() {
+ Questionario questionario = new Questionario();
+ QuestionarioDao questionarioDao;
- private void gerarRelatorio(int idQuestionario)
- {
- Questionario questionario = new Questionario(path, idQuestionario);
- RespostaQuestionarioDao respostaQuestionarioDao = new RespostaQuestionarioDao();
-
- List lsRespostaQuestionario = new ArrayList();
- List lsAmostragemSiteQuestionario =
- new ArrayList();
-
- lsRespostaQuestionario =
- respostaQuestionarioDao.retornarRespostaQuestionarioPorQuestionario(path, questionario
- .getIdQuestionario());
-
- List curso = new ArrayList();
- List simValidacao = new ArrayList();
- List assistiva = new ArrayList();
- List deficiencias = new ArrayList();
- List ferramentaValidacao = new ArrayList();
-
- for (RespostaQuestionario respostaQuestionario : lsRespostaQuestionario) {
-
- switch (respostaQuestionario.getPergunta().getIdPergunta()) {
- case 1:
- result.include("nomeOrgao", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 2:
- result.include("nomePessoa", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 3:
- result.include("cargo", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 4:
- result.include("telefone", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 5:
- result.include("email", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 7:
- result.include("perguntaAcessibilidade", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 8:
- result.include("reclamacao", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 9:
- result.include("espacoReclamacao", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 10:
- result.include("perguntaEstimulo", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 11:
- curso.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
- break;
- case 12:
- result.include("requisito", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 13:
- result.include("justificativaRequisito", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 14:
- result.include("opcaoContrat", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 15:
- result.include("perguntaValidacao", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 16:
- simValidacao.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
- break;
- case 17:
- ferramentaValidacao.add(respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 18:
- result.include("outroAvaliador", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 19:
-
- lsAmostragemSiteQuestionario.add(respostaQuestionario.getAmostragemSiteQuestionario());
- break;
- /* case 20:
- result.include("nivelWcag", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;*/
- case 21:
- result.include("checklistQtnList", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 22:
- deficiencias.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
- break;
- case 23:
- result.include("funcionalidade", respostaQuestionario.getOpcaoResposta()
- .getDescOpcaoResposta());
- break;
- case 24:
- assistiva.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
- break;
- case 25:
- result.include("justificativaAssistiva", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- case 26:
- result.include("dificuldadePrazo", respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ?respostaQuestionario.getTextoResposta().replace("null", "Não Respondido"):respostaQuestionario.getTextoResposta());
- break;
- default:
- break;
+ UploadedFile fileRelatorio;
+
+ String mensagemMPF = "";
+ String mensagemOrgao = "";
+ String assuntoMPF = "";
+ String assuntoOrgao = "";
+
+ questionario =
+ (Questionario) VRaptorRequestHolder.currentRequest().getServletContext()
+ .getAttribute("questionario");
+
+ fileRelatorio =
+ (UploadedFile) VRaptorRequestHolder.currentRequest().getServletContext()
+ .getAttribute("fileRelatorio");
+
+ PlanoTrabalho planoTrabalho = new PlanoTrabalho();
+ PlanoTrabalhoDao planoTrabalhoDao = new PlanoTrabalhoDao();
+
+ planoTrabalho = planoTrabalhoDao.recuperarPlanoTrabalho(path, questionario);
+
+ DataHandler dataHandlerRelatorio;
+ DataHandler dataHandlerPlano;
+
+ dataHandlerRelatorio =
+ new DataHandler(planoTrabalho.getArquivoRelatorioAss(), fileRelatorio.getContentType());
+ dataHandlerPlano =
+ new DataHandler(planoTrabalho.getArquivoPlanoTrabalho(), fileRelatorio.getContentType());
+
+ Email email = new Email(this.application.getRealPath("") + "/WEB-INF/mail.properties");
+
+ EnvioEmailSemAutenticacao envioEmailSemAutenticacao =
+ new EnvioEmailSemAutenticacao(email.getHost(), Integer.toString(email.getPort()));
+
+
+ String mensagemRetornoMPF =
+ envioEmailSemAutenticacao.sendMailComAnexo(questionario.getEmailDestinoOrgao(),
+ email.getAnexosTo(), assuntoMPF, mensagemMPF, email.getAuth(), email.getAuthUser(),
+ email.getAuthPass(), dataHandlerRelatorio, planoTrabalho.getNomeExtensaoRelatorioAss(),
+ dataHandlerPlano, planoTrabalho.getNomeExtensaoPlanoTrabalho());
+
+ if (mensagemRetornoMPF.equalsIgnoreCase("")) {
+ String mensagemRetornoOrgao =
+ envioEmailSemAutenticacao.sendMailComAnexo(email.getFrom(),
+ questionario.getEmailDestinoOrgao(), assuntoOrgao, mensagemOrgao, email.getAuth(),
+ email.getAuthUser(), email.getAuthPass(), dataHandlerRelatorio,
+ planoTrabalho.getNomeExtensaoRelatorioAss(), dataHandlerPlano,
+ planoTrabalho.getNomeExtensaoPlanoTrabalho());
+
+
+ if (mensagemRetornoOrgao.equalsIgnoreCase("")) {
+
+ questionarioDao = new QuestionarioDao();
+
+ if(questionarioDao.atualizarFlagEnviado(path, questionario.getIdQuestionario()))
+ {
+ result.include("mensagemEnvio", "Mensagem enviada com Sucesso, você recebeu um email com os anexos!");
+ result.include("statusEnvio", true);
}
+ }
+ }
+ else
+ {
+ result.include("mensagemEnvio", "Não foi possível enviar o email com os anexos!");
+ result.include("statusEnvio", false);
+ }
+
+ this.validator.add(new ValidationMessage("", ""));
+ this.validator.onErrorUsePageOf(relatorioController.class).confirmacaoEnvioEmailMPF();
+ }
+ public void confirmacaoEnvioEmailMPF()
+ {
+
+ }
+
+ @Get("/relatorio-imprimir/{id}")
+ public void relatorioImprimir(String id) {
+ if (id != null) {
+ gerarRelatorio(Integer.parseInt(id));
+ }
+ }
+
+ private void gerarRelatorio(int idQuestionario) {
+ Questionario questionario = new Questionario(path, idQuestionario);
+ RespostaQuestionarioDao respostaQuestionarioDao = new RespostaQuestionarioDao();
+
+ List lsRespostaQuestionario = new ArrayList();
+ List lsAmostragemSiteQuestionario =
+ new ArrayList();
+
+ lsRespostaQuestionario =
+ respostaQuestionarioDao.retornarRespostaQuestionarioPorQuestionario(path,
+ questionario.getIdQuestionario());
+
+ List curso = new ArrayList();
+ List simValidacao = new ArrayList();
+ List assistiva = new ArrayList();
+ List deficiencias = new ArrayList();
+ List ferramentaValidacao = new ArrayList();
+
+ for (RespostaQuestionario respostaQuestionario : lsRespostaQuestionario) {
+
+ switch (respostaQuestionario.getPergunta().getIdPergunta()) {
+ case 1:
+ result
+ .include(
+ "nomeOrgao",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 2:
+ result
+ .include(
+ "nomePessoa",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 3:
+ result
+ .include(
+ "cargo",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 4:
+ result
+ .include(
+ "telefone",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 5:
+ result
+ .include(
+ "email",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 7:
+ result.include("perguntaAcessibilidade", respostaQuestionario.getOpcaoResposta()
+ .getDescOpcaoResposta());
+ break;
+ case 8:
+ result.include("reclamacao", respostaQuestionario.getOpcaoResposta()
+ .getDescOpcaoResposta());
+ break;
+ case 9:
+ result
+ .include(
+ "espacoReclamacao",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 10:
+ result.include("perguntaEstimulo", respostaQuestionario.getOpcaoResposta()
+ .getDescOpcaoResposta());
+ break;
+ case 11:
+ curso.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
+ break;
+ case 12:
+ result.include("requisito", respostaQuestionario.getOpcaoResposta()
+ .getDescOpcaoResposta());
+ break;
+ case 13:
+ result
+ .include(
+ "justificativaRequisito",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 14:
+ result.include("opcaoContrat", respostaQuestionario.getOpcaoResposta()
+ .getDescOpcaoResposta());
+ break;
+ case 15:
+ result.include("perguntaValidacao", respostaQuestionario.getOpcaoResposta()
+ .getDescOpcaoResposta());
+ break;
+ case 16:
+ simValidacao.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
+ break;
+ case 17:
+ ferramentaValidacao.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
+ break;
+ case 18:
+ result
+ .include(
+ "outroAvaliador",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 19:
+
+ lsAmostragemSiteQuestionario.add(respostaQuestionario.getAmostragemSiteQuestionario());
+ break;
+ /*
+ * case 20: result.include("nivelWcag", respostaQuestionario.getOpcaoResposta()
+ * .getDescOpcaoResposta()); break;
+ */
+ case 21:
+ result.include("checklistQtnList", respostaQuestionario.getOpcaoResposta()
+ .getDescOpcaoResposta());
+ break;
+ case 22:
+ deficiencias.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
+ break;
+ case 23:
+ result.include("funcionalidade", respostaQuestionario.getOpcaoResposta()
+ .getDescOpcaoResposta());
+ break;
+ case 24:
+ assistiva.add(respostaQuestionario.getOpcaoResposta().getDescOpcaoResposta());
+ break;
+ case 25:
+ result
+ .include(
+ "justificativaAssistiva",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ case 26:
+ result
+ .include(
+ "dificuldadePrazo",
+ respostaQuestionario.getTextoResposta().equalsIgnoreCase("null") ? respostaQuestionario
+ .getTextoResposta().replace("null", "Não Respondido") : respostaQuestionario
+ .getTextoResposta());
+ break;
+ default:
+ break;
}
- result.include("dataRespostaQuestionario", respostaQuestionarioDao.retornarDataRespostaQuestionarioPorQuestionario(path, idQuestionario));
-
- if(curso.size() == 0)
- {
- curso.add("Não Respondido");
- }
-
- if(simValidacao.size() == 0)
- {
- simValidacao.add("Não Respondido");
- }
-
- if(deficiencias.size() == 0)
- {
- deficiencias.add("Não Respondido");
- }
-
- result.include("curso", curso);
- result.include("simValidacao", simValidacao);
- result.include("assistiva", assistiva);
- result.include("deficiencias", deficiencias);
- result.include("ferramentaValidacao", ferramentaValidacao);
- result.include("questionario", questionario);
- result.include("lsAmostragemSiteQuestionario", lsAmostragemSiteQuestionario);
+
+
}
+ result.include("dataRespostaQuestionario", respostaQuestionarioDao
+ .retornarDataRespostaQuestionarioPorQuestionario(path, idQuestionario));
+
+ if (curso.size() == 0) {
+ curso.add("Não Respondido");
+ }
+
+ if (simValidacao.size() == 0) {
+ simValidacao.add("Não Respondido");
+ }
+
+ if (deficiencias.size() == 0) {
+ deficiencias.add("Não Respondido");
+ }
+
+ result.include("curso", curso);
+ result.include("simValidacao", simValidacao);
+ result.include("assistiva", assistiva);
+ result.include("deficiencias", deficiencias);
+ result.include("ferramentaValidacao", ferramentaValidacao);
+ result.include("questionario", questionario);
+ result.include("lsAmostragemSiteQuestionario", lsAmostragemSiteQuestionario);
+ }
}
diff --git a/src/br/com/dao/HashDao.java b/src/br/com/dao/HashDao.java
index 9418bf4..bccc6e1 100644
--- a/src/br/com/dao/HashDao.java
+++ b/src/br/com/dao/HashDao.java
@@ -29,7 +29,7 @@ public class HashDao {
sql.append(" SELECT id_questionario, dt_inicio_questionario, dt_fim_questionario, ");
sql.append(" no_orgao, hash_autenticacao, questionario_respondido, email_destino_orgao, ");
sql.append(" responsavel, cargo_responsavel, telefone, data_recebimento_email, ");
- sql.append(" idautorizacao, data_resposta_email ");
+ sql.append(" idautorizacao, data_resposta_email, flag_enviado ");
sql.append(" FROM questionario where hash_autenticacao = '" + valorHash + "'");
sql.append(" and (dt_inicio_questionario <= '" + DateUtil.dataHoraAtual() + "')");
sql.append(" and (dt_fim_questionario >= '" + DateUtil.dataHoraAtual() + "');");
@@ -48,6 +48,7 @@ public class HashDao {
questionario.setResponsavel(rset.getString("responsavel"));
questionario.setCargoResponsavel(rset.getString("cargo_responsavel"));
questionario.setTelefone(rset.getString("telefone"));
+ questionario.setFlagEnviado(rset.getBoolean("flag_enviado"));
questionario.setEmailDestinoOrgao(rset.getString("email_destino_orgao"));
}
diff --git a/src/br/com/dao/PlanoTrabalhoDao.java b/src/br/com/dao/PlanoTrabalhoDao.java
index aacb642..d8a8a2a 100644
--- a/src/br/com/dao/PlanoTrabalhoDao.java
+++ b/src/br/com/dao/PlanoTrabalhoDao.java
@@ -1,20 +1,14 @@
package br.com.dao;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
import java.io.InputStream;
-import java.io.PrintStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import java.util.Properties;
import br.com.model.entity.PlanoTrabalho;
import br.com.model.entity.Questionario;
-import br.com.model.utilities.ManagerProperties;
public class PlanoTrabalhoDao {
@@ -27,7 +21,7 @@ public class PlanoTrabalhoDao {
Connection con = Conexao.conecta(path);
Statement estado;
ResultSet rset = null;
- boolean existePlanoTrabalho = false;
+ //boolean existePlanoTrabalho = false;
int idPlanoTrabalho = -1;
try {
@@ -72,7 +66,44 @@ public class PlanoTrabalhoDao {
try {
sql = new StringBuffer();
- sql.append(" INSERT INTO public.plano_trabalho(id_questionario, arquivo_plano_trabalho, nome_extensao) VALUES (?, ?, ?); ");
+ sql.append(" INSERT INTO public.plano_trabalho(id_questionario, arquivo_plano_trabalho, extensao_plano_trabalho) VALUES (?, ?, ?); ");
+
+ estado = con.prepareStatement(sql.toString());
+
+ estado.setInt(1, questionario.getIdQuestionario());
+ estado.setBinaryStream(2, file);
+ estado.setString(3, nomeExtensao);
+
+ resultado = estado.executeUpdate();
+
+ if (resultado == 0) {
+ salvoComSucesso = false;
+ } else {
+
+ salvoComSucesso = true;
+ }
+
+ } catch (SQLException e) {
+
+ e.printStackTrace();
+ }
+
+ return salvoComSucesso;
+ }
+
+ public boolean salvarRelatorioAss(String path, InputStream file, Questionario questionario, String nomeExtensao)
+ {
+
+ StringBuffer sql = new StringBuffer();
+ Connection con = Conexao.conecta(path);
+ PreparedStatement estado;
+ int resultado = 0;
+ boolean salvoComSucesso = false;
+
+ try {
+
+ sql = new StringBuffer();
+ sql.append(" INSERT INTO public.plano_trabalho(id_questionario, arquivo_relatorio_ass, extensao_relatorio_ass) VALUES (?, ?, ?); ");
estado = con.prepareStatement(sql.toString());
@@ -112,7 +143,7 @@ public class PlanoTrabalhoDao {
//sql.append(" INSERT INTO public.plano_trabalho(id_questionario, arquivo_plano_trabalho) VALUES (?, ?); ");
sql.append(" UPDATE public.plano_trabalho");
sql.append(" SET arquivo_plano_trabalho=?,");
- sql.append( " nome_extensao =? ");
+ sql.append( " extensao_plano_trabalho =? ");
sql.append(" WHERE id_plano_trabalho=?;");
estado = con.prepareStatement(sql.toString());
@@ -139,6 +170,49 @@ public class PlanoTrabalhoDao {
return salvoComSucesso;
}
+ public boolean atualizarRelatorioAss(String path, InputStream file, Questionario questionario, int idPlanoTrabalho, String nomeExtensao)
+ {
+
+ StringBuffer sql = new StringBuffer();
+ Connection con = Conexao.conecta(path);
+ PreparedStatement estado;
+ int resultado = 0;
+ boolean salvoComSucesso = false;
+
+ try {
+
+ sql = new StringBuffer();
+ //sql.append(" INSERT INTO public.plano_trabalho(id_questionario, arquivo_plano_trabalho) VALUES (?, ?); ");
+ sql.append(" UPDATE public.plano_trabalho");
+ sql.append(" SET arquivo_relatorio_ass=?,");
+ sql.append( " extensao_relatorio_ass =? ");
+ sql.append(" WHERE id_plano_trabalho=?;");
+
+ estado = con.prepareStatement(sql.toString());
+
+ //estado.setInt(1, questionario.getIdQuestionario());
+ estado.setBinaryStream(1, file);
+ estado.setString(2, nomeExtensao);
+ estado.setInt(3, idPlanoTrabalho);
+
+ resultado = estado.executeUpdate();
+
+ if (resultado == 0) {
+ salvoComSucesso = false;
+ } else {
+
+ salvoComSucesso = true;
+ }
+
+ } catch (SQLException e) {
+
+ e.printStackTrace();
+ }
+
+ return salvoComSucesso;
+ }
+
+
public PlanoTrabalho recuperarPlanoTrabalho(String path, Questionario questionario)
{
@@ -147,8 +221,8 @@ public class PlanoTrabalhoDao {
Connection con = Conexao.conecta(path);
Statement estado;
ResultSet rset = null;
- byte[] imgBytes = null;
- PlanoTrabalho planoTrabalho = new PlanoTrabalho();
+ //byte[] imgBytes = null;
+ PlanoTrabalho planoTrabalho = new PlanoTrabalho();
try {
@@ -162,9 +236,11 @@ public class PlanoTrabalhoDao {
rset = estado.executeQuery(sql);
while (rset.next()) {
- planoTrabalho.setArquivoPlanoTrabalho(rset.getBytes("arquivo_plano_trabalho"));
planoTrabalho.setIdPlanoTrabalho(rset.getInt("id_plano_trabalho"));
- planoTrabalho.setNomeExtensao(rset.getString("nome_extensao"));
+ planoTrabalho.setArquivoPlanoTrabalho(rset.getBytes("arquivo_plano_trabalho"));
+ planoTrabalho.setNomeExtensaoPlanoTrabalho(rset.getString("extensao_plano_trabalho"));
+ planoTrabalho.setArquivoRelatorioAss(rset.getBytes("arquivo_relatorio_ass"));
+ planoTrabalho.setNomeExtensaoRelatorioAss(rset.getString("extensao_relatorio_ass"));
planoTrabalho.setQuestionario(questionario);
}
diff --git a/src/br/com/dao/QuestionarioDao.java b/src/br/com/dao/QuestionarioDao.java
index 7b1624c..7f7f03c 100644
--- a/src/br/com/dao/QuestionarioDao.java
+++ b/src/br/com/dao/QuestionarioDao.java
@@ -54,8 +54,9 @@ public class QuestionarioDao {
questionario.setTelefone(rset.getString("telefone"));
questionario.setIdAutorizacaoGeracaoHash(rset.getInt("idAutorizacao"));
questionario.setDtRecebimentoEmail(DateUtil.dataHoraFormatadaDiaMesAno(rset.getString("data_recebimento_email")));
-
+ questionario.setFlagEnviado(rset.getBoolean("flag_enviado"));
dataRespostaQuestionario = rset.getString("data_resposta_email");
+
if(dataRespostaQuestionario != null)
{
questionario.setDtRespostaEmail(DateUtil.dataHoraFormatadaDiaMesAnoComParametro(dataRespostaQuestionario));
@@ -110,6 +111,7 @@ public class QuestionarioDao {
questionario.setTelefone(rset.getString("telefone"));
questionario.setIdAutorizacaoGeracaoHash(rset.getInt("idAutorizacao"));
questionario.setDtRecebimentoEmail(DateUtil.dataHoraFormatadaDiaMesAno(rset.getString("data_recebimento_email")));
+ questionario.setFlagEnviado(rset.getBoolean("flag_enviado"));
dataRespostaQuestionario = rset.getString("data_resposta_email");
if(dataRespostaQuestionario != null)
@@ -277,6 +279,42 @@ public class QuestionarioDao {
return salvoComSucesso;
}
+ public boolean atualizarFlagEnviado(String path, int idQuestionario)
+ {
+
+ StringBuffer sql = new StringBuffer();
+ Connection con = Conexao.conecta(path);
+ PreparedStatement estado;
+ int resultado = 0;
+ boolean salvoComSucesso = false;
+
+
+
+ try {
+
+ sql = new StringBuffer();
+ sql.append(" UPDATE public.questionario SET flag_enviado = true WHERE id_questionario = ?; ");
+
+ estado = con.prepareStatement(sql.toString());
+
+ estado.setInt(1, idQuestionario);
+
+ resultado = estado.executeUpdate();
+
+ if (resultado == 0) {
+ salvoComSucesso = false;
+ } else {
+
+ salvoComSucesso = true;
+ }
+
+ } catch (SQLException e) {
+
+ e.printStackTrace();
+ }
+
+ return salvoComSucesso;
+ }
public ResultSet retornarQuestionarioPorId(String path, int idQuestionario) {
@@ -345,8 +383,8 @@ public class QuestionarioDao {
sql.append(" dt_inicio_questionario, dt_fim_questionario, ");
sql.append(" no_orgao, hash_autenticacao, questionario_respondido, email_destino_orgao, ");
sql.append(" responsavel, cargo_responsavel, telefone, idAutorizacao, ");
- sql.append(" data_recebimento_email) ");
- sql.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
+ sql.append(" data_recebimento_email,flag_enviado) ");
+ sql.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?);");
// cria statement para executar a query
@@ -363,6 +401,7 @@ public class QuestionarioDao {
estado.setString(9, questionario.getTelefone());
estado.setInt(10, questionario.getIdAutorizacaoGeracaoHash());
estado.setDate(11, sqlDtRecebimentoEmail);
+ estado.setBoolean(12, false);
//estado.setDate(12, sqlDtRespostaEmail);
//resultado = estado.executeUpdate();
--
libgit2 0.21.2