From 8ece47d6b77ed07e3bbafc0e7855bfbbbbd07036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tiago=20Sim=C3=A3o?= Date: Fri, 1 Oct 2010 13:45:37 +0000 Subject: [PATCH] git-svn-id: https://svn.coded.pt/svn/SIPRP@1519 bb69d46d-e84e-40c8-a05a-06db0d633741 --- trunk/SIPRPSoft/lib/shst.jar | Bin 2040445 -> 2050246 bytes .../properties/1-development/app.properties | 10 +- .../cursos/templates/certificado_empresas.xsl | 0 .../cursos/templates/certificado_formador.xsl | 0 .../cursos/templates/certificado_formando.xsl | 0 .../1-development}/ficha/ficha_aptidao.xsl | 0 .../cursos/templates/certificado_empresas.xsl | 112 ++ .../cursos/templates/certificado_formador.xsl | 123 ++ .../cursos/templates/certificado_formando.xsl | 95 ++ .../2-testing/ficha/ficha_aptidao.xsl | 487 ++++++ .../cursos/templates/certificado_empresas.xsl | 112 ++ .../cursos/templates/certificado_formador.xsl | 123 ++ .../cursos/templates/certificado_formando.xsl | 95 ++ .../3-production/ficha/ficha_aptidao.xsl | 487 ++++++ .../src/siprp/FichaDataProvider.java | 745 --------- trunk/SIPRPSoft/src/siprp/Main.java | 11 +- .../src/siprp/analise_acidentes_trabalho.xsl | 797 ---------- .../src/siprp/cursos/SIPRPCursosInit.java | 20 - .../provider/CursosTemplatesProvider.java | 175 --- .../estatistica/EstatisticaDataProvider.java | 777 ---------- .../siprp/estatistica/EstatisticaWindow.java | 1359 ----------------- .../src/siprp/ficha/EmpresaPanel.java | 505 ------ trunk/SIPRPSoft/src/siprp/ficha/ExamePDF.java | 524 ------- .../SIPRPSoft/src/siprp/ficha/ExamePanel.java | 557 ------- .../siprp/ficha/FichaAptidaoConstants.java | 78 - .../src/siprp/ficha/FichaAptidaoCreator.java | 115 -- .../ficha/FichaAptidaoEditorManager.java | 207 --- .../FichaAptidaoEditorManagerFactory.java | 40 - .../src/siprp/ficha/FichaWindow.java | 1258 --------------- .../siprp/ficha/MedicoColumnizedObject.java | 46 - .../src/siprp/ficha/MedicoEditor.java | 281 ---- .../src/siprp/ficha/ObservacoesPanel.java | 103 -- .../src/siprp/ficha/PDFFilePrinter.java | 57 - .../src/siprp/ficha/RecomendacoesPanel.java | 64 - .../src/siprp/ficha/SaveExameListener.java | 19 - .../src/siprp/ficha/TrabalhadorPanel.java | 470 ------ .../SIPRPSoft/src/siprp/ficha/UpperPanel.java | 305 ---- .../src/siprp/ficha/ValuesException.java | 22 - .../src/siprp/ficha/ficha_aptidao_teste.xml | 88 -- trunk/SIPRPSoft/src/siprp/ficha/out.txt | 6 - .../src/siprp/ficha/svg/char_square_pure.svg | 24 - .../src/siprp/ficha/svg/char_tick_pure.svg | 24 - .../siprp/initializer/SIPRPLoggerInit.java | 10 - .../siprp/initializer/SIPRPUIInitializer.java | 38 - .../siprp/medicina/MarcacaoConsultaPanel.xml | 100 -- .../src/siprp/medicina/MarcacaoExamePanel.xml | 78 - trunk/SIPRPSoft/src/siprp/medicina/alter.sql | 159 -- trunk/SIPRPSoft/src/siprp/paths | 2 - .../siprp/pesquisas/PesquisasProvider.java | 922 ----------- .../siprp/pesquisas/RelatorioAnualWindow.java | 626 -------- trunk/SIPRPSoft/src/siprp/teste.xml | 384 ----- trunk/SIPRPSoft/src/siprp/ui/SIPRPFrame.java | 20 - .../src/siprp/ui/SIPRPTabbedWindow.java | 32 - trunk/SIPRPSoft/src/siprp/web/WebUpdater.java | 1233 --------------- trunk/SIPRPSoft/src/updtprop.txt | 7 - trunk/SIPRPSoft/src/xml-apis-1.3.04.jar | Bin 194354 -> 0 bytes trunk/SIPRPSoft/src/xml-apis-ext-1.3.04.jar | Bin 85686 -> 0 bytes 57 files changed, 1648 insertions(+), 12284 deletions(-) rename trunk/SIPRPSoft/{src/siprp => properties/1-development}/cursos/templates/certificado_empresas.xsl (100%) rename trunk/SIPRPSoft/{src/siprp => properties/1-development}/cursos/templates/certificado_formador.xsl (100%) rename trunk/SIPRPSoft/{src/siprp => properties/1-development}/cursos/templates/certificado_formando.xsl (100%) rename trunk/SIPRPSoft/{src/siprp => properties/1-development}/ficha/ficha_aptidao.xsl (100%) create mode 100644 trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_empresas.xsl create mode 100644 trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_formador.xsl create mode 100644 trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_formando.xsl create mode 100644 trunk/SIPRPSoft/properties/2-testing/ficha/ficha_aptidao.xsl create mode 100644 trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_empresas.xsl create mode 100644 trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_formador.xsl create mode 100644 trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_formando.xsl create mode 100644 trunk/SIPRPSoft/properties/3-production/ficha/ficha_aptidao.xsl delete mode 100644 trunk/SIPRPSoft/src/siprp/FichaDataProvider.java delete mode 100644 trunk/SIPRPSoft/src/siprp/analise_acidentes_trabalho.xsl delete mode 100644 trunk/SIPRPSoft/src/siprp/cursos/SIPRPCursosInit.java delete mode 100644 trunk/SIPRPSoft/src/siprp/cursos/provider/CursosTemplatesProvider.java delete mode 100644 trunk/SIPRPSoft/src/siprp/estatistica/EstatisticaDataProvider.java delete mode 100644 trunk/SIPRPSoft/src/siprp/estatistica/EstatisticaWindow.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/EmpresaPanel.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/ExamePDF.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/ExamePanel.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoConstants.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoCreator.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoEditorManager.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoEditorManagerFactory.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/FichaWindow.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/MedicoColumnizedObject.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/MedicoEditor.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/ObservacoesPanel.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/PDFFilePrinter.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/RecomendacoesPanel.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/SaveExameListener.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/TrabalhadorPanel.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/UpperPanel.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/ValuesException.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/ficha_aptidao_teste.xml delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/out.txt delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/svg/char_square_pure.svg delete mode 100644 trunk/SIPRPSoft/src/siprp/ficha/svg/char_tick_pure.svg delete mode 100644 trunk/SIPRPSoft/src/siprp/initializer/SIPRPUIInitializer.java delete mode 100644 trunk/SIPRPSoft/src/siprp/medicina/MarcacaoConsultaPanel.xml delete mode 100644 trunk/SIPRPSoft/src/siprp/medicina/MarcacaoExamePanel.xml delete mode 100644 trunk/SIPRPSoft/src/siprp/medicina/alter.sql delete mode 100644 trunk/SIPRPSoft/src/siprp/paths delete mode 100644 trunk/SIPRPSoft/src/siprp/pesquisas/PesquisasProvider.java delete mode 100644 trunk/SIPRPSoft/src/siprp/pesquisas/RelatorioAnualWindow.java delete mode 100644 trunk/SIPRPSoft/src/siprp/teste.xml delete mode 100644 trunk/SIPRPSoft/src/siprp/ui/SIPRPFrame.java delete mode 100644 trunk/SIPRPSoft/src/siprp/ui/SIPRPTabbedWindow.java delete mode 100644 trunk/SIPRPSoft/src/siprp/web/WebUpdater.java delete mode 100644 trunk/SIPRPSoft/src/updtprop.txt delete mode 100644 trunk/SIPRPSoft/src/xml-apis-1.3.04.jar delete mode 100644 trunk/SIPRPSoft/src/xml-apis-ext-1.3.04.jar diff --git a/trunk/SIPRPSoft/lib/shst.jar b/trunk/SIPRPSoft/lib/shst.jar index d5f0ca65c8246bc1cadf9a167e7a1a2b2b2dfec3..70967fe975720ea2204fdb69ebb4c9ab08c8fdc3 100644 GIT binary patch delta 62550 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%0DAnAvLn#(*R`o+_l8;wosnKbc|*uj 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

i%+#>fBbER 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 + + + + + + + + + + + + + + + + + + +   +   +   +   + Certificado +   +   +   +   + + A S.I.P.R.P – Sociedade Ibérica de Prevenção de Riscos Profissionais Unipessoal, certifica que + , + + é formadora certificada ( com CAP nº + + ), ministrou uma acção de formação relativa ao + + , com duração de no dia + + , aos seguintes trabalhadores: + + + + + + + Nome + + + Numero + + + + + + + + + + + + + + + + + + + + + +   + + Formadora +   +   +   +   + + Responsável de Formação + +   +   +   +   +   +   +   +   + +   +   +   +   +   +   +   +   +   +   +   + + Este certificado está registado no Livro de Registo de Formação nº + sob o nº +   +   + + + + + + + diff --git a/trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_formador.xsl b/trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_formador.xsl new file mode 100644 index 00000000..b5adeea7 --- /dev/null +++ b/trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_formador.xsl @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + +   +   +   +   + + +   +   + +   + Certificado +   +   + + A S.I.P.R.P – Sociedade Ibérica de Prevenção de Riscos Profissionais Unipessoal, Lda ( localizada no Atrium do Saldanha – Praça Duque de Saldanha, 1 – 9ºG, Lisboa ), certifica que + , + + + + de sexo , + + + + ministrou uma acção de formação no dia , + com duração total de , + relativa a + +   +   + +   +   +   +   +   +   + + + + + + + + + + + + + + Responsável de Formação + + + Director + + + + +   +   +   +   +   +   +   + + + + + + + + +   + + + + + Formadora + + +   + + + + +   +   +   +   +   +   +   +   +   + Este certificado está registado no Livro de Registo de Formação nº sob o nº + + + + + + + diff --git a/trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_formando.xsl b/trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_formando.xsl new file mode 100644 index 00000000..7ecae65a --- /dev/null +++ b/trunk/SIPRPSoft/properties/2-testing/cursos/templates/certificado_formando.xsl @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + +   +   +   + Certificado de Frequência de Formação Profissional + (de acordo com o Dec. Reg. 35/2002 de 23 de Abril ) +   +   + + A S.I.P.R.P – Sociedade Ibérica de Prevenção de Riscos Profissionais Unipessoal, Lda ( localizada no Atrium do Saldanha – Praça Duque de Saldanha, 1 – 9ºG, Lisboa ), certifica que + + nascida em + a , + com nacionalidade , + de sexo , + + frequentou no dia , + com a duração total de , + o Curso de Formação Profissional de + +   +   + +   +   +   +   +   +   +   + + + + + + + + + + + + + + Formadora + + + Formadora e Responsável de Formação + + + + +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   + Este certificado está registado no Livro de Registo de Formação nº sob o nº + + + + + + + diff --git a/trunk/SIPRPSoft/properties/2-testing/ficha/ficha_aptidao.xsl b/trunk/SIPRPSoft/properties/2-testing/ficha/ficha_aptidao.xsl new file mode 100644 index 00000000..55536878 --- /dev/null +++ b/trunk/SIPRPSoft/properties/2-testing/ficha/ficha_aptidao.xsl @@ -0,0 +1,487 @@ + + + + + + + + + + + + + FICHA DE APTIDÃO + + ( + + ) + + + + + + + + Empresa/Entidade + + + + + + DESIGNAÇÃO SOCIAL: + + + + + + + + ESTABELECIMENTO: + + + + + + LOCALIDADE: + + + + + + + + + + + + + + + + + + + + SERVIÇO DE + SAÚDE: Tipo + + + + ❐ +      + + + + + + + Interno + + + + ❐ +      + + + + + + + Interempresas + + + + ❐ +      + + + + + + + Externo + + + + ❐ +      + + + + + + + Serviço + Nacional de + Saúde + + + + + + DESIGNAÇÃO: + + + + + + + + + + + + + + + + SERVIÇO DE + HIGIENE E + SEGURANÇA: + Tipo + + + + + + + + + Interno + + + + + + + + + Interempresas + + + + + + + + + Externo + + + + + + + + + Outro + + + + + + DESIGNAÇÃO: + + + + + + + + + + + + + + + + + Trabalhador + + + + + + NOME: + + + + + + + + SEXO: + + + + + + DATA DE NASCIMENTO: + + + + + + NACIONALIDADE: + + + + + + + + NÚMERO + MECANOGRÁFICO/OUTRO: + + + + CATEGORIA PROFISSIONAL: + + + + FUNÇÃO PROPOSTA: + + + + + + DATA DE ADMISSÃO: + + + + LOCAL DE TRABALHO: + + + + DATA DE ADMISSÃO NA + FUNÇÃO: + + + + + + + + + + + + + Observações + + + + + + + + + + + + + + + + + + Exame Médico + + + + + + DATA DO EXAME: + + + TIPO + + + ADMISSÃO + + + + + + + PERIÓDICO + + + + + + + OCASIONAL + + + + + + + APÓS DOENÇA + + + + + + + APÓS ACIDENTE + + + + + + + A PEDIDO DO TRABALHADOR + + + + + + + A PEDIDO DO SERVIÇO + + + + + + + POR MUDANCA DE FUNÇÃO + + + + + + + POR ALTERAÇÃO DAS + CONDIÇÕES DE TRABALHO + + + + + + + OUTRO + + + + + + ESPECIFIQUE: + + + + + RESULTADO + + + APTO + + + + + + + APTO CONDICIONALMENTE + + + + + + + INAPTO TEMPORARIAMENTE + + + + + + + INAPTO DEFINITIVAMENTE + + + + + + OUTRAS FUNÇÕES QUE + PODE DESEMPENHAR + + 1 + + + + 2 + + + + 3 + + + + 4 + + +   + + + + + + + + + + + Outras Recomendações + + + + + + PRÓXIMO EXAME: + + + + + + + + + + + + + + + + + MÉDICO DO TRABALHO: + + + + + + C.P. + + + + + + + ASSINATURA + _____________________________________________________________________________________________ + TOMEI CONHECIMENTO + ___________________________________________________________________ + DATA: ___/___/______ + O RESPONSÁVEL DOS RECURSOS + HUMANOS + + + + + + + + + + diff --git a/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_empresas.xsl b/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_empresas.xsl new file mode 100644 index 00000000..c51d15e9 --- /dev/null +++ b/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_empresas.xsl @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + +   +   +   +   + Certificado +   +   +   +   + + A S.I.P.R.P – Sociedade Ibérica de Prevenção de Riscos Profissionais Unipessoal, certifica que + , + + é formadora certificada ( com CAP nº + + ), ministrou uma acção de formação relativa ao + + , com duração de no dia + + , aos seguintes trabalhadores: + + + + + + + Nome + + + Numero + + + + + + + + + + + + + + + + + + + + + +   + + Formadora +   +   +   +   + + Responsável de Formação + +   +   +   +   +   +   +   +   + +   +   +   +   +   +   +   +   +   +   +   + + Este certificado está registado no Livro de Registo de Formação nº + sob o nº +   +   + + + + + + + diff --git a/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_formador.xsl b/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_formador.xsl new file mode 100644 index 00000000..b5adeea7 --- /dev/null +++ b/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_formador.xsl @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + +   +   +   +   + + +   +   + +   + Certificado +   +   + + A S.I.P.R.P – Sociedade Ibérica de Prevenção de Riscos Profissionais Unipessoal, Lda ( localizada no Atrium do Saldanha – Praça Duque de Saldanha, 1 – 9ºG, Lisboa ), certifica que + , + + + + de sexo , + + + + ministrou uma acção de formação no dia , + com duração total de , + relativa a + +   +   + +   +   +   +   +   +   + + + + + + + + + + + + + + Responsável de Formação + + + Director + + + + +   +   +   +   +   +   +   + + + + + + + + +   + + + + + Formadora + + +   + + + + +   +   +   +   +   +   +   +   +   + Este certificado está registado no Livro de Registo de Formação nº sob o nº + + + + + + + diff --git a/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_formando.xsl b/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_formando.xsl new file mode 100644 index 00000000..7ecae65a --- /dev/null +++ b/trunk/SIPRPSoft/properties/3-production/cursos/templates/certificado_formando.xsl @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + +   +   +   + Certificado de Frequência de Formação Profissional + (de acordo com o Dec. Reg. 35/2002 de 23 de Abril ) +   +   + + A S.I.P.R.P – Sociedade Ibérica de Prevenção de Riscos Profissionais Unipessoal, Lda ( localizada no Atrium do Saldanha – Praça Duque de Saldanha, 1 – 9ºG, Lisboa ), certifica que + + nascida em + a , + com nacionalidade , + de sexo , + + frequentou no dia , + com a duração total de , + o Curso de Formação Profissional de + +   +   + +   +   +   +   +   +   +   + + + + + + + + + + + + + + Formadora + + + Formadora e Responsável de Formação + + + + +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   + Este certificado está registado no Livro de Registo de Formação nº sob o nº + + + + + + + diff --git a/trunk/SIPRPSoft/properties/3-production/ficha/ficha_aptidao.xsl b/trunk/SIPRPSoft/properties/3-production/ficha/ficha_aptidao.xsl new file mode 100644 index 00000000..55536878 --- /dev/null +++ b/trunk/SIPRPSoft/properties/3-production/ficha/ficha_aptidao.xsl @@ -0,0 +1,487 @@ + + + + + + + + + + + + + FICHA DE APTIDÃO + + ( + + ) + + + + + + + + Empresa/Entidade + + + + + + DESIGNAÇÃO SOCIAL: + + + + + + + + ESTABELECIMENTO: + + + + + + LOCALIDADE: + + + + + + + + + + + + + + + + + + + + SERVIÇO DE + SAÚDE: Tipo + + + + ❐ +      + + + + + + + Interno + + + + ❐ +      + + + + + + + Interempresas + + + + ❐ +      + + + + + + + Externo + + + + ❐ +      + + + + + + + Serviço + Nacional de + Saúde + + + + + + DESIGNAÇÃO: + + + + + + + + + + + + + + + + SERVIÇO DE + HIGIENE E + SEGURANÇA: + Tipo + + + + + + + + + Interno + + + + + + + + + Interempresas + + + + + + + + + Externo + + + + + + + + + Outro + + + + + + DESIGNAÇÃO: + + + + + + + + + + + + + + + + + Trabalhador + + + + + + NOME: + + + + + + + + SEXO: + + + + + + DATA DE NASCIMENTO: + + + + + + NACIONALIDADE: + + + + + + + + NÚMERO + MECANOGRÁFICO/OUTRO: + + + + CATEGORIA PROFISSIONAL: + + + + FUNÇÃO PROPOSTA: + + + + + + DATA DE ADMISSÃO: + + + + LOCAL DE TRABALHO: + + + + DATA DE ADMISSÃO NA + FUNÇÃO: + + + + + + + + + + + + + Observações + + + + + + + + + + + + + + + + + + Exame Médico + + + + + + DATA DO EXAME: + + + TIPO + + + ADMISSÃO + + + + + + + PERIÓDICO + + + + + + + OCASIONAL + + + + + + + APÓS DOENÇA + + + + + + + APÓS ACIDENTE + + + + + + + A PEDIDO DO TRABALHADOR + + + + + + + A PEDIDO DO SERVIÇO + + + + + + + POR MUDANCA DE FUNÇÃO + + + + + + + POR ALTERAÇÃO DAS + CONDIÇÕES DE TRABALHO + + + + + + + OUTRO + + + + + + ESPECIFIQUE: + + + + + RESULTADO + + + APTO + + + + + + + APTO CONDICIONALMENTE + + + + + + + INAPTO TEMPORARIAMENTE + + + + + + + INAPTO DEFINITIVAMENTE + + + + + + OUTRAS FUNÇÕES QUE + PODE DESEMPENHAR + + 1 + + + + 2 + + + + 3 + + + + 4 + + +   + + + + + + + + + + + Outras Recomendações + + + + + + PRÓXIMO EXAME: + + + + + + + + + + + + + + + + + MÉDICO DO TRABALHO: + + + + + + C.P. + + + + + + + ASSINATURA + _____________________________________________________________________________________________ + TOMEI CONHECIMENTO + ___________________________________________________________________ + DATA: ___/___/______ + O RESPONSÁVEL DOS RECURSOS + HUMANOS + + + + + + + + + + diff --git a/trunk/SIPRPSoft/src/siprp/FichaDataProvider.java b/trunk/SIPRPSoft/src/siprp/FichaDataProvider.java deleted file mode 100644 index 65eb759d..00000000 --- a/trunk/SIPRPSoft/src/siprp/FichaDataProvider.java +++ /dev/null @@ -1,745 +0,0 @@ -/* - * FichaDataProvider.java - * - * Created on 30 de Marco de 2004, 11:31 - */ - -package siprp; - -import java.text.DateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import shst.data.AvisoConstants; -import shst.data.Marcacao; -import shst.data.outer.MarcacoesTrabalhadorData; - -import com.evolute.utils.Singleton; -import com.evolute.utils.arrays.Virtual2DArray; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.data.MappableObject; -import com.evolute.utils.db.DBManager; -import com.evolute.utils.db.Executer; -import com.evolute.utils.sql.Assignment; -import com.evolute.utils.sql.Expression; -import com.evolute.utils.sql.Field; -import com.evolute.utils.sql.Select; -import com.evolute.utils.sql.Select2; -import com.evolute.utils.sql.Update; -import com.evolute.utils.strings.StringPlainer; -import com.evolute.utils.ui.search.SearchDialog; -import com.evolute.utils.ui.search.SearchExecuter; - -/** - * - * @author pars - */ -public class FichaDataProvider - implements SearchExecuter { - - private static final Object LOCK = new Object(); - private static FichaDataProvider instance = null; - private final Executer executer; - - public static final String SIPRP = "SIPRP - Sociedade Ib\u00e9rica de Preven\u00e7\u00e3o de Riscos Profissionais"; - - // empresas - public static final String T_EMPRESAS = "empresas"; - public static final String ID = "id"; - public static final String DESIGNACAO_SOCIAL = "designacao_social"; - public static final String SERVICO_SAUDE_TIPO = "servico_saude_tipo"; - public static final String SERVICO_SAUDE_DESIGNACAO = "servico_saude_designacao"; - public static final String SERVICO_HIGIENE_TIPO = "servico_higiene_tipo"; - public static final String SERVICO_HIGIENE_DESIGNACAO = "servico_higiene_designacao"; - public static final String INACTIVO = "inactivo"; - -// public static final DBTable EMPRESAS = -// new DBTable( T_EMPRESAS, -// new String[]{ DESIGNACAO_SOCIAL, -// SERVICO_SAUDE_TIPO, -// SERVICO_SAUDE_DESIGNACAO, -// SERVICO_HIGIENE_TIPO, -// SERVICO_HIGIENE_DESIGNACAO, -// INACTIVO }, -// ID ); - - // estabelecimentos - public static final String T_ESTABELECIMENTOS = "estabelecimentos"; - // ID - public static final String NOME = "nome"; - public static final String LOCALIDADE = "localidade"; - public static final String EMPRESA_ID = "empresa_id"; - // INACTIVO - -// public static final DBTable ESTABELECIMENTOS = -// new DBTable( T_ESTABELECIMENTOS, -// new String[]{ NOME, LOCALIDADE, EMPRESA_ID, INACTIVO }, -// ID ); - - // trabalhadores - public static final String T_TRABALHADORES = "trabalhadores"; - // ID - // public static final String NOME = "nome"; - public static final String SEXO = "sexo"; - public static final String DATA_NASCIMENTO = "data_nascimento"; - public static final String NACIONALIDADE = "nacionalidade"; - public static final String NUMERO_MECANOGRAFICO = "numero_mecanografico"; - public static final String DATA_ADMISSAO = "data_admissao"; - public static final String CATEGORIA = "categoria"; - public static final String LOCAL_TRABALHO = "local_trabalho"; - public static final String FUNCAO_PROPOSTA = "funcao_proposta"; - public static final String DATA_ADMISSAO_FUNCAO = "data_admissao_funcao"; - public static final String OBSERVACOES = "observacoes"; - public static final String ESTABELECIMENTO_ID = "estabelecimento_id"; - // INACTIVO - -// public static final DBTable TRABALHADORES = -// new DBTable( T_TRABALHADORES, -// new String[]{ NOME, SEXO, DATA_NASCIMENTO, -// NACIONALIDADE, NUMERO_MECANOGRAFICO, -// DATA_ADMISSAO, CATEGORIA, LOCAL_TRABALHO, -// FUNCAO_PROPOSTA, DATA_ADMISSAO_FUNCAO, -// OBSERVACOES, ESTABELECIMENTO_ID, INACTIVO }, -// ID ); - - //medicos - public static final String T_MEDICOS = "medicos"; - - public static final String NUMERO_CEDULA = "numero_cedula"; - -// public static final DBTable MEDICOS = -// new DBTable( T_MEDICOS, -// new String[]{ NOME, NUMERO_CEDULA }, ID ); - - // exames - public static final String T_EXAMES = "exames"; - // ID - public static final String DATA = "data"; - public static final String TIPO = "tipo"; - public static final String OCASIONAL = "ocasional"; - public static final String OUTRO_TIPO = "outro_tipo"; - public static final String RESULTADO = "resultado"; - public static final String OUTRA_FUNCAO_1 = "outra_funcao_1"; - public static final String OUTRA_FUNCAO_2 = "outra_funcao_2"; - public static final String OUTRA_FUNCAO_3 = "outra_funcao_3"; - public static final String OUTRA_FUNCAO_4 = "outra_funcao_4"; - public static final String PROXIMO_EXAME = "proximo_exame"; - public static final String OUTRAS_RECOMENDACOES = "outras_recomendacoes"; - public static final String TRABALHADOR_ID = "trabalhador_id"; - public static final String MEDICO_ID = "medico_id"; - public static final String PDF = "pdf"; - -// public static final DBTable EXAMES = -// new DBTable( T_EXAMES, -// new String[]{ DATA, TIPO, OCASIONAL, -// OUTRO_TIPO, RESULTADO, OUTRA_FUNCAO_1, -// OUTRA_FUNCAO_2, OUTRA_FUNCAO_3, -// OUTRA_FUNCAO_4, PROXIMO_EXAME, -// OUTRAS_RECOMENDACOES, TRABALHADOR_ID, MEDICO_ID, PDF, INACTIVO }, -// ID ); -// -// public static DBReference R_ESTABELECIMENTO_EMPRESA = new DBReference( ESTABELECIMENTOS.getFieldByName( EMPRESA_ID ) ); -// public static DBReference R_TRABALHADOR_ESTABELECIMENTO = new DBReference( TRABALHADORES.getFieldByName( ESTABELECIMENTO_ID ) ); -// public static DBReference R_EXAME_TRABALHADOR = new DBReference( EXAMES.getFieldByName( TRABALHADOR_ID ) ); -// public static DBReference R_EXAME_MEDICO = new DBReference( EXAMES.getFieldByName( MEDICO_ID ) ); -// static -// { -// try -// { -// EXAMES.addRelation( MEDICOS, -// new DBField[]{ EXAMES.getFieldByName( MEDICO_ID ) }, -// "R_EXAMES_MEDICOS" ); -// EXAMES.addRelation( TRABALHADORES, -// new DBField[]{ EXAMES.getFieldByName( TRABALHADOR_ID ) }, -// "R_EXAMES_TRABALHADORES" ); -// TRABALHADORES.addRelation( ESTABELECIMENTOS, -// new DBField[]{ TRABALHADORES.getFieldByName( ESTABELECIMENTO_ID ) }, -// "R_TRABALHADORES_ESTABELECIMENTOS" ); -// ESTABELECIMENTOS.addRelation( EMPRESAS, -// new DBField[]{ ESTABELECIMENTOS.getFieldByName( EMPRESA_ID ) }, -// "R_ESTABELECIMENTOS_EMPRESAS" ); -// EMPRESAS.disableSave( INACTIVO ); -// ESTABELECIMENTOS.disableSave( INACTIVO ); -// TRABALHADORES.disableSave( INACTIVO ); -// EXAMES.disableSave( PDF ); -// } -// catch( Exception e ) -// { -// throw new RuntimeException( e ); -// } -// } - - public static final int SEARCH_EMPRESAS = 0; - public static final int SEARCH_ESTABELECIMENTOS = 1; - public static final int SEARCH_TRABALHADORES = 2; - public static final int SEARCH_EXAMES = 3; - private int SEARCH = 0; - private int SEARCH_EMPRESAS_ID = -1; - private int SEARCH_ESTABELECIMENTOS_ID = -1; - private int SEARCH_TRABALHADORES_ID = -1; - private int SEARCH_EXAMES_ID = -1; - - protected final Map medicosEstabelecimentosHash = new HashMap(); - - /** Creates a new instance of FichaDataProvider */ - private FichaDataProvider() - throws Exception - { - DBManager dbm = ( DBManager ) Singleton.getInstance( Singleton.DEFAULT_DBMANAGER /*SingletonConstants.DBMANAGER*/ ); - executer = dbm.getSharedExecuter( this ); - -// setDBTable( EXAMES ); - - } - -// public static MetaProvider getProvider() -// throws Exception -// { -// synchronized( LOCK ) -// { -// if( instance == null ) -// { -// instance = new FichaDataProvider(); -// } -// } -// return instance; -// } - - public static FichaDataProvider getProvider() - throws Exception - { - synchronized( LOCK ) - { - if( instance == null ) - { - instance = new FichaDataProvider(); - } - } - return instance; - } - - public String[] getColumnNames() { - return new String[]{ "Nome" }; - } - - public String getSearchTitle() { - switch( SEARCH ) - { - case SEARCH_EMPRESAS: - return "Procurar empresa"; - case SEARCH_ESTABELECIMENTOS: - return "Procurar estabelecimento"; - case SEARCH_TRABALHADORES: - return "Procurar trabalhador"; - case SEARCH_EXAMES: - return "Procurar exame"; - } - return ""; - } - - public boolean hasDetails() { - return false; - } - - public void setSearch( int what ) - { - switch( what ) - { - case SEARCH_EMPRESAS: - case SEARCH_ESTABELECIMENTOS: - case SEARCH_TRABALHADORES: - case SEARCH_EXAMES: - SEARCH = what; - break; - } - } - - public void setSearchID( int what, int id ) - { - switch( what ) - { - case SEARCH_EMPRESAS: - SEARCH_EMPRESAS_ID = id; - break; - case SEARCH_ESTABELECIMENTOS: - SEARCH_ESTABELECIMENTOS_ID = id; - break; - case SEARCH_TRABALHADORES: - SEARCH_TRABALHADORES_ID = id; - break; - case SEARCH_EXAMES: - SEARCH_EXAMES_ID = id; - break; - } - } - - public Virtual2DArray search( String pattern ) throws Exception { - switch( SEARCH ) - { - case SEARCH_EMPRESAS: - return searchEmpresas( pattern ); - case SEARCH_ESTABELECIMENTOS: - return searchEstabelecimentos( pattern ); - case SEARCH_TRABALHADORES: - return searchTrabalhadores( pattern ); - case SEARCH_EXAMES: - return searchExames( pattern ); - } - return null; - } - - public Virtual2DArray searchEmpresas( String pattern ) throws Exception { - Select select = new Select( new String[]{ T_EMPRESAS }, - new String[]{ ID, DESIGNACAO_SOCIAL, "designacao_social_plain" }, - new Field( "designacao_social_plain" ).isLike( "%" + StringPlainer.convertString( pattern, false, false ) + "%" ).and( - new Field( INACTIVO ).isDifferent( "y" ) ), - new String[]{ "designacao_social_plain" }, null ); -// Select select = new Select( "SELECT e.id, e.designacao_social FROM empresas e ORDER BY lower( e.designacao_social );" ); - return executer.executeQuery( select ); - } - - public Virtual2DArray searchEstabelecimentos( String pattern ) throws Exception { -// Select select = new Select( "SELECT e.id, e.nome FROM estabelecimentos e WHERE empresa_id = " + SEARCH_EMPRESAS_ID -// + " ORDER BY lower( e.nome )"); - Select select = new Select( new String[]{ T_ESTABELECIMENTOS }, - new String[]{ ID, NOME, "nome_plain" }, - new Field( "nome_plain" ).isLike( "%" + StringPlainer.convertString( pattern, false, false ) + "%" ).and( - new Field( EMPRESA_ID ).isEqual( new Integer( SEARCH_EMPRESAS_ID ) ) ).and( - new Field( INACTIVO ).isDifferent( "y" ) ), - new String[]{ "nome_plain" }, null ); - return executer.executeQuery( select ); - } - - public Virtual2DArray searchTrabalhadores( String pattern ) throws Exception { -// Select select = -// new Select( "SELECT t.id, t.nome FROM trabalhadores t, estabelecimentos es " -// + " WHERE t.estabelecimento_id = es.id " -// + " AND es.empresa_id = " + SEARCH_EMPRESAS_ID + " ORDER BY lower(t.nome);" ); - Select select = new Select( new String[]{ T_TRABALHADORES, T_ESTABELECIMENTOS }, - new String[]{ T_TRABALHADORES + "." + ID, T_TRABALHADORES + "." + NOME }, - new Field( T_TRABALHADORES + ".nome_plain" ).isLike( "%" + StringPlainer.convertString( pattern, false, false ) + "%" ).and( - new Field( ESTABELECIMENTO_ID ).isEqual( new Field( T_ESTABELECIMENTOS + "." + ID ) ) ).and( - new Field( ESTABELECIMENTO_ID ).isEqual( new Integer( SEARCH_ESTABELECIMENTOS_ID ) ) ).and( - new Field( EMPRESA_ID ).isEqual( new Integer( SEARCH_EMPRESAS_ID ) ) ).and( - new Field( T_TRABALHADORES + "." + INACTIVO ).isDifferent( "y" ) ), - new String[]{ T_TRABALHADORES + ".nome_plain" }, null ); - return executer.executeQuery( select ); - } - - public Virtual2DArray searchExames( String pattern ) throws Exception { - Select select = new Select( "SELECT e.id, e.data FROM exames e " - + " WHERE e.trabalhador_id = " + SEARCH_TRABALHADORES_ID - + " ORDER BY e.data DESC;" ); - return executer.executeQuery( select ); - } - - public void showDetails(SearchDialog dialog, Object o) throws Exception { - } - - public Object [][]getAllMedicos() - throws Exception - { - Select select = new Select( new String[]{ T_MEDICOS }, - new String[]{ ID, NOME, NUMERO_CEDULA }, - null, new String[]{ NOME }, null ); - Virtual2DArray array = executer.executeQuery( select ); - return array.getObjects(); - } - -// public void savePDF( MetaObject exame ) -// throws Exception -// { -// if( exame == null ) -// { -// return; -// } -// DBKey key = exame.getPrimaryKeyValue(); -// DBField fields[] = EXAMES.getPrimaryKey(); -// Integer id = new Integer( ((Number)key.getFieldValue( fields[ 0 ] )).intValue() ); -// if( id == null ) -// { -// throw new Exception( "Error saving pdf: id is null" ); -// } -// byte []pdf = (byte[]) exame.getProperty( PDF ); -// BlobUpdate bUpdate = new BlobUpdate( T_EXAMES, PDF, pdf, new Field( ID ).isEqual( id ) ); -// executer.executeQuery( bUpdate ); -// } - - public Integer getLastExameIDForTrabalhador( Integer trabalhadorID ) - throws Exception - { - Select select = new Select( new String[]{ T_EXAMES }, - new String[]{ ID, DATA }, - new Field( TRABALHADOR_ID ).isEqual( trabalhadorID ), - new String[]{ DATA + " DESC", ID + " DESC" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 ) - { - return null; - } - return new Integer( ( (Number) array.get( 0, 0 ) ).intValue() ); - } - - public IDObject []getAllFichasForTrabalhador( Integer trabalhadorID ) - throws Exception - { - Select select = - new Select( new String[]{ T_EXAMES }, new String[]{ "MAX("+ID+")", DATA }, - new Field( TRABALHADOR_ID ).isEqual( trabalhadorID ).and( - new Field( INACTIVO ).isEqual( "n" ) ), - new String[]{ DATA + " DESC" }, new String[]{ DATA } ); - Virtual2DArray array = executer.executeQuery( select ); - IDObject exames[] = new IDObject[ array.columnLength() ]; - DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT ); - for( int n = 0; n < exames.length; n++ ) - { - Date date = (Date)array.get( n, 1 ); - Integer id = new Integer( ((Number)array.get( n, 0 )).intValue() ); - exames[ n ] = new MappableObject( id, date != null? df.format( date ): "" ); - } - return exames; - } - - public IDObject []getAllEstabelecimentosForEmpresa( Integer empresaID ) - throws Exception - { - Select select = new Select( new String[]{ T_ESTABELECIMENTOS }, - new String[]{ ID, NOME, "nome_plain" }, - new Field( EMPRESA_ID ).isEqual( empresaID ).and( - new Field( INACTIVO ).isDifferent( "y" ) ), - new String[]{ "nome_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - IDObject objects[] = new IDObject[ array.columnLength() ]; - for( int n = 0; n < objects.length; n++ ) - { - Integer id = new Integer( ((Number)array.get( n, 0 )).intValue() ); - String desc = (String)array.get( n, 1 ); - objects[ n ] = new MappableObject( id, desc ); - } - return objects; - } - - public IDObject []getAllTrabalhadoresForEmpresa( Integer empresaID ) - throws Exception - { - Select select = new Select( new String[]{ T_TRABALHADORES, T_ESTABELECIMENTOS }, - new String[]{ T_TRABALHADORES + "." + ID, - T_TRABALHADORES + "." + NOME, - T_TRABALHADORES + ".nome_plain" }, - new Field( T_ESTABELECIMENTOS + "." + EMPRESA_ID ).isEqual( empresaID ).and( - new Field( T_TRABALHADORES + "." + ESTABELECIMENTO_ID ).isEqual( - new Field( T_ESTABELECIMENTOS + "." + ID ) ) ), - new String[]{ T_TRABALHADORES + ".nome_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - IDObject objects[] = new IDObject[ array.columnLength() ]; - for( int n = 0; n < objects.length; n++ ) - { - Integer id = new Integer( ((Number)array.get( n, 0 )).intValue() ); - String desc = (String)array.get( n, 1 ); - objects[ n ] = new MappableObject( id, desc ); - } - return objects; - } - - public IDObject []getAllTrabalhadoresForEstabelecimento( Integer estabelecimentoID ) - throws Exception - { - Select select = new Select( new String[]{ T_TRABALHADORES }, - new String[]{ ID, NOME, "nome_plain" }, - new Field( ESTABELECIMENTO_ID ).isEqual( estabelecimentoID ).and( - new Field( INACTIVO ).isDifferent( "y" ) ), - new String[]{ "nome_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - IDObject objects[] = new IDObject[ array.columnLength() ]; - for( int n = 0; n < objects.length; n++ ) - { - Integer id = new Integer( ((Number)array.get( n, 0 )).intValue() ); - String desc = (String)array.get( n, 1 ); - objects[ n ] = new MappableObject( id, desc ); - } - return objects; - } - - public Integer getEstabelecimentoIDForTrabalhador( Integer trabalhadorID ) - throws Exception - { - Select select = new Select( new String[]{ T_TRABALHADORES }, - new String[]{ ESTABELECIMENTO_ID }, - new Field( ID ).isEqual( trabalhadorID ).and( - new Field( INACTIVO ).isDifferent( "y" ) ), - null, null ); - Virtual2DArray array = executer.executeQuery( select ); - Integer estabelecimentoID = null; - if( array != null && array.columnLength() > 0 ) - { - estabelecimentoID = ( Integer )array.get( 0, 0 ); - } - return estabelecimentoID; - } - - public Integer getEmpresaIDForEstabelecimento( Integer estabelecimentoID ) - throws Exception - { - Select select = new Select( new String[]{ T_ESTABELECIMENTOS }, - new String[]{ EMPRESA_ID }, - new Field( ID ).isEqual( estabelecimentoID ).and( - new Field( INACTIVO ).isDifferent( "y" ) ), - null, null ); - Virtual2DArray array = executer.executeQuery( select ); - Integer empresaID = null; - if( array != null && array.columnLength() > 0 ) - { - empresaID = ( Integer )array.get( 0, 0 ); - } - return empresaID; - } - - public Integer []getAvisosIDByTipoAndDate( Integer tipo, Date date ) - throws Exception - { - Select select = new Select( new String[]{ "avisos" }, new String[]{ "id", "data_evento" }, - new Field( "tipo" ).isEqual( tipo ).and( - new Field( "data_aviso" ).isLessOrEqual( date )), - new String[]{ "data_evento" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - Integer ids[] = new Integer[ array.columnLength() ]; - for( int n = 0; n < ids.length; n++ ) - { - ids[ n ] = new Integer( ((Number)array.get( n, 0 )).intValue() ); - } - return ids; - } - - public Object [][]getAvisosTrabalhadorByDate( Date date ) - throws Exception - { - Select select = new Select( new String[]{ "avisos", "empresas", "estabelecimentos", "trabalhadores" }, - new String[]{ "avisos.id", "avisos.data_evento", "avisos.descricao", - "empresas.designacao_social", "estabelecimentos.nome", - "trabalhadores.nome", "data_aviso" }, - new Field( "tipo" ).isEqual( new Integer( AvisoConstants.TIPO_TRABALHADOR ) ).and( - new Field( "data_aviso" ).isLessOrEqual( date ) ).and( - new Field( "avisos.empresa_id" ).isEqual( new Field( "empresas.id" ) ) ).and( - new Field( "avisos.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "avisos.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ) ), - new String[]{ "data_evento" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - return array.getObjects(); - } - - public Object [][]getAvisosEstabelecimentoByDate( Date date ) - throws Exception - { - Select select = new Select( new String[]{ "avisos", "empresas", "estabelecimentos" }, - new String[]{ "avisos.id", "avisos.data_evento", "avisos.descricao", - "empresas.designacao_social", "estabelecimentos.nome", "data_aviso" }, - new Field( "tipo" ).isEqual( new Integer( AvisoConstants.TIPO_ESTABELECIMENTO ) ).and( - new Field( "data_aviso" ).isLessOrEqual( date ) ).and( - new Field( "avisos.empresa_id" ).isEqual( new Field( "empresas.id" ) ) ).and( - new Field( "avisos.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ), - new String[]{ "data_evento" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - return array.getObjects(); - } - - public Object [][]getAvisosEmpresaByDate( Date date ) - throws Exception - { - Select select = new Select( new String[]{ "avisos", "empresas" }, - new String[]{ "avisos.id", "avisos.data_evento", "avisos.descricao", - "empresas.designacao_social", "data_aviso" }, - new Field( "tipo" ).isEqual( new Integer( AvisoConstants.TIPO_EMPRESA ) ).and( - new Field( "data_aviso" ).isLessOrEqual( date ) ).and( - new Field( "avisos.empresa_id" ).isEqual( new Field( "empresas.id" ) ) ), - new String[]{ "data_evento" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - return array.getObjects(); - } - - public Integer getMarcacaoIDByTrabalhador( Integer trabalhadorID ) - throws Exception - { - Select realizadaSelect = - new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ "MAX(data)" }, - new Field( "trabalhador_id" ).isEqual( trabalhadorID ).and( - new Field( "estado" ).isEqual( new Integer( 2 ) ) ).and( - new Field( "tipo" ).isEqual( new Integer( MarcacoesTrabalhadorData.TIPO_CONSULTA ) ) ) ); - Virtual2DArray realizadaArray = executer.executeQuery( realizadaSelect ); - Date realizada = (Date) realizadaArray.get( 0, 0 ); - Select select; - if( realizada == null ) - { - select = new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ "MIN(id)" }, - new Field( "trabalhador_id" ).isEqual( trabalhadorID ).and( - new Field( "estado" ).isEqual( new Integer( 0 ) ) ).and( - new Field( "tipo" ).isEqual( new Integer( MarcacoesTrabalhadorData.TIPO_CONSULTA ) ) ) ); - } - else - { - select = new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ "MIN(id)" }, - new Field( "trabalhador_id" ).isEqual( trabalhadorID ).and( - new Field( "estado" ).isEqual( new Integer( 0 ) ) ).and( - new Field( "data" ).isGreater( realizada ) ).and( - new Field( "tipo" ).isEqual( new Integer( MarcacoesTrabalhadorData.TIPO_CONSULTA ) ) ) ); - } - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 || array.get( 0, 0 ) == null ) - { - return null; - } - return new Integer( ( ( Number ) array.get( 0, 0 ) ).intValue() ); - } - - public IDObject[] getAllEmpresasDeleted() - throws Exception - { - Select select = new Select( new String[]{ T_EMPRESAS }, - new String[]{ ID, DESIGNACAO_SOCIAL, "designacao_social_plain" }, - new Field( INACTIVO ).isEqual( "y" ), - new String[]{ "designacao_social_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - IDObject empresas[] = new IDObject[ array.columnLength() ]; - for( int n = 0; n < array.columnLength(); n++ ) - { - Integer id = new Integer( ((Number)array.get( n, 0 )).intValue() ); - String designacao = ( String ) array.get( n, 1 ); - empresas[ n ] = new MappableObject( id, designacao ); - } - return empresas; - } - - public IDObject []getAllEstabelecimentosDeletedForEmpresa( Integer empresaID ) - throws Exception - { - Select select = new Select( new String[]{ T_ESTABELECIMENTOS }, - new String[]{ ID, NOME, "nome_plain" }, - new Field( EMPRESA_ID ).isEqual( empresaID ).and( - new Field( INACTIVO ).isEqual( "y" ) ), - new String[]{ "nome_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - IDObject objects[] = new IDObject[ array.columnLength() ]; - for( int n = 0; n < objects.length; n++ ) - { - Integer id = new Integer( ((Number)array.get( n, 0 )).intValue() ); - String desc = (String)array.get( n, 1 ); - objects[ n ] = new MappableObject( id, desc ); - } - return objects; - } - - public IDObject []getAllTrabalhadoresDeletedForEstabelecimento( Integer estabelecimentoID ) - throws Exception - { - Select select = new Select( new String[]{ T_TRABALHADORES }, - new String[]{ ID, NOME, "nome_plain" }, - new Field( ESTABELECIMENTO_ID ).isEqual( estabelecimentoID ).and( - new Field( INACTIVO ).isEqual( "y" ) ), - new String[]{ "nome_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - IDObject objects[] = new IDObject[ array.columnLength() ]; - for( int n = 0; n < objects.length; n++ ) - { - Integer id = new Integer( ((Number)array.get( n, 0 )).intValue() ); - String desc = (String)array.get( n, 1 ); - objects[ n ] = new MappableObject( id, desc ); - } - return objects; - } - - public Object[] getDadosUltimaMarcacao( Integer trabalhadorID ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ "MAX( data )" }, - new Field( "trabalhador_id" ).isEqual( trabalhadorID ).and( - new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ).and( - new Field( "realizada" ).isEqual( "y" ).or( - new Field( "estado" ).isEqual( new Integer( 2 ) ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 || array.get( 0, 0 ) == null ) - { - return new Object[]{ null, null }; - } - Date data = ( Date ) array.get( 0, 0 ); - select = - new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ "motivo", "id" }, - new Field( "data" ).isEqual( data ).and( - new Field( "trabalhador_id" ).isEqual( trabalhadorID ) ).and( - new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ).and( - new Field( "realizada" ).isEqual( "y" ).or( - new Field( "estado" ).isEqual( new Integer( 2 ) ) ) ), - new String[]{ "id" }, null ); - array = executer.executeQuery( select ); - Integer tipo = ( Integer ) array.get( 0, 0 ); - if( tipo.intValue() == 5 ) - { - tipo = new Integer( 2 ); - } - return new Object[]{ data, tipo }; - } - - public void setMedicoForEstabelecimento( Integer estabelecimentoID, Integer medicoID ) - throws Exception - { - Integer medicoAntigo = medicosEstabelecimentosHash.get( estabelecimentoID ); - if( !medicoID.equals( medicoAntigo ) ) - { - Update update = - new Update( "estabelecimentos", - new Assignment[]{ - new Assignment( new Field( "medico_id" ), medicoID ) }, - new Field( "id" ).isEqual( estabelecimentoID ) ); - executer.executeQuery( update ); - medicosEstabelecimentosHash.put( estabelecimentoID, medicoID ); - } - } - - public Integer getMedicoForEstabelecimento( Integer estabelecimentoID ) - throws Exception - { - if( !medicosEstabelecimentosHash.containsKey( estabelecimentoID ) ) - { - Select select = - new Select( new String[]{ "estabelecimentos" }, - new String[]{ "medico_id" }, - new Field( "id" ).isEqual( estabelecimentoID ) ); - Virtual2DArray array = executer.executeQuery( select ); - Integer medicoID = ( Integer ) array.get( 0, 0 ); - if( medicoID == null ) - { - medicoID = new Integer( -1 ); - } - medicosEstabelecimentosHash.put( estabelecimentoID, medicoID ); - } - return ( Integer ) medicosEstabelecimentosHash.get( estabelecimentoID ); - } - - public Long countTrabalhadoresActivosForEmpresa( Integer empresaID ) - throws Exception - { - Long result = 0L; - Select2 query = new Select2( new String[]{ "trabalhadores", "estabelecimentos", "empresas" }, - new Integer[]{ Select2.JOIN_INNER, Select2.JOIN_INNER }, - new Expression[]{ - new Field("estabelecimentos.id").isEqual(new Field("trabalhadores.estabelecimento_id")), - new Field("empresas.id").isEqual( new Field("estabelecimentos.empresa_id") ) }, - new String[]{"count(trabalhadores.id)" }, - new Field("empresas.id").isEqual( empresaID ). - and( new Field("trabalhadores.inactivo").isEqual( "n" ) ). - and( new Field("trabalhadores.data_demissao").isEqual( null ) ). - and( new Field("estabelecimentos.inactivo").isEqual( "n" ) ), - null, null, null, null ); - Virtual2DArray returned = executer.executeQuery( query ); - if( returned.columnLength() > 0 ) - { - result = (Long) returned.get( 0, 0 ); - } - return result; - } -} diff --git a/trunk/SIPRPSoft/src/siprp/Main.java b/trunk/SIPRPSoft/src/siprp/Main.java index a9c5d3f1..53035b58 100644 --- a/trunk/SIPRPSoft/src/siprp/Main.java +++ b/trunk/SIPRPSoft/src/siprp/Main.java @@ -26,9 +26,9 @@ import shst.SHSTShutdownHook; import shst.SHSTTracker; import shst.companydataloaders.SIPRPPropertiesLoader; import shst.initializer.SHSTORMInitializer; +import shst.initializer.SHSTUIInitializer; import shst.lembretes.LembretesDaemon; import siprp.initializer.SIPRPLoggerInit; -import siprp.initializer.SIPRPUIInitializer; import siprp.update.UpdateList; import com.evolute.module.updater.UpdateListener; @@ -81,7 +81,7 @@ public class Main implements com.evolute.utils.ui.window.Connector new SHSTShutdownHook().init(); - new SIPRPUIInitializer().doInit(); + new SHSTUIInitializer().doInit(); SIPRPPropertiesLoader.getInstance().load(); @@ -141,8 +141,8 @@ public class Main implements com.evolute.utils.ui.window.Connector JPanel left = loginWindow.getLeftPanel(); left.setBackground( Color.white ); - loginWindow.setSize( 700, 510 ); - loginWindow.setExtendedState(loginWindow.getExtendedState() | LoginWindow.MAXIMIZED_BOTH); + loginWindow.setSize( 600, 500 ); + loginWindow.setExtendedState( loginWindow.getExtendedState() | LoginWindow.MAXIMIZED_BOTH ); loginWindow.setVisible( true ); SwingUtilities.invokeLater( new Runnable() { @@ -171,8 +171,7 @@ public class Main implements com.evolute.utils.ui.window.Connector } catch( Exception ex ) { - DialogException.showExceptionMessage( ex, "N\u00E3o foi poss\u00EDvel estabelecer" - + " a liga\u00E7\u00E3o \u00E0 base de dados.\n(" + url + ")", false ); + DialogException.showExceptionMessage( ex, "N\u00E3o foi poss\u00EDvel estabelecer a liga\u00E7\u00E3o \u00E0 base de dados.\n(" + url + ")", false ); } } diff --git a/trunk/SIPRPSoft/src/siprp/analise_acidentes_trabalho.xsl b/trunk/SIPRPSoft/src/siprp/analise_acidentes_trabalho.xsl deleted file mode 100644 index d98488f3..00000000 --- a/trunk/SIPRPSoft/src/siprp/analise_acidentes_trabalho.xsl +++ /dev/null @@ -1,797 +0,0 @@ - - - - - - - - - - - - - - - Página - - - - de - - - - - - - - - - - - - - - - - - - imagem1 - - - - ANÁLISE DE ACIDENTE DE TRABALHO - - - - - - - - - N.º - - - - - - DATA: - - / - - / - - - - - - - - - - - imagem2 - - - - - - - - - - - - - IDENTIFICAÇÃO DA - ENTIDADE EMPREGADORA - - - - - - Identificação - completa: - - - - - - - - Actividade desenvolvida: - - - - - - - - Loja: - - - - - - - - - - - - - EMPRESA SEGURADORA - - - - - - Identificação - completa: - - - - - - - - Nº de Apólice: - - - - - - - - - - - - - - EMPRESA PRESTADORA DE - SERVIÇOS DE - SEGURANÇA, HIGIENE E - SAÚDE DO TRABALHO - - - - - - Identificação - completa: - - - - - - - - Técnico(a) Superior - de HST: - - - - - - C.A.P. nº:: - - - - - - - - Médico(a) do - Trabalho: - - - - - - Cédula Prof. nº: - - - - - - - - - - - - - - ACIDENTADO (A) - - - - - - Nome: - - - - - - - - Estabelecimento de - origem: - - - - - - - - Data Nascimento: - - / - - / - - - - - - - - Bilhete de Identidade - N°: - - - - - - - - Morada - - - - - - - - Contacto - telefónico: - - - - - - - - Data admissão: - - / - - / - - - - - - - - Função: - - - - - - - - Turno de Trabalho: - - - - - - - Identificação do superior - hierárquico/Responsável do - posto de trabalho - - - - - - Nome: - - - - - - E-mail: - - - - - - - - - - - - - - DADOS DO ACIDENTE DE - TRABALHO - - - - - - Averiguador: - - - - - - - - Data da ocorrência: - - / - - / - - - - - - Hora do acidente: - - h - - m - - - - - - - Nº horas trabalhadas no - turno: - - - - - - - - Secção: - - - - - - Local específico: - - - - - - - - Tarefa/Actividade que se - encontrava a realizar: - - - - - - - - Substâncias, - equipamentos, - ferramentas e objectos - utilizados: - - - - - - - - Condições que - contribuíram para o - acidente e respectiva - explicação da - sua existência: - - - - - - - - Testemunhas: - - - - - - - - Causas do acidente: - - - - - - - - Descrição do - acidente: - - - - - - - - Fotografia(s) e/ou - croqui(s) do local do - acidente: - - - - - - - - - - Conclusões: - - - - - - - - Acções Imediatas - tomadas: - - - - - - - - - - O colaborador - teve formação em SHST - - - O colaborador não - teve formação em SHST - - - - - - - Motivo: - - - - - - - - - - - - Verificaram-se outras - ocorrências/incidências - no mesmo posto de - trabalho com o - colaborador acidentado. - - - Não se verificaram outras - ocorrências/incidências - no mesmo posto de - trabalho com o - colaborador acidentado. - - - - - - - Quantidade: - - Relatórios de acidente nº: - - - ; - - - - - - - - - - - - Verificaram-se - ocorrências/incidentes - semelhantes com outros - colaboradores. - - - Não se verificaram - ocorrências/incidentes - semelhantes com outros - colaboradores. - - - - - - - Quantidade: - - Relatórios de acidente nº: - - - ; - - - - - - - - - - LESÃO - - - - - - - Áreas corporais - específicas - lesionadas: - - - - - - - - - - Tipo de Lesão: - - - - - - - - - INCAPACIDADE - - - - - - - Tipo de Incapacidade: - - - - - - Coeficiente de - Incapacidade - - % - - - - - - - Avaliação de - Incapacidade realizada - em - - / - - / - - - - - - Revisão de - Incapacidade - - / - - / - - - - - - - - Período da Incapacidade - Temporária: de - - / - - / - - a - - / - - / - - - - - - - - - - - - - - RECOMENDAÇÕES PROPOSTAS - pela SIPRP - - - - - - - - - - . - - - - - - - - - - - - - - - - MEDIDAS A ADOPTAR PELA - ENTIDADE EMPREGADORA - - - - - - - - - - - - . - - - - - - - - - - - - - - - - - - TOMADA DE CONHECIMENTO / - TERMO DE - RESPONSABILIDADE - - - - - - - - - Averiguado por - - (Departamento de Segurança) - a - - / - - / - - . - - - Verificado por - - (Técnico - de HST) a - - / - - / - - . - - - Verificado por - - (Responsável de Segurança) a - - / - - / - - . - - - Verificado por - - (Responsável de RH) a - - / - - / - - . - - - Com conhecimento de - - (Superior hierárquico) a - - / - - / - - . - - - processamento informático - - acesso autenticado - - - - - - - - - - - - - diff --git a/trunk/SIPRPSoft/src/siprp/cursos/SIPRPCursosInit.java b/trunk/SIPRPSoft/src/siprp/cursos/SIPRPCursosInit.java deleted file mode 100644 index 2b5065dd..00000000 --- a/trunk/SIPRPSoft/src/siprp/cursos/SIPRPCursosInit.java +++ /dev/null @@ -1,20 +0,0 @@ -package siprp.cursos; - -import shst.cursos.CursosInit; -import siprp.cursos.provider.CursosTemplatesProvider; - -import com.evolute.genericpeople.TemplateProviderFactory; - -public class SIPRPCursosInit -{ - - public static void initFactory() throws Exception - { - //default init - CursosInit.initFactory(); - - //replace templates provider - TemplateProviderFactory.setProvider( new CursosTemplatesProvider() ); - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/cursos/provider/CursosTemplatesProvider.java b/trunk/SIPRPSoft/src/siprp/cursos/provider/CursosTemplatesProvider.java deleted file mode 100644 index d98c554b..00000000 --- a/trunk/SIPRPSoft/src/siprp/cursos/provider/CursosTemplatesProvider.java +++ /dev/null @@ -1,175 +0,0 @@ -package siprp.cursos.provider; - -import static com.evolute.utils.strings.UnicodeLatin1Map.atilde; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.Locale; - -import javax.swing.JOptionPane; - -import shst.cursos.provider.PessoasProvider; - -import com.evolute.genericpeople.AutorizacaoProviderInterface; -import com.evolute.genericpeople.DefaultTemplateProvider; -import com.evolute.genericpeople.PessoaDocumentoConstants; -import com.evolute.genericpeople.PessoaDocumentoInterface; -import com.evolute.genericpeople.PessoaInterface; -import com.evolute.genericpeople.TemplateConstants; -import com.evolute.module.cursos.CursosDataProvider; -import com.evolute.module.cursos.CursosLogic; -import com.evolute.module.cursos.data.CurCursosData; -import com.evolute.module.cursos.data.CurFormandosData; -import com.evolute.swing.frame.EvoFrame; -import com.evolute.utils.Singleton; -import com.evolute.utils.error.ErrorLogger; -import com.evolute.utils.tables.ColumnizedObjectArray; -import com.evolute.utils.xml.SimpleXMLElement; - -public class CursosTemplatesProvider extends DefaultTemplateProvider -{ - private CursosDataProvider cursosProvider = CursosDataProvider.getProvider(); - - public CursosTemplatesProvider() - { - setTemplate( TemplateConstants.SUMARIOS, "com/evolute/module/cursos/templates/sumarios.xsl" ); - setTemplate( TemplateConstants.LISTA_PRESENCAS, "com/evolute/module/cursos/templates/lista_presencas.xsl" ); - setTemplate( TemplateConstants.TOPICOS_FILE, "com/evolute/module/cursos/templates/topicos.xsl" ); - - setTemplate( TemplateConstants.CERTIFICADO_FORMANDO, "siprp/cursos/templates/certificado_formando.xsl" ); - setTemplate( TemplateConstants.CERTIFICADO_FORMADOR, "siprp/cursos/templates/certificado_formador.xsl" ); - - setTemplate( TemplateConstants.INSCRICAO_ACEITE, "com/evolute/module/cursos/templates/inscricao_aceite.xsl" ); - setTemplate( TemplateConstants.INSCRICAO_ACEITE_POPH, "com/evolute/module/cursos/templates/inscricao_aceite_POPH.xsl" ); - setTemplate( TemplateConstants.INSCRICAO_REJEITADA, "com/evolute/module/cursos/templates/inscricao_rejeitada.xsl" ); - setTemplate( TemplateConstants.CONFIRMAR_INSCRICAO, "com/evolute/module/cursos/templates/confirmar_inscricao.xsl" ); - } - - @Override - public SimpleXMLElement getXMLForImpressaoFormador( boolean visualizar, CurCursosData curso, EvoFrame parent, List< ColumnizedObjectArray > formadores ) - throws Exception - { - return super.getXMLForImpressaoFormador( visualizar, curso, parent, formadores ); - } - - @Override - public SimpleXMLElement getXMLForImpressaoFormando( boolean visualizar, CurCursosData curso, EvoFrame parent, List< ColumnizedObjectArray > formandos ) - throws Exception - { - SimpleXMLElement xml = null; - if( formandos != null && !formandos.isEmpty() ) - { - CurFormandosData formando = cursosProvider.getFormandoByID( formandos.get( 0 ).getID() ); - PessoaInterface pessoa = cursosProvider.getPessoaFromFormando( formando ); - - Integer numero = super.getNumeroCertificado( formando.getId(), curso.getId() ); - if( numero == null ) - { - return null; - } - String numCertificado = numero.toString(); - Calendar cal = Calendar.getInstance(); - String year = "" + cal.get( Calendar.YEAR ); - year = year.substring( 2, year.length() ); - numCertificado += "/" + year; - - String nomePessoa = super.getNomePessoa( pessoa ); - if( nomePessoa == null ) - { - JOptionPane.showMessageDialog( parent, "O nome do formando tem de estar preenchido!", "Erro", JOptionPane.ERROR_MESSAGE, null ); - return null; - } - - String sexo = pessoa.getSexo(); - if( sexo == null ) - { - JOptionPane.showMessageDialog( parent, "O formador tem de ter o campo sexo preenchido", "Erro", JOptionPane.ERROR_MESSAGE, null); - return null; - } - - String profissao = pessoa.getProfissao(); - if( profissao == null ) - { - JOptionPane.showMessageDialog( parent, "A profiss" + atilde + "o do formando tem de estar preenchida!", "Erro", JOptionPane.ERROR_MESSAGE, null ); - return null; - } - - String naturalidade = pessoa.getNaturalidade(); - if( naturalidade == null ) - { - JOptionPane.showMessageDialog( parent, "A naturalidade do formando tem de estar preenchida!", "Erro", JOptionPane.ERROR_MESSAGE, null ); - return null; - } - - String dataNascimento = super.getDataNascimento( pessoa ); - if( dataNascimento == null ) - { - JOptionPane.showMessageDialog( parent, "A data de nascimento do formando tem de estar preenchida", "Erro", JOptionPane.ERROR_MESSAGE, null); - return null; - } - - String nacionalidade = super.getNacionalidade( pessoa ); - if( nacionalidade == null ) - { - JOptionPane.showMessageDialog( parent, "A nacionalidade do formando tem de estar preenchida", "Erro", JOptionPane.ERROR_MESSAGE, null); - return null; - } - - PessoaDocumentoInterface doc = PessoasProvider.getProvider().getDocumentoByPessoaID( pessoa.getId(), PessoaDocumentoConstants.TIPO_DOCUMENTO_BI ); - String bi_numero = doc == null || "".equals( doc.getNumero().trim() ) ? "" : "portadora do Bilhete de Identidade nº " + doc.getNumero() + ", "; - String bi_emissao = doc == null || "".equals( doc.getLocal_emissao().trim() ) ? "" : " emitido em " + doc.getLocal_emissao() + ", "; - String bi_data_emissao = doc == null ? "" : "em " + DefaultTemplateProvider.D_F.format( doc.getData_emissao() ) + ", "; -// String bi_numero = pessoa.getBINumero() == null || "".equals( pessoa.getBINumero().trim() ) ? "" : "portadora do Bilhete de Identidade nº " + pessoa.getBINumero() + ", "; -// String bi_emissao = pessoa.getBIArquivo() == null || "".equals( pessoa.getBIArquivo().trim() ) ? "" : " emitido em " + pessoa.getBIArquivo() + ", "; -// String bi_data_emissao = pessoa.getBIData() == null ? "" : "em " + DefaultTemplateProvider.D_F.format( pessoa.getBIData() ) + ", "; - - - xml = new SimpleXMLElement( CERTIFICADO_FORMANDO_XML_NAME ); - xml.addElement( new SimpleXMLElement( "numero_certificado", numCertificado ) ); - xml.addElement( new SimpleXMLElement( "signature_filename1", visualizar ? "": AutorizacaoProviderInterface.ASSINATURA1_FILENAME ) ); - - xml.addElement( new SimpleXMLElement( "nome_pessoa", nomePessoa ) ); - xml.addElement( new SimpleXMLElement( "profissao", profissao ) ); - xml.addElement( new SimpleXMLElement( "naturalidade", naturalidade ) ); - xml.addElement( new SimpleXMLElement( "data_nascimento", dataNascimento ) ); - xml.addElement( new SimpleXMLElement( "nacionalidade", nacionalidade ) ); - xml.addElement( new SimpleXMLElement( "sexo", sexo ) ); - xml.addElement( new SimpleXMLElement( "bi_numero", bi_numero ) ); - xml.addElement( new SimpleXMLElement( "bi_emissao", bi_emissao ) ); - xml.addElement( new SimpleXMLElement( "bi_data_emissao", bi_data_emissao ) ); - - xml.addElement( new SimpleXMLElement( "nome_formadora", "TODO - nome formadora" ) ); - xml.addElement( new SimpleXMLElement( "nome_formadora_e_responsavel", "TODO - nome formadora e responsavel" ) ); - - //TODO : numero de Livro de Registo de Formação - xml.addElement( new SimpleXMLElement( "nr_livro_registo", " " ) ); - xml.addElement( new SimpleXMLElement( "numero_certificado", numCertificado ) ); - try - { - if( CursosLogic.getInstance().fillDadosCurso( parent, xml, curso, null ) ) - { - Date today = (Date) Singleton.getInstance( Singleton.TODAY ); - SimpleXMLElement dataCorrenteElement = new SimpleXMLElement( "data_corrente", new SimpleDateFormat( "dd' de 'MMMM' de 'yyyy", new Locale( "pt", "PT" ) ).format( today ) ); - xml.addElement( dataCorrenteElement ); - System.out.println( xml ); - } - else - { - xml = null; - } - } - catch( Exception ex ) - { - ErrorLogger.logException( ex ); - } - } - else - { - xml = super.generateXMLTesteFormando( parent, curso ); - } - return xml; - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/estatistica/EstatisticaDataProvider.java b/trunk/SIPRPSoft/src/siprp/estatistica/EstatisticaDataProvider.java deleted file mode 100644 index 6377fa32..00000000 --- a/trunk/SIPRPSoft/src/siprp/estatistica/EstatisticaDataProvider.java +++ /dev/null @@ -1,777 +0,0 @@ -/* - * EstatisticaDataProvider.java - * - * Created on 16 de Dezembro de 2004, 12:50 - */ - -package siprp.estatistica; - -import java.text.DateFormat; -import java.util.Date; - -import shst.data.Marcacao; -import shst.data.outer.MarcacoesTrabalhadorData; - -import com.evolute.utils.Singleton; -import com.evolute.utils.arrays.Virtual2DArray; -import com.evolute.utils.db.DBManager; -import com.evolute.utils.db.Executer; -import com.evolute.utils.metadb.MetaProvider; -import com.evolute.utils.sql.Field; -import com.evolute.utils.sql.Select; -/** - * - * @author fpalma - */ -public class EstatisticaDataProvider extends MetaProvider -{ - private static final Object LOCK = new Object(); - private static EstatisticaDataProvider instance = null; - private final Executer executer; - - public static final DateFormat DF = DateFormat.getDateInstance( DateFormat.SHORT ); - - /** Creates a new instance of EstatisticaDataProvider */ - public EstatisticaDataProvider() - throws Exception - { - DBManager dbm = ( DBManager ) Singleton.getInstance( Singleton.DEFAULT_DBMANAGER /*SingletonConstants.DBMANAGER*/ ); - executer = dbm.getSharedExecuter( this ); - } - - public static MetaProvider getProvider() - throws Exception - { - synchronized( LOCK ) - { - if( instance == null ) - { - instance = new EstatisticaDataProvider(); - } - } - return instance; - } - - public String[][] getMarcacoesPeriodo( Date dataInicio, Date dataFim ) - throws Exception - { - String [][]result = null; - Select select = - new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ MarcacoesTrabalhadorData.DATA, - "trabalhador_id", - MarcacoesTrabalhadorData.REALIZADA, - MarcacoesTrabalhadorData.TIPO }, - new Field( "data" ).isGreaterOrEqual( dataInicio ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ), - new String[]{ "data" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - result = new String[ array.columnLength() ][ 5 ]; - for( int n = 0; n < result.length; n++ ) - { - Date data = ( Date ) array.get( n, 0 ); - int trabalhadorID = ( ( Number ) array.get( n, 1 ) ).intValue(); - boolean realizada = "y".equals( array.get( n, 2 ) ); - int tipo = ( ( Number ) array.get( n, 3 ) ).intValue(); - String nomeEstabEmp[] = getNomeEstabelecimentoEmpresaForTrabalhador( trabalhadorID ); - result[ n ][ 0 ] = nomeEstabEmp[ 2 ]; - result[ n ][ 1 ] = nomeEstabEmp[ 0 ]; - result[ n ][ 2 ] = nomeEstabEmp[ 1 ]; - result[ n ][ 3 ] = DF.format( data ); - result[ n ][ 4 ] = ( tipo == Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ? "(Exame)" : "(Consulta)" ); - - } - return result; - } - - public String[] getNomeEstabelecimentoEmpresaForTrabalhador( int trabalhadorID ) - throws Exception - { - String data[] = new String[ 3 ]; - Select select = - new Select( new String[]{ "trabalhadores", "estabelecimentos", "empresas"}, - new String[]{ "trabalhadores.nome", "estabelecimentos.nome", "empresas.designacao_social" }, - new Field( "trabalhadores.id" ).isEqual( new Integer( trabalhadorID ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "estabelecimentos.empresa_id" ).isEqual( new Field( "empresas.id" ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 1 ) - { - data[ 0 ] = ( String ) array.get( 0, 0 ); - data[ 1 ] = ( String ) array.get( 0, 1 ); - data[ 2 ] = ( String ) array.get( 0, 2 ); - } - return data; - } - - public int countExamesPeriodo( Date dataInicio, Date dataFim ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ "count(*)" }, - new Field( "data" ).isGreaterOrEqual( dataInicio ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ).and( - new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 || array.get( 0, 0 ) == null ) - { - return 0; - } - return ( ( Number ) array.get( 0, 0 ) ).intValue(); - } - - public int countConsultasPeriodo( Date dataInicio, Date dataFim ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ "count(*)" }, - new Field( "data" ).isGreaterOrEqual( dataInicio ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ).and( - new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 || array.get( 0, 0 ) == null ) - { - return 0; - } - return ( ( Number ) array.get( 0, 0 ) ).intValue(); - } - - public int countExamesPeriodoForEmpresa( Date dataInicio, Date dataFim, Integer empresaID ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores", "estabelecimentos" }, - new String[]{ "count(*)" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "estabelecimentos.empresa_id" ).isEqual( empresaID ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ).and( - new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 || array.get( 0, 0 ) == null ) - { - return 0; - } - return ( ( Number ) array.get( 0, 0 ) ).intValue(); - } - - public int countConsultasPeriodoForEmpresa( Date dataInicio, Date dataFim, Integer empresaID ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores", "estabelecimentos" }, - new String[]{ "count(*)" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "estabelecimentos.empresa_id" ).isEqual( empresaID ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ).and( - new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 || array.get( 0, 0 ) == null ) - { - return 0; - } - return ( ( Number ) array.get( 0, 0 ) ).intValue(); - } - - public String[][] getMarcacoesPeriodoForEstabelecimento( Date dataInicio, Date dataFim, Integer estabelecimentoID ) - throws Exception - { - String [][]result = null; - Select select = - new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores" }, - new String[]{ MarcacoesTrabalhadorData.DATA, - "trabalhador_id", - MarcacoesTrabalhadorData.REALIZADA, - MarcacoesTrabalhadorData.TIPO }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ), - new String[]{ "data" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - result = new String[ array.columnLength() ][ 5 ]; - for( int n = 0; n < result.length; n++ ) - { - Date data = ( Date ) array.get( n, 0 ); - int trabalhadorID = ( ( Number ) array.get( n, 1 ) ).intValue(); - boolean realizada = "y".equals( array.get( n, 2 ) ); - int tipo = ( ( Number ) array.get( n, 3 ) ).intValue(); - String nomeEstabEmp[] = getNomeEstabelecimentoEmpresaForTrabalhador( trabalhadorID ); - result[ n ][ 0 ] = nomeEstabEmp[ 2 ]; - result[ n ][ 1 ] = nomeEstabEmp[ 0 ]; - result[ n ][ 2 ] = nomeEstabEmp[ 1 ]; - result[ n ][ 3 ] = DF.format( data ); - result[ n ][ 4 ] = ( tipo == Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ? "(Exame)" : "(Consulta)" ); - - } - return result; - } - - public int countExamesPeriodoForEstabelecimento( Date dataInicio, Date dataFim, Integer estabelecimentoID ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores" }, - new String[]{ "count(*)" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ).and( - new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 || array.get( 0, 0 ) == null ) - { - return 0; - } - return ( ( Number ) array.get( 0, 0 ) ).intValue(); - } - - public int countConsultasPeriodoForEstabelecimento( Date dataInicio, Date dataFim, Integer estabelecimentoID ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores" }, - new String[]{ "count(*)" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ).and( - new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() == 0 || array.get( 0, 0 ) == null ) - { - return 0; - } - return ( ( Number ) array.get( 0, 0 ) ).intValue(); - } - - public String[][] getTrabalhadoresSemExamesOuConsultas( Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { -// Select subSelect = -// new Select( new String[]{ "marcacoes_trabalhador" }, -// new String[]{ "trabalhador_id" }, -// new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ) ).and( -// new Field( "realizada" ).isEqual( "y" ) ) ); - Select select = - new Select( new String[]{ "empresas", "estabelecimentos", - "trabalhadores LEFT OUTER JOIN marcacoes_trabalhador ON " - + "( trabalhadores.id = marcacoes_trabalhador.trabalhador_id AND marcacoes_trabalhador.tipo = " - + (exames ? Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES : Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA) + " AND marcacoes_trabalhador.realizada = 'y' )" }, - new String[]{ "empresas.designacao_social", "estabelecimentos.nome", "trabalhadores.nome", - "empresas.designacao_social_plain", "estabelecimentos.nome_plain", "trabalhadores.nome_plain" }, - new Field( "estabelecimentos.empresa_id" ).isEqual( new Field( "empresas.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( null ) ).and( - new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ).or( - new Field( "marcacoes_trabalhador.realizada" ).isDifferent( "y" ) ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ), - new String[]{ "empresas.designacao_social_plain", "estabelecimentos.nome_plain", "trabalhadores.nome_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - String data[][] = new String[ array.columnLength() ][ 3 ]; - for( int r = 0; r < array.columnLength(); r++ ) - { - for( int c = 0; c < 3; c++ ) - { - data[ r ][ c ] = (String) array.get( r, c ); - } - } - return data; - } - - - - public int countTrabalhadoresSemExamesOuConsultas( Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "trabalhadores" }, new String[]{ "COUNT(*)" }, - new Field( "inactivo" ).isDifferent( "y" ) ); - int totalCount = 0; - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() > 0 && array.rowLength() > 0 ) - { - Number n = (Number) array.get( 0, 0 ); - if( n != null ) - { - totalCount = n.intValue(); - } - } - -// select = -// new Select( new String[]{ "marcacoes_trabalhador" }, -// new String[]{ "COUNT(*)" }, -// new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ) ).and( -// new Field( "realizada" ).isEqual( "y" ) ).and( -// new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ) ); -// int subCount = 0; -// array = executer.executeQuery( select ); -// if( array.columnLength() > 0 && array.rowLength() > 0 ) -// { -// Number n = (Number) array.get( 0, 0 ); -// if( n != null ) -// { -// subCount = n.intValue(); -// } -// } - - return totalCount - countTrabalhadoresComExamesOuConsultasPeriodo( dataInicio, dataFim, exames ); - } - - public String[][] getTrabalhadoresSemExamesOuConsultasEstabelecimento( Integer estabelecimentoID, Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador" }, - new String[]{ "trabalhador_id" }, - new Field( "tipo" ).isEqual( new Integer( exames ? Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES : Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ).and( - new Field( "realizada" ).isEqual( "y" ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - Integer ids[] = new Integer[ array.columnLength() ]; - for( int n = 0; n < ids.length; n++ ) - { - ids[ n ] = ( Integer ) array.get( n, 0 ); - } - if( ids.length == 0 ) - { - ids = new Integer[]{ new Integer( -1 ) }; - } - select = - new Select( new String[]{ "estabelecimentos", - "trabalhadores" }, - new String[]{ "estabelecimentos.nome", "trabalhadores.nome" }, - new Field( "estabelecimentos.id" ).isEqual( estabelecimentoID ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.id" ).notIn( ids ) ), - new String[]{ "trabalhadores.nome" }, null ); -// Select select = -// new Select( new String[]{ "estabelecimentos", -// "trabalhadores LEFT OUTER JOIN marcacoes_trabalhador ON " -// + "( trabalhadores.id = marcacoes_trabalhador.trabalhador_id AND marcacoes_trabalhador.tipo = " -// + (exames ? Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES : Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA) + " AND marcacoes_trabalhador.realizada = 'y' )" }, -// new String[]{ "estabelecimentos.nome", "trabalhadores.nome" }, -// new Field( "estabelecimentos.id" ).isEqual( estabelecimentoID ).and( -// new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( -// new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ).and( -// new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( null ).or( -// new Field( "marcacoes_trabalhador.realizada" ).isDifferent( "y" ) ) ).and( -// new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( -// new Field( "data" ).isLessOrEqual( dataFim ) ).and( -// new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ), -// new String[]{ "trabalhadores.nome" }, null ); - array = executer.executeQuery( select ); - String data[][] = new String[ array.columnLength() ][ 2 ]; - for( int r = 0; r < array.columnLength(); r++ ) - { - for( int c = 0; c < 2; c++ ) - { - data[ r ][ c ] = (String) array.get( r, c ); - } - } - return data; - } - - public Object[][] getCountTrabalhadoresSemExamesOuConsultasPeriodoForAllEmpresas( Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "empresas" }, - new String[]{ "id", "designacao_social", "designacao_social_plain" }, - new Field( "inactivo" ).isDifferent( "y" ), - new String[]{ "designacao_social_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - Object data[][] = new Object[ array.columnLength() ][ 3 ]; - for( int n = 0; n < data.length; n++ ) - { - data[ n ][ 0 ] = array.get( n, 1 ); - Integer empresaID = (Integer)array.get( n, 0 ); - data[ n ][ 1 ] = new Integer( countTrabalhadoresSemExamesOuConsultasEmpresa( empresaID, dataInicio, dataFim, exames ) ); - data[ n ][ 2 ] = empresaID; - } - return data; - } - - public int countTrabalhadoresSemExamesOuConsultasEmpresa( Integer empresaID, Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "trabalhadores", "estabelecimentos" }, new String[]{ "COUNT(*)" }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ).and( - new Field( "estabelecimentos.empresa_id" ).isEqual( empresaID ) ).and( - new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ) ); - int totalCount = 0; - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() > 0 && array.rowLength() > 0 ) - { - Number n = (Number) array.get( 0, 0 ); - if( n != null ) - { - totalCount = n.intValue(); - } - } - -// select = -// new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores", "estabelecimentos" }, -// new String[]{ "COUNT(*)" }, -// new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( -// new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( -// new Field( "estabelecimentos.empresa_id" ).isEqual( empresaID ) ).and( -// new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ) ) ).and( -// new Field( "realizada" ).isEqual( "y" ) ).and( -// new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ) ); -// int subCount = 0; -// array = executer.executeQuery( select ); -// if( array.columnLength() > 0 && array.rowLength() > 0 ) -// { -// Number n = (Number) array.get( 0, 0 ); -// if( n != null ) -// { -// subCount = n.intValue(); -// } -// } - return totalCount - countTrabalhadoresComExamesOuConsultasPeriodoForEmpresa( dataInicio, dataFim, empresaID, exames ); - } - - public int countTrabalhadoresSemExamesOuConsultasEstabelecimento( Integer estabelecimentoID, Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "trabalhadores" }, new String[]{ "COUNT(*)" }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( estabelecimentoID ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ) ); - int totalCount = 0; - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() > 0 && array.rowLength() > 0 ) - { - Number n = (Number) array.get( 0, 0 ); - if( n != null ) - { - totalCount = n.intValue(); - } - } - -// select = -// new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores" }, -// new String[]{ "COUNT(*)" }, -// new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( -// new Field( "trabalhadores.estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( -// new Field( "tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ) ) ).and( -// new Field( "realizada" ).isEqual( "y" ) ).and( -// new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ) ); -// int subCount = 0; -// array = executer.executeQuery( select ); -// if( array.columnLength() > 0 && array.rowLength() > 0 ) -// { -// Number n = (Number) array.get( 0, 0 ); -// if( n != null ) -// { -// subCount = n.intValue(); -// } -// } - return totalCount - countTrabalhadoresComExamesOuConsultasPeriodoForEstabelecimento( dataInicio, dataFim, estabelecimentoID, exames ); - } - - public String[][]getTrabalhadoresComExamesOuConsultasPeriodo( Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "empresas", "estabelecimentos", - "trabalhadores", "marcacoes_trabalhador" }, - new String[]{ "empresas.designacao_social", "estabelecimentos.nome", "trabalhadores.nome", - "empresas.designacao_social_plain", "estabelecimentos.nome_plain", "trabalhadores.nome_plain" }, - new Field( "estabelecimentos.empresa_id" ).isEqual( new Field( "empresas.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ).and( - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ) ).and( - new Field( "marcacoes_trabalhador.tipo" ).isEqual( new Integer( exames ? Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES : Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ).and( - new Field( "marcacoes_trabalhador.realizada" ).isEqual( "y" ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ), - new String[]{ "empresas.designacao_social_plain", "estabelecimentos.nome_plain", "trabalhadores.nome_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - String data[][] = new String[ array.columnLength() ][ 3 ]; - for( int r = 0; r < array.columnLength(); r++ ) - { - for( int c = 0; c < 3; c++ ) - { - data[ r ][ c ] = (String) array.get( r, c ); - } - } - return data; - } - - public int countTrabalhadoresComExamesOuConsultasPeriodo( Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores" }, - new String[]{ "COUNT(*)" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "tipo" ).isEqual( new Integer( exames ? Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES : Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ).and( - new Field( "realizada" ).isEqual( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ) ); - int count = 0; - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() > 0 && array.rowLength() > 0 ) - { - Number n = (Number) array.get( 0, 0 ); - if( n != null ) - { - count = n.intValue(); - } - } - return count; - } - - public String[][]getTrabalhadoresComExamesOuConsultasPeriodoForEstabelecimento( Date dataInicio, Date dataFim, Integer estabelecimentoID, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "estabelecimentos", - "trabalhadores", "marcacoes_trabalhador" }, - new String[]{ "estabelecimentos.nome", "trabalhadores.nome" }, - new Field( "estabelecimentos.id" ).isEqual( estabelecimentoID ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ).and( - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ) ).and( - new Field( "marcacoes_trabalhador.tipo" ).isEqual( new Integer( exames ? Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES : Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ).and( - new Field( "marcacoes_trabalhador.realizada" ).isEqual( "y" ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ), - new String[]{ "estabelecimentos.nome", "trabalhadores.nome" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - String data[][] = new String[ array.columnLength() ][ 2 ]; - for( int r = 0; r < array.columnLength(); r++ ) - { - for( int c = 0; c < 2; c++ ) - { - data[ r ][ c ] = (String) array.get( r, c ); - } - } - return data; - } - - public Object[][] getCountTrabalhadoresComExamesOuConsultasPeriodoForAllEmpresas( Date dataInicio, Date dataFim, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "empresas" }, - new String[]{ "id", "designacao_social", "designacao_social_plain" }, - new Field( "inactivo" ).isDifferent( "y" ), - new String[]{ "designacao_social_plain" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - Object data[][] = new Object[ array.columnLength() ][ 3 ]; - for( int n = 0; n < data.length; n++ ) - { - data[ n ][ 0 ] = array.get( n, 1 ); - Integer empresaID = (Integer)array.get( n, 0 ); - data[ n ][ 1 ] = new Integer( countTrabalhadoresComExamesOuConsultasPeriodoForEmpresa( dataInicio, dataFim, empresaID, exames ) ); - data[ n ][ 2 ] = empresaID; - } - return data; - } - - public int countTrabalhadoresComExamesOuConsultasPeriodoForEmpresa( Date dataInicio, Date dataFim, Integer empresaID, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores", "estabelecimentos" }, - new String[]{ "COUNT(*)" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "estabelecimentos.empresa_id" ).isEqual( empresaID ) ).and( - new Field( "tipo" ).isEqual( new Integer( exames ? Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES : Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ).and( - new Field( "realizada" ).isEqual( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ).and( - new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ) ); - int count = 0; - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() > 0 && array.rowLength() > 0 ) - { - Number n = (Number) array.get( 0, 0 ); - if( n != null ) - { - count = n.intValue(); - } - } - return count; - } - - public int countTrabalhadoresComExamesOuConsultasPeriodoForEstabelecimento( Date dataInicio, Date dataFim, Integer estabelecimentoID, boolean exames ) - throws Exception - { - Select select = - new Select( new String[]{ "marcacoes_trabalhador", "trabalhadores" }, - new String[]{ "COUNT(*)" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( "tipo" ).isEqual( new Integer( exames ? Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES : Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ).and( - new Field( "realizada" ).isEqual( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ).and( - new Field( "data" ).isGreaterOrEqual( dataInicio ) ).and( - new Field( "data" ).isLessOrEqual( dataFim ) ) ); - int count = 0; - Virtual2DArray array = executer.executeQuery( select ); - if( array.columnLength() > 0 && array.rowLength() > 0 ) - { - Number n = (Number) array.get( 0, 0 ); - if( n != null ) - { - count = n.intValue(); - } - } - return count; - } - - public String [][]getDadosTrabalhadoresPeriodo( Date dataInicio, Date dataFim ) - throws Exception - { - Select select = - new Select( new String[]{ "empresas", "estabelecimentos", "trabalhadores" }, - new String[]{ "empresas.designacao_social", "estabelecimentos.nome", "trabalhadores.nome", "trabalhadores.id", - "empresas.designacao_social_plain", "estabelecimentos.nome_plain", "trabalhadores.nome_plain" }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ).and( - new Field( "estabelecimentos.empresa_id" ).isEqual( new Field( "empresas.id" ) ) ).and( - new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ), - new String[]{ "empresas.designacao_social_plain", "estabelecimentos.nome_plain", "trabalhadores.nome_plain" }, null ); - - Virtual2DArray array = executer.executeQuery( select ); - String data[][] = new String[ array.columnLength() ][ 7 ]; - for( int n = 0; n < array.columnLength(); n++ ) - { - data[ n ][ 0 ] = ( String ) array.get( n, 0 ); - data[ n ][ 1 ] = ( String ) array.get( n, 1 ); - data[ n ][ 2 ] = ( String ) array.get( n, 2 ); - Integer id = new Integer( ( (Number) array.get( n, 3 ) ).intValue() ); - Select exameSelect = - new Select( new String[]{ "trabalhadores", "marcacoes_trabalhador" }, - new String[]{ "data", "realizada" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.id" ).isEqual( id ) ).and( - new Field( "marcacoes_trabalhador.data" ).isLessOrEqual( dataFim ) ).and( - new Field( "marcacoes_trabalhador.tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES ) ) ), - new String[]{ "data desc" }, null ); - Virtual2DArray exameArray = executer.executeQuery( exameSelect ); - if( exameArray.columnLength() > 0 ) - { - Date dataExame = ( Date ) exameArray.get( 0, 0 ); - String estado = ( String ) exameArray.get( 0, 1 ); - data[ n ][ 3 ] = DF.format( dataExame ); - data[ n ][ 4 ] = "y".equals( estado ) ? "Realizado" : "Faltou"; - } - else - { - data[ n ][ 3 ] = "--"; - data[ n ][ 4 ] = "--"; - } - - Select consultaSelect = - new Select( new String[]{ "trabalhadores", "marcacoes_trabalhador" }, - new String[]{ "data", "realizada" }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.id" ).isEqual( id ) ).and( - new Field( "marcacoes_trabalhador.data" ).isLessOrEqual( dataFim ) ).and( - new Field( "marcacoes_trabalhador.tipo" ).isEqual( new Integer( Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA ) ) ), - new String[]{ "data desc" }, null ); - Virtual2DArray consultaArray = executer.executeQuery( consultaSelect ); - if( consultaArray.columnLength() > 0 ) - { - Date dataConsulta = ( Date ) consultaArray.get( 0, 0 ); - String estado = ( String ) consultaArray.get( 0, 1 ); - data[ n ][ 5 ] = DF.format( dataConsulta ); - data[ n ][ 6 ] = "y".equals( estado ) ? "Realizada" : "Faltou"; - } - else - { - data[ n ][ 5 ] = "--"; - data[ n ][ 6 ] = "--"; - } - } - return data; - } - - public String[][]getDadosHigieneSeguranca() - throws Exception - { - Select select = - new Select( new String[]{ "empresas", "estabelecimentos" }, - new String[]{ "empresas.designacao_social", "estabelecimentos.nome", "estabelecimentos.id", - "empresas.designacao_social_plain", "estabelecimentos.nome_plain" }, - new Field( "estabelecimentos.empresa_id" ).isEqual( new Field( "empresas.id" ) ).and( - new Field( "empresas.inactivo" ).isDifferent( "y" ) ).and( - new Field( "estabelecimentos.inactivo" ).isDifferent( "y" ) ), - new String[]{ "empresas.designacao_social_plain", "estabelecimentos.nome_plain" }, null ); - - Virtual2DArray array = executer.executeQuery( select ); - String data[][] = new String[ array.columnLength() ][ 6 ]; - for( int n = 0; n < array.columnLength(); n++ ) - { - data[ n ][ 0 ] = ( String ) array.get( n, 0 ); - data[ n ][ 1 ] = ( String ) array.get( n, 1 ); - Integer id = new Integer( ( (Number) array.get( n, 2 ) ).intValue() ); - Select ultimaSelect = - new Select( new String[]{ "marcacoes_estabelecimento" }, - new String[]{ "data", "realizada", "data_relatorio" }, - new Field( "marcacoes_estabelecimento.estabelecimento_id" ).isEqual( id ).and( - new Field( "marcacoes_estabelecimento.data" ).isLessOrEqual( new Date() ) ), - new String[]{ "data desc" }, null ); - Virtual2DArray ultimaArray = executer.executeQuery( ultimaSelect ); - if( ultimaArray.columnLength() > 0 ) - { - Date dataAud = ( Date ) ultimaArray.get( 0, 0 ); - String estado = ( String ) ultimaArray.get( 0, 1 ); - Date dataRel = ( Date ) ultimaArray.get( 0, 2 ); - data[ n ][ 2 ] = DF.format( dataAud ); - data[ n ][ 3 ] = "y".equals( estado ) ? "Realizada" : "Não Realizada"; - data[ n ][ 4 ] = dataRel != null ? DF.format( dataRel ) : "--"; - } - else - { - data[ n ][ 2 ] = "--"; - data[ n ][ 3 ] = "--"; - data[ n ][ 4 ] = "--"; - } - - Select proximaSelect = - new Select( new String[]{ "marcacoes_estabelecimento" }, - new String[]{ "data" }, - new Field( "marcacoes_estabelecimento.estabelecimento_id" ).isEqual( id ).and( - new Field( "marcacoes_estabelecimento.data" ).isGreaterOrEqual( new Date() ) ), - new String[]{ "data desc" }, null ); - Virtual2DArray proximaArray = executer.executeQuery( proximaSelect ); - if( proximaArray.columnLength() > 0 ) - { - Date dataProx = ( Date ) proximaArray.get( 0, 0 ); - data[ n ][ 5 ] = DF.format( dataProx ); - } - else - { - data[ n ][ 5 ] = "--"; - } - } - return data; - } - - - -} - diff --git a/trunk/SIPRPSoft/src/siprp/estatistica/EstatisticaWindow.java b/trunk/SIPRPSoft/src/siprp/estatistica/EstatisticaWindow.java deleted file mode 100644 index 3d29f2f4..00000000 --- a/trunk/SIPRPSoft/src/siprp/estatistica/EstatisticaWindow.java +++ /dev/null @@ -1,1359 +0,0 @@ -/* - * EstatisticaWindow.java - * - * Created on 16 de Dezembro de 2004, 13:50 - */ - -package siprp.estatistica; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.FileDialog; -import java.awt.FlowLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.event.ActionListener; -import java.awt.event.ItemListener; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.text.DateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.Vector; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JEditorPane; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionListener; - -import shst.data.outer.EmpresasData; -import shst.data.outer.EstabelecimentosData; -import siprp.pesquisas.PesquisasProvider; -import siprp.ui.SIPRPFrame; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.data.MappableObject; -import com.evolute.utils.documents.YearDocument; -import com.evolute.utils.tables.BaseTable; -import com.evolute.utils.tables.VectorTableModel; -import com.evolute.utils.tracker.TrackableWindow; -import com.evolute.utils.ui.DialogException; -import com.evolute.utils.ui.calendar.JCalendarPanel; -import com.evolute.utils.ui.text.CopyPasteHandler; -/** - * - * @author fpalma - */ -public class EstatisticaWindow extends SIPRPFrame - implements TrackableWindow, ListSelectionListener, ActionListener, ItemListener -{ - public static final DateFormat DF = DateFormat.getDateInstance( DateFormat.SHORT ); - - public static final int NONE = 0; - public static final int LISTAGEM_GERAL_MARCACOES_PERIODO = 1; - public static final int LISTAGEM_MARCACOES_PERIODO_EMPRESA_ESTABELECIMENTO = 2; - public static final int LISTAGEM_GLOBAL_TRABALHADORES_SEM_EXAMES = 3; - public static final int LISTAGEM_TRABALHADORES_SEM_EXAMES_EMPRESA_ESTABELECIMENTO = 4; - public static final int LISTAGEM_GLOBAL_TRABALHADORES_COM_EXAMES_PERIODO = 5; - public static final int LISTAGEM_TRABALHADORES_COM_EXAMES_PERIODO_EMPRESA_ESTABELECIMENTO = 6; - public static final int LISTAGEM_GLOBAL_TRABALHADORES_SEM_CONSULTA = 7; - public static final int LISTAGEM_TRABALHADORES_SEM_CONSULTA_EMPRESA_ESTABELECIMENTO = 8; - public static final int LISTAGEM_GLOBAL_TRABALHADORES_COM_CONSULTA_PERIODO = 9; - public static final int LISTAGEM_TRABALHADORES_COM_CONSULTA_PERIODO_EMPRESA_ESTABELECIMENTO = 10; - public static final int LISTAGEM_GLOBAL_TRABALHADORES_PERIODO = -1; - public static final int LISTAGEM_GLOBAL_HIGIENE_SEGURANCA = 11; - - public static final String ESTATISTICAS[] = - new String[]{ "", - "Marca\u00e7\u00f5es efectuadas e pendentes (geral)", - "Marca\u00e7\u00f5es efectuadas e pendentes (por Empresa e Estabelecimento)", - "Contagem global de trabalhadores que ainda n\u00e3o realizaram exames (por per\u00edodo)", - "Listagem de trabalhadores que ainda n\u00e3o realizaram exames (por per\u00edodo, Empresa e Estabelecimento)", - "Contagem global de trabalhadores que j\u00e1 realizaram exames (por per\u00edodo)", - "Listagem de trabalhadores que j\u00e1 realizaram exames (por per\u00edodo, Empresa e Estabelecimento)", - "Contagem global de trabalhadores que ainda n\u00e3o realizaram consultas (por per\u00edodo)", - "Listagem de trabalhadores que ainda n\u00e3o realizaram consultas (por per\u00edodo, Empresa e Estabelecimento)", - "Contagem global de trabalhadores que j\u00e1 realizaram consultas (por per\u00edodo)", - "Listagem de trabalhadores que j\u00e1 realizaram consultas (por per\u00edodo, Empresa e Estabelecimento)", - //"Listagem global de trabalhadores (por per\u00edodo)", - "Listagem global com os dados de higiene e seguran\u00e7a" }; - - - public static final int OPTION_INTERVALO = 0; - public static final int OPTION_ANO = 1; - public static final int OPTION_EMPRESA = 2; - public static final int OPTION_ESTABELECIMENTO = 0; - - public static final boolean ESTATISTICAS_OPTIONS[][] = - // intervalo, ano, empresa, estabelecimento - new boolean[][]{ { false, false, false, false }, - { true, false, false, false }, - { true, false, true, true }, - { true, false, false, false }, - { true, false, true, true }, - { true, false, false, false }, - { true, false, true, true }, - { true, false, false, false }, - { true, false, true, true }, - { true, false, false, false }, - { true, false, true, true }, -// { true, false, false, false }, - { false, false, false, false } }; - - private ProviderInterface JDO; - private EstatisticaDataProvider provider; - private PesquisasProvider pesquisasProvider; - - private JComboBox estatisticaCombo; - private JCalendarPanel dataInicioPanel; - private JCalendarPanel dataFimPanel; - private JTextField anoText; - private BaseTable empresasTable; - private VectorTableModel empresasModel; - private BaseTable estabelecimentosTable; - private VectorTableModel estabelecimentosModel; - private JButton pesquisarButton; - private JButton excelButton; - private JEditorPane resultadoText; - - /** Creates a new instance of EstatisticaWindow */ - public EstatisticaWindow() - throws Exception - { - provider = (EstatisticaDataProvider)EstatisticaDataProvider.getProvider(); - pesquisasProvider = (PesquisasProvider)PesquisasProvider.getProvider(); - JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - setupComponents(); - } - - private void setupComponents() - { - setSize( 1000, 700 ); - setTitle( "Listagens" ); - - JLabel estatisticaLabel = new JLabel( "Listagem" ); - estatisticaCombo = new JComboBox(); - for( int n = 0; n < ESTATISTICAS.length; n++ ) - { - estatisticaCombo.addItem( ESTATISTICAS[ n ] ); - } - estatisticaCombo.setSelectedIndex( 0 ); - estatisticaCombo.addItemListener( this ); - estatisticaCombo.setPreferredSize( new Dimension( 700, 20 ) ); - JLabel intervalo1Label = new JLabel( "De" ); - JLabel intervalo2Label = new JLabel( "a" ); - dataInicioPanel = new JCalendarPanel( null ); - dataInicioPanel.setPreferredSize( new Dimension( 200, 20 ) ); - dataFimPanel = new JCalendarPanel( null ); - dataFimPanel.setPreferredSize( new Dimension( 200, 20 ) ); - - JLabel anoLabel = new JLabel( "Ano" ); - anoText = new JTextField(); - anoText.setDocument( new YearDocument() ); - anoText.setPreferredSize( new Dimension( 50, 20 ) ); - new CopyPasteHandler( anoText ); - - empresasModel = new VectorTableModel( new String[]{ "Designa\u00e7\u00e3o Social" } ); - empresasTable = new BaseTable( empresasModel ); - empresasTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); - empresasTable.setNonResizableNorReordable(); - empresasTable.getSelectionModel().addListSelectionListener( this ); - JScrollPane empresasScroll = new JScrollPane(); - empresasScroll.setViewportView( empresasTable ); - empresasScroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); - empresasScroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - empresasScroll.getVerticalScrollBar().setBlockIncrement(20); - - estabelecimentosModel = new VectorTableModel( new String[]{ "Nome" } ); - estabelecimentosTable = new BaseTable( estabelecimentosModel ); - estabelecimentosTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); - estabelecimentosTable.setNonResizableNorReordable(); - estabelecimentosTable.getSelectionModel().addListSelectionListener( this ); - JScrollPane estabelecimentosScroll = new JScrollPane(); - estabelecimentosScroll.setViewportView( estabelecimentosTable ); - estabelecimentosScroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); - estabelecimentosScroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - - pesquisarButton = new JButton( "Pesquisar" ); - pesquisarButton.addActionListener( this ); - excelButton = new JButton( "Exportar" ); - excelButton.addActionListener( this ); - - resultadoText = new JEditorPane( "text/html", "" ); - resultadoText.setEditable( false ); -// resultadoText.setLineWrap( true ); -// resultadoText.setWrapStyleWord( true ); - new CopyPasteHandler( resultadoText ); - JScrollPane resultadoScroll = new JScrollPane(); - resultadoScroll.setViewportView( resultadoText ); - resultadoScroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS ); - resultadoScroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - - JPanel pad; - - GridBagLayout gridbag = new GridBagLayout(); - getContentPane().setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 5, 5, 5, 5 ); - - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - - JPanel escolhaEstatisticaPanel = new JPanel(); - escolhaEstatisticaPanel.setLayout( new FlowLayout( FlowLayout.LEFT ) ); - escolhaEstatisticaPanel.add( estatisticaLabel ); - escolhaEstatisticaPanel.add( estatisticaCombo ); - gridbag.setConstraints( escolhaEstatisticaPanel, constraints ); - getContentPane().add( escolhaEstatisticaPanel ); - - JPanel periodoPanel = new JPanel(); - periodoPanel.setLayout( new FlowLayout( FlowLayout.LEFT ) ); - periodoPanel.add( intervalo1Label ); - periodoPanel.add( dataInicioPanel ); - periodoPanel.add( intervalo2Label ); - periodoPanel.add( dataFimPanel ); - gridbag.setConstraints( periodoPanel, constraints ); - getContentPane().add( periodoPanel ); - - JPanel anoPanel = new JPanel(); - anoPanel.setLayout( new FlowLayout( FlowLayout.LEFT ) ); - anoPanel.add( anoLabel ); - anoPanel.add( anoText ); - gridbag.setConstraints( anoPanel, constraints ); - getContentPane().add( anoPanel ); - - constraints.fill = GridBagConstraints.BOTH; - constraints.weighty = 0.2; - constraints.gridheight = 2; - constraints.weightx = 0.3; - constraints.gridwidth = 3; - - JPanel empresasPanel = new JPanel( new BorderLayout() ); - empresasPanel.add( empresasScroll ); - empresasPanel.setBorder( BorderFactory.createTitledBorder( "Empresa" ) ); - - gridbag.setConstraints( empresasPanel, constraints ); - getContentPane().add( empresasPanel ); - - JPanel panel = new JPanel( new BorderLayout() ); - panel.setBorder( BorderFactory.createTitledBorder( "Estabelecimento" ) ); - panel.add( estabelecimentosScroll ); - - gridbag.setConstraints( panel, constraints ); - getContentPane().add( panel ); - - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 0.4; - constraints.gridwidth = GridBagConstraints.REMAINDER; - pad = new JPanel(); - gridbag.setConstraints( pad, constraints ); - getContentPane().add( pad ); - - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 0; - constraints.gridwidth = 1; - JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout( new GridLayout( 1, 1 ) ); - buttonPanel.add( pesquisarButton ); - buttonPanel.add( excelButton ); - gridbag.setConstraints( buttonPanel, constraints ); - getContentPane().add( buttonPanel ); - - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 0.4; - constraints.gridwidth = GridBagConstraints.REMAINDER; - pad = new JPanel(); - gridbag.setConstraints( pad, constraints ); - getContentPane().add( pad ); - - constraints.fill = GridBagConstraints.BOTH; - constraints.weighty = 0.8; - constraints.gridheight = GridBagConstraints.REMAINDER; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - - JPanel resultadoPanel = new JPanel( new BorderLayout() ); - resultadoPanel.add( resultadoScroll ); - - gridbag.setConstraints( resultadoPanel, constraints ); - getContentPane().add( resultadoPanel ); - - processarEscolha(); - } - - public void actionPerformed(java.awt.event.ActionEvent e) - { - Object source = e.getSource(); - if( source.equals( pesquisarButton ) ) - { - int index = estatisticaCombo.getSelectedIndex(); - switch( index ) - { - case LISTAGEM_GERAL_MARCACOES_PERIODO: - listagemGeralMarcacoesPeriodo(); - break; - - case LISTAGEM_MARCACOES_PERIODO_EMPRESA_ESTABELECIMENTO: - listagemMarcacoesPeriodoEmpresaEstabelecimento(); - break; - - case LISTAGEM_GLOBAL_TRABALHADORES_SEM_EXAMES: - listagemGeralTrabalhadoresSemExamesOuConsultas( true ); - break; - - case LISTAGEM_TRABALHADORES_SEM_EXAMES_EMPRESA_ESTABELECIMENTO: - listagemTrabalhadoresSemExamesOuConsultasEmpresaEstabelecimento( true ); - break; - - case LISTAGEM_GLOBAL_TRABALHADORES_COM_EXAMES_PERIODO: - listagemGeralTrabalhadoresComExamesOuConsultasPeriodo( true ); - break; - - case LISTAGEM_TRABALHADORES_COM_EXAMES_PERIODO_EMPRESA_ESTABELECIMENTO: - listagemGeralTrabalhadoresComExamesOuConsultasPeriodoEmpresaEstabelecimento( true ); - break; - - case LISTAGEM_GLOBAL_TRABALHADORES_SEM_CONSULTA: - listagemGeralTrabalhadoresSemExamesOuConsultas( false ); - break; - - case LISTAGEM_TRABALHADORES_SEM_CONSULTA_EMPRESA_ESTABELECIMENTO: - listagemTrabalhadoresSemExamesOuConsultasEmpresaEstabelecimento( false ); - break; - - case LISTAGEM_GLOBAL_TRABALHADORES_COM_CONSULTA_PERIODO: - listagemGeralTrabalhadoresComExamesOuConsultasPeriodo( false ); - break; - - case LISTAGEM_TRABALHADORES_COM_CONSULTA_PERIODO_EMPRESA_ESTABELECIMENTO: - listagemGeralTrabalhadoresComExamesOuConsultasPeriodoEmpresaEstabelecimento( false ); - break; - - case LISTAGEM_GLOBAL_TRABALHADORES_PERIODO: - listagemGeralTrabalhadoresPeriodo(); - break; - - case LISTAGEM_GLOBAL_HIGIENE_SEGURANCA: - listagemGlobalHigieneSeguranca(); - break; - } - } - else if( source.equals( excelButton ) ) - { - exportar(); - } - } - - private boolean close() - { - setVisible( false ); - dispose(); - return true; - } - - public boolean closeIfPossible() - { - return close(); - } - - public void open() - { - empresasTable.clearSelection(); - estatisticaCombo.setSelectedIndex( 0 ); - try - { - IDObject empresas[] = pesquisasProvider.getAllEmpresas(); - empresasModel.setValues( new Vector( Arrays.asList( empresas ) ) ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar dados", true ); - } - setVisible( true ); - } - - public void refresh() - { - setVisible( true ); - } - - public void valueChanged(javax.swing.event.ListSelectionEvent e) - { - Object source = e.getSource(); - if( source.equals( empresasTable.getSelectionModel() ) ) - { - estabelecimentosTable.clearSelection(); - int selected = empresasTable.getSelectedRow(); - if( selected == -1 ) - { - return; - } - IDObject empresa = (IDObject) empresasModel.getRowAt( selected ); - estabelecimentosModel.clearAll(); - IDObject estabelecimentos[]; - try - { - estabelecimentos = pesquisasProvider.getAllEstabelecimentosForEmpresa( empresa.getID() ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar os estabelecimentos", true ); - return; - } - Vector v = new Vector( Arrays.asList( estabelecimentos ) ); - v.add( new MappableObject( new Integer( -1 ), "TODOS" ) ); - estabelecimentosModel.setValues( v ); - } - } - - public void itemStateChanged(java.awt.event.ItemEvent itemEvent) - { - processarEscolha(); - } - - protected void processarEscolha() - { - int index = estatisticaCombo.getSelectedIndex(); - boolean optionLine[] = ESTATISTICAS_OPTIONS[ index ]; - dataInicioPanel.setEnabled( optionLine[ OPTION_INTERVALO ] ); - dataFimPanel.setEnabled( optionLine[ OPTION_INTERVALO ] ); - anoText.setEnabled( optionLine[ OPTION_ANO ] ); - empresasTable.setEnabled( optionLine[ OPTION_EMPRESA ] ); - estabelecimentosTable.setEnabled( optionLine[ OPTION_ESTABELECIMENTO ] ); - pesquisarButton.setEnabled( index != NONE ); - } - - protected void listagemGeralMarcacoesPeriodo() - { - try - { - Date inicio = dataInicioPanel.getDate(); - Date fim = dataFimPanel.getDate(); - if( inicio == null || fim == null ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher o intervalo de datas.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - if( inicio.after( fim ) ) - { - JOptionPane.showMessageDialog( this, "A data de in\u00edcio tem de ser inferior \u00e0 de fim..", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - StringBuffer buffer = new StringBuffer(); - int exames = provider.countExamesPeriodo( inicio, fim ); - int consultas = provider.countConsultasPeriodo( inicio, fim ); - int total = exames + consultas; - buffer.append( "

" ); - buffer.append( "" + ESTATISTICAS[ LISTAGEM_GERAL_MARCACOES_PERIODO ] + "" ); - buffer.append( "

" ); - buffer.append( "
" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "PER\u00cdODO:" ); - buffer.append( "" ); - buffer.append( "" + DF.format( dataInicioPanel.getDate() ) + " a " - + DF.format( dataFimPanel.getDate() ) + "" ); - buffer.append( "
" ); - buffer.append( "EXAMES:" ); - buffer.append( "" ); - buffer.append( "" + exames + "" ); - buffer.append( "
" ); - buffer.append( "CONSULTAS:" ); - buffer.append( "" ); - buffer.append( "" + consultas + "" ); - buffer.append( "
" ); - buffer.append( "TOTAL:" ); - buffer.append( "" ); - buffer.append( "" + ( exames + consultas ) + "" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - String data[][] = provider.getMarcacoesPeriodo( inicio, fim ); - for( int l = 0; l < data.length; l++ ) - { - buffer.append( "" ); - for( int c = 0; c < data[ l ].length; c++ ) - { - buffer.append( "" ); - buffer.append( "" ); - } - buffer.append( "" ); - } - buffer.append( "
" ); - buffer.append( "EMPRESA" ); - buffer.append( "" ); - buffer.append( "NOME" ); - buffer.append( "" ); - buffer.append( "ESTABELECIMENTO" ); - buffer.append( "" ); - buffer.append( "DATA" ); - buffer.append( "" ); - buffer.append( " " ); - buffer.append( "
" ); - buffer.append( "" + data[ l ][ c ] + "" ); - buffer.append( "
" ); - resultadoText.setText( buffer.toString() ); - } - catch( Exception ex ) - { - resultadoText.setText( "ERRO a carregar dados!" ); - ex.printStackTrace(); - } - } - - protected void listagemMarcacoesPeriodoEmpresaEstabelecimento() - { - try - { - Date inicio = dataInicioPanel.getDate(); - Date fim = dataFimPanel.getDate(); - int sEmpresa = empresasTable.getSelectedRow(); - int sEstabelecimento = estabelecimentosTable.getSelectedRow(); - if( inicio == null || fim == null || sEmpresa == -1 ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher Empresa e intervalo de datas.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - if( inicio.after( fim ) ) - { - JOptionPane.showMessageDialog( this, "A data de in\u00edcio tem de ser inferior \u00e0 de fim..", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - StringBuffer buffer = new StringBuffer(); - Integer idEmpresa = ( (IDObject)empresasModel.getRowAt( sEmpresa ) ).getID(); - EmpresasData empresa = (EmpresasData)JDO.load( EmpresasData.class, idEmpresa ); - String designacao = (String)empresa.get( EmpresasData.DESIGNACAO_SOCIAL ); - IDObject estabelecimentos[]; - if( sEstabelecimento == -1 || ( ( IDObject )estabelecimentosModel.getRowAt( sEstabelecimento ) ).getID().equals( new Integer( -1 ) ) ) - { - estabelecimentos = pesquisasProvider.getAllEstabelecimentosForEmpresa( idEmpresa ); - } - else - { - estabelecimentos = new IDObject[ 1 ]; - estabelecimentos[ 0 ] = ( IDObject )estabelecimentosModel.getRowAt( sEstabelecimento ); - } - int examesEmpresa = provider.countExamesPeriodoForEmpresa( inicio, fim, idEmpresa ); - int consultasEmpresa = provider.countConsultasPeriodoForEmpresa( inicio, fim, idEmpresa ); - buffer.append( "

" ); - buffer.append( "" + ESTATISTICAS[ LISTAGEM_MARCACOES_PERIODO_EMPRESA_ESTABELECIMENTO ] + "" ); - buffer.append( "

" ); - buffer.append( "
" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "EMPRESA:" ); - buffer.append( "" ); - buffer.append( "" + designacao + "" ); - buffer.append( "
" ); - buffer.append( "PER\u00cdODO:" ); - buffer.append( "" ); - buffer.append( "" + DF.format( dataInicioPanel.getDate() ) + " a " - + DF.format( dataFimPanel.getDate() ) + "" ); - buffer.append( "
" ); - buffer.append( "EXAMES:" ); - buffer.append( "" ); - buffer.append( "" + examesEmpresa + "" ); - buffer.append( "
" ); - buffer.append( "CONSULTAS:" ); - buffer.append( "" ); - buffer.append( "" + consultasEmpresa + "" ); - buffer.append( "
" ); - buffer.append( "TOTAL:" ); - buffer.append( "" ); - buffer.append( "" + ( examesEmpresa + consultasEmpresa ) + "" ); - buffer.append( "
" ); - for( int e = 0; e < estabelecimentos.length; e++ ) - { - EstabelecimentosData estabelecimento = (EstabelecimentosData)JDO.load( EstabelecimentosData.class, estabelecimentos[ e ].getID() ); - String nome = (String)estabelecimento.get( EstabelecimentosData.NOME ); - int exames = provider.countExamesPeriodoForEstabelecimento( inicio, fim, estabelecimentos[ e ].getID() ); - int consultas = provider.countConsultasPeriodoForEstabelecimento( inicio, fim, estabelecimentos[ e ].getID() ); - int total = exames + consultas; - buffer.append( "



" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "ESTABELECIMENTO:" ); - buffer.append( "" ); - buffer.append( "" + nome + "" ); - buffer.append( "
" ); - buffer.append( "EXAMES:" ); - buffer.append( "" ); - buffer.append( "" + exames + "" ); - buffer.append( "
" ); - buffer.append( "CONSULTAS:" ); - buffer.append( "" ); - buffer.append( "" + consultas + "" ); - buffer.append( "
" ); - buffer.append( "TOTAL:" ); - buffer.append( "" ); - buffer.append( "" + ( exames + consultas ) + "" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - String data[][] = provider.getMarcacoesPeriodoForEstabelecimento( inicio, fim, estabelecimentos[ e ].getID() ); - for( int l = 0; l < data.length; l++ ) - { - buffer.append( "" ); - for( int c = 1; c < data[ l ].length; c++ ) - { - buffer.append( "" ); - buffer.append( "" ); - } - buffer.append( "" ); - } - buffer.append( "
" ); - buffer.append( "NOME" ); - buffer.append( "" ); - buffer.append( "ESTABELECIMENTO" ); - buffer.append( "" ); - buffer.append( "DATA" ); - buffer.append( "" ); - buffer.append( " " ); - buffer.append( "
" ); - buffer.append( "" + data[ l ][ c ] + "" ); - buffer.append( "
" ); - } - resultadoText.setText( buffer.toString() ); - } - catch( Exception ex ) - { - resultadoText.setText( "ERRO a carregar dados!" ); - ex.printStackTrace(); - } - } - - protected void listagemGeralTrabalhadoresSemExamesOuConsultas( boolean exames ) - { - try - { - Date inicio = dataInicioPanel.getDate(); - Date fim = dataFimPanel.getDate(); - if( inicio == null || fim == null ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher o intervalo de datas.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - if( inicio.after( fim ) ) - { - JOptionPane.showMessageDialog( this, "A data de in\u00edcio tem de ser inferior \u00e0 de fim..", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - int count = provider.countTrabalhadoresSemExamesOuConsultas( inicio, fim, exames ); - //String data[][] = provider.getTrabalhadoresComExamesOuConsultasPeriodo( inicio, fim, exames ); - Object data[][] = provider.getCountTrabalhadoresSemExamesOuConsultasPeriodoForAllEmpresas( inicio, fim, exames ); - StringBuffer buffer = new StringBuffer(); - buffer.append( "

" ); - buffer.append( "" + ESTATISTICAS[ exames ? LISTAGEM_GLOBAL_TRABALHADORES_SEM_EXAMES : LISTAGEM_GLOBAL_TRABALHADORES_SEM_CONSULTA ] + "" ); - buffer.append( "

" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "PER\u00cdODO:" ); - buffer.append( "" ); - buffer.append( "" + DF.format( dataInicioPanel.getDate() ) + " a " - + DF.format( dataFimPanel.getDate() ) + "" ); - buffer.append( "
" ); - buffer.append( "TOTAL:" ); - buffer.append( "" ); - buffer.append( "" + count + "" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - for( int l = 0; l < data.length; l++ ) - { - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - } - buffer.append( "
" ); - buffer.append( "EMPRESA" ); - buffer.append( "" ); - buffer.append( "N\u00ba" ); - buffer.append( "
" ); - buffer.append( "" + data[ l ][ 0 ] + "" ); - buffer.append( "" ); - buffer.append( "" + data[ l ][ 1 ] + "" ); - buffer.append( "
" ); - resultadoText.setText( buffer.toString() ); - } - catch( Exception ex ) - { - resultadoText.setText( "ERRO a carregar dados!" ); - ex.printStackTrace(); - } - } - - protected void listagemTrabalhadoresSemExamesOuConsultasEmpresaEstabelecimento( boolean exames ) - { - try - { - Date inicio = dataInicioPanel.getDate(); - Date fim = dataFimPanel.getDate(); - if( inicio == null || fim == null ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher o intervalo de datas.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - if( inicio.after( fim ) ) - { - JOptionPane.showMessageDialog( this, "A data de in\u00edcio tem de ser inferior \u00e0 de fim..", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - int sEmpresa = empresasTable.getSelectedRow(); - int sEstabelecimento = estabelecimentosTable.getSelectedRow(); - if( sEmpresa == -1 ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher Empresa.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - StringBuffer buffer = new StringBuffer(); - Integer idEmpresa = ( (IDObject)empresasModel.getRowAt( sEmpresa ) ).getID(); - EmpresasData empresa = (EmpresasData)JDO.load( EmpresasData.class, idEmpresa ); - String designacao = (String)empresa.get( EmpresasData.DESIGNACAO_SOCIAL ); - IDObject estabelecimentos[]; - if( sEstabelecimento == -1 || ( ( IDObject )estabelecimentosModel.getRowAt( sEstabelecimento ) ).getID().equals( new Integer( -1 ) ) ) - { - estabelecimentos = pesquisasProvider.getAllEstabelecimentosForEmpresa( idEmpresa ); - } - else - { - estabelecimentos = new IDObject[ 1 ]; - estabelecimentos[ 0 ] = ( IDObject )estabelecimentosModel.getRowAt( sEstabelecimento ); - } - int countEmpresa = provider.countTrabalhadoresSemExamesOuConsultasEmpresa( idEmpresa, inicio, fim, exames ); - buffer.append( "

" ); - buffer.append( "" + ESTATISTICAS[ exames ? LISTAGEM_TRABALHADORES_SEM_EXAMES_EMPRESA_ESTABELECIMENTO : LISTAGEM_TRABALHADORES_SEM_CONSULTA_EMPRESA_ESTABELECIMENTO ] + "" ); - buffer.append( "

" ); - buffer.append( "
" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "EMPRESA:" ); - buffer.append( "" ); - buffer.append( "" + designacao + "" ); - buffer.append( "
" ); - buffer.append( "Nº DE TRABALHADORES:" ); - buffer.append( "" ); - buffer.append( "" + countEmpresa + "" ); - buffer.append( "
" ); - for( int e = 0; e < estabelecimentos.length; e++ ) - { - EstabelecimentosData estabelecimento = (EstabelecimentosData)JDO.load( EstabelecimentosData.class, estabelecimentos[ e ].getID() ); - String nome = (String)estabelecimento.get( EstabelecimentosData.NOME ); - int countEstabelecimento = provider.countTrabalhadoresSemExamesOuConsultasEstabelecimento( estabelecimentos[ e ].getID(), inicio, fim, exames ); - buffer.append( "



" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "ESTABELECIMENTO:" ); - buffer.append( "" ); - buffer.append( "" + nome + "" ); - buffer.append( "
" ); - buffer.append( "Nº DE TRABALHADORES:" ); - buffer.append( "" ); - buffer.append( "" + countEstabelecimento + "" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - String data[][] = provider.getTrabalhadoresSemExamesOuConsultasEstabelecimento( estabelecimentos[ e ].getID(), inicio, fim, exames ); - for( int l = 0; l < data.length; l++ ) - { - buffer.append( "" ); - for( int c = 0; c < data[ l ].length; c++ ) - { - buffer.append( "" ); - buffer.append( "" ); - } - buffer.append( "" ); - } - buffer.append( "
" ); - buffer.append( "ESTABELECIMENTO" ); - buffer.append( "" ); - buffer.append( "NOME" ); - buffer.append( "
" ); - buffer.append( "" + data[ l ][ c ] + "" ); - buffer.append( "
" ); - } - resultadoText.setText( buffer.toString() ); - } - catch( Exception ex ) - { - resultadoText.setText( "ERRO a carregar dados!" ); - ex.printStackTrace(); - } - } - - protected void listagemGeralTrabalhadoresComExamesOuConsultasPeriodo( boolean exames ) - { - try - { - Date inicio = dataInicioPanel.getDate(); - Date fim = dataFimPanel.getDate(); - if( inicio == null || fim == null ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher o intervalo de datas.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - if( inicio.after( fim ) ) - { - JOptionPane.showMessageDialog( this, "A data de in\u00edcio tem de ser inferior \u00e0 de fim..", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - int count = provider.countTrabalhadoresComExamesOuConsultasPeriodo( inicio, fim, exames ); - //String data[][] = provider.getTrabalhadoresComExamesOuConsultasPeriodo( inicio, fim, exames ); - Object data[][] = provider.getCountTrabalhadoresComExamesOuConsultasPeriodoForAllEmpresas( inicio, fim, exames ); - StringBuffer buffer = new StringBuffer(); - buffer.append( "

" ); - buffer.append( "" + ESTATISTICAS[ exames ? LISTAGEM_GLOBAL_TRABALHADORES_COM_EXAMES_PERIODO : LISTAGEM_GLOBAL_TRABALHADORES_COM_CONSULTA_PERIODO ] + "" ); - buffer.append( "

" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "PER\u00cdODO:" ); - buffer.append( "" ); - buffer.append( "" + DF.format( dataInicioPanel.getDate() ) + " a " - + DF.format( dataFimPanel.getDate() ) + "" ); - buffer.append( "
" ); - buffer.append( "TOTAL:" ); - buffer.append( "" ); - buffer.append( "" + count + "" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - for( int l = 0; l < data.length; l++ ) - { - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - } - buffer.append( "
" ); - buffer.append( "EMPRESA" ); - buffer.append( "" ); - buffer.append( "N\u00ba" ); - buffer.append( "
" ); - buffer.append( "" + data[ l ][ 0 ] + "" ); - buffer.append( "" ); - buffer.append( "" + data[ l ][ 1 ] + "" ); - buffer.append( "
" ); - resultadoText.setText( buffer.toString() ); - } - catch( Exception ex ) - { - resultadoText.setText( "ERRO a carregar dados!" ); - ex.printStackTrace(); - } - } - - protected void listagemGeralTrabalhadoresComExamesOuConsultasPeriodoEmpresaEstabelecimento( boolean exames ) - { - try - { - Date inicio = dataInicioPanel.getDate(); - Date fim = dataFimPanel.getDate(); - int sEmpresa = empresasTable.getSelectedRow(); - int sEstabelecimento = estabelecimentosTable.getSelectedRow(); - if( inicio == null || fim == null || sEmpresa == -1 ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher Empresa e intervalo de datas.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - if( inicio.after( fim ) ) - { - JOptionPane.showMessageDialog( this, "A data de in\u00edcio tem de ser inferior \u00e0 de fim..", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - StringBuffer buffer = new StringBuffer(); - Integer idEmpresa = ( (IDObject)empresasModel.getRowAt( sEmpresa ) ).getID(); - EmpresasData empresa = (EmpresasData)JDO.load( EmpresasData.class, idEmpresa ); - String designacao = (String)empresa.get( EmpresasData.DESIGNACAO_SOCIAL ); - IDObject estabelecimentos[]; - if( sEstabelecimento == -1 || ( ( IDObject )estabelecimentosModel.getRowAt( sEstabelecimento ) ).getID().equals( new Integer( -1 ) ) ) - { - estabelecimentos = pesquisasProvider.getAllEstabelecimentosForEmpresa( idEmpresa ); - } - else - { - estabelecimentos = new IDObject[ 1 ]; - estabelecimentos[ 0 ] = ( IDObject )estabelecimentosModel.getRowAt( sEstabelecimento ); - } - int countEmpresa = provider.countTrabalhadoresComExamesOuConsultasPeriodoForEmpresa( inicio, fim, idEmpresa, exames ); - buffer.append( "

" ); - buffer.append( "" + ESTATISTICAS[ exames ? LISTAGEM_TRABALHADORES_COM_EXAMES_PERIODO_EMPRESA_ESTABELECIMENTO : LISTAGEM_TRABALHADORES_COM_CONSULTA_PERIODO_EMPRESA_ESTABELECIMENTO ] + "" ); - buffer.append( "

" ); - buffer.append( "
" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "
" ); - buffer.append( "EMPRESA:" ); - buffer.append( "" ); - buffer.append( "" + designacao + "" ); - buffer.append( "
" ); - buffer.append( "PER\u00cdODO:" ); - buffer.append( "" ); - buffer.append( "" + DF.format( dataInicioPanel.getDate() ) + " a " - + DF.format( dataFimPanel.getDate() ) + "" ); - buffer.append( "
" ); - buffer.append( "Nº:" ); - buffer.append( "" ); - buffer.append( "" + countEmpresa + "" ); - buffer.append( "
" ); - for( int e = 0; e < estabelecimentos.length; e++ ) - { - EstabelecimentosData estabelecimento = (EstabelecimentosData)JDO.load( EstabelecimentosData.class, estabelecimentos[ e ].getID() ); - String nome = (String)estabelecimento.get( EstabelecimentosData.NOME ); - int countEstabelecimento = provider.countTrabalhadoresComExamesOuConsultasPeriodoForEstabelecimento( inicio, fim, estabelecimentos[ e ].getID(), exames ); - buffer.append( "



" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "ESTABELECIMENTO:" ); - buffer.append( "" ); - buffer.append( "" + nome + "" ); - buffer.append( "
" ); - buffer.append( "Nº:" ); - buffer.append( "" ); - buffer.append( "" + countEstabelecimento + "" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - String data[][] = provider.getTrabalhadoresComExamesOuConsultasPeriodoForEstabelecimento( inicio, fim, estabelecimentos[ e ].getID(), exames ); - for( int l = 0; l < data.length; l++ ) - { - buffer.append( "" ); - for( int c = 0; c < data[ l ].length; c++ ) - { - buffer.append( "" ); - buffer.append( "" ); - } - buffer.append( "" ); - } - buffer.append( "
" ); - buffer.append( "ESTABELECIMENTO" ); - buffer.append( "" ); - buffer.append( "NOME" ); - buffer.append( "
" ); - buffer.append( "" + data[ l ][ c ] + "" ); - buffer.append( "
" ); - } - resultadoText.setText( buffer.toString() ); - } - catch( Exception ex ) - { - resultadoText.setText( "ERRO a carregar dados!" ); - ex.printStackTrace(); - } - } - - protected void listagemGeralTrabalhadoresPeriodo() - { - try - { - Date inicio = dataInicioPanel.getDate(); - Date fim = dataFimPanel.getDate(); - if( inicio == null || fim == null ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher o intervalo de datas.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - if( inicio.after( fim ) ) - { - JOptionPane.showMessageDialog( this, "A data de in\u00edcio tem de ser inferior \u00e0 de fim..", "Erro...", - JOptionPane.ERROR_MESSAGE ); - resultadoText.setText( "ERRO!" ); - return; - } - StringBuffer buffer = new StringBuffer(); - buffer.append( "

" ); - buffer.append( "" + ESTATISTICAS[ LISTAGEM_GLOBAL_TRABALHADORES_PERIODO ] + "" ); - buffer.append( "

" ); - buffer.append( "
" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "
" ); - buffer.append( "PER\u00cdODO:" ); - buffer.append( "" ); - buffer.append( "" + DF.format( dataInicioPanel.getDate() ) + " a " - + DF.format( dataFimPanel.getDate() ) + "" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - String data[][] = provider.getDadosTrabalhadoresPeriodo( inicio, fim ); - for( int l = 0; l < data.length; l++ ) - { - buffer.append( "" ); - for( int c = 0; c < data[ l ].length; c++ ) - { - buffer.append( "" ); - buffer.append( "" ); - } - buffer.append( "" ); - } - buffer.append( "
" ); - buffer.append( "EMPRESA" ); - buffer.append( "" ); - buffer.append( "ESTABELECIMENTO" ); - buffer.append( "" ); - buffer.append( "NOME" ); - buffer.append( "" ); - buffer.append( "ÚLTIMO EXAME" ); - buffer.append( "" ); - buffer.append( "ESTADO" ); - buffer.append( "" ); - buffer.append( "ÚLTIMA CONSULTA" ); - buffer.append( "" ); - buffer.append( "ESTADO" ); - buffer.append( "
" ); - buffer.append( "" + data[ l ][ c ] + "" ); - buffer.append( "
" ); - resultadoText.setText( buffer.toString() ); - } - catch( Exception ex ) - { - resultadoText.setText( "ERRO a carregar dados!" ); - ex.printStackTrace(); - } - } - - protected void listagemGlobalHigieneSeguranca() - { - try - { - StringBuffer buffer = new StringBuffer(); - buffer.append( "

" ); - buffer.append( "" + ESTATISTICAS[ LISTAGEM_GLOBAL_HIGIENE_SEGURANCA ] + "" ); - buffer.append( "

" ); - buffer.append( "
" ); - - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - buffer.append( "" ); - String data[][] = provider.getDadosHigieneSeguranca(); - for( int l = 0; l < data.length; l++ ) - { - buffer.append( "" ); - for( int c = 0; c < data[ l ].length; c++ ) - { - buffer.append( "" ); - buffer.append( "" ); - } - buffer.append( "" ); - } - buffer.append( "
" ); - buffer.append( "EMPRESA" ); - buffer.append( "" ); - buffer.append( "ESTABELECIMENTO" ); - buffer.append( "" ); - buffer.append( "ÚLTIMA AUDITORIA" ); - buffer.append( "" ); - buffer.append( "ESTADO" ); - buffer.append( "" ); - buffer.append( "RELATÓRIO" ); - buffer.append( "" ); - buffer.append( "PRÓXIMA AUDITORIA" ); - buffer.append( "
" ); - buffer.append( "" + data[ l ][ c ] + "" ); - buffer.append( "
" ); - resultadoText.setText( buffer.toString() ); - } - catch( Exception ex ) - { - resultadoText.setText( "ERRO a carregar dados!" ); - ex.printStackTrace(); - } - } - - public void exportar() - { - FileDialog dialog = new FileDialog( this, "Ficheiro de destino", FileDialog.SAVE ); - dialog.setDirectory( System.getProperty( "user.home" ) ); - dialog.setVisible( true ); - String fileName; - String dirName; - fileName = dialog.getFile(); - dirName = dialog.getDirectory(); - if( fileName != null ) - { - int index = fileName.indexOf( '.' ); - if( index == -1 ) - { - fileName += ".html"; - } - if( index == fileName.length() - 1 ) - { - fileName += "html"; - } - String fullName = dirName + fileName; - String text = resultadoText.getText(); - String title = "S.I.P.R.P. - Sociedade Ibérica de Prevenção de Riscos Profissionais"; - String style = ""; - text = text.replace( "", "\n\t\t" + title + "\n" + style ); - text = text.replace( "", "
" ); - text = text.replace( "", "
" ); -// System.out.println( text ); - try - { - FileWriter writer = new FileWriter( new File( fullName ) ); - writer.write( text ); - writer.close(); - } - catch( IOException ex ) - { - DialogException.showException( ex ); - return; - } - } - } -} \ No newline at end of file diff --git a/trunk/SIPRPSoft/src/siprp/ficha/EmpresaPanel.java b/trunk/SIPRPSoft/src/siprp/ficha/EmpresaPanel.java deleted file mode 100644 index f4e6c2c5..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/EmpresaPanel.java +++ /dev/null @@ -1,505 +0,0 @@ -/* - * EmpresaPanel.java - * - * Created on 29 de Marco de 2004, 11:53 - */ - -package siprp.ficha; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Map; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import shst.SHSTPropertiesConstants; -import shst.data.outer.EmpresasData; -import shst.data.outer.EstabelecimentosData; -import siprp.FichaDataProvider; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.data.MappableObject; -import com.evolute.utils.dataui.ComponentController; -import com.evolute.utils.dataui.ComponentsHashtable; -import com.evolute.utils.dataui.ControllableComponent; -import com.evolute.utils.ui.DialogException; -import com.evolute.utils.ui.panel.RadioButtonFixedPanel; -import com.evolute.utils.ui.panel.RadioButtonPanel; -import com.evolute.utils.ui.text.CopyPasteHandler; - -/** - * - * @author fpalma - */ -public class EmpresaPanel extends JPanel - implements ControllableComponent< Object > -{ - private ProviderInterface JDO; - private JTextField designacaoSocialText; - private JTextField estabelecimentoText; - private JTextField localidadeText; - private RadioButtonFixedPanel servicoSaudeTipoPanel; - private JTextField designacaoServicoSaudeText; - private JButton defaultServicoSaudeButton; - private RadioButtonFixedPanel servicoHigieneTipoPanel; - private JTextField designacaoText; - private JButton defaultServicoHigieneButton; - - private FichaDataProvider provider; - private ComponentsHashtable empresaComponents; - private ComponentsHashtable estabelecimentoComponents; - - private EstabelecimentosData estabelecimento; - private EmpresasData empresa; - - - /** Creates a new instance of EmpresaPanel */ - public EmpresaPanel() - throws Exception - { - provider = (FichaDataProvider)FichaDataProvider.getProvider(); - JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - setupComponents(); - setupComponentsHashtable(); - } - - private void setupComponents() - { - setBorder( BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(), - "Empresa/Entidade" ) ); - - JLabel designacaoSocialLabel = new JLabel( "Designa\u00e7\u00e3o Social" ); - designacaoSocialText = new JTextField(); -// JPanel servicoSaudePanel = new JPanel(); - JLabel estabelecimentoLabel = new JLabel( "Estabelecimento" ); - estabelecimentoText = new JTextField(); - JLabel localidadeLabel = new JLabel( "Localidade" ); - localidadeText = new JTextField(); - JLabel servicoSaudeLabel = new JLabel( "Servi\u00e7o de Sa\u00fade: Tipo" ); - servicoSaudeTipoPanel = - new RadioButtonFixedPanel( new IDObject[]{ new MappableObject( new Integer(1), "Interno" ), - new MappableObject( new Integer(2), "Interempresas" ), - new MappableObject( new Integer(3), "Externo" ), - new MappableObject( new Integer(4), "Servi\u00e7o Nacional de Sa\u00fade" ) }, - 1, 4, RadioButtonPanel.ORIENTATION_HORIZONTAL, false ); - JLabel designacaoServicoSaudeLabel = new JLabel( "Designa\u00e7\u00e3o" ); - designacaoServicoSaudeText = new JTextField(); - defaultServicoSaudeButton = new JButton("-"); - defaultServicoSaudeButton.addActionListener( new ActionListener(){ - public void actionPerformed( ActionEvent e ) - { - designacaoServicoSaudeText.setText( (String) Singleton.getInstance( SHSTPropertiesConstants.COMPANY_NAME ) ); - } - } ); - - JLabel servicoHigieneLabel = new JLabel( "Servi\u00e7o de Higiene e Seguran\u00e7a: Tipo" ); - servicoHigieneTipoPanel = - new RadioButtonFixedPanel( new IDObject[]{ new MappableObject( new Integer(1), "Interno" ), - new MappableObject( new Integer(2), "Interempresas" ), - new MappableObject( new Integer(3), "Externo" ), - new MappableObject( new Integer(4), "Outro" ) }, - 1, 4, RadioButtonPanel.ORIENTATION_HORIZONTAL, false ); - JLabel designacaoLabel = new JLabel( "Designa\u00e7\u00e3o" ); - designacaoText = new JTextField(); - defaultServicoHigieneButton = new JButton("-"); - defaultServicoHigieneButton.addActionListener( new ActionListener(){ - public void actionPerformed( ActionEvent e ) - { - designacaoText.setText( (String) Singleton.getInstance( SHSTPropertiesConstants.COMPANY_NAME ) ); - } - } ); - - GridBagLayout gridbag = new GridBagLayout(); - setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 0, 1, 0, 1 ); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 1; - constraints.weightx = 0; - constraints.gridheight = 1; - constraints.weighty = 0; - - gridbag.setConstraints( designacaoSocialLabel, constraints ); - add( designacaoSocialLabel ); - - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( designacaoSocialText, constraints ); - add( designacaoSocialText ); - - constraints.weightx = 0; - constraints.gridwidth = 1; - gridbag.setConstraints( estabelecimentoLabel, constraints ); - add( estabelecimentoLabel ); - - constraints.weightx = 0.6; - constraints.gridwidth = 3; - gridbag.setConstraints( estabelecimentoText, constraints ); - add( estabelecimentoText ); - - constraints.weightx = 0; - constraints.gridwidth = 1; - gridbag.setConstraints( localidadeLabel, constraints ); - add( localidadeLabel ); - - constraints.weightx = 0.4; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( localidadeText, constraints ); - add( localidadeText ); - - constraints.weightx = 0; - constraints.gridwidth = 2; - gridbag.setConstraints( servicoSaudeLabel, constraints ); - add( servicoSaudeLabel ); - - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( servicoSaudeTipoPanel, constraints ); - add( servicoSaudeTipoPanel ); - - constraints.weightx = 0; - constraints.gridwidth = 1; - gridbag.setConstraints( designacaoServicoSaudeLabel, constraints ); - add( designacaoServicoSaudeLabel ); - - JPanel designacaoServicoSaudePanel = new JPanel(); - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( designacaoServicoSaudePanel, constraints ); - add( designacaoServicoSaudePanel ); - - constraints.weightx = 0; - constraints.gridwidth = 3; - gridbag.setConstraints( servicoHigieneLabel, constraints ); - add( servicoHigieneLabel ); - - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( servicoHigieneTipoPanel, constraints ); - add( servicoHigieneTipoPanel ); - - constraints.gridwidth = 1; - constraints.weightx = 0; - constraints.weighty = 1; - constraints.gridheight = GridBagConstraints.REMAINDER; - gridbag.setConstraints( designacaoLabel, constraints ); - add( designacaoLabel ); - - JPanel designacaoServicoHigienePanel = new JPanel(); - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( designacaoServicoHigienePanel, constraints ); - add( designacaoServicoHigienePanel ); - - gridbag = new GridBagLayout(); - designacaoServicoSaudePanel.setLayout( gridbag ); - constraints.insets = new Insets( 0, 0, 0, 0 ); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 1; - constraints.weightx = 1; - constraints.weighty = 1; - constraints.gridheight = GridBagConstraints.REMAINDER; - - gridbag.setConstraints( designacaoServicoSaudeText, constraints ); - designacaoServicoSaudePanel.add( designacaoServicoSaudeText ); - - constraints.weightx = 0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( defaultServicoSaudeButton, constraints ); - designacaoServicoSaudePanel.add( defaultServicoSaudeButton ); - - - gridbag = new GridBagLayout(); - designacaoServicoHigienePanel.setLayout( gridbag ); - constraints.insets = new Insets( 0, 0, 0, 0 ); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridwidth = 1; - constraints.weightx = 1; - constraints.weighty = 1; - constraints.gridheight = GridBagConstraints.REMAINDER; - - gridbag.setConstraints( designacaoText, constraints ); - designacaoServicoHigienePanel.add( designacaoText ); - - constraints.weightx = 0; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( defaultServicoHigieneButton, constraints ); - designacaoServicoHigienePanel.add( defaultServicoHigieneButton ); - - new CopyPasteHandler( designacaoSocialText ); - new CopyPasteHandler( estabelecimentoText ); - new CopyPasteHandler( localidadeText ); - new CopyPasteHandler( designacaoServicoSaudeText ); - new CopyPasteHandler( designacaoText ); - } - - private void setupComponentsHashtable() - { - empresaComponents = new ComponentsHashtable(); - empresaComponents.putComponent( EmpresasData.DESIGNACAO_SOCIAL, designacaoSocialText ); - empresaComponents.putComponent( EmpresasData.SERVICO_SAUDE_TIPO, servicoSaudeTipoPanel ); - empresaComponents.putComponent( EmpresasData.SERVICO_SAUDE_DESIGNACAO, designacaoServicoSaudeText ); - empresaComponents.putComponent( EmpresasData.SERVICO_HIGIENE_TIPO, servicoHigieneTipoPanel ); - empresaComponents.putComponent( EmpresasData.SERVICO_HIGIENE_DESIGNACAO, designacaoText ); - - empresaComponents.putDummy( EmpresasData.MORADA ); - empresaComponents.putDummy( EmpresasData.CODIGO_POSTAL ); - empresaComponents.putDummy( EmpresasData.LOCALIDADE ); - empresaComponents.putDummy( EmpresasData.DISTRITO ); - empresaComponents.putDummy( EmpresasData.CONCELHO ); - empresaComponents.putDummy( EmpresasData.DATA_PROPOSTA ); - empresaComponents.putDummy( EmpresasData.DATA_ACEITACAO ); - empresaComponents.putDummy( EmpresasData.PERFIL_1 ); - empresaComponents.putDummy( EmpresasData.PERFIL_2 ); - empresaComponents.putDummy( EmpresasData.DATA_ENVIO_CONTRATO ); - empresaComponents.putDummy( EmpresasData.DATA_RECEPCAO_CONTRATO ); - empresaComponents.putDummy( EmpresasData.DATA_ENVIO_IDICT ); - empresaComponents.putDummy( EmpresasData.DATA_RELATORIO_ANUAL ); - empresaComponents.putDummy( EmpresasData.CODIGO_1 ); - empresaComponents.putDummy( EmpresasData.CODIGO_2 ); - empresaComponents.putDummy( EmpresasData.CODIGO_3 ); - empresaComponents.putDummy( EmpresasData.CAE ); - empresaComponents.putDummy( EmpresasData.ACTIVIDADE ); - empresaComponents.putDummy( EmpresasData.CONTRIBUINTE ); - empresaComponents.putDummy( EmpresasData.SEGURANCA_SOCIAL ); - empresaComponents.putDummy( EmpresasData.CONTACTO_1 ); - empresaComponents.putDummy( EmpresasData.CONTACTO_2 ); - empresaComponents.putDummy( EmpresasData.SERVICOS ); -// empresaComponents.putDummy( EmpresasData.PRECO_HIGIENE ); -// empresaComponents.putDummy( EmpresasData.PRECO_MEDICINA ); - empresaComponents.putDummy( EmpresasData.PERIODICIDADE ); - empresaComponents.putDummy( EmpresasData.DESIGNACAO_SOCIAL_PLAIN ); - empresaComponents.putDummy( EmpresasData.DATA_CANCELAMENTO ); - empresaComponents.putDummy( EmpresasData.A_CONSULTAS ); - empresaComponents.putDummy( EmpresasData.A_EXAMES ); - empresaComponents.putDummy( EmpresasData.B_CONSULTAS ); - empresaComponents.putDummy( EmpresasData.B_EXAMES ); - empresaComponents.putDummy( EmpresasData.INICIO_CONTRATO ); - empresaComponents.putDummy( EmpresasData.DURACAO ); - - estabelecimentoComponents = new ComponentsHashtable(); - estabelecimentoComponents.putComponent( EstabelecimentosData.NOME, estabelecimentoText ); - estabelecimentoComponents.putComponent( EstabelecimentosData.LOCALIDADE, localidadeText ); - estabelecimentoComponents.putDummy( EstabelecimentosData.MORADA ); - estabelecimentoComponents.putDummy( EstabelecimentosData.CODIGO_POSTAL ); - estabelecimentoComponents.putDummy( EstabelecimentosData.CONTACTO_ID ); - estabelecimentoComponents.putDummy( EstabelecimentosData.HISTORICO ); - estabelecimentoComponents.putDummy( EstabelecimentosData.EMPRESA_ID ); - estabelecimentoComponents.putDummy( EstabelecimentosData.NOME_PLAIN ); - -// components.putComponent( FichaDataProvider.T_EMPRESAS + "." + FichaDataProvider.DESIGNACAO_SOCIAL, designacaoSocialText ); -// components.put( FichaDataProvider.T_EMPRESAS + "." + FichaDataProvider.SERVICO_SAUDE_TIPO, servicoSaudeTipoPanel ); -// components.putComponent( FichaDataProvider.T_EMPRESAS + "." + FichaDataProvider.SERVICO_SAUDE_DESIGNACAO, designacaoServicoSaudeText ); -// components.put( FichaDataProvider.T_EMPRESAS + "." + FichaDataProvider.SERVICO_HIGIENE_TIPO, servicoHigieneTipoPanel ); -// components.putComponent( FichaDataProvider.T_EMPRESAS + "." + FichaDataProvider.SERVICO_HIGIENE_DESIGNACAO, designacaoText ); -// -// components.putComponent( FichaDataProvider.T_ESTABELECIMENTOS + "." + FichaDataProvider.NOME, estabelecimentoText ); -// components.putComponent( FichaDataProvider.T_ESTABELECIMENTOS + "." + FichaDataProvider.LOCALIDADE, localidadeText ); -// -// components.putDummy( FichaDataProvider.T_EMPRESAS + "." + FichaDataProvider.INACTIVO ); -// components.putDummy( FichaDataProvider.T_ESTABELECIMENTOS + "." + FichaDataProvider.EMPRESA_ID ); -// components.putDummy( FichaDataProvider.T_ESTABELECIMENTOS + "." + FichaDataProvider.INACTIVO ); - } - - public void fill(Object value) - { - clear(); - empresa = null; - estabelecimento = null; - if( value != null ) - { - Integer empresaID = (Integer)((Object[])value)[0]; - Integer estabelecimentoID = (Integer)((Object[])value)[1]; - if( empresaID != null ) - { - try - { - empresa = (EmpresasData)JDO.load( EmpresasData.class, empresaID ); - String names[] = (String[])empresaComponents.keySet().toArray( new String[0] ); - ComponentController.fill( names, empresa.getHashData(), empresaComponents ); - - if( estabelecimentoID != null ) - { - estabelecimento = (EstabelecimentosData)JDO.load( EstabelecimentosData.class, estabelecimentoID ); - names = (String[])estabelecimentoComponents.keySet().toArray( new String[0] ); //estabelecimento.getFieldNames(); - ComponentController.fill( names, estabelecimento.getHashData(), estabelecimentoComponents ); - } - -// DBField fields[] = provider.EMPRESAS.getInsertFields(); -// String empresaFields[] = new String[ fields.length ]; -// Hashtable data = new Hashtable(); -// for( int i = 0; i < empresaFields.length; ++i ) -// { -// empresaFields[ i ] = fields[ i ].FULL_NAME; -// Object fieldValue = empresa.getProperty( empresaFields[ i ] ); -// if( fieldValue != null ) -// { -// data.put( empresaFields[ i ], fieldValue ); -// } -// } -// ComponentController.fill( empresaFields, data, components ); -// if( estabelecimentoID != null ) -// { -// estabelecimento = provider.load( provider.ESTABELECIMENTOS, new DBKey( estabelecimentoID ) ); -// fields = provider.ESTABELECIMENTOS.getInsertFields(); -// String estabelecimentoFields[] = new String[ fields.length ]; -// for( int i = 0; i < estabelecimentoFields.length; ++i ) -// { -// estabelecimentoFields[ i ] = fields[ i ].FULL_NAME; -// Object fieldValue = estabelecimento.getProperty( estabelecimentoFields[ i ] ); -// if( fieldValue != null ) -// { -// data.put( estabelecimentoFields[ i ], fieldValue ); -// } -// } -// ComponentController.fill( estabelecimentoFields, data, components ); -// } - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar os dados da Empresa", true ); - } - } - } - else - { - estabelecimentoText.setText( "Sede" ); - } - } - - public Object save() - { - StringBuffer msg = new StringBuffer(); - boolean hasMsg = false; - try - { - if( estabelecimento == null ) - { -// estabelecimento = provider.createObject( provider.ESTABELECIMENTOS ); - estabelecimento = new EstabelecimentosData(); - } - if( empresa == null ) - { -// empresa = provider.createObject( provider.EMPRESAS ); - empresa = new EmpresasData(); - } -// DBField fields[] = provider.EMPRESAS.getInsertFields(); -// String empresaFields[] = new String[ fields.length ]; -// for( int i = 0; i < empresaFields.length; ++i ) -// { -// empresaFields[ i ] = fields[ i ].FULL_NAME; -// } -// Hashtable hash = new Hashtable(); -// ComponentController.save( empresaFields, hash, components ); -// Enumeration enum = hash.keys(); -// while( enum.hasMoreElements() ) -// { -// String name = ( String )enum.nextElement(); -// empresa.setProperty( name, hash.get( name ) ); -// } -// fields = provider.ESTABELECIMENTOS.getInsertFields(); -// String estabelecimentoFields[] = new String[ fields.length ]; -// for( int i = 0; i < estabelecimentoFields.length; ++i ) -// { -// estabelecimentoFields[ i ] = fields[ i ].FULL_NAME; -// } -// hash = new Hashtable(); -// ComponentController.save( estabelecimentoFields, hash, components ); -// enum = hash.keys(); -// while( enum.hasMoreElements() ) -// { -// String name = ( String )enum.nextElement(); -// estabelecimento.setProperty( name, hash.get( name ) ); -// } - - String names[] = (String[])empresaComponents.keySet().toArray( new String[0] ); -// String names[] = new String[]{ EmpresasData.DESIGNACAO_SOCIAL, EmpresasData.SERVICO_SAUDE_TIPO, -// EmpresasData.SERVICO_SAUDE_DESIGNACAO, EmpresasData.SERVICO_HIGIENE_TIPO, -// EmpresasData.SERVICO_HIGIENE_DESIGNACAO }; - Map hash = empresa.getHashData(); - ComponentController.save( names, hash, empresaComponents ); - empresa.setHashData( hash ); - -// names = estabelecimento.getFieldNames(); - names = (String[])estabelecimentoComponents.keySet().toArray( new String[0] ); - hash = estabelecimento.getHashData(); - ComponentController.save( names, hash, estabelecimentoComponents ); - estabelecimento.setHashData( hash ); - estabelecimento.setToEmpresa_id( empresa ); - -// estabelecimento.setProperty( provider.R_ESTABELECIMENTO_EMPRESA, empresa ); - -// if( ((String)empresa.getProperty( provider.DESIGNACAO_SOCIAL )).trim().length() == 0 ) - if( ((String)empresa.get( EmpresasData.DESIGNACAO_SOCIAL )).trim().length() == 0 ) - { - msg.append( "A empresa tem de ter uma design\u00e7\u00e3o social\n" ); - hasMsg = true; - } - else - { - empresa.set( EmpresasData.DESIGNACAO_SOCIAL_PLAIN, - com.evolute.utils.strings.StringPlainer.convertString( ( String ) - empresa.get( EmpresasData.DESIGNACAO_SOCIAL ) ) ); - } -// if( empresa.getProperty( provider.SERVICO_SAUDE_TIPO ) == null ) - if( empresa.get( EmpresasData.SERVICO_SAUDE_TIPO ) == null ) - { - msg.append( "A empresa tem de ter um tipo de seri\00e7o de sa\u00fade\n" ); - hasMsg = true; - } -// if( empresa.getProperty( provider.SERVICO_HIGIENE_TIPO ) == null ) - if( empresa.get( EmpresasData.SERVICO_HIGIENE_TIPO ) == null ) - { - msg.append( "A empresa tem de ter um tipo de seri\00e7o de higiene\n" ); - hasMsg = true; - } -// if( ((String)estabelecimento.getProperty( provider.NOME )).trim().length() == 0 ) - if( ((String)estabelecimento.get( EstabelecimentosData.NOME )).trim().length() == 0 ) - { - msg.append( "O estabelecimento tem de ter nome\n" ); - hasMsg = true; - } - - } - catch( Exception ex ) - { - ex.printStackTrace(); - return null; - } - if( hasMsg ) - { - throw new ValuesException( msg.toString() ); - } - return estabelecimento; - - } - - public void clear() - { - String names[] = (String[])empresaComponents.keySet().toArray( new String[0] ); - ComponentController.clear( names, empresaComponents ); - names = (String[])estabelecimentoComponents.keySet().toArray( new String[0] ); - ComponentController.clear( names, estabelecimentoComponents ); - estabelecimentoText.setText( "Sede" ); - empresa = null; - estabelecimento = null; - } - - public void setEnabled( boolean enable ) - { - String names[] = (String[])empresaComponents.keySet().toArray( new String[0] ); - ComponentController.setEnabled( names, enable, empresaComponents ); - names = (String[])estabelecimentoComponents.keySet().toArray( new String[0] ); - ComponentController.setEnabled( names, enable, estabelecimentoComponents ); - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/ExamePDF.java b/trunk/SIPRPSoft/src/siprp/ficha/ExamePDF.java deleted file mode 100644 index 56dc759f..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/ExamePDF.java +++ /dev/null @@ -1,524 +0,0 @@ -package siprp.ficha; - -import java.awt.Color; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.HashMap; - -import shst.SHSTPropertiesConstants; - -import com.evolute.utils.Singleton; -import com.lowagie.text.Cell; -import com.lowagie.text.Chunk; -import com.lowagie.text.Document; -import com.lowagie.text.Element; -import com.lowagie.text.Font; -import com.lowagie.text.FontFactory; -import com.lowagie.text.PageSize; -import com.lowagie.text.Paragraph; -import com.lowagie.text.Phrase; -import com.lowagie.text.Table; -import com.lowagie.text.pdf.BaseFont; -import com.lowagie.text.pdf.PdfWriter; - -public class ExamePDF implements FichaAptidaoConstants -{ - private final Font FONT_BOLD = FontFactory.getFont( "Arial", 8, Font.BOLD ); - private final Font FONT_NORMAL = FontFactory.getFont( "Arial", 8, Font.NORMAL ); - private final Font FONT_ZAPFDINGBATS = new Font( Font.ZAPFDINGBATS , 12, Font.NORMAL, new Color( 0, 0, 0 ) ); - - private BaseFont BASE_WINGDINGS; - private Font FONT_WINGDINGS; - -// static -// { -// try -// { -// //BASE_WINGDINGS = BaseFont.createFont("C:\\WINNT\\Fonts\\WINGDING.TTF", BaseFont.CP1252, BaseFont.NOT_EMBEDDED); -// BASE_WINGDINGS = BaseFont.createFont("WingDings", BaseFont.CP1252, BaseFont.EMBEDDED); -// InputStream stream = BaseFont.getResourceStream( "WING", ClassLoader loader) -// BASE_WINGDINGS = BaseFont.createFont("WingDings", BaseFont.CP1252, BaseFont.EMBEDDED, -// true, byte[] ttfAfm, null ); -// FONT_WINGDINGS = new Font(BASE_WINGDINGS, 12); -// } -// catch( Exception ex ) -// { -// FONT_WINGDINGS = FONT_NORMAL; -// System.out.println( "NO FONT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); -// } -// } - - public ExamePDF() - { - FontFactory.registerDirectories(); - String possibleNames[] = new String[]{ "Wingdings", "WingDings", "wingdings", "WINGDINGS" }; - - for( int n = 0; n < 4; n++ ) - { - FONT_WINGDINGS = FontFactory.getFont( possibleNames[ n ] ); - if( FONT_WINGDINGS.getFamilyname().toLowerCase().equals( "wingdings" ) ) - { - break; - } - } - - } - - public static void main( String[] args ) - { - try - { - HashMap ht = new HashMap(); - // designacao_social - // estabelecimentos.nome - // estabelecimentos.localidade - // servico_saude_tipo_interno - // servico_saude_tipo_interempresas - // servico_saude_tipo_externo - // servico_saude_tipo_sns - // servico_saude_designacao - // servico_higiene_tipo_interno - // servico_higiene_tipo_interempresas - // servico_higiene_tipo_externo - // servico_higiene_outro - // servico_higiene_designacao - // trabalhadores.nome - // sexo - // data_nascimento - // nacionalidade - // numero_mecanografico - // data_admissao - // categoria - // local_trabalho - // funcao_proposta - // data_admissao_funcao - // observacoes - // exames.data - // tipo_admissao - // tipo_periodico - // tipo_ocasional - // tipo_apos_doenca - // tipo_apos_acidente - // tipo_pedido_trabalhador - // tipo_pedido_empresa - // tipo_mudanca_funcao - // tipo_trabalho - // tipo_outro - // resultado_apto - // resultado_apto_condicionalmente - // resultado_inapto_temp - // resultado_inapto_def - // outra_funcao_1 - // outra_funcao_2 - // outra_funcao_3 - // outra_funcao_4 - // proximo_exame - // outras_recomendacoes - // medicos.nome - // numero_cedula - - ht.put( TRABALHADORES_NOME, "Trabalhador do com\u00e9rcio" ); - ht.put( SERVICO_SAUDE_DESIGNACAO, "Designacao servico saude" ); - ht.put( SERVICO_SAUDE_TIPO_EXTERNO, "" + Boolean.TRUE ); - ht.put( TIPO_PERIODICO, "" + Boolean.TRUE ); - ht.put( RESULTADO_INAPTO_TEMP, "" + Boolean.TRUE ); - FileOutputStream fos = new FileOutputStream( System.getProperty( "user.home" ) + "\\report.pdf" ); - fos.write( new ExamePDF().createPDF( ht ) ); - fos.close(); - System.out.println( "File saved." ); - Process proc = Runtime.getRuntime().exec( "cmd.exe /c \"" + System.getProperty( "user.home" ) + "\\report.pdf\"" ); - proc.waitFor(); - new File( System.getProperty( "user.home" ) + "\\report.pdf" ).delete(); - System.out.println( "Done." ); - } - catch( Exception e ) - { - e.printStackTrace(); - } - } - - public void print( byte []pdf, String nome ) - throws Exception - { -// new PDFFilePrinter( pdf, false ); - -// if( true ) -// { -// return; -// } - - long time = System.currentTimeMillis(); -// FileOutputStream fos = new FileOutputStream( System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + "report_ficha" + time + ".pdf" ); - FileOutputStream fos = new FileOutputStream( System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + nome + "_" + time + ".pdf" ); - fos.write( pdf ); - fos.close(); - System.out.println( "File saved ( " + nome + "_" + time + " )." ); - Process proc; - if( System.getProperty( "os.name" ).startsWith( "Windows" ) ) - { -//System.out.println( "cmd.exe /c \"" + System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + "report_ficha.pdf\"" ); - proc = Runtime.getRuntime().exec( "cmd.exe /c \"" + System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + nome + "_" + time + ".pdf\"" ); - -// proc = Runtime.getRuntime().exec( new String[]{ System.getProperty( "user.home" ) + "\\open.bat", System.getProperty( "user.home" ) + "\\" + nome + "_" + time + ".pdf" }); - - - proc.waitFor(); - if( !new File( System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + nome + "_" + time + ".pdf" ).delete() ) - { - System.err.println( "File: report_ficha" + time + ".pdf - NOT DELETED" ); - } - } - else - { -//System.out.println( "/usr/bin/open \"" + System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + "report_ficha.pdf\"" ); - try{ - proc = Runtime.getRuntime().exec( new String[]{"/usr/bin/open", "" + System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + nome + "_" + time + ".pdf" } ); - } - catch( Exception ex ) - { - ex.printStackTrace(); - } -// proc = Runtime.getRuntime().exec( "/usr/bin/open \"/Users/Shared/teste.pdf.pdf\"" ); - } - } - - public void printSilent( byte []pdf, String nome, String printerName ) throws InterruptedException, IOException - // throws Exception - { - long time = System.currentTimeMillis(); -// FileOutputStream fos = new FileOutputStream( System.getProperty( "user.home" ) + System.getProperty( "file.separator" ) + "report_ficha" + time + ".pdf" ); - - if( System.getProperty( "os.name" ).startsWith( "Windows" ) ) - { - Process proc; - -// FileOutputStream fos = new FileOutputStream( System.getProperty( "user.home" ) + "\\print_fichas_temp\\" + nome + "_" + time + ".pdf" ); - FileOutputStream fos = new FileOutputStream( "c:\\temp\\" + nome + "_" + time + ".pdf" ); - fos.write( pdf ); - fos.close(); - - System.out.println( "File saved ( " + nome + "_" + time + " )." ); -//System.out.println("cmd /c \"c:\\temp\\acrord32.lnk /t \"c:" + System.getProperty( "file.separator" ) + "temp" + System.getProperty( "file.separator" ) + nome + "_" + time + ".pdf\" \"" + printerName + "\"\""); -// proc = Runtime.getRuntime().exec( new String[]{ System.getProperty( "user.home" ) + "\\print.bat", -// System.getProperty( "user.home" ) + "\\print_fichas_temp\\" + nome + "_" + time + ".pdf", -// printerName }); - proc = Runtime.getRuntime().exec( new String[]{ System.getProperty( "user.home" ) + "\\print.bat", - "c:\\temp\\" + nome + "_" + time + ".pdf", - printerName }); - proc.waitFor(); -// if( !new File( "c:\\temp\\" + nome + "_" + time + ".pdf" ).delete() ) -// { -// System.err.println( "File: " + nome + "_" + ".pdf - NOT DELETED" ); -// } - } - - } - - public void cleanSilentPrint() - throws Exception - { - Process proc; - proc = Runtime.getRuntime().exec( "cmd /c \"del c:\\temp\\*.pdf\"" ); - proc.waitFor(); - } - - public byte[] createPDF( HashMap values ) - { - Document document = new Document(); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - document.setPageSize( PageSize.A4 ); - try { - PdfWriter pdfw = PdfWriter.getInstance( document, bos ); -// try { - - - document.addTitle( "Ficha de Aptid\u00e3o" ); - String acronym = (String) Singleton.getInstance( SHSTPropertiesConstants.COMPANY_ACRONYM ); - document.addAuthor( acronym != null ? acronym: "n/a" ); - document.addCreator( "Evolute" ); - - document.open(); - - Paragraph conteudo = new Paragraph(); - - conteudo.add( new Chunk( "\n\nFICHA DE APTID\u00c3O\n", - FontFactory.getFont( "Arial", 10, Font.BOLD ) ) ); - conteudo.add( new Chunk( "(Portaria n.\u00ba 299/2007, de 16 de Mar\u00e7o)", -// conteudo.add( new Chunk( "(Portaria n\u00ba1031/2002, de 10 de Agosto)", - FontFactory.getFont( "Arial", 7, Font.BOLD ) ) ); - - conteudo.setAlignment( Element.ALIGN_CENTER ); - - document.add( conteudo ); - - Table table = new Table( 1 ); - table.setBorderWidth( 1 ); - table.setPadding( 5 ); - table.setOffset( 0 ); - table.setWidth( 100 ); - - table.addCell( new Phrase( "Empresa/Entidade", FONT_BOLD ) ); - - StringBuilder texto = new StringBuilder(); - Phrase ph = new Phrase( 12f ); - - Cell cell = new Cell(); - texto.append( "DESIGNA\u00c7\u00c3O SOCIAL: " + values.get( DESIGNACAO_SOCIAL ) + "\n" ); - texto.append( "ESTABELECIMENTO: " + values.get( ESTABELECIMENTOS_NOME ) - + " LOCALIDADE: " + values.get( ESTABELECIMENTOS_LOCALIDADE ) + "\n" ); - texto.append( "SERVI\u00c7O DE SA\u00DaDE: Tipo " ); - ph.add( new Chunk( texto.toString(), FONT_NORMAL ) ); - - texto = new StringBuilder( "Interno" ); - ph.add( doCheckedPhrase( texto.toString(), values.get( SERVICO_SAUDE_TIPO_INTERNO ) ) ); - - texto = new StringBuilder( "Interempresas" ); - ph.add( doCheckedPhrase( texto.toString(), values.get( SERVICO_SAUDE_TIPO_INTEREMPRESAS ), true ) ); - - texto = new StringBuilder( "Externo" ); - ph.add( doCheckedPhrase( texto.toString(), values.get( SERVICO_SAUDE_TIPO_EXTERNO ), true ) ); - - texto = new StringBuilder( "Servi\u00e7o Nacional de Sa\u00fade\n" ); - ph.add( doCheckedPhrase( texto.toString(), values.get( SERVICO_SAUDE_TIPO_SNS ), true ) ); - - texto = new StringBuilder(); - - texto.append( "DESIGNA\u00c7\u00c3O: " + values.get( SERVICO_SAUDE_DESIGNACAO ) + "\n" ); - texto.append( "SERVI\u00c7O DE HIGIENE E SEGURAN\u00c7A: Tipo " ); - ph.add( new Chunk( texto.toString(), FONT_NORMAL ) ); - - texto = new StringBuilder( "Interno" ); - ph.add( doCheckedPhrase( texto.toString(), values.get( SERVICO_HIGIENE_TIPO_INTERNO ) ) ); - - texto = new StringBuilder( "Interempresas" ); - ph.add( doCheckedPhrase( texto.toString(), values.get( SERVICO_HIGIENE_TIPO_INTEREMPRESAS ), true ) ); - - texto = new StringBuilder( "Externo" ); - ph.add( doCheckedPhrase( texto.toString(), values.get( SERVICO_HIGIENE_TIPO_EXTERNO ), true ) ); - - texto = new StringBuilder( "Outro\n" ); - ph.add( doCheckedPhrase( texto.toString(), values.get( SERVICO_HIGIENE_TIPO_OUTRO ), true ) ); - - texto = new StringBuilder(); - - texto.append( "DESIGNA\u00c7\u00c3O: " + values.get( SERVICO_HIGIENE_DESIGNACAO ) + "" ); - - ph.add( new Chunk( texto.toString(), FONT_NORMAL ) ); - - cell.addElement( ph ); - table.addCell( cell ); - document.add( table ); - - table = new Table( 1 ); - table.setBorderWidth( 1 ); - table.setPadding( 5 ); - table.setOffset( 0 ); - table.setWidth( 100 ); - - table.addCell( new Phrase( "Trabalhador", - FONT_BOLD ) ); - - texto = new StringBuilder(); - - texto.append( "NOME: " + values.get( TRABALHADORES_NOME ) + "\n" ); - texto.append( "SEXO: " + values.get( SEXO ) + " DATA DE NASCIMENTO: " - + values.get( DATA_NASCIMENTO ) + " NACIONALIDADE: " - + values.get( NACIONALIDADE ) + "\n" ); - texto.append( "N\u00daMERO MECANOGR\u00c1FICO/OUTRO: " + values.get( NUMERO_MECANOGRAFICO ) - + " DATA DE ADMISS\u00c3O: " + values.get( DATA_ADMISSAO ) + "\n" ); - texto.append( "CATEGORIA PROFISSIONAL: " + values.get( CATEGORIA ) - + " LOCAL DE TRABALHO: " + values.get( LOCAL_TRABALHO ) + "\n" ); - texto.append( "FUN\u00c7\u00c3O PROPOSTA: " + values.get( FUNCAO_PROPOSTA ) - + " DATA DE ADMISS\u00c3O NA FUN\u00c7\u00c3O: " - + values.get( DATA_ADMISSAO_FUNCAO ) + "" ); - - table.addCell( new Phrase( 12f, texto.toString(), FONT_NORMAL ) ); - document.add( table ); - - table = new Table( 1 ); - table.setBorderWidth( 1 ); - table.setOffset( 0 ); - table.setPadding( 5 ); - table.setWidth( 100 ); - - table.addCell( new Phrase( "Observa\u00e7\u00f5es", - FONT_BOLD ) ); - - texto = new StringBuilder(); - texto.append( values.get( OBSERVACOES ) ); - - table.addCell( new Phrase( 12f, texto.toString(), FONT_NORMAL ) ); - document.add( table ); - - table = new Table( 2 ); - table.setBorderWidth( 1 ); - table.setOffset( 0 ); - table.setPadding( 5 ); - table.setWidth( 100 ); - - cell = new Cell( new Phrase( "Exame M\u00e9dico", - FONT_BOLD ) ); - - cell.setColspan( 2 ); - table.addCell( cell ); - - texto = new StringBuilder(); - ph = new Phrase( 12f ); - texto.append( "DATA DO EXAME: " + values.get( EXAMES_DATA ) + "\n" ); - texto.append( "TIPO\n" ); - ph.add( new Chunk( texto.toString(), FONT_NORMAL ) ); - - ph.add( doCheckedPhrase( "ADMISS\u00c3O\n", values.get( TIPO_ADMISSAO ) ) ); - - ph.add( doCheckedPhrase( "PERI\u00d3DICO\n", values.get( TIPO_PERIODICO ) ) ); - - ph.add( doCheckedPhrase( "OCASIONAL\n", values.get( TIPO_OCASIONAL ) ) ); - - ph.add( doCheckedPhrase( "AP\u00d3S DOEN\u00c7A\n", values.get( TIPO_APOS_DOENCA ), true ) ); - - ph.add( doCheckedPhrase( "AP\u00d3S ACIDENTE\n", values.get( TIPO_APOS_ACIDENTE ), true ) ); - - ph.add( doCheckedPhrase( "A PEDIDO DO TRABALHADOR\n", values.get( TIPO_PEDIDO_TRABALHADOR ), true ) ); - - ph.add( doCheckedPhrase( "A PEDIDO DO SERVI\u00c7O\n", values.get( TIPO_PEDIDO_EMPRESA ), true ) ); - - ph.add( doCheckedPhrase( "POR MUDAN\u00c7A DE FUN\u00c7\u00c3O\n", values.get( TIPO_MUDANCA_FUNCAO ), true ) ); - - ph.add( doCheckedPhrase( "POR ALTERA\u00c7\u00c3O DAS CONDI\u00c7\u00d5ES DE TRABALHO\n", values.get( TIPO_TRABALHO ), true ) ); - - ph.add( doCheckedPhrase( "OUTRO\n", values.get( TIPO_OUTRO ), true ) ); - - texto = new StringBuilder(); - texto.append( " ESPECIFIQUE: " + values.get( TIPO_OUTRO_TEXTO ) ); - - ph.add( new Chunk( texto.toString(), FONT_NORMAL ) ); - - table.addCell( ph ); - - ph = new Phrase( 12f ); - ph.add( new Chunk( "RESULTADO\n", FONT_NORMAL ) ); - ph.add( doCheckedPhrase( "APTO\n", values.get( RESULTADO_APTO ) ) ); - - ph.add( doCheckedPhrase( "APTO CONDICIONALMENTE\n\n", values.get( RESULTADO_APTO_CONDICIONALMENTE ) ) ); - - ph.add( doCheckedPhrase( "INAPTO TEMPORARIAMENTE\n", values.get( RESULTADO_INAPTO_TEMP ) ) ); - - ph.add( doCheckedPhrase( "INAPTO DEFINITIVAMENTE\n\n", values.get( RESULTADO_INAPTO_DEF ) ) ); - - texto = new StringBuilder(); - texto.append( "OUTRAS FUN\u00c7\u00d5ES QUE PODE DESEMPENHAR\n" ); - texto.append( " 1 " + values.get( OUTRA_FUNCAO_1 ) + "\n" ); - texto.append( " 2 " + values.get( OUTRA_FUNCAO_2 ) + "\n" ); - texto.append( " 3 " + values.get( OUTRA_FUNCAO_3 ) + "\n" ); - texto.append( " 4 " + values.get( OUTRA_FUNCAO_4 ) + "\n" ); - ph.add( new Chunk( texto.toString(), FONT_NORMAL ) ); - table.addCell( ph ); - - document.add( table ); - - table = new Table( 1 ); - table.setBorderWidth( 1 ); - table.setOffset( 0 ); - table.setPadding( 5 ); - table.setWidth( 100 ); - - table.addCell( new Phrase( "Outras Recomenda\u00e7\u00f5es", - FONT_BOLD ) ); - - texto = new StringBuilder(); - if( ( (Boolean) Singleton.getInstance( SHSTPropertiesConstants.FICHA_MARCA_EXAMES ) ).booleanValue() ) - { - System.out.println( "ficha marca exames" ); - texto.append( "PR\u00d3XIMO EXAME: " + values.get( PROXIMO_EXAME ) + "\n" ); - } - texto.append( "" + values.get( OUTRAS_RECOMENDACOES ) + "" ); - - table.addCell( new Phrase( 12f, texto.toString(), FONT_NORMAL ) ); - document.add( table ); - - - table = new Table( 1 ); - table.setBorderWidth( 1 ); - table.setOffset( 0 ); - table.setPadding( 5 ); - table.setWidth( 100 ); - - texto = new StringBuilder(); - - texto.append( "M\u00c9DICO DO TRABALHO: " - + values.get( MEDICOS_NOME ) + " C.P. " + values.get( NUMERO_CEDULA ) + "\n" ); - texto.append( "ASSINATURA _____________________________________________________________________________________\n\n" ); - texto.append( "TOMEI CONHECIMENTO ___________________________________________________________ DATA:____/____/________\n" ); - texto.append( " O RESPONS\u00c1VEL DOS RECURSOS HUMANOS" ); - - table.addCell( new Phrase( 18f, texto.toString(), FONT_NORMAL ) ); - document.add( table ); - -// } -// catch( Exception e ) { -// e.printStackTrace(); -// return null; -// } - - document.close(); -// PdfWriter pdfw = PdfWriter.getInstance( document, bos ); -// PdfContentByte pdfcb = new PdfContentByte( pdfw ); -// -// PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); -// // Step 2: Obtain a print job. -// PrinterJob pj = PrinterJob.getPrinterJob(); -// Graphics2D graphics = pdfcb.createPrinterGraphics( 100.0F, 100.0F, pj ); -// // Step 3: Find print services. -// PrintService []services = PrinterJob.lookupPrintServices(); -// PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); -// if(services.length > 0) -// { -// System.out.println("selected printer: " + services[0]); -// try -// { -// PrintService service = defaultService; -//// PrintService service = ServiceUI.printDialog(null, 200, 200, -//// services, defaultService, DocFlavor.SERVICE_FORMATTED.PAGEABLE, aset); -// pj.setPrintService(service); -// // Step 2: Pass the settings to a page dialog and print dialog. -//// pj.pageDialog(aset); -//// if (pj.printDialog(aset)) -//// { -// // Step 4: Update the settings made by the user in the dialogs. -// // Step 5: Pass the final settings into the print request. -// pj.print(aset); -//// } -// } -// catch (PrinterException pe ) { -// System.err.println(pe); -// } -// } - - } - catch( Exception e ) { - e.printStackTrace(); - return null; - } - return bos.toByteArray(); - } - - private Phrase doCheckedPhrase( String text, String phrase, boolean indent ) - { - boolean checked = CHECKED.equals( phrase ); - Phrase p = new Phrase( 12f ); - //p.add( new Chunk( ( indent ? " " : "" ) + ( char )( checked? 110: 111) + " ", FONT_ZAPFDINGBATS ) ); - //System.out.println( "FAMILY: " + FONT_WINGDINGS.getFamilyname() ); - p.add( new Chunk( ( indent ? " " : "" ) + ( char )( checked? 0xfe: 0xa8), FONT_WINGDINGS ) ); -// p.add( new Chunk( ( indent ? " " : "" ) + ( char )( checked? 'X': '_'), FONT_WINGDINGS ) ); - p.add( new Chunk( text, FONT_NORMAL ) ); - return p; - } - - private Phrase doCheckedPhrase( String text, String phrase ) - { - return doCheckedPhrase( text, phrase, false ); - } -} \ No newline at end of file diff --git a/trunk/SIPRPSoft/src/siprp/ficha/ExamePanel.java b/trunk/SIPRPSoft/src/siprp/ficha/ExamePanel.java deleted file mode 100644 index ae8ff047..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/ExamePanel.java +++ /dev/null @@ -1,557 +0,0 @@ -/* - * ExamePanel.java - * - * Created on 29 de Marco de 2004, 11:57 - */ - -package siprp.ficha; - -import java.awt.BorderLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.util.Calendar; -import java.util.Date; -import java.util.Vector; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.ListSelectionListener; - -import shst.MedicinaConstants; -import shst.SHSTPropertiesConstants; -import shst.data.Marcacao; -import shst.data.outer.ExamesData; -import shst.data.outer.MarcacoesTrabalhadorData; -import siprp.FichaDataProvider; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.data.MappableObject; -import com.evolute.utils.dataui.ComponentController; -import com.evolute.utils.dataui.ComponentsHashtable; -import com.evolute.utils.dataui.ControllableComponent; -import com.evolute.utils.documents.MaximumLengthDocument; -import com.evolute.utils.ui.button.BetterButtonGroup; -import com.evolute.utils.ui.calendar.JCalendarPanel; -import com.evolute.utils.ui.panel.RadioButtonFixedPanel; -import com.evolute.utils.ui.text.CopyPasteHandler; -/** - * - * @author fpalma - */ -public class ExamePanel extends JPanel - implements ChangeListener, ControllableComponent, ListSelectionListener -{ - - private static final long serialVersionUID = 1L; - - private ProviderInterface JDO; - - private JCalendarPanel dataExamePanel; - private BetterButtonGroup tipoGroup; - private JRadioButton admissaoRadio; - private JRadioButton periodicoRadio; - private JRadioButton ocasionalRadio; -// private JRadioButton outroRadio; - private RadioButtonFixedPanel ocasionalPanel; - private JTextField especificarText; - private RadioButtonFixedPanel tipoProximoPanel; - private JCalendarPanel proximoExamePanel; - private RadioButtonFixedPanel resultadoPanel; - private JTextField outrasFuncoesTexts[]; - private JTextArea recomendacoesText; - - private FichaDataProvider provider; - private ComponentsHashtable components; - - private Integer trabalhadorID; - private MarcacoesTrabalhadorData marcacao; - - /** Creates a new instance of ExamePanel */ - public ExamePanel() - throws Exception - { - provider = (FichaDataProvider)FichaDataProvider.getProvider(); - JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - setupComponents(); - setupComponentsHashtable(); - } - - private void setupComponents() - { - setBorder( BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(), - "Exame M\u00e9dico" ) ); - - JPanel leftPanel = new JPanel(); - JPanel rightPanel = new JPanel(); - JPanel dataExameOuterPanel = new JPanel(); - JLabel dataExameLabel = new JLabel( "Data do Exame" ); - dataExamePanel = new JCalendarPanel( null ); - JPanel tipoPanel = new JPanel(); - tipoPanel.setBorder( BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(), "Tipo" ) ); - tipoGroup = new BetterButtonGroup( false ); - admissaoRadio = new JRadioButton( "Admiss\u00e3o" ); - tipoGroup.add( admissaoRadio ); - periodicoRadio = new JRadioButton( "Peri\u00f3dico" ); - tipoGroup.add( periodicoRadio ); - ocasionalRadio = new JRadioButton( "Ocasional" ); - tipoGroup.add( ocasionalRadio ); - ocasionalRadio.addChangeListener( this ); -// outroRadio = new JRadioButton( "Outro" ); -// tipoGroup.add( outroRadio ); -// outroRadio.addChangeListener( this ); - ocasionalPanel = new RadioButtonFixedPanel( - new IDObject[]{ new MappableObject( new Integer( 1 ), "Ap\u00f3s doen\u00e7a" ), - new MappableObject( new Integer( 2 ), "Ap\u00f3s acidente" ), - new MappableObject( new Integer( 3 ), "A pedido do trabalhador" ), - new MappableObject( new Integer( 4 ), "A pedido do servi\u00e7o" ), - new MappableObject( new Integer( 5 ), "Por mudan\u00e7a de fun\u00e7\u00e3o" ), - new MappableObject( new Integer( 6 ), "Por altera\u00e7\u00e3o das condi\u00e7\u00f5es de trabalho" ), - new MappableObject( new Integer( 10 ), "Outro" ) }, - false ); - ocasionalPanel.addListSelectionListener( this ); - ocasionalPanel.setEnabled( false ); - especificarText = new JTextField(); - especificarText.setEnabled( false ); - JPanel proximoExameOuterPanel = new JPanel(); - proximoExameOuterPanel.setBorder( BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(), "Pr\u00f3ximo Exame" ) ); - proximoExamePanel = new JCalendarPanel( null ); - tipoProximoPanel = new RadioButtonFixedPanel( - new IDObject[]{ new MappableObject( new Integer( 2 ), "Peri\u00f3dico" ), - new MappableObject( new Integer( 3 ), "Ocasional" ) }, - RadioButtonFixedPanel.ORIENTATION_HORIZONTAL, 1, 2, false ); -// JLabel proximoExameLabel = new JLabel( "Pr\u00f3ximo Exame" ); - - JPanel resultadoOuterPanel = new JPanel(); - resultadoOuterPanel.setBorder( BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(), "Resultado" ) ); - resultadoPanel = new RadioButtonFixedPanel( - new IDObject[]{ new MappableObject( new Integer( 1 ), "Apto" ), - new MappableObject( new Integer( 2 ), "Apto condicionalmente" ), - new MappableObject( new Integer( 3 ), "Inapto temporariamente" ), - new MappableObject( new Integer( 4 ), "Inapto definitivamente" ) }, - false ); - JLabel outrasFuncoesLabel = new JLabel( "Outras fun\u00e7\u00f5es que pode desempenhar", JLabel.CENTER ); - JPanel outrasFuncoesPanel = new JPanel(); - JLabel outrasFuncoesLabels[] = new JLabel[ 4 ]; - outrasFuncoesTexts = new JTextField[ 4 ]; - for( int n = 0; n < 4; n++ ) - { - outrasFuncoesLabels[ n ] = new JLabel( "" + ( n + 1 ) ); - outrasFuncoesTexts[ n ] = new JTextField(); - } - JScrollPane recomendacoesScp = new JScrollPane(); - recomendacoesScp.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); - recomendacoesScp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - recomendacoesText = new JTextArea(); - recomendacoesText.setLineWrap( true ); - recomendacoesText.setWrapStyleWord( true ); - recomendacoesText.setDocument( new MaximumLengthDocument( 300 ) ); - recomendacoesScp.setViewportView( recomendacoesText ); - - setLayout( new GridLayout( 1, 2 ) ); - add( leftPanel ); - add( rightPanel ); - - leftPanel.setLayout( new BorderLayout() ); - - dataExameOuterPanel.setLayout( new BorderLayout() ); - dataExameOuterPanel.add( dataExameLabel, BorderLayout.WEST ); - dataExameOuterPanel.add( dataExamePanel, BorderLayout.CENTER ); - leftPanel.add( dataExameOuterPanel, BorderLayout.NORTH ); - leftPanel.add( tipoPanel, BorderLayout.CENTER ); - proximoExameOuterPanel.setLayout( new BorderLayout() ); -// proximoExameOuterPanel.add( proximoExameLabel, BorderLayout.WEST ); - proximoExameOuterPanel.add( proximoExamePanel, BorderLayout.CENTER ); - proximoExameOuterPanel.add( tipoProximoPanel, BorderLayout.SOUTH ); - if( ( ( Boolean ) Singleton.getInstance( SHSTPropertiesConstants.FICHA_MARCA_EXAMES ) ).booleanValue() ) - { - leftPanel.add( proximoExameOuterPanel, BorderLayout.SOUTH ); - } - - GridBagLayout gridbag = new GridBagLayout(); - tipoPanel.setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 0, 1, 0, 1 ); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - - gridbag.setConstraints( admissaoRadio, constraints ); - tipoPanel.add( admissaoRadio ); - - gridbag.setConstraints( periodicoRadio, constraints ); - tipoPanel.add( periodicoRadio ); - - gridbag.setConstraints( ocasionalRadio, constraints ); - tipoPanel.add( ocasionalRadio ); - - constraints.weightx = 0.1; - constraints.gridwidth = 1; - JPanel pad = new JPanel(); - gridbag.setConstraints( pad, constraints ); - tipoPanel.add( pad ); - - constraints.weightx = 0.9; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( ocasionalPanel, constraints ); - tipoPanel.add( ocasionalPanel ); - -// constraints.weightx = 0; -// constraints.gridwidth = 1; -// gridbag.setConstraints( outroRadio, constraints ); -// tipoPanel.add( outroRadio ); - - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( especificarText, constraints ); - tipoPanel.add( especificarText ); - - - gridbag = new GridBagLayout(); - rightPanel.setLayout( gridbag ); - constraints.fill = GridBagConstraints.BOTH; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = 1; - constraints.weighty = 0; - - gridbag.setConstraints( resultadoOuterPanel, constraints ); - rightPanel.add( resultadoOuterPanel ); - - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - //constraints.gridheight = GridBagConstraints.REMAINDER; - constraints.weighty = 1; -// JPanel recomendacoesOuterPanel = new JPanel(); -// recomendacoesOuterPanel.setLayout( new GridLayout( 1, 1 ) ); -// recomendacoesOuterPanel.add( recomendacoesScp ); - JPanel recomendacoesPanel = new JPanel( new BorderLayout() ); - gridbag.setConstraints( recomendacoesPanel, constraints ); - recomendacoesPanel.add( recomendacoesScp, BorderLayout.CENTER ); - recomendacoesPanel.setBorder( BorderFactory.createTitledBorder( "Outras recomenda\u00e7\u00f5es" ) ); - rightPanel.add( recomendacoesPanel ); - - gridbag = new GridBagLayout(); - resultadoOuterPanel.setLayout( gridbag ); - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = 1; - constraints.weighty = 0; - - gridbag.setConstraints( resultadoPanel, constraints ); - resultadoOuterPanel.add( resultadoPanel ); - - gridbag.setConstraints( outrasFuncoesLabel, constraints ); - resultadoOuterPanel.add( outrasFuncoesLabel ); - - gridbag.setConstraints( outrasFuncoesPanel, constraints ); - resultadoOuterPanel.add( outrasFuncoesPanel ); - - for( int n = 0; n < outrasFuncoesTexts.length; n++ ) - { - constraints.weightx = 0.1; - constraints.gridwidth = 1; - pad = new JPanel(); - gridbag.setConstraints( pad, constraints ); - resultadoOuterPanel.add( pad ); - - constraints.weightx = 0; - gridbag.setConstraints( outrasFuncoesLabels[ n ], constraints ); - resultadoOuterPanel.add( outrasFuncoesLabels[ n ] ); - - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( outrasFuncoesTexts[ n ], constraints ); - resultadoOuterPanel.add( outrasFuncoesTexts[ n ] ); - new CopyPasteHandler( outrasFuncoesTexts[ n ] ); - } - - new CopyPasteHandler( especificarText ); - new CopyPasteHandler( recomendacoesText ); - } - - private void setupComponentsHashtable() - { - components = new ComponentsHashtable(); - components.putDummy( ExamesData.TIPO ); - components.putComponent( ExamesData.DATA, dataExamePanel ); - components.putComponent( ExamesData.OCASIONAL, ocasionalPanel ); - components.putComponent( ExamesData.OUTRO_TIPO, especificarText ); - components.putComponent( ExamesData.PROXIMO_EXAME, proximoExamePanel ); - components.putComponent( ExamesData.RESULTADO, resultadoPanel ); - components.putComponent( ExamesData.OUTRA_FUNCAO_1, outrasFuncoesTexts[ 0 ] ); - components.putComponent( ExamesData.OUTRA_FUNCAO_2, outrasFuncoesTexts[ 1 ] ); - components.putComponent( ExamesData.OUTRA_FUNCAO_3, outrasFuncoesTexts[ 2 ] ); - components.putComponent( ExamesData.OUTRA_FUNCAO_4, outrasFuncoesTexts[ 3 ] ); - components.putComponent( ExamesData.OUTRAS_RECOMENDACOES, recomendacoesText ); - components.putDummy( ExamesData.INACTIVO ); - components.putDummy( ExamesData.TRABALHADOR_ID ); - components.putDummy( ExamesData.MEDICO_ID ); - components.putDummy( ExamesData.PDF ); - components.putDummy( ExamesData.FO ); - } - - public void stateChanged( ChangeEvent e ) - { - if( e.getSource().equals( ocasionalRadio ) ) - { - ocasionalPanel.setEnabled( ocasionalRadio.isSelected() && ocasionalRadio.isEnabled() ) ; - } -// else if( e.getSource().equals( outroRadio ) ) -// { -// especificarText.setEnabled( outroRadio.isSelected() && outroRadio.isEnabled() ); -// } - } - - - public void fill( Object value ) - { - clear(); - trabalhadorID = ( Integer ) value; - if( trabalhadorID == null ) - { - return; - } - try - { - Integer marcacaoID = provider.getMarcacaoIDByTrabalhador( trabalhadorID ); - - if( marcacaoID != null ) - { - marcacao = ( MarcacoesTrabalhadorData ) JDO.load( MarcacoesTrabalhadorData.class, marcacaoID ); - proximoExamePanel.setDate( (Date) marcacao.get( Marcacao.DATA ) ); - } - Object dadosMarcacao[] = provider.getDadosUltimaMarcacao( trabalhadorID ); - if( dadosMarcacao != null ) - { - dataExamePanel.setDate( ( Date ) dadosMarcacao[ 0 ] ); - Integer tipo = ( Integer ) dadosMarcacao[ 1 ]; - int tipoValue = tipo != null ? tipo.intValue() : 0; - tipoGroup.setIntSelected( tipoValue > 0 ? tipoValue - 1 : 0 ); - } - - } - catch( Exception ex ) - { - ex.printStackTrace(); - return; - } - -// Integer trabID = (Integer) value; -// if( trabID == null ) -// { -// return; -// } -// try -// { -// Integer id = provider.getLastExameIDForTrabalhador( trabID ); -// if( id == null ) -// { -// return; -// } -// MetaObject exame = provider.load( provider.EXAMES, new DBKey( id ) ); -// byte pdf[] = (byte []) exame.getProperty( provider.PDF ); -// if( pdf != null ) -// { -// FileOutputStream fos = new FileOutputStream( "C:\\teste.pdf" ); -// fos.write( pdf ); -// fos.close(); -// } -// } -// catch( Exception ex ) -// { -// ex.printStackTrace(); -// return; -// } - } - - public Object save() - { - StringBuffer msg = new StringBuffer(); - boolean hasMsg = false; - boolean hasData = false; - ExamesData exame; - Date dataExame = dataExamePanel.getDate(); - if( dataExame == null ) - { - dataExame = new Date(); - } - Calendar cal = Calendar.getInstance(); - cal.add( Calendar.DAY_OF_MONTH, 1 ); - if( !cal.getTime().after( dataExame ) ) - { - throw new ValuesException( "N\u00E3o \u00E9 poss\u00EDvel gravar exames com datas futuras." ); - } - try - { - String recomendacoes = recomendacoesText.getText(); - String linhas[] = recomendacoes.split( "\\n" ); - Vector linhasV = new Vector(); - for( int n = 0; n < linhas.length; n++ ) - { - if( linhas[ n ].trim().length() > 0 ) - { - linhasV.add( linhas[ n ] ); - } - } - if( linhasV.size() > 0 ) - { - linhas = ( String[] ) linhasV.toArray( new String[0] ); - boolean compress = false; - if( linhas.length == 2 ) - { - linhas[ 0 ] += " "; - } - recomendacoes = ""; - for( int n = 0; n < linhas.length; n++ ) - { - recomendacoes += linhas[ n ]; - } - } - recomendacoesText.setText( recomendacoes.trim() ); - - exame = new ExamesData(); - - - exame.setHashData( ComponentController.save( components ) ); - - int tipo = 0; - if( admissaoRadio.isSelected() ) - { - tipo = 1; - } - else if( periodicoRadio.isSelected() ) - { - tipo = 2; - } - else if( ocasionalRadio.isSelected() ) - { - tipo = 3; - } -// else if( outroRadio.isSelected() ) -// { -// tipo = 4; -// } -// exame.setProperty( FichaDataProvider.TIPO, new Integer( tipo ) ); - exame.set( ExamesData.TIPO, new Integer( tipo ) ); - if( tipo != 3 ) - { -// exame.setProperty( FichaDataProvider.EXAMES.getFieldByName( FichaDataProvider.OCASIONAL ).FULL_NAME, null ); - exame.set( ExamesData.OCASIONAL, null ); -// exame.setProperty( FichaDataProvider.EXAMES.getFieldByName( FichaDataProvider.OUTRO_TIPO ).FULL_NAME, "" ); - exame.set( ExamesData.OUTRO_TIPO, "" ); - } - else - { - Integer ocasionalID = ( Integer )ocasionalPanel.save(); - if( ocasionalID == null || ocasionalID.intValue() != 10 ) - { -// exame.setProperty( FichaDataProvider.EXAMES.getFieldByName( FichaDataProvider.OUTRO_TIPO ).FULL_NAME, "" ); - exame.set( ExamesData.OUTRO_TIPO, "" ); - } - } - } - catch( Exception ex ) - { - ex.printStackTrace(); - return null; - } - if( hasMsg ) - { - throw new ValuesException( msg.toString() ); - } - return exame; - } - - public void clear() - { - String names[] = (String[])components.keySet().toArray( new String[0] ); - ComponentController.clear( names, components ); - tipoGroup.setIntSelected( 0 ); - dataExamePanel.setDate( new Date() ); - tipoProximoPanel.setSelected( new Integer( 2 ) ); - marcacao = null; - } - - public void setEnabled( boolean enable ) - { - String names[] = (String[])components.keySet().toArray( new String[0] ); - ComponentController.setEnabled( names, enable, components ); - admissaoRadio.setEnabled( enable ); - periodicoRadio.setEnabled( enable ); - ocasionalRadio.setEnabled( enable ); -// outroRadio.setEnabled( enable ); - ocasionalPanel.setEnabled( ocasionalRadio.isSelected() && ocasionalRadio.isEnabled() ) ; -// especificarText.setEnabled( outroRadio.isSelected() && outroRadio.isEnabled() ); - setEspecificarState(); - } - - public void valueChanged(javax.swing.event.ListSelectionEvent listSelectionEvent) - { - setEspecificarState(); - } - - public void setEspecificarState() - { - Integer id = ( Integer )ocasionalPanel.save(); - if( id != null && id.intValue() == 10 ) - { - especificarText.setEnabled( ocasionalRadio.isSelected() && ocasionalRadio.isEnabled() ); - } - else - { - especificarText.setEnabled( false ); - } - } - - public Integer getMotivoProximoExame() - { - return tipoProximoPanel.getSelected(); - } - - public void setup( Date fichaDate, Integer motivoProcesso ) - { - if( fichaDate != null ) - { - dataExamePanel.setDate( fichaDate ); - Calendar proximo = Calendar.getInstance(); - proximo.setTime( fichaDate ); - proximo.add( Calendar.YEAR, 2 ); - proximoExamePanel.setDate( proximo.getTime() ); - } - if( motivoProcesso != null ) - { - switch( motivoProcesso.intValue() ) - { - case MedicinaConstants.MOTIVO_ADMISSAO: - admissaoRadio.setSelected( true ); - break; - case MedicinaConstants.MOTIVO_PERIODICO: - periodicoRadio.setSelected( true ); - break; - case MedicinaConstants.MOTIVO_PERIODICO_INICIAL: - periodicoRadio.setSelected( true ); - break; - case MedicinaConstants.MOTIVO_OCASIONAL: - ocasionalRadio.setSelected( true ); - break; - } - } - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoConstants.java b/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoConstants.java deleted file mode 100644 index a9cfaef7..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoConstants.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * FichaAptidaoConstants.java - * - * Created on May 14, 2007, 5:12 PM - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -package siprp.ficha; - -/** - * - * @author lflores - */ -public interface FichaAptidaoConstants -{ - /* unicode - private final String SQUARE = "☐"; - private final String CHECKED = "☑";*/ -/* windows arial circle (full circle) */ - public static final String SQUARE = "○"; - public static final String CHECKED = "●"; - - public static final String PORTARIA = "portaria"; - public static final String DESIGNACAO_SOCIAL = "designacao_social"; - public static final String ESTABELECIMENTOS_NOME = "estabelecimentos.nome"; - public static final String ESTABELECIMENTOS_LOCALIDADE = "estabelecimentos.localidade"; - public static final String SERVICO_SAUDE_TIPO_INTERNO = "servico_saude_tipo_interno"; - public static final String SERVICO_SAUDE_TIPO_INTEREMPRESAS = "servico_saude_tipo_interempresas"; - public static final String SERVICO_SAUDE_TIPO_EXTERNO = "servico_saude_tipo_externo"; - public static final String SERVICO_SAUDE_TIPO_SNS = "servico_saude_tipo_sns"; - public static final String SERVICO_SAUDE_DESIGNACAO = "servico_saude_designacao"; - public static final String SERVICO_HIGIENE_TIPO_INTERNO = "servico_higiene_tipo_interno"; - public static final String SERVICO_HIGIENE_TIPO_INTEREMPRESAS = "servico_higiene_tipo_interempresas"; - public static final String SERVICO_HIGIENE_TIPO_EXTERNO = "servico_higiene_tipo_externo"; - public static final String SERVICO_HIGIENE_TIPO_OUTRO = "servico_higiene_tipo_outro"; - public static final String SERVICO_HIGIENE_DESIGNACAO = "servico_higiene_designacao"; - public static final String TRABALHADORES_NOME = "trabalhadores.nome"; - public static final String SEXO = "sexo"; - public static final String DATA_NASCIMENTO = "data_nascimento"; - public static final String NACIONALIDADE = "nacionalidade"; - public static final String NUMERO_MECANOGRAFICO = "numero_mecanografico"; - public static final String DATA_ADMISSAO = "data_admissao"; - public static final String CATEGORIA = "categoria"; - public static final String LOCAL_TRABALHO = "local_trabalho"; - public static final String FUNCAO_PROPOSTA = "funcao_proposta"; - public static final String DATA_ADMISSAO_FUNCAO = "data_admissao_funcao"; - public static final String OBSERVACOES = "observacoes"; - public static final String EXAMES_DATA = "exames.data"; - public static final String TIPO_ADMISSAO = "tipo_admissao"; - public static final String TIPO_PERIODICO = "tipo_periodico"; - public static final String TIPO_OCASIONAL = "tipo_ocasional"; - public static final String TIPO_APOS_DOENCA = "tipo_apos_doenca"; - public static final String TIPO_APOS_ACIDENTE = "tipo_apos_acidente"; - public static final String TIPO_PEDIDO_TRABALHADOR = "tipo_pedido_trabalhador"; - public static final String TIPO_PEDIDO_EMPRESA = "tipo_pedido_empresa"; - public static final String TIPO_MUDANCA_FUNCAO = "tipo_mudanca_funcao"; - public static final String TIPO_TRABALHO = "tipo_trabalho"; - public static final String TIPO_OUTRO = "tipo_outro"; - public static final String TIPO_OUTRO_TEXTO = "tipo_outro_texto"; - public static final String RESULTADO_APTO = "resultado_apto"; - public static final String RESULTADO_APTO_CONDICIONALMENTE = "resultado_apto_condicionalmente"; - public static final String RESULTADO_INAPTO_TEMP = "resultado_inapto_temp"; - public static final String RESULTADO_INAPTO_DEF = "resultado_inapto_def"; - public static final String OUTRA_FUNCAO_1 = "outra_funcao_1"; - public static final String OUTRA_FUNCAO_2 = "outra_funcao_2"; - public static final String OUTRA_FUNCAO_3 = "outra_funcao_3"; - public static final String OUTRA_FUNCAO_4 = "outra_funcao_4"; - public static final String OUTRAS_RECOMENDACOES = "outras_recomendacoes"; - public static final String PROXIMO_EXAME = "proximo_exame"; - public static final String MEDICOS_NOME = "medicos.nome"; - public static final String NUMERO_CEDULA = "numero_cedula"; - - public static final int CODIGO_TIPO_ADMISSAO = 1; - public static final int CODIGO_TIPO_PERIODICO = 2; - public static final int CODIGO_TIPO_OCASIONAL = 3; -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoCreator.java b/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoCreator.java deleted file mode 100644 index 7cb534ca..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoCreator.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * FichaAptidaoCreator.java - * - * Created on May 14, 2007, 4:50 PM - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -package siprp.ficha; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; - -import com.evolute.utils.fop.FOPCreator; -import com.evolute.utils.fop.FOPPrinter; -import com.evolute.utils.fop.PDFCreator; - - -/** - * - * @author lflores - */ -public class FichaAptidaoCreator implements FichaAptidaoConstants -{ - private final FOPCreator fopCreator; - private final PDFCreator pdfCreator; - private final FOPPrinter fopPrinter; - - private static FichaAptidaoCreator creator = null; - - /** Creates a new instance of FichaAptidaoCreator */ - private FichaAptidaoCreator() - { - fopCreator = FOPCreator.getFOPCreator(); - pdfCreator = PDFCreator.getPDFCreator(); - fopPrinter = FOPPrinter.getFOPPrinter(); - } - - public static FichaAptidaoCreator getCreator() - { - if( creator == null ) - { - creator = new FichaAptidaoCreator(); - } - return creator; - } - - public void print( byte fo[] ) - throws Exception - { - ByteArrayInputStream in = new ByteArrayInputStream( fo ); - fopPrinter.printFO( in, true, true, null ); -// System.out.println( "DONE" ); - } - - public void printSilent( byte fo[], String printerName ) - throws Exception - { - ByteArrayInputStream in = new ByteArrayInputStream( fo ); - fopPrinter.printFO( in, true, false, null ); - } - -// public byte[] createFO( HashMap values ) -// throws Exception -// { -// StringBuilder buff = new StringBuilder( "\n\n" ); -// -// values.put( PORTARIA, "Portaria n. 299/2007, de 16 de Março" ); -// -//// ☐ square -//// ☑ checked square -// -// for( String key: values.keySet() ) -// { -// buff.append( "\t<" + key + ">" ); -// String val = values.get( key ); -// buff.append( UnicodeChecker.parseToUnicode( "&#x", ";", val, true ) ); -// buff.append( "\n" ); -// } -// buff.append( "" ); -// String xml = buff.toString(); -// -// System.out.println( "XML: " + xml ); -// -// ByteArrayOutputStream out = new ByteArrayOutputStream(); -// InputStream xmlIn = new ByteArrayInputStream( xml.getBytes() ); -// -// InputStream xslStream = getClass().getClassLoader().getResourceAsStream( "siprp/ficha/ficha_aptidao.xsl" ); -// fopCreator.createFOfromXML( xmlIn, xslStream, out ); -// // System.out.println( "FO created" ); -// -// return out.toByteArray(); -// } - - public byte[] createFO( byte []xml ) - throws Exception - { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - InputStream xmlIn = new ByteArrayInputStream( xml ); - - InputStream xslStream = getClass().getClassLoader().getResourceAsStream( "siprp/ficha/ficha_aptidao.xsl" ); - fopCreator.createFOfromXML( xmlIn, xslStream, out ); - // System.out.println( "FO created" ); - - return out.toByteArray(); - } - - public byte[] createPDF( byte[] fo ) - throws Exception - { - return pdfCreator.createPdfFromFo( fo ); - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoEditorManager.java b/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoEditorManager.java deleted file mode 100644 index ba56bd15..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoEditorManager.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * FichaAptidaoEditorManager.java - * - * Created on 30 de Marco de 2004, 19:23 - */ - -package siprp.ficha; - -import com.evolute.utils.editormanager.Editor; -import com.evolute.utils.editormanager.EditorManager; -import com.evolute.utils.editormanager.EditorManagerFactory; -import com.evolute.utils.editormanager.EditorManagerInterface; - -/** - * - * @author fpalma - */ -public class FichaAptidaoEditorManager extends EditorManager -{ - private static final EditorManagerFactory FACTORY = new FichaAptidaoEditorManagerFactory(); - - public static EditorManagerFactory getEditorManagerFactory() - { - return FACTORY; - } - - /** Creates a new instance of FichaAptidaoEditorManager */ - public FichaAptidaoEditorManager( Editor ed, int i ) - { - super( ed, i ); - } - - /** Creates a new instance of FichaAptidaoEditorManager */ - public FichaAptidaoEditorManager( Editor ed, int i, EditorManagerInterface subMan ) - { - super( ed, i, subMan ); - throw new RuntimeException( "FichaAptidaoEditorManager cannot have subManagers" ); - } - - /** Creates a new instance of FichaAptidaoEditorManager */ - public FichaAptidaoEditorManager( Editor ed, int i, EditorManagerInterface subMan[] ) - { - super( ed, i, subMan ); - throw new RuntimeException( "FichaAptidaoEditorManager cannot have subManagers" ); - } - - public boolean isEditing() - { - if( state != STATE_UNSELECT ) - { - return true; - } - return false; - } - - public void enable() - { -// System.out.println( "EditorManager: enable " + this ); - editor.enableComponents( index, false ); - // new, edit, cancel, save, delete, select - editor.actions( index, true, false, false, false, false, true ); - enabled = true; - } - - public void disable() - { -// System.out.println( "EditorManager: disable " + this ); - editor.clear( index ); - editor.enableComponents( index, false ); - // new, edit, cancel, save, delete, select - editor.actions( index, false, false, false, false, false, false ); - enabled = false; - state = STATE_UNSELECT; - } - - public void unlock(boolean direction) - { - editor.enableComponents( index, false ); - if( enabled ) - { - if( state == STATE_UNSELECT ) - { - // new, edit, cancel, save, delete, select - editor.actions( index, true, false, false, false, false, true ); - } - else - { - // new, edit, cancel, save, delete, select - editor.actions( index, true, true, false, false, true, true ); - } - } - } - - public void select() - { -// System.out.println( "EditorManager: select " + this ); - // new, edit, cancel, save, delete, select - editor.actions( index, true, true, true, true, true, true ); - state = STATE_EDIT; - } - - public void unselect() - { -// System.out.println( "EditorManager: select " + this ); - // new, edit, cancel, save, delete, select - editor.actions( index, true, false, false, false, false, true ); - state = STATE_UNSELECT; - } - - public void newItem() - { -// System.out.println( "EditorManager: new " + this ); - editor.enableComponents( index, true ); - // new, edit, cancel, save, delete, select - editor.actions( index, false, false, true, true, true, false ); - state = STATE_NEW; - } - - public void cancelItem() - { -// System.out.println( "EditorManager: cancel " + this ); - if( state == STATE_NEW ) - { - editor.clear( index ); - editor.enableComponents( index, false ); - // new, edit, cancel, save, delete, select - editor.actions( index, true, false, false, false, false, true ); - state = STATE_UNSELECT; - } - else if( state == STATE_EDIT ) - { - editor.reload( index ); - editor.enableComponents( index, true ); - // new, edit, cancel, save, delete, select - editor.actions( index, true, true, true, true, true, true ); - state = STATE_EDIT; - } - } - - public void saveItem() - { -// System.out.println( "EditorManager: save " + this ); - if( ! editor.save( index ) ) - { - return; - } - editor.enableComponents( index, false ); - // new, edit, cancel, save, delete, select - editor.actions( index, true, true, false, false, true, true ); - state = STATE_EDIT; - } - - public void deleteItem() - { -// System.out.println( "EditorManager: delete " + this ); - if( editor.delete( index ) ) - { - editor.clear( index ); - editor.enableComponents( index, false ); - // new, edit, cancel, save, delete, select - editor.actions( index, true, false, false, false, false, true ); - state = STATE_UNSELECT; - } - } - - public void refresh() - { -// System.out.println( "EditorManager: refresh " + this ); - if( !enabled ) - { - disable(); - return; - } - switch( state ) - { - case STATE_NEW: - editItem(); - state = STATE_NEW; - break; - case STATE_EDIT: - editItem(); - break; - case STATE_SELECT: - throw new RuntimeException( "FichaAptidaoEditorManager cannot be in STATE_SELECT" ); - case STATE_UNSELECT: - enable(); - break; - } - } - - public void editItem() - { - state = STATE_EDIT; - editor.actions( index, false, false, true, true, true, false ); - } - - public void lock(boolean direction) - { - throw new RuntimeException( "lock cannot be called on FichaAptidaoEditorManager" ); - } - - public void registerMain(EditorManagerInterface mainMan) - { - throw new RuntimeException( "registerMain cannot be called on FichaAptidaoEditorManager" ); - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoEditorManagerFactory.java b/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoEditorManagerFactory.java deleted file mode 100644 index f6ec1512..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/FichaAptidaoEditorManagerFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * FichaAptidaoEditorManagerFactory.java - * - * Created on 30 de Marco de 2004, 20:48 - */ - -package siprp.ficha; - -import com.evolute.utils.editormanager.Editor; -import com.evolute.utils.editormanager.EditorManagerFactory; -import com.evolute.utils.editormanager.EditorManagerInterface; -/** - * - * @author fpalma - */ -public class FichaAptidaoEditorManagerFactory - implements EditorManagerFactory -{ - - /** Creates a new instance of FichaAptidaoEditorManagerFactory */ - public FichaAptidaoEditorManagerFactory() - { - } - - public EditorManagerInterface createEditorManager(Editor ed, int i) - { - return new FichaAptidaoEditorManager( ed, i ); - } - - public EditorManagerInterface createEditorManager(Editor ed, int i, EditorManagerInterface[] subMan) - { - return new FichaAptidaoEditorManager( ed, i, subMan ); - } - - public EditorManagerInterface createEditorManager(Editor ed, int i, EditorManagerInterface subMan) - { - return new FichaAptidaoEditorManager( ed, i, subMan ); - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/FichaWindow.java b/trunk/SIPRPSoft/src/siprp/ficha/FichaWindow.java deleted file mode 100644 index d7189fdc..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/FichaWindow.java +++ /dev/null @@ -1,1258 +0,0 @@ -/* - * FichaWindow.java - * - * Created on 29 de Marco de 2004, 11:50 - */ - -package siprp.ficha; - -import java.awt.FileDialog; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FilenameFilter; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Vector; - -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -import org.jdom.Document; -import org.jdom.Element; -import org.jdom.output.XMLOutputter; - -import shst.data.outer.EmpresasData; -import shst.data.outer.EstabelecimentosData; -import shst.data.outer.ExamesData; -import shst.data.outer.MedicosData; -import shst.data.outer.TrabalhadoresData; -import shst.importer.Importer; -import shst.lembretes.LembretesDataProvider; -import shst.medicina.MarcacoesMedicinaHandler; -import shst.printer.Printer; -import siprp.FichaDataProvider; -import siprp.ui.SIPRPTabbedWindow; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.strings.StringPlainer; -import com.evolute.utils.ui.DialogException; -import com.evolute.utils.ui.dialog.ListAction; -import com.evolute.utils.ui.dialog.ListActionDialog; -import com.evolute.utils.ui.search.SearchDialog; -import com.evolute.utils.ui.window.ActionHandler; - -/** - * - * @author fpalma - */ -public class FichaWindow extends SIPRPTabbedWindow implements ListAction, FichaAptidaoConstants -{ - - private static final long serialVersionUID = 1L; - - private ProviderInterface JDO; - - private UpperPanel upperPanel; - private EmpresaPanel empresaPanel; - private TrabalhadorPanel trabalhadorPanel; - private ObservacoesPanel observacoesPanel; - private ExamePanel examePanel; - - private LembretesDataProvider lembretesProvider; - private FichaDataProvider fdpProvider; - private MarcacoesMedicinaHandler marcacoesHandler; - private Integer empresaID; - private Integer estabelecimentoID; - private Integer trabalhadorID; - - private final ExamePDF ePDF = new ExamePDF(); - - private static int permissions[][] = - new int[][]{ { NEW_INDEX, CANCEL_INDEX, SAVE_INDEX } }; - - private static FichaWindow window = null; - - private Integer imposedTrabalhadorID = null; - private SaveExameListener exameListener = null; - - private boolean useFO = false; - - /** Creates a new instance of FichaWindow */ - private FichaWindow() - throws Exception - { - super( new UpperPanel(), new String[]{ "Empresa/Trabalhador", "Exame" }, - createPermissions( permissions ) ); - setEditorManagerFactory( FichaAptidaoEditorManager.getEditorManagerFactory() ); - upperPanel = (UpperPanel) getUpperPanel(); - upperPanel.owner = this; - fdpProvider = ( FichaDataProvider ) FichaDataProvider.getProvider(); - JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - marcacoesHandler = new MarcacoesMedicinaHandler(); - lembretesProvider = LembretesDataProvider.getProvider(); - setupComponents(); - } - - public static FichaWindow getWindow() - throws Exception - { - if( window == null ) - { - window = new FichaWindow(); - } - return window; - } - - private void setupComponents() - throws Exception - { - setSize( 800, 700 ); - setResizable( false ); - setTitle( "Ficha de Aptid\u00e3o" ); - - JPanel empresaTrabalhadorPanel = getTab( 0 ); - JPanel exameRecomendacoesPanel = getTab( 1 ); - - GridBagLayout gridbag = new GridBagLayout(); - empresaTrabalhadorPanel.setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 0, 1, 0, 1 ); - constraints.fill = GridBagConstraints.BOTH; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = 1; - constraints.weighty = 0; - - empresaPanel = new EmpresaPanel(); - empresaPanel.setEnabled( false ); - gridbag.setConstraints( empresaPanel, constraints ); - empresaTrabalhadorPanel.add( empresaPanel ); - - constraints.weighty = 0; - trabalhadorPanel = new TrabalhadorPanel(); - gridbag.setConstraints( trabalhadorPanel, constraints ); - empresaTrabalhadorPanel.add( trabalhadorPanel ); - - constraints.weighty = 1; - observacoesPanel = new ObservacoesPanel(); - gridbag.setConstraints( observacoesPanel, constraints ); - empresaTrabalhadorPanel.add( observacoesPanel ); - - - gridbag = new GridBagLayout(); - exameRecomendacoesPanel.setLayout( gridbag ); - constraints = new GridBagConstraints(); - constraints.insets = new Insets( 0, 1, 0, 1 ); - constraints.fill = GridBagConstraints.BOTH; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = 1; - constraints.weighty = 0; - - constraints.weighty = 1; - examePanel = new ExamePanel(); - gridbag.setConstraints( examePanel, constraints ); - exameRecomendacoesPanel.add( examePanel ); - - registerAction( new ActionHandler(){ - public void execute() - { - print(); - } - - public boolean activate( boolean newAction, boolean editAction, - boolean cancelAction, boolean saveAction, - boolean deleteAction, boolean selectAction ) - { - return saveAction || editAction; - } - }, "Imprimir", - "Imprimir Ficha", "print", - 0, true ); - - registerAction( new ActionHandler(){ - public void execute() - { - printOld(); - } - - public boolean activate( boolean newAction, boolean editAction, - boolean cancelAction, boolean saveAction, - boolean deleteAction, boolean selectAction ) - { - return saveAction || editAction; - } - }, "Imprimir Fichas Anteriores", - "Imprimir Fichas Anteriores", null, - 0, false ); - -// registerAction( new ActionHandler(){ -// public void execute() -// { -// printOldFO(); -// } -// -// public boolean activate( boolean newAction, boolean editAction, -// boolean cancelAction, boolean saveAction, -// boolean deleteAction, boolean selectAction ) -// { -// return saveAction || editAction; -// } -// }, "Imprimir Fichas Anteriores (novo)", -// "Imprimir Fichas Anteriores (novo)", null, -// 0, false ); - - registerAction( new ActionHandler(){ - public void execute() - { - deleteOld(); - } - - public boolean activate( boolean newAction, boolean editAction, - boolean cancelAction, boolean saveAction, - boolean deleteAction, boolean selectAction ) - { - return saveAction || editAction; - } - }, "Apagar Fichas Anteriores", - "Apagar Fichas Anteriores", null, - 0, false ); - - registerAction( new ActionHandler(){ - public void execute() - { - printToFile(); - } - - public boolean activate( boolean newAction, boolean editAction, - boolean cancelAction, boolean saveAction, - boolean deleteAction, boolean selectAction ) - { - return saveAction || editAction; - } - }, "Exportar", "Exportar para PDF", null, 0, true ); - -// registerAction( new ActionHandler(){ -// public void execute() -// { -// excel(); -// } -// -// public boolean activate( boolean newAction, boolean editAction, -// boolean cancelAction, boolean saveAction, -// boolean deleteAction, boolean selectAction ) -// { -// return saveAction; -// } -// }, "Importar", -// "Importar de Excel", "excel", -// 0, true ); - } - - public boolean save( int index ) - { - StringBuilder msg = new StringBuilder(); - MedicosData medico; - try - { - medico = (MedicosData)upperPanel.save(); - } - catch( ValuesException vex ) - { - msg.append( vex.getMessage() ); - medico = null; - } - EstabelecimentosData estabelecimento; - try - { - estabelecimento = (EstabelecimentosData)empresaPanel.save(); - } - catch( ValuesException vex ) - { - msg.append( vex.getMessage() ); - estabelecimento = null; - } - TrabalhadoresData trabalhador; - try - { - trabalhador = (TrabalhadoresData)trabalhadorPanel.save(); - } - catch( ValuesException vex ) - { - msg.append( vex.getMessage() ); - trabalhador = null; - } - ExamesData exame; - try - { - exame = (ExamesData)examePanel.save(); - } - catch( ValuesException vex ) - { - msg.append( vex.getMessage() ); - exame = null; - } - if( estabelecimento == null || trabalhador == null || exame == null || medico == null ) - { - JOptionPane.showMessageDialog( this, msg.toString(), "Erro...", JOptionPane.ERROR_MESSAGE ); - return false; - } - String observacoes = ( String ) observacoesPanel.save(); - - - estabelecimento.set( EstabelecimentosData.NOME_PLAIN, - com.evolute.utils.strings.StringPlainer.convertString( ( String ) - estabelecimento.get( EstabelecimentosData.NOME ) ) ); - - trabalhador.set( TrabalhadoresData.TO_ESTABELECIMENTO_ID, estabelecimento ); - trabalhador.set( TrabalhadoresData.OBSERVACOES, observacoes ); - trabalhador.set( TrabalhadoresData.NOME_PLAIN, - com.evolute.utils.strings.StringPlainer.convertString( ( String ) - trabalhador.get( TrabalhadoresData.NOME ) ) ); - exame.set( ExamesData.TO_MEDICO_ID, medico ); - exame.set( ExamesData.TO_TRABALHADOR_ID, trabalhador ); - - byte fo[] = null; - try - { - fo = createFO( exame ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a criar nova vers\u00e3o de ficha", true ); - } - - try - { - exame.set( ExamesData.FO, fo ); - exame.set( ExamesData.PDF, createPDF( exame ) ); - exame.save(); - trabalhador.save(); - try - { - if( medico != null ) - { - fdpProvider.setMedicoForEstabelecimento( ( Integer ) estabelecimento.get( EstabelecimentosData.ID ), - ( Integer ) medico.get( MedicosData.ID ) ); - } - } - catch( Exception mex ) - { - } - trabalhadorID = ( Integer ) trabalhador.get( TrabalhadoresData.ID ); - try - { - //Marcacao.saveMarcacaoConsultaForTrabalhadorID( trabalhadorID, (Date)exame.get( ExamesData.PROXIMO_EXAME ) ); - marcacoesHandler.ajustarMarcacoes( - trabalhadorID, (Integer)exame.get( ExamesData.TIPO ), - (Date)exame.get( ExamesData.DATA ), - examePanel.getMotivoProximoExame(), (Date)exame.get( ExamesData.PROXIMO_EXAME ) ); - } - catch( Exception iex ) - { - iex.printStackTrace(); - } -// Integer motivoProximoExame = (Integer) exame.get( ExamesData.TIPO ); -// if ( motivoProximoExame != null && motivoProximoExame.equals( new Integer( FichaAptidaoConstants.CODIGO_TIPO_OCASIONAL ) ) ) -// { -// Date proximoExameDate = (Date) exame.get( ExamesData.PROXIMO_EXAME ); -// if( proximoExameDate != null && proximoExameDate.getTime() > 0 ) -// { -// Calendar whenCal = Calendar.getInstance(); -// whenCal.setTime( proximoExameDate ); -// whenCal.add( Calendar.MONTH, -2 ); -// Date now = new Date(); -// Date when = whenCal.getTime(); -// lembretesProvider.criarLembreteFicha( exame, now.after( when ) ? now : when ); -// System.out.println(new Date() + ": A criar lembrete"); -// } -// } -// createPDF( exame ); -// print(); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a guardar", true ); - return false; - } - if( exameListener != null ) - { - exameListener.exameSaved( trabalhadorID, ( Integer )exame.get( ExamesData.ID ) ); - exameListener = null; - } - return true; - } - - public boolean newItem( int index ) - { - exameListener = null; - if( imposedTrabalhadorID == null ) - { - fdpProvider.setSearch( FichaDataProvider.SEARCH_EMPRESAS ); - SearchDialog search; - Integer oldID = empresaID; - - search = new SearchDialog( fdpProvider, null, false, null, true ); - empresaID = ( Integer )search.getSelected(); - - if( empresaID == null ) - { - if( search.getIsNew() ) - { - estabelecimentoID = null; - trabalhadorID = null; - clear( 0 ); - return true; - } - else - { - return false; - } - } - - fdpProvider.setSearch( FichaDataProvider.SEARCH_ESTABELECIMENTOS ); - fdpProvider.setSearchID( FichaDataProvider.SEARCH_EMPRESAS, empresaID.intValue() ); - - search = new SearchDialog( fdpProvider, null, false, null, true ); - estabelecimentoID = ( Integer )search.getSelected(); - - if( estabelecimentoID == null ) - { - if( search.getIsNew() ) - { - trabalhadorID = null; - reload(0); - return true; - } - else - { - return false; - } - } - - fdpProvider.setSearch( FichaDataProvider.SEARCH_TRABALHADORES ); - fdpProvider.setSearchID( FichaDataProvider.SEARCH_ESTABELECIMENTOS, estabelecimentoID.intValue() ); - search = new SearchDialog( fdpProvider, null, false, null, true ); - trabalhadorID = ( Integer )search.getSelected(); - if( trabalhadorID == null && search.getIsNew() ) - { - reload(0); - return true; - } - } - else - { - trabalhadorID = imposedTrabalhadorID; - imposedTrabalhadorID = null; - try - { - estabelecimentoID = fdpProvider.getEstabelecimentoIDForTrabalhador( trabalhadorID ); - empresaID = fdpProvider.getEmpresaIDForEstabelecimento( estabelecimentoID ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar dados.", true ); - return false; - } - } - if( trabalhadorID == null ) - { - return false; - } - reload(0); - return true; - } - - public boolean delete( int index ) - { - return true; - } - - public void deleteOld() - { - if( trabalhadorID == null ) - { - return; - } - Vector linhas; - try - { - IDObject fichas[] = fdpProvider.getAllFichasForTrabalhador( trabalhadorID ); - linhas = new Vector( Arrays.asList( fichas ) ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a criar lista de Fichas anteriores", true ); - return; - } - ListActionDialog dialog = - new ListActionDialog( this, "Apagar Fichas Anteriores", new String[]{ "Data" }, linhas, - new ListAction(){ - public String getListActionName() - { - return "Apagar"; - } - - public boolean executeListAction( int line, Object value ) - { - if( value == null ) - { - return true; - } - try - { - delete( ( ( IDObject )value ).getID() ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a Apagar Ficha", true ); - return false; - } - return true; - } - } ); - dialog.setSize( 250, 200 ); - dialog.setVisible( true ); - } - - public void reload( int index ) - { - Integer upperData[] = new Integer[]{ empresaID, estabelecimentoID, trabalhadorID }; - upperPanel.fill( upperData ); - Object empresaData[] = new Object[]{ empresaID, estabelecimentoID }; - empresaPanel.fill( empresaData ); - trabalhadorPanel.fill( trabalhadorID ); - observacoesPanel.fill( trabalhadorID ); - examePanel.fill( trabalhadorID ); - } - - public void enableComponents( int index, boolean enable ) - { - upperPanel.setEnabled( enable ); - empresaPanel.setEnabled( enable ); - trabalhadorPanel.setEnabled( enable ); - observacoesPanel.setEnabled( enable ); - examePanel.setEnabled( enable ); - } - - public void clear( int index ) - { - upperPanel.clear(); - empresaPanel.clear(); - trabalhadorPanel.clear(); - observacoesPanel.clear(); - examePanel.clear(); - } - - public void print() - { - try - { - if( trabalhadorID == null ) - { - System.out.println( "no trab" ); - return; - } - - Integer id = fdpProvider.getLastExameIDForTrabalhador( trabalhadorID ); - if( id == null ) - { - System.out.println( "no id" ); - return; - } - print( id, false ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "N\u00e3o foi poss\u00edvel imprimir", true ); - } - } - - private void print( Integer exameID, boolean toFile ) - throws Exception - { -// MetaObject exame = fdpProvider.load( fdpProvider.EXAMES, new DBKey( exameID ) ); - ExamesData exame = (ExamesData) JDO.load( ExamesData.class, exameID ); - if( exame == null ) - { - throw new Exception( "N\u00e3o existe exame" ); - } - - byte fo[] = (byte []) exame.get( ExamesData.FO ); - byte pdf[] = (byte []) exame.get( ExamesData.PDF ); - - if( toFile ) - { - TrabalhadoresData trabalhadorExame = exame.toTrabalhador_id(); - String fileName = StringPlainer.convertString( ( String ) trabalhadorExame.get( TrabalhadoresData.NOME ) ); - SimpleDateFormat sdf = new SimpleDateFormat("_dd-MM-yyyy"); - Date date = new Date(); - fileName = fileName + sdf.format( date ); - fileName = fileName.replace( ' ', '_' ); - JFileChooser dialog = new JFileChooser(); - dialog.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY ); - int result = dialog.showSaveDialog( this ); - if( result == JFileChooser.APPROVE_OPTION ) - { - File selectedFile = dialog.getSelectedFile(); - if( selectedFile != null ) - { - String absolutePath = selectedFile.getAbsolutePath(); - if( absolutePath != null ) - { - if(absolutePath.charAt( absolutePath.length() - 1) != File.separatorChar ) - { - absolutePath = absolutePath + File.separatorChar; - } - fileName = absolutePath + fileName + ".pdf"; - } - -// if( fo != null ) -// { -// Printer.printFoToFile( fo, fileName, true ); -// } -// else -// { - Printer.printPDFToFile( pdf, fileName, true ); -// } - JOptionPane.showMessageDialog( this, "Ficha exportada para: " + fileName ); - } - } - } - else - { -// if( fo != null ) -// { -// FichaAptidaoCreator.getCreator().print( fo ); -// } -// else -// { - TrabalhadoresData trabalhadorExame = exame.toTrabalhador_id(); - String nomeFicheiro = StringPlainer.convertString( ( String ) trabalhadorExame.get( TrabalhadoresData.NOME ) ); - nomeFicheiro = nomeFicheiro.replaceAll( " ", "_" ); - ePDF.print( pdf, nomeFicheiro ); -// } - } - } - - private void printToFile() - { - try - { - if( trabalhadorID != null ) - { - Integer id = fdpProvider.getLastExameIDForTrabalhador( trabalhadorID ); - if( id != null ) - { - print(id, true); - } - } - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "N\u00e3o foi poss\u00edvel exportar", true ); - } - } - -// private void printFO( Integer exameID ) -// throws Exception -//{ -//// MetaObject exame = fdpProvider.load( fdpProvider.EXAMES, new DBKey( exameID ) ); -// ExamesData exame = (ExamesData) JDO.load( ExamesData.class, exameID ); -// if( exame == null ) -// { -// throw new Exception( "N\u00e3o existe exame" ); -// } -// -// // lflores - ignore FO (for now) -// byte fo[] = (byte []) exame.get( ExamesData.FO ); -// -// if( fo != null ) -// { -// byte pdf[] = FichaAptidaoCreator.getCreator().createPDF( fo ); -// new PDFFilePrinter( pdf, true ); -// } -//} - - public byte[] createFO( ExamesData exame ) - throws Exception - { - byte xml[] = createXmlFromExame( exame ); -// HashMap ht = createMapFromExame(exame); -// ExamePDF ePDF = new ExamePDF(); -// return ePDF.createPDF( ht ); - - return FichaAptidaoCreator.getCreator().createFO( xml ); - } - - public byte[] createPDF( ExamesData exame ) - throws Exception - { - // byte fo[] = exame.get( ExamesData.FO, fo ); - HashMap ht = createMapFromExame( exame ); - return ePDF.createPDF( ht ); -// return FichaAptidaoCreator.getCreator().createPDF( fo ); - } - - private HashMap createMapFromExame(final ExamesData exame) - { - MedicosData medico = exame.toMedico_id(); - TrabalhadoresData trabalhador = exame.toTrabalhador_id(); - EstabelecimentosData estabelecimento = trabalhador.toEstabelecimento_id(); - EmpresasData empresa = estabelecimento.toEmpresa_id(); -// empresa.load( empresa.getPrimaryKeyValue() ); - HashMap ht = new HashMap(); - ht.put( DESIGNACAO_SOCIAL, ( String )empresa.get( EmpresasData.DESIGNACAO_SOCIAL ) ); - ht.put( ESTABELECIMENTOS_NOME, ( String )estabelecimento.get( EstabelecimentosData.NOME ) ); - String aux = (String)estabelecimento.get( EstabelecimentosData.LOCALIDADE ); - ht.put( ESTABELECIMENTOS_LOCALIDADE, aux != null ? aux : "" ); - Integer tipo = (Integer)empresa.get( EmpresasData.SERVICO_SAUDE_TIPO ); - ht.put( SERVICO_SAUDE_TIPO_INTERNO, SQUARE ); - ht.put( SERVICO_SAUDE_TIPO_INTEREMPRESAS, SQUARE ); - ht.put( SERVICO_SAUDE_TIPO_EXTERNO, SQUARE ); - ht.put( SERVICO_SAUDE_TIPO_SNS, SQUARE ); - switch( tipo.intValue() ) - { - case 1: - ht.put( SERVICO_SAUDE_TIPO_INTERNO, CHECKED ); - break; - case 2: - ht.put( SERVICO_SAUDE_TIPO_INTEREMPRESAS, CHECKED ); - break; - case 3: - ht.put( SERVICO_SAUDE_TIPO_EXTERNO, CHECKED ); - break; - case 4: - ht.put( SERVICO_SAUDE_TIPO_SNS, CHECKED ); - break; - } - ht.put( SERVICO_SAUDE_DESIGNACAO, ( String )empresa.get( EmpresasData.SERVICO_SAUDE_DESIGNACAO ) ); - tipo = (Integer)empresa.get( EmpresasData.SERVICO_HIGIENE_TIPO ); - ht.put( SERVICO_HIGIENE_TIPO_INTERNO, SQUARE ); - ht.put( SERVICO_HIGIENE_TIPO_INTEREMPRESAS, SQUARE ); - ht.put( SERVICO_HIGIENE_TIPO_EXTERNO, SQUARE ); - ht.put( SERVICO_HIGIENE_TIPO_OUTRO, SQUARE ); - switch( tipo.intValue() ) - { - case 1: - ht.put( SERVICO_HIGIENE_TIPO_INTERNO, CHECKED ); - break; - case 2: - ht.put( SERVICO_HIGIENE_TIPO_INTEREMPRESAS, CHECKED ); - break; - case 3: - ht.put( SERVICO_HIGIENE_TIPO_EXTERNO, CHECKED ); - break; - case 4: - ht.put( SERVICO_HIGIENE_TIPO_OUTRO, CHECKED ); - break; - } - ht.put( SERVICO_HIGIENE_DESIGNACAO, ( String )empresa.get( EmpresasData.SERVICO_HIGIENE_DESIGNACAO ) ); - ht.put( TRABALHADORES_NOME, ( String )trabalhador.get( TrabalhadoresData.NOME ) ); - aux = (String)trabalhador.get( TrabalhadoresData.SEXO ); - switch( aux.charAt( 0 ) ) - { - case 'm': - ht.put( SEXO, "Masculino" ); - break; - case 'f': - ht.put( SEXO, "Feminino" ); - break; - } - DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT ); - Date data = ( Date )trabalhador.get( TrabalhadoresData.DATA_NASCIMENTO ); - ht.put( DATA_NASCIMENTO, data != null ? df.format( data ) : "" ); - aux = (String)trabalhador.get( TrabalhadoresData.NACIONALIDADE ); - ht.put( NACIONALIDADE, aux != null ? aux : "" ); - aux = (String)trabalhador.get( TrabalhadoresData.NUMERO_MECANOGRAFICO ); - ht.put( NUMERO_MECANOGRAFICO, aux != null ? aux : "" ); - data = ( Date )trabalhador.get( TrabalhadoresData.DATA_ADMISSAO ); - ht.put( DATA_ADMISSAO, data != null ? df.format( data ) : "" ); - aux = (String)trabalhador.get( TrabalhadoresData.CATEGORIA ); - ht.put( CATEGORIA, aux != null ? aux : "" ); - aux = (String)trabalhador.get( TrabalhadoresData.LOCAL_TRABALHO ); - ht.put( LOCAL_TRABALHO, aux != null ? aux : "" ); - aux = (String)trabalhador.get( TrabalhadoresData.FUNCAO_PROPOSTA ); - ht.put( FUNCAO_PROPOSTA, aux != null ? aux : "" ); - data = ( Date )trabalhador.get( TrabalhadoresData.DATA_ADMISSAO_FUNCAO ); - ht.put( DATA_ADMISSAO_FUNCAO, data != null ? df.format( data ) : "" ); - aux = (String)trabalhador.get( TrabalhadoresData.OBSERVACOES ); - ht.put( OBSERVACOES, aux != null ? aux : "" ); - data = ( Date )exame.get( ExamesData.DATA ); - ht.put( EXAMES_DATA, data != null ? df.format( data ) : "" ); - tipo = (Integer)exame.get( ExamesData.TIPO ); - ht.put( TIPO_ADMISSAO, SQUARE ); - ht.put( TIPO_PERIODICO, SQUARE ); - ht.put( TIPO_OCASIONAL, SQUARE ); - - ht.put( TIPO_APOS_DOENCA, SQUARE ); - ht.put( TIPO_APOS_ACIDENTE, SQUARE ); - ht.put( TIPO_PEDIDO_TRABALHADOR, SQUARE ); - ht.put( TIPO_PEDIDO_EMPRESA, SQUARE ); - ht.put( TIPO_MUDANCA_FUNCAO, SQUARE ); - ht.put( TIPO_TRABALHO, SQUARE ); - ht.put( TIPO_OUTRO, SQUARE ); - - switch( tipo.intValue() ) - { - case 1: - ht.put( TIPO_ADMISSAO, CHECKED ); - break; - case 2: - ht.put( TIPO_PERIODICO, CHECKED ); - break; - case 3: - ht.put( TIPO_OCASIONAL, CHECKED ); - tipo = (Integer)exame.get( ExamesData.OCASIONAL ); - - switch( tipo.intValue() ) - { - case 1: - ht.put( TIPO_APOS_DOENCA, CHECKED ); - break; - case 2: - ht.put( TIPO_APOS_ACIDENTE, CHECKED ); - break; - case 3: - ht.put( TIPO_PEDIDO_TRABALHADOR, CHECKED ); - break; - case 4: - ht.put( TIPO_PEDIDO_EMPRESA, CHECKED ); - break; - case 5: - ht.put( TIPO_MUDANCA_FUNCAO, CHECKED ); - break; - case 6: - ht.put( TIPO_TRABALHO, CHECKED ); - break; - case 10: - ht.put( TIPO_OUTRO, CHECKED ); - break; - } - break; -// case 4: -// aux = (String)exame.get( ExamesData.OUTRO_TIPO ); -// ht.put( "tipo_outro", aux != null ? aux : "" ); -// break; - } - aux = (String)exame.get( ExamesData.OUTRO_TIPO ); - ht.put( TIPO_OUTRO_TEXTO, aux != null ? aux : "" ); - tipo = (Integer)exame.get( ExamesData.RESULTADO ); - ht.put( RESULTADO_APTO, SQUARE ); - ht.put( RESULTADO_APTO_CONDICIONALMENTE, SQUARE ); - ht.put( RESULTADO_INAPTO_TEMP, SQUARE ); - ht.put( RESULTADO_INAPTO_DEF, SQUARE ); - switch( tipo.intValue() ) - { - case 1: - ht.put( RESULTADO_APTO, CHECKED ); - break; - case 2: - ht.put( RESULTADO_APTO_CONDICIONALMENTE, CHECKED ); - break; - case 3: - ht.put( RESULTADO_INAPTO_TEMP, CHECKED ); - break; - case 4: - ht.put( RESULTADO_INAPTO_DEF, CHECKED ); - break; - } - aux = (String)exame.get( ExamesData.OUTRA_FUNCAO_1 ); - ht.put( OUTRA_FUNCAO_1, aux != null ? aux : "" ); - aux = (String)exame.get( ExamesData.OUTRA_FUNCAO_2 ); - ht.put( OUTRA_FUNCAO_2, aux != null ? aux : "" ); - aux = (String)exame.get( ExamesData.OUTRA_FUNCAO_3 ); - ht.put( OUTRA_FUNCAO_3, aux != null ? aux : "" ); - aux = (String)exame.get( ExamesData.OUTRA_FUNCAO_4 ); - ht.put( OUTRA_FUNCAO_4, aux != null ? aux : "" ); - aux = (String)exame.get( ExamesData.OUTRAS_RECOMENDACOES ); - ht.put( OUTRAS_RECOMENDACOES, aux != null ? aux : "" ); - data = ( Date )exame.get( ExamesData.PROXIMO_EXAME ); - ht.put( PROXIMO_EXAME, data != null ? df.format( data ) : "n/d" ); - aux = (String)medico.get( MedicosData.NOME ); - ht.put( MEDICOS_NOME, aux != null ? aux : "" ); - aux = (String)medico.get( MedicosData.NUMERO_CEDULA ); - ht.put( NUMERO_CEDULA, aux != null ? aux : "" ); - return ht; - } - - private byte[] createXmlFromExame(final ExamesData exame) - throws Exception - { - MedicosData medico = exame.toMedico_id(); - TrabalhadoresData trabalhador = exame.toTrabalhador_id(); - EstabelecimentosData estabelecimento = trabalhador.toEstabelecimento_id(); - EmpresasData empresa = estabelecimento.toEmpresa_id(); - - Element rootElement = new Element( "FichaAptidao" ); - Element portariaElement = new Element( "portaria" ); - portariaElement.setText( "Portaria n. 299/2007, de 16 de Mar\u00e7o" ); - rootElement.addContent( portariaElement ); - - Element empresaElement = new Element( "empresa" ); - Element designacaoSocialEmpresaElement = new Element( "designacao-social" ); - designacaoSocialEmpresaElement.setText( ( String )empresa.get( EmpresasData.DESIGNACAO_SOCIAL ) ); - empresaElement.addContent( designacaoSocialEmpresaElement ); - rootElement.addContent( empresaElement ); - - Integer tipoServicoSaude = (Integer)empresa.get( EmpresasData.SERVICO_SAUDE_TIPO ); - Integer tipoServicoHigieneSeguranca = (Integer)empresa.get( EmpresasData.SERVICO_HIGIENE_TIPO ); - Element estabelecimentoElement = new Element( "estabelecimento" ); - Element nomeEstabelecimentoElement = new Element( "nome" ); - nomeEstabelecimentoElement.setText( ( String )estabelecimento.get( EstabelecimentosData.NOME ) ); - estabelecimentoElement.addContent( nomeEstabelecimentoElement ); - Element localidadeEstabelecimentoElement = new Element( "localidade" ); - localidadeEstabelecimentoElement.setText( ( String )estabelecimento.get( EstabelecimentosData.LOCALIDADE ) ); - estabelecimentoElement.addContent( localidadeEstabelecimentoElement ); - Element servicoSaudeEstabelecimentoElement = new Element( "servico-saude" ); - Element tipoServicoSaudeEstabelecimentoElement = new Element( "tipo" ); - Element internoTipoServicoSaudeEstabelecimentoElement = new Element( "interno" ); - internoTipoServicoSaudeEstabelecimentoElement.setText( tipoServicoSaude.intValue() == 1 ? "y" : "n" ); - tipoServicoSaudeEstabelecimentoElement.addContent( internoTipoServicoSaudeEstabelecimentoElement ); - Element interempresasTipoServicoSaudeEstabelecimentoElement = new Element( "interempresas" ); - interempresasTipoServicoSaudeEstabelecimentoElement.setText( tipoServicoSaude.intValue() == 2 ? "y" : "n" ); - tipoServicoSaudeEstabelecimentoElement.addContent( interempresasTipoServicoSaudeEstabelecimentoElement ); - Element externoTipoServicoSaudeEstabelecimentoElement = new Element( "externo" ); - externoTipoServicoSaudeEstabelecimentoElement.setText( tipoServicoSaude.intValue() == 3 ? "y" : "n" ); - tipoServicoSaudeEstabelecimentoElement.addContent( externoTipoServicoSaudeEstabelecimentoElement ); - Element snsTipoServicoSaudeEstabelecimentoElement = new Element( "sns" ); - snsTipoServicoSaudeEstabelecimentoElement.setText( tipoServicoSaude.intValue() == 4 ? "y" : "n" ); - tipoServicoSaudeEstabelecimentoElement.addContent( snsTipoServicoSaudeEstabelecimentoElement ); - servicoSaudeEstabelecimentoElement.addContent( tipoServicoSaudeEstabelecimentoElement ); - Element designacaoServicoSaudeEstabelecimentoElement = new Element( "designacao" ); - designacaoServicoSaudeEstabelecimentoElement.setText( ( String )empresa.get( EmpresasData.SERVICO_SAUDE_DESIGNACAO ) ); - servicoSaudeEstabelecimentoElement.addContent( designacaoServicoSaudeEstabelecimentoElement ); - estabelecimentoElement.addContent( servicoSaudeEstabelecimentoElement ); - Element servicoHigieneSegurancaEstabelecimentoElement = new Element( "servico-higiene-seguranca" ); - Element tipoServicoHigieneSegurancaEstabelecimentoElement = new Element( "tipo" ); - Element internoTipoServicoHigieneSegurancaEstabelecimentoElement = new Element( "interno" ); - internoTipoServicoHigieneSegurancaEstabelecimentoElement.setText( tipoServicoHigieneSeguranca.intValue() == 1 ? "y" : "n" ); - tipoServicoHigieneSegurancaEstabelecimentoElement.addContent( internoTipoServicoHigieneSegurancaEstabelecimentoElement ); - Element interempresasTipoServicoHigieneSegurancaEstabelecimentoElement = new Element( "interempresas" ); - interempresasTipoServicoHigieneSegurancaEstabelecimentoElement.setText( tipoServicoHigieneSeguranca.intValue() == 2 ? "y" : "n" ); - tipoServicoHigieneSegurancaEstabelecimentoElement.addContent( interempresasTipoServicoHigieneSegurancaEstabelecimentoElement ); - Element externoTipoServicoHigieneSegurancaEstabelecimentoElement = new Element( "externo" ); - externoTipoServicoHigieneSegurancaEstabelecimentoElement.setText( tipoServicoHigieneSeguranca.intValue() == 3 ? "y" : "n" ); - tipoServicoHigieneSegurancaEstabelecimentoElement.addContent( externoTipoServicoHigieneSegurancaEstabelecimentoElement ); - Element outroTipoServicoHigieneSegurancaEstabelecimentoElement = new Element( "outro" ); - outroTipoServicoHigieneSegurancaEstabelecimentoElement.setText( tipoServicoHigieneSeguranca.intValue() == 4 ? "y" : "n" ); - tipoServicoHigieneSegurancaEstabelecimentoElement.addContent( outroTipoServicoHigieneSegurancaEstabelecimentoElement ); - servicoHigieneSegurancaEstabelecimentoElement.addContent( tipoServicoHigieneSegurancaEstabelecimentoElement ); - Element designacaoServicoHigieneSegurancaEstabelecimentoElement = new Element( "designacao" ); - designacaoServicoHigieneSegurancaEstabelecimentoElement.setText( ( String )empresa.get( EmpresasData.SERVICO_HIGIENE_DESIGNACAO ) ); - servicoHigieneSegurancaEstabelecimentoElement.addContent( designacaoServicoHigieneSegurancaEstabelecimentoElement ); - estabelecimentoElement.addContent( servicoHigieneSegurancaEstabelecimentoElement ); - rootElement.addContent( estabelecimentoElement ); - - char sexo = ( (String)trabalhador.get( TrabalhadoresData.SEXO ) ).charAt( 0 ); - DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT ); - Date dataNascimento = ( Date )trabalhador.get( TrabalhadoresData.DATA_NASCIMENTO ); - Date dataAdmissao = ( Date )trabalhador.get( TrabalhadoresData.DATA_ADMISSAO ); - Date dataAdmissaoFuncao = ( Date )trabalhador.get( TrabalhadoresData.DATA_ADMISSAO_FUNCAO ); - Element trabalhadorElement = new Element( "trabalhador" ); - Element nomeTrabalhadorElement = new Element( "nome" ); - nomeTrabalhadorElement.setText( ( String )trabalhador.get( TrabalhadoresData.NOME ) ); - Element sexoTrabalhadorElement = new Element( "sexo" ); - sexoTrabalhadorElement.setText( sexo == 'm' ? "Masculino" : "Feminino" ); - trabalhadorElement.addContent( sexoTrabalhadorElement ); - Element dataNascimentoTrabalhadorElement = new Element( "data-nascimento" ); - dataNascimentoTrabalhadorElement.setText( dataNascimento != null ? df.format( dataNascimento ) : "" ); - trabalhadorElement.addContent( dataNascimentoTrabalhadorElement ); - Element nacionalidadeTrabalhadorElement = new Element( "nacionalidade" ); - nacionalidadeTrabalhadorElement.setText( (String)trabalhador.get( TrabalhadoresData.NACIONALIDADE ) ); - trabalhadorElement.addContent( nacionalidadeTrabalhadorElement ); - trabalhadorElement.addContent( nomeTrabalhadorElement ); - Element numeroMecanograficoTrabalhadorElement = new Element( "numero-mecanografico" ); - numeroMecanograficoTrabalhadorElement.setText( (String)trabalhador.get( TrabalhadoresData.NUMERO_MECANOGRAFICO ) ); - trabalhadorElement.addContent( numeroMecanograficoTrabalhadorElement ); - Element dataAdmissaoTrabalhadorElement = new Element( "data-admissao" ); - dataAdmissaoTrabalhadorElement.setText( dataAdmissao != null ? df.format( dataAdmissao ) : "" ); - trabalhadorElement.addContent( dataAdmissaoTrabalhadorElement ); - Element categoriaProfissionalTrabalhadorElement = new Element( "categoria-profissional" ); - categoriaProfissionalTrabalhadorElement.setText( (String)trabalhador.get( TrabalhadoresData.CATEGORIA ) ); - trabalhadorElement.addContent( categoriaProfissionalTrabalhadorElement ); - Element localTrabalhoTrabalhadorElement = new Element( "local-trabalho" ); - localTrabalhoTrabalhadorElement.setText( (String)trabalhador.get( TrabalhadoresData.LOCAL_TRABALHO ) ); - trabalhadorElement.addContent( localTrabalhoTrabalhadorElement ); - Element funcaoPropostaTrabalhadorElement = new Element( "funcao-proposta" ); - funcaoPropostaTrabalhadorElement.setText( (String)trabalhador.get( TrabalhadoresData.FUNCAO_PROPOSTA ) ); - Element dataAdmissaoFuncaoTrabalhadorElement = new Element( "data-admissao-funcao" ); - dataAdmissaoFuncaoTrabalhadorElement.setText( dataAdmissaoFuncao != null ? df.format( dataAdmissaoFuncao ) : "" ); - trabalhadorElement.addContent( dataAdmissaoFuncaoTrabalhadorElement ); - trabalhadorElement.addContent( funcaoPropostaTrabalhadorElement ); - rootElement.addContent( trabalhadorElement ); - - Element observacoesElement = new Element( "observacoes" ); - observacoesElement.setText( (String)trabalhador.get( TrabalhadoresData.OBSERVACOES ) ); - rootElement.addContent( observacoesElement ); - - Date dataExameMedico = ( Date )exame.get( ExamesData.DATA ); - Integer tipoExameMedico = (Integer)exame.get( ExamesData.TIPO ); - Integer tipoOcasionalExameMedico = (Integer)exame.get( ExamesData.OCASIONAL ); - Integer resultadoExameMedico = (Integer)exame.get( ExamesData.RESULTADO ); - Element exameMedicoElement = new Element( "exame-medico" ); - Element dataExameMedicoElement = new Element( "data" ); - dataExameMedicoElement.setText( dataExameMedico != null ? df.format( dataExameMedico ) : "" ); - exameMedicoElement.addContent( dataExameMedicoElement ); - Element tipoExameMedicoElement = new Element( "tipo" ); - Element admissaoTipoExameMedicoElement = new Element( "admissao" ); - admissaoTipoExameMedicoElement.setText( tipoExameMedico.intValue() == 1 ? "y" : "n" ); - tipoExameMedicoElement.addContent( admissaoTipoExameMedicoElement ); - Element periodicoTipoExameMedicoElement = new Element( "periodico" ); - periodicoTipoExameMedicoElement.setText( tipoExameMedico.intValue() == 2 ? "y" : "n" ); - tipoExameMedicoElement.addContent( periodicoTipoExameMedicoElement ); - Element ocasionalTipoExameMedicoElement = new Element( "ocasional" ); - ocasionalTipoExameMedicoElement.setText( tipoExameMedico.intValue() == 3 ? "y" : "n" ); - tipoExameMedicoElement.addContent( ocasionalTipoExameMedicoElement ); - Element ocasionalDoencaTipoExameMedicoElement = new Element( "ocasional-doenca" ); - ocasionalDoencaTipoExameMedicoElement.setText( - ( tipoExameMedico.intValue() == 3 && tipoOcasionalExameMedico != null && tipoOcasionalExameMedico.intValue() == 1 ) ? "y" : "n" ); - tipoExameMedicoElement.addContent( ocasionalDoencaTipoExameMedicoElement ); - Element ocasionalAcidenteTipoExameMedicoElement = new Element( "ocasional-acidente" ); - ocasionalAcidenteTipoExameMedicoElement.setText( - ( tipoExameMedico.intValue() == 3 && tipoOcasionalExameMedico != null && tipoOcasionalExameMedico.intValue() == 2 ) ? "y" : "n" ); - tipoExameMedicoElement.addContent( ocasionalAcidenteTipoExameMedicoElement ); - Element ocasionalPedidoTrabalhadorTipoExameMedicoElement = new Element( "ocasional-pedido-trabalhador" ); - ocasionalPedidoTrabalhadorTipoExameMedicoElement.setText( - ( tipoExameMedico.intValue() == 3 && tipoOcasionalExameMedico != null && tipoOcasionalExameMedico.intValue() == 3 ) ? "y" : "n" ); - tipoExameMedicoElement.addContent( ocasionalPedidoTrabalhadorTipoExameMedicoElement ); - Element ocasionalPedidoServicoTipoExameMedicoElement = new Element( "ocasional-pedido-servico" ); - ocasionalPedidoServicoTipoExameMedicoElement.setText( - ( tipoExameMedico.intValue() == 3 && tipoOcasionalExameMedico != null && tipoOcasionalExameMedico.intValue() == 4 ) ? "y" : "n" ); - tipoExameMedicoElement.addContent( ocasionalPedidoServicoTipoExameMedicoElement ); - Element ocasionalMudancaoFuncaoTipoExameMedicoElement = new Element( "ocasional-mudanca-funcao" ); - ocasionalMudancaoFuncaoTipoExameMedicoElement.setText( - ( tipoExameMedico.intValue() == 3 && tipoOcasionalExameMedico != null && tipoOcasionalExameMedico.intValue() == 5 ) ? "y" : "n" ); - tipoExameMedicoElement.addContent( ocasionalMudancaoFuncaoTipoExameMedicoElement ); - Element ocasionalAlteracaoCondicoesTrabalhoTipoExameMedicoElement = new Element( "ocasional-alteracao-condicoes-trabalho" ); - ocasionalAlteracaoCondicoesTrabalhoTipoExameMedicoElement.setText( - ( tipoExameMedico.intValue() == 3 && tipoOcasionalExameMedico != null && tipoOcasionalExameMedico.intValue() == 6 ) ? "y" : "n" ); - tipoExameMedicoElement.addContent( ocasionalAlteracaoCondicoesTrabalhoTipoExameMedicoElement ); - Element ocasionalOutroTipoExameMedicoElement = new Element( "ocasional-outro" ); - ocasionalOutroTipoExameMedicoElement.setText( - ( tipoExameMedico.intValue() == 3 && tipoOcasionalExameMedico != null && tipoOcasionalExameMedico.intValue() == 10 ) ? "y" : "n" ); - tipoExameMedicoElement.addContent( ocasionalOutroTipoExameMedicoElement ); - Element ocasionalOutroDescricaoTipoExameMedicoElement = new Element( "ocasional-outro-descricao" ); - ocasionalOutroDescricaoTipoExameMedicoElement.setText( (String)exame.get( ExamesData.OUTRO_TIPO ) ); - tipoExameMedicoElement.addContent( ocasionalOutroDescricaoTipoExameMedicoElement ); - exameMedicoElement.addContent( tipoExameMedicoElement ); - Element resultadoExameMedicoElement = new Element( "resultado" ); - Element aptoResultadoExameMedicoElement = new Element( "apto" ); - aptoResultadoExameMedicoElement.setText( resultadoExameMedico.intValue() == 1 ? "y" : "n" ); - resultadoExameMedicoElement.addContent( aptoResultadoExameMedicoElement ); - Element aptoCondicionalmenteResultadoExameMedicoElement = new Element( "apto-condicionalmente" ); - aptoCondicionalmenteResultadoExameMedicoElement.setText( resultadoExameMedico.intValue() == 2 ? "y" : "n" ); - resultadoExameMedicoElement.addContent( aptoCondicionalmenteResultadoExameMedicoElement ); - Element inaptoTemporariamenteResultadoExameMedicoElement = new Element( "inapto-temporariamente" ); - inaptoTemporariamenteResultadoExameMedicoElement.setText( resultadoExameMedico.intValue() == 3 ? "y" : "n" ); - resultadoExameMedicoElement.addContent( inaptoTemporariamenteResultadoExameMedicoElement ); - Element inaptoDefinitivamenteResultadoExameMedicoElement = new Element( "inapto-definitivamente" ); - inaptoDefinitivamenteResultadoExameMedicoElement.setText( resultadoExameMedico.intValue() == 4 ? "y" : "n" ); - resultadoExameMedicoElement.addContent( inaptoDefinitivamenteResultadoExameMedicoElement ); - Element outrasFuncoes1ResultadoExameMedicoElement = new Element( "outras-funcoes-1" ); - outrasFuncoes1ResultadoExameMedicoElement.setText( (String)exame.get( ExamesData.OUTRA_FUNCAO_1 ) ); - resultadoExameMedicoElement.addContent( outrasFuncoes1ResultadoExameMedicoElement ); - Element outrasFuncoes2ResultadoExameMedicoElement = new Element( "outras-funcoes-2" ); - outrasFuncoes2ResultadoExameMedicoElement.setText( (String)exame.get( ExamesData.OUTRA_FUNCAO_2 ) ); - resultadoExameMedicoElement.addContent( outrasFuncoes2ResultadoExameMedicoElement ); - Element outrasFuncoes3ResultadoExameMedicoElement = new Element( "outras-funcoes-3" ); - outrasFuncoes3ResultadoExameMedicoElement.setText( (String)exame.get( ExamesData.OUTRA_FUNCAO_3 ) ); - resultadoExameMedicoElement.addContent( outrasFuncoes3ResultadoExameMedicoElement ); - Element outrasFuncoes4ResultadoExameMedicoElement = new Element( "outras-funcoes-4" ); - outrasFuncoes4ResultadoExameMedicoElement.setText( (String)exame.get( ExamesData.OUTRA_FUNCAO_4 ) ); - resultadoExameMedicoElement.addContent( outrasFuncoes4ResultadoExameMedicoElement ); - exameMedicoElement.addContent( resultadoExameMedicoElement ); - rootElement.addContent( exameMedicoElement ); - - Date dataProximoExame = ( Date )exame.get( ExamesData.PROXIMO_EXAME ); - Element proximoExameElement = new Element( "proximo-element" ); - proximoExameElement.setText( dataProximoExame != null ? df.format( dataProximoExame ) : "" ); - rootElement.addContent( proximoExameElement ); - - Element outrasRecomendacoesElement = new Element( "outras-recomendacoes" ); - outrasRecomendacoesElement.setText( (String)exame.get( ExamesData.OUTRAS_RECOMENDACOES ) ); - rootElement.addContent( outrasRecomendacoesElement ); - - Element medicoElement = new Element( "medico" ); - Element nomeMedicoElement = new Element( "nome" ); - nomeMedicoElement.setText( (String)medico.get( MedicosData.NOME ) ); - medicoElement.addContent( nomeMedicoElement ); - Element cedulaMedicoElement = new Element( "cedula" ); - cedulaMedicoElement.setText( (String)medico.get( MedicosData.NUMERO_CEDULA ) ); - medicoElement.addContent( cedulaMedicoElement ); - rootElement.addContent( medicoElement ); - - Document doc = new Document( rootElement ); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - new XMLOutputter().output( doc, baos ); - return baos.toByteArray(); - } - - private void excel() - { - FileDialog fd = new FileDialog( this, "Escolha um ficheiro Excel:", FileDialog.LOAD ); - fd.setDirectory( System.getProperty( "user.home" ) ); - fd.setFilenameFilter( new FilenameFilter() { - public boolean accept( File dir, String name ) - { - return (name!=null) && (name.indexOf( ".xls" ) != -1); - } - } ); - fd.setVisible( true ); - //String filename = "c:\\test.xls"; - String filename = fd.getFile(); - if( filename != null ) - { - filename = fd.getDirectory() + File.separator + filename; - try - { - Importer importer = new Importer( this, filename, false, Importer.TYPE_ADMISSAO ); - Hashtable hash = importer.getData(); - if( hash != null ) - { - trabalhadorPanel.setData( hash ); - } - } - catch( Exception ex ) - { - ex.printStackTrace(); - JOptionPane.showMessageDialog( this, "Erro a importar", "Erro...", JOptionPane.ERROR_MESSAGE ); - } - } - - } - - private void printOld() - { - if( trabalhadorID != null ) - { - Vector linhas; - try - { - IDObject fichas[] = fdpProvider.getAllFichasForTrabalhador( trabalhadorID ); - linhas = new Vector( Arrays.asList( fichas ) ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a criar lista de Fichas anteriores", true ); - return; - } - ListActionDialog dialog = new ListActionDialog( this, "Imprimir Fichas Anteriores", new String[]{ "Data" }, - linhas, this ); - dialog.setSize( 250, 200 ); - useFO = false; - dialog.setVisible( true ); - } - } - -// private void printOldFO() -// { -// if( trabalhadorID != null ) -// { -// Vector linhas; -// try -// { -// IDObject fichas[] = fdpProvider.getAllFichasForTrabalhador( trabalhadorID ); -// linhas = new Vector( Arrays.asList( fichas ) ); -// } -// catch( Exception ex ) -// { -// DialogException.showExceptionMessage( ex, "Erro a criar lista de Fichas anteriores", true ); -// return; -// } -// ListActionDialog dialog = new ListActionDialog( this, "Imprimir Fichas Anteriores", new String[]{ "Data" }, -// linhas, this ); -// dialog.setSize( 250, 200 ); -// useFO = true; -// dialog.setVisible( true ); -// } -// } - - public boolean executeListAction( int line, Object value ) - { - if( value != null ) - { - try - { -// if( useFO ) -// { -// ExamesData exame = (ExamesData) JDO.load( ExamesData.class, ( ( IDObject )value ).getID() ); -// if( exame == null ) -// { -// throw new Exception( "N\u00e3o existe exame" ); -// } -// byte fo[] = (byte[]) exame.get( ExamesData.FO ); -// Printer.printFO( fo ); -// } -// else -// { - print( ( ( IDObject )value ).getID(), false ); -// } - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a imprimir Ficha", true ); - return false; - } - } - return true; - } - - public String getListActionName() - { - return "Imprimir"; - } - - private void delete( Integer exameID ) - throws Exception - { -// MetaObject exame = fdpProvider.load( fdpProvider.EXAMES, new DBKey( exameID ) ); - ExamesData exame = (ExamesData) JDO.load( ExamesData.class, exameID ); - if( exame == null ) - { - throw new Exception( "N\u00e3o existe exame" ); - } - if( JOptionPane.showConfirmDialog( this, - "Tem a certeza que quer apagar o exame de " + exame.get( ExamesData.DATA ) + "?", - "...", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null ) == 0 ) - { -// exame.set( ExamesData.INACTIVO, "y" ); -// exame.save(); - exame.delete(); - } - } - - - public void editTrabalhador( Integer trabalhadorID, SaveExameListener listener ) - { - System.out.println( "edit trabalhador: " + trabalhadorID ); - if( isVisible() ) - { - toFront(); - } - else - { - setVisible( true ); - } - imposedTrabalhadorID = trabalhadorID; - executeAction( NEW_INDEX ); - exameListener = listener; - } - - public void editTrabalhador( Integer trabalhadorID, Date ultimaConsulta, Integer motivoProcesso, SaveExameListener listener ) - { - editTrabalhador(trabalhadorID,listener); - examePanel.setup( ultimaConsulta, motivoProcesso ); - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/MedicoColumnizedObject.java b/trunk/SIPRPSoft/src/siprp/ficha/MedicoColumnizedObject.java deleted file mode 100644 index f8d64bbd..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/MedicoColumnizedObject.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * MedicoColumnizedObject.java - * - * Created on 12 de Abril de 2004, 11:53 - */ - -package siprp.ficha; - -import com.evolute.utils.tables.ColumnizedObject; - -/** - * - * @author fpalma - */ -public class MedicoColumnizedObject implements ColumnizedObject -{ - private Integer id; - private String nome; - private String numero; - - /** Creates a new instance of MedicoColumnizedObject */ - public MedicoColumnizedObject( Integer id, String nome, String numero ) - { - this.id = id; - this.nome = nome; - this.numero = numero; - } - - public Object getValue( int col ) - { - switch( col ) - { - case 0: - return nome; - - case 1: - return numero; - } - return null; - } - - public Integer getID() - { - return id; - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/MedicoEditor.java b/trunk/SIPRPSoft/src/siprp/ficha/MedicoEditor.java deleted file mode 100644 index 769a6fd6..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/MedicoEditor.java +++ /dev/null @@ -1,281 +0,0 @@ -/* - * MedicoEditor.java - * - * Created on 10 de Abril de 2004, 20:50 - */ - -package siprp.ficha; - -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Vector; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionListener; - -import shst.data.outer.MedicosData; -import siprp.FichaDataProvider; -import siprp.ui.SIPRPTabbedWindow; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.tables.BaseTable; -import com.evolute.utils.tables.VectorTableModel; -import com.evolute.utils.ui.CustomJDialog; -import com.evolute.utils.ui.DialogException; -import com.evolute.utils.ui.text.CopyPasteHandler; - -/** - * - * @author Administrator - */ -public class MedicoEditor extends CustomJDialog - implements ActionListener, ListSelectionListener -{ - - private ProviderInterface JDO; - private FichaDataProvider provider; - private BaseTable table; - private VectorTableModel model; - private JButton okButton; - private JButton cancelarButton; - private JButton novoButton; - private JTextField nomeText; - private JTextField numeroText; - private Integer id; - private boolean isNew = false; - - /** Creates a new instance of MedicoEditor */ - public MedicoEditor( SIPRPTabbedWindow owner ) - throws Exception - { - super( owner, true ); - provider = (FichaDataProvider)FichaDataProvider.getProvider(); - JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - setupComponents(); - } - - private void setupComponents() - throws Exception - { - setSize( 600, 300 ); - setResizable( false ); - setTitle( "Criar/Editar M\u00e9dico" ); - centerSuper(); - - model = new VectorTableModel( new String[]{ "Nome", "NC" } ); - table = new BaseTable( model ); - table.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); - JScrollPane scp = new JScrollPane(); - scp.setMinimumSize( new Dimension( 300, 200 ) ); - scp.setMaximumSize( new Dimension( 300, 200 ) ); - scp.setPreferredSize( new Dimension( 300, 200 ) ); - scp.setSize( new Dimension( 300, 200 ) ); - scp.setViewportView( table ); - scp.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); - scp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - table.fixColumnWidth( 0, 200 ); - table.setNonResizableNorReordable(); - table.getSelectionModel().addListSelectionListener( this ); - Object obj[][] = provider.getAllMedicos(); - Vector medicos = new Vector(); - for( int n = 0; n < obj.length; n++ ) - { - medicos.add( new MedicoColumnizedObject( (Integer)obj[n][0], - (String)obj[n][1], - (String)obj[n][2] ) ); - } - model.setValues( medicos ); - - okButton = new JButton( "OK" ); - cancelarButton = new JButton( "Cancelar" ); - novoButton = new JButton( "Novo" ); - okButton.addActionListener( this ); - cancelarButton.addActionListener( this ); - novoButton.addActionListener( this ); - - nomeText = new JTextField(); - nomeText.setEnabled( false ); - numeroText = new JTextField(); - numeroText.setEnabled( false ); - - GridBagLayout gridbag = new GridBagLayout(); - getContentPane().setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 1, 1, 1, 1 ); - constraints.fill = GridBagConstraints.BOTH; - constraints.weighty = 1; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = 1; - - JPanel upperPanel = new JPanel(); - upperPanel.setLayout( new GridLayout( 1, 2 ) ); - upperPanel.add( scp ); - JPanel textPanel = new JPanel(); - upperPanel.add( textPanel ); - gridbag.setConstraints( upperPanel, constraints ); - getContentPane().add( upperPanel ); - - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.weighty = 0; - constraints.weightx = 0.3; - constraints.gridwidth = 1; - constraints.gridheight = GridBagConstraints.REMAINDER;; - - gridbag.setConstraints( novoButton, constraints ); - getContentPane().add( novoButton ); - - gridbag.setConstraints( okButton, constraints ); - getContentPane().add( okButton ); - - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( cancelarButton, constraints ); - getContentPane().add( cancelarButton ); - - gridbag = new GridBagLayout(); - textPanel.setLayout( gridbag ); - constraints.weighty = 0; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.gridheight = 1; - - JLabel nomeLabel = new JLabel( "Nome" ); - gridbag.setConstraints( nomeLabel, constraints ); - textPanel.add( nomeLabel ); - - gridbag.setConstraints( nomeText, constraints ); - textPanel.add( nomeText ); - - JLabel numeroLabel = new JLabel( "N\u00famero" ); - gridbag.setConstraints( numeroLabel, constraints ); - textPanel.add( numeroLabel ); - - gridbag.setConstraints( numeroText, constraints ); - textPanel.add( numeroText ); - - constraints.weighty = 1; - constraints.gridheight = GridBagConstraints.REMAINDER;; - JPanel pad = new JPanel(); - gridbag.setConstraints( pad, constraints ); - textPanel.add( pad ); - - new CopyPasteHandler( nomeText ); - new CopyPasteHandler( numeroText ); - } - - public void actionPerformed( ActionEvent e ) - { - if( e.getSource().equals( okButton ) ) - { - if( save() ) - { - close(); - } - } - else if( e.getSource().equals( cancelarButton ) ) - { - close(); - } - if( e.getSource().equals( novoButton ) ) - { - table.getSelectionModel().removeListSelectionListener( this ); - nomeText.setText( "" ); - numeroText.setText( "" ); - nomeText.setEnabled( true ); - numeroText.setEnabled( true ); - id = null; - isNew = true; - } - } - - public void valueChanged(javax.swing.event.ListSelectionEvent listSelectionEvent) - { - int selected = table.getSelectedRow(); - if( selected == -1 ) - { - return; - } - MedicoColumnizedObject row = (MedicoColumnizedObject)model.getRowAt( selected ); - id = row.getID(); - String nome = (String) row.getValue( 0 ); - String numero = (String) row.getValue( 1 ); - nomeText.setText( nome ); - numeroText.setText( numero ); - nomeText.setEnabled( true ); - numeroText.setEnabled( true ); - } - - private void close() - { - setVisible( false ); - dispose(); - } - - public boolean getIsNew() - { - return isNew; - } - - public Integer getID() - { - return id; - } - - private boolean save() - { - String nome = nomeText.getText().trim(); - String numero = numeroText.getText().trim(); - if( nome.length() == 0 ) - { - JOptionPane.showMessageDialog( this, "O Nome n\u00e3o pode ser vazio.", "Erro...", - JOptionPane.ERROR_MESSAGE ); - return false; - } - try - { - MedicosData medico; - if( id != null ) - { - medico = ( MedicosData ) JDO.load( MedicosData.class, id ); -// medico = provider.load( provider.MEDICOS, new DBKey( id ) ); - } - else - { - medico = new MedicosData(); -// medico = provider.createObject( provider.MEDICOS ); - } -// medico.setProperty( provider.NOME, nome ); -// medico.setProperty( provider.NUMERO_CEDULA, numero ); - medico.set( MedicosData.NOME, nome ); - medico.set( MedicosData.NUMERO_CEDULA, numero ); - medico.save(); - if( id == null ) - { -// DBKey key = medico.getPrimaryKeyValue(); -// DBField fields[] = provider.MEDICOS.getPrimaryKey(); -// id = new Integer( ((Number)key.getFieldValue( fields[ 0 ] )).intValue() ); - id = (Integer)medico.get( MedicosData.ID ); - } - } - catch( Exception ex ) - { -// JOptionPane.showMessageDialog( this, "Erro a gravar...", "Erro...", -// JOptionPane.ERROR_MESSAGE ); - DialogException.showExceptionMessage( ex, "Erro a gravar...", false ); - return false; - } - return true; - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/ObservacoesPanel.java b/trunk/SIPRPSoft/src/siprp/ficha/ObservacoesPanel.java deleted file mode 100644 index dce49b45..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/ObservacoesPanel.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ObservacoesPanel.java - * - * Created on 29 de Marco de 2004, 11:56 - */ - -package siprp.ficha; - -import java.awt.GridLayout; - -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import shst.data.outer.TrabalhadoresData; -import siprp.FichaDataProvider; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.dataui.ControllableComponent; -import com.evolute.utils.documents.MaximumLengthDocument; -import com.evolute.utils.ui.text.CopyPasteHandler; -/** - * - * @author fpalma - */ -public class ObservacoesPanel extends JPanel - implements ControllableComponent -{ - private ProviderInterface JDO; - - private JTextField observacoesText; - - private FichaDataProvider provider; - - /** Creates a new instance of ObservacoesPanel */ - public ObservacoesPanel() - throws Exception - { - provider = (FichaDataProvider)FichaDataProvider.getProvider(); - JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - setupComponents(); - } - - private void setupComponents() - { - setBorder( BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(), - "Observa\u00e7\u00f5es" ) ); - -// JScrollPane scp = new JScrollPane(); -// scp.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); -// scp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - observacoesText = new JTextField(); - observacoesText.setDocument( new MaximumLengthDocument( 150 ) ); -// observacoesText.setLineWrap( true ); -// observacoesText.setWrapStyleWord( true ); -// scp.setViewportView( observacoesText ); - - setLayout( new GridLayout( 1, 1, 0, 0 ) ); - add( observacoesText ); - - new CopyPasteHandler( observacoesText ); - } - - public void fill(Object value) - { - clear(); - Integer trabalhadorID = (Integer)value; - if( trabalhadorID != null ) - { - - try - { - TrabalhadoresData trabalhador = (TrabalhadoresData)JDO.load( TrabalhadoresData.class, trabalhadorID ); - String observacoes = (String) trabalhador.get( TrabalhadoresData.OBSERVACOES ); - if( observacoes != null ) - { - observacoesText.setText( observacoes ); - } - } - catch( Exception ex ) - { - ex.printStackTrace(); - } - } - } - - public Object save() - { - return observacoesText.getText(); - } - - public void clear() - { - observacoesText.setText( "" ); - } - - public void setEnabled( boolean enable ) - { - observacoesText.setEnabled( enable ); - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/PDFFilePrinter.java b/trunk/SIPRPSoft/src/siprp/ficha/PDFFilePrinter.java deleted file mode 100644 index a3e0b5ea..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/PDFFilePrinter.java +++ /dev/null @@ -1,57 +0,0 @@ -package siprp.ficha; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.print.PageFormat; -import java.nio.ByteBuffer; - -import com.evolute.utils.print.A4ContinuoPage; -import com.evolute.utils.print.AbstractPrintHandler; -import com.sun.pdfview.PDFFile; -import com.sun.pdfview.PDFPage; -import com.sun.pdfview.PDFRenderer; - -public class PDFFilePrinter extends AbstractPrintHandler -{ - protected byte pdf[]; - protected PDFFile pdffile; - - public PDFFilePrinter(byte pdf[], boolean printDialog ) - throws Exception - { - super( new A4ContinuoPage(), printDialog ); - - this.pdf = pdf; - ByteBuffer buffer = ByteBuffer.allocate( pdf.length ); - buffer.put( pdf ); -// - -// File file = new File("/home/fpalma/Desktop/icons_op.pdf"); -// -// // set up the PDF reading -// RandomAccessFile raf = new RandomAccessFile(file, "r"); -// FileChannel channel = raf.getChannel(); -// ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); - pdffile = new PDFFile(buffer); - setNumberOfPages( pdffile.getNumPages() ); - print(); - } - - protected void paintGraphics( Graphics g, PageFormat pf, int index ) - { - try - { - PDFPage page = pdffile.getPage( index ); - PDFRenderer renderer = new PDFRenderer(page, ( Graphics2D ) g, - new Rectangle(0, 0,(int) page.getWidth(), (int) page.getHeight()), null, Color.RED); - page.waitForFinish(); - renderer.run(); - } - catch( Exception ex ) - { - ex.printStackTrace(); - } - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/RecomendacoesPanel.java b/trunk/SIPRPSoft/src/siprp/ficha/RecomendacoesPanel.java deleted file mode 100644 index 2e387342..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/RecomendacoesPanel.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * RecomendacoesPanel.java - * - * Created on 29 de Marco de 2004, 11:58 - */ - -package siprp.ficha; - -import java.awt.BorderLayout; -import java.awt.GridLayout; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -import com.evolute.utils.documents.MaximumLengthDocument; -import com.evolute.utils.ui.calendar.JCalendarPanel; -import com.evolute.utils.ui.text.CopyPasteHandler; - -/** - * - * @author fpalma - */ -public class RecomendacoesPanel extends JPanel -{ - private JTextArea recomendacoesText; - private JCalendarPanel proximoExamePanel; - /** Creates a new instance of RecomendacoesPanel */ - public RecomendacoesPanel() - { - setupComponents(); - } - - private void setupComponents() - { - setBorder( BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(), - "Outras Recomenda\u00e7\u00f5es" ) ); - - JScrollPane scp = new JScrollPane(); - scp.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); - scp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - recomendacoesText = new JTextArea(); - recomendacoesText.setLineWrap( true ); - recomendacoesText.setWrapStyleWord( true ); - recomendacoesText.setDocument( new MaximumLengthDocument( 150 ) ); - scp.setViewportView( recomendacoesText ); - JPanel rightPanel = new JPanel(); - JLabel proximoExameLabel = new JLabel( "Pr\u00f3ximo Exame" ); - proximoExamePanel = new JCalendarPanel( null ); - - setLayout( new GridLayout( 1, 2, 0, 0 ) ); - add( scp ); - add( rightPanel ); - - rightPanel.setLayout( new BorderLayout() ); - rightPanel.add( proximoExameLabel, BorderLayout.WEST ); - rightPanel.add( proximoExamePanel, BorderLayout.CENTER ); - - new CopyPasteHandler( recomendacoesText ); - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/SaveExameListener.java b/trunk/SIPRPSoft/src/siprp/ficha/SaveExameListener.java deleted file mode 100644 index ccb16da8..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/SaveExameListener.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * SaveExameListener.java - * - * Created on May 17, 2007, 12:33 PM - * - * To change this template, choose Tools | Template Manager - * and open the template in the editor. - */ - -package siprp.ficha; - -/** - * - * @author lflores - */ -public interface SaveExameListener -{ - public void exameSaved( Integer trabalhadorID, Integer exameID ); -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/TrabalhadorPanel.java b/trunk/SIPRPSoft/src/siprp/ficha/TrabalhadorPanel.java deleted file mode 100644 index 0b260c80..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/TrabalhadorPanel.java +++ /dev/null @@ -1,470 +0,0 @@ -/* - * TrabalhadorPanel.java - * - * Created on 29 de Marco de 2004, 11:55 - */ - -package siprp.ficha; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.util.Hashtable; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import shst.data.outer.TrabalhadoresData; -import shst.importer.Importer; -import siprp.FichaDataProvider; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.data.MappableObject; -import com.evolute.utils.dataui.ComponentController; -import com.evolute.utils.dataui.ComponentsHashtable; -import com.evolute.utils.dataui.ControllableComponent; -import com.evolute.utils.date.DateUtils; -import com.evolute.utils.ui.DialogException; -import com.evolute.utils.ui.calendar.JCalendarPanel; -import com.evolute.utils.ui.panel.RadioButtonFixedPanel; -import com.evolute.utils.ui.panel.RadioButtonPanel; -import com.evolute.utils.ui.text.CopyPasteHandler; -/** - * - * @author fpalma - */ -public class TrabalhadorPanel extends JPanel - implements ControllableComponent -{ - private ProviderInterface JDO; - private JTextField nomeText; - private RadioButtonFixedPanel sexoPanel; - private JCalendarPanel dataNascimentoPanel; - private JTextField nacionalidadeText; - private JTextField numeroMecanograficoText; - private JCalendarPanel dataAdmissaoPanel; - private JTextField categoriaText; - private JTextField localText; - private JTextField funcaoText; - private JCalendarPanel dataAdmissaoFuncaoPanel; - - private ComponentsHashtable components; - private FichaDataProvider provider; - private TrabalhadoresData trabalhador; - - /** Creates a new instance of TrabalhadorPanel */ - - public TrabalhadorPanel() - throws Exception - { - provider = (FichaDataProvider)FichaDataProvider.getProvider(); - JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - setupComponents(); - setupComponentsHashtable(); - } - - - private void setupComponents() - { - setBorder( BorderFactory.createTitledBorder( - BorderFactory.createEtchedBorder(), - "Trabalhador" ) ); - JLabel nomeLabel = new JLabel( "Nome" ); - nomeText = new JTextField(); - JLabel sexoLabel = new JLabel( "Sexo" ); - sexoPanel = - new RadioButtonFixedPanel( - new IDObject[]{ new MappableObject( new Integer( 1 ), "M" ), - new MappableObject( new Integer( 2 ), "F" ) }, - 1, 2, RadioButtonPanel.ORIENTATION_HORIZONTAL, false ); - JLabel dataNascimentoLabel = new JLabel( "Data de Nascimento" ); - dataNascimentoPanel = new JCalendarPanel( null ); - JLabel nacionalidadeLabel = new JLabel( "Nacionalidade" ); - nacionalidadeText = new JTextField(); - JLabel numeroMecanograficoLabel = new JLabel( "N\u00famero Mecanogr\u00e1fico/outro" ); - numeroMecanograficoText = new JTextField(); - JLabel dataAdmissaoLabel = new JLabel( "Data de Admiss\u00e3o" ); - dataAdmissaoPanel = new JCalendarPanel( null ); - JLabel categoriaLabel = new JLabel( "Categoria Profissional" ); - categoriaText = new JTextField(); - JLabel localLabel = new JLabel( "Local de Trabalho" ); - localText = new JTextField(); - JLabel funcaoLabel = new JLabel( "Fun\u00e7\u00e3o proposta" ); - funcaoText = new JTextField(); - JLabel dataAdmissaoFuncaoLabel = new JLabel( "Data de Admiss\u00e3o na Fun\u00e7\u00e3o" ); - dataAdmissaoFuncaoPanel = new JCalendarPanel( null ); - - GridBagLayout gridbag = new GridBagLayout(); - setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 0, 1, 0, 1 ); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.gridwidth = 1; - constraints.weightx = 0; - - gridbag.setConstraints( nomeLabel, constraints ); - add( nomeLabel ); - - constraints.weightx = 1; - constraints.gridwidth = 3; - gridbag.setConstraints( nomeText, constraints ); - add( nomeText ); - - constraints.gridwidth = 1; - constraints.weightx = 0; - gridbag.setConstraints( sexoLabel, constraints ); - add( sexoLabel ); - - constraints.weightx = 0; - //constraints.gridwidth = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( sexoPanel, constraints ); - add( sexoPanel ); - - constraints.weightx = 0; - constraints.gridwidth = 2; - gridbag.setConstraints( nacionalidadeLabel, constraints ); - add( nacionalidadeLabel ); - - constraints.weightx = 0.5; - constraints.gridwidth = 1; - gridbag.setConstraints( nacionalidadeText, constraints ); - add( nacionalidadeText ); - - constraints.weightx = 0; - constraints.gridwidth = 1; - gridbag.setConstraints( dataNascimentoLabel, constraints ); - add( dataNascimentoLabel ); - - constraints.weightx = 0.5; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( dataNascimentoPanel, constraints ); - add( dataNascimentoPanel ); - - constraints.weightx = 0; - constraints.gridwidth = 2; - gridbag.setConstraints( numeroMecanograficoLabel, constraints ); - add( numeroMecanograficoLabel ); - - constraints.weightx = 0.5; - constraints.gridwidth = 1; - gridbag.setConstraints( numeroMecanograficoText, constraints ); - add( numeroMecanograficoText ); - - constraints.weightx = 0; - constraints.gridwidth = 1; - gridbag.setConstraints( dataAdmissaoLabel, constraints ); - add( dataAdmissaoLabel ); - - constraints.weightx = 0.5; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( dataAdmissaoPanel, constraints ); - add( dataAdmissaoPanel ); - - constraints.weightx = 0; - constraints.gridwidth = 2; - gridbag.setConstraints( categoriaLabel, constraints ); - add( categoriaLabel ); - - constraints.weightx = 0.5; - constraints.gridwidth = 1; - gridbag.setConstraints( categoriaText, constraints ); - add( categoriaText ); - - constraints.weightx = 0; - gridbag.setConstraints( localLabel, constraints ); - add( localLabel ); - - constraints.weightx = 0.5; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( localText, constraints ); - add( localText ); - - constraints.weightx = 0; - constraints.gridwidth = 2; - gridbag.setConstraints( funcaoLabel, constraints ); - add( funcaoLabel ); - - constraints.weightx = 0.5; - constraints.gridwidth = 1; - gridbag.setConstraints( funcaoText, constraints ); - add( funcaoText ); - - constraints.weightx = 0; - constraints.gridwidth = 1; - gridbag.setConstraints( dataAdmissaoFuncaoLabel, constraints ); - add( dataAdmissaoFuncaoLabel ); - - constraints.weightx = 0.5; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( dataAdmissaoFuncaoPanel, constraints ); - add( dataAdmissaoFuncaoPanel ); - - new CopyPasteHandler( nomeText ); - new CopyPasteHandler( nacionalidadeText ); - new CopyPasteHandler( numeroMecanograficoText ); - new CopyPasteHandler( categoriaText ); - new CopyPasteHandler( localText ); - new CopyPasteHandler( funcaoText ); - } - - private void setupComponentsHashtable() - { - components = new ComponentsHashtable(); - components.putComponent( TrabalhadoresData.NOME, nomeText ); - components.putComponent( TrabalhadoresData.SEXO, new ControllableComponent() - { - public void fill( Object value ) - { - if( value != null && value.equals( "f" ) ) - { - sexoPanel.fill( new Integer(2) ); - } - else - { - sexoPanel.fill( new Integer(1) ); - } - } - - public Object save() - { - Integer id = (Integer)sexoPanel.save(); - if( id != null && id.intValue() == 1 ) - { - return "m"; - } - return "f"; - } - - public void clear() - { - sexoPanel.clear(); - } - - public void setEnabled( boolean enable ) - { - sexoPanel.setEnabled( enable ); - } - } ); - components.putComponent( TrabalhadoresData.DATA_NASCIMENTO, dataNascimentoPanel ); - components.putComponent( TrabalhadoresData.NACIONALIDADE, nacionalidadeText ); - components.putComponent( TrabalhadoresData.NUMERO_MECANOGRAFICO, numeroMecanograficoText ); - components.putComponent( TrabalhadoresData.DATA_ADMISSAO, dataAdmissaoPanel ); - components.putComponent( TrabalhadoresData.CATEGORIA, categoriaText ); - components.putComponent( TrabalhadoresData.LOCAL_TRABALHO, localText ); - components.putComponent( TrabalhadoresData.FUNCAO_PROPOSTA, funcaoText ); - components.putComponent( TrabalhadoresData.DATA_ADMISSAO_FUNCAO, dataAdmissaoFuncaoPanel ); - components.putDummy( TrabalhadoresData.DATA_DEMISSAO ); - components.putDummy( TrabalhadoresData.OBSERVACOES ); - components.putDummy( TrabalhadoresData.OBSERVACOES_GESTAO ); - components.putDummy( TrabalhadoresData.PERFIL ); - components.putDummy( TrabalhadoresData.TO_ESTABELECIMENTO_ID ); - components.putDummy( TrabalhadoresData.NOME_PLAIN ); - components.putDummy( TrabalhadoresData.BI ); - -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.NOME, nomeText ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.DATA_NASCIMENTO, dataNascimentoPanel ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.NACIONALIDADE, nacionalidadeText ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.NUMERO_MECANOGRAFICO, numeroMecanograficoText ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.DATA_ADMISSAO, dataAdmissaoPanel ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.CATEGORIA, categoriaText ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.LOCAL_TRABALHO, localText ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.FUNCAO_PROPOSTA, funcaoText ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.DATA_ADMISSAO_FUNCAO, dataAdmissaoFuncaoPanel ); -// components.putDummy( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.ESTABELECIMENTO_ID ); -// components.putDummy( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.OBSERVACOES ); -// components.putComponent( FichaDataProvider.T_TRABALHADORES + "." + FichaDataProvider.SEXO, -// new ControllableComponent() -// { -// public void fill( Object value ) -// { -// if( value != null && value.equals( "f" ) ) -// { -// sexoPanel.fill( new Integer(2) ); -// } -// else -// { -// sexoPanel.fill( new Integer(1) ); -// } -// } -// -// public Object save() -// { -// Integer id = (Integer)sexoPanel.save(); -// if( id != null && id.intValue() == 1 ) -// { -// return "m"; -// } -// return "f"; -// } -// -// public void clear() -// { -// sexoPanel.clear(); -// } -// -// public void setEnabled( boolean enable ) -// { -// sexoPanel.setEnabled( enable ); -// } -// } ); - } - - public void fill(Object value) - { - clear(); - trabalhador = null; - if( value != null ) - { - Integer trabalhadorID = (Integer)value; - if( trabalhadorID != null ) - { - try - { - trabalhador = ( TrabalhadoresData ) JDO.load( TrabalhadoresData.class, trabalhadorID ); -// String names[] = trabalhador.getFieldNames(); - ComponentController.fill( trabalhador.getHashData(), components ); -// trabalhador = provider.load( FichaDataProvider.TRABALHADORES, new DBKey( trabalhadorID ) ); -// DBField fields[] = FichaDataProvider.TRABALHADORES.getInsertFields(); -// String trabalhadorFields[] = new String[ fields.length ]; -// Hashtable data = new Hashtable(); -// for( int i = 0; i < trabalhadorFields.length; ++i ) -// { -// trabalhadorFields[ i ] = fields[ i ].FULL_NAME; -// Object fieldValue = trabalhador.getProperty( trabalhadorFields[ i ] ); -// if( fieldValue != null ) -// { -// data.put( trabalhadorFields[ i ], fieldValue ); -// } -// } -// ComponentController.fill( trabalhadorFields, data, components ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar os dados do trabalhador", true ); - } - } - } - - } - - public Object save() - { - StringBuffer msg = new StringBuffer(); - boolean hasMsg = false; - try - { - if( trabalhador == null ) - { -// trabalhador = provider.createObject( FichaDataProvider.TRABALHADORES ); - trabalhador = new TrabalhadoresData(); - trabalhador.set( TrabalhadoresData.PERFIL, new Integer( 1 ) ); - } - trabalhador.setHashData( ComponentController.save( components ) ); -// if( ((String)trabalhador.getProperty( FichaDataProvider.NOME )).trim().length() == 0 ) - if( ((String)trabalhador.get( TrabalhadoresData.NOME )).trim().length() == 0 ) - { - msg.append( "O trabalhador tem de ter nome\n" ); - hasMsg = true; - } -// if( trabalhador.getProperty( FichaDataProvider.SEXO ) == null ) - if( trabalhador.get( TrabalhadoresData.SEXO ) == null ) - { - msg.append( "O trabalhador tem de ter um sexo definido\n" ); - hasMsg = true; - } - } - catch( Exception ex ) - { - ex.printStackTrace(); - return null; - } - if( hasMsg ) - { - throw new ValuesException( msg.toString() ); - } - return trabalhador; - } - - public void clear() - { - String names[] = (String[])components.keySet().toArray( new String[0] ); - ComponentController.clear( names, components ); - trabalhador = null; - } - - public void setEnabled( boolean enable ) - { - String names[] = (String[])components.keySet().toArray( new String[0] ); - ComponentController.setEnabled( names, enable, components ); - } - - public void setData( Hashtable data ) - { - String nome = (String)data.get( Importer.NOME ); - if( nome != null && nome.trim().length() > 0 ) - { - nomeText.setText( nome ); - } - String sexo = (String)data.get( Importer.SEXO ); - if( sexo != null && sexo.trim().length() > 0 ) - { - Integer sexoInt; - if( sexo.trim().toLowerCase().charAt(0) == 'f' ) - { - sexoInt = new Integer( 2 ); - } - else - { - sexoInt = new Integer( 1 ); - } - sexoPanel.fill( sexoInt ); - } - String nacionalidade = (String)data.get( Importer.NACIONALIDADE ); - if( nacionalidade != null && nacionalidade.trim().length() > 0 ) - { - nacionalidadeText.setText( nacionalidade ); - } - String dataNascimento = (String)data.get( Importer.DATA_NASCIMENTO ); - if( dataNascimento != null ) - { - dataNascimentoPanel.setDate( DateUtils.guessDate( dataNascimento ) ); - } - String numeroMecanografico = (String)data.get( Importer.NUMERO_MECANOGRAFICO ); - if( numeroMecanografico != null && numeroMecanografico.trim().length() > 0 ) - { - numeroMecanograficoText.setText( numeroMecanografico ); - } - String dataAdmissao = (String)data.get( Importer.DATA_ADMISSAO ); - if( dataAdmissao != null ) - { - dataAdmissaoPanel.setDate( DateUtils.guessDate( dataAdmissao ) ); - } - String categoria = (String)data.get( Importer.CATEGORIA ); - if( categoria != null && categoria.trim().length() > 0 ) - { - categoriaText.setText( categoria ); - } - String localTrabalho = (String)data.get( Importer.LOCAL_TRABALHO ); - if( localTrabalho != null && localTrabalho.trim().length() > 0 ) - { - localText.setText( localTrabalho ); - } - String funcao = (String)data.get( Importer.FUNCAO ); - if( funcao != null && funcao.trim().length() > 0 ) - { - funcaoText.setText( funcao ); - } - String dataAdmissaoFuncao = (String)data.get( Importer.DATA_ADMISSAO_FUNCAO ); - if( dataAdmissaoFuncao != null ) - { - dataAdmissaoFuncaoPanel.setDate( DateUtils.guessDate( dataAdmissaoFuncao ) ); - } - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/UpperPanel.java b/trunk/SIPRPSoft/src/siprp/ficha/UpperPanel.java deleted file mode 100644 index 55b9eb89..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/UpperPanel.java +++ /dev/null @@ -1,305 +0,0 @@ -/* - * UpperPanel.java - * - * Created on 29 de Marco de 2004, 17:44 - */ - -package siprp.ficha; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ItemListener; -import java.util.Hashtable; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import shst.data.outer.EmpresasData; -import shst.data.outer.EstabelecimentosData; -import shst.data.outer.MedicosData; -import shst.data.outer.TrabalhadoresData; -import siprp.FichaDataProvider; -import siprp.ui.SIPRPTabbedWindow; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.data.MappableObject; -import com.evolute.utils.dataui.ControllableComponent; -import com.evolute.utils.ui.DialogException; -import com.evolute.utils.ui.text.CopyPasteHandler; - -/** - * - * @author fpalma - */ -public class UpperPanel extends JPanel - implements ControllableComponent< Object >, ItemListener -{ - protected ProviderInterface JDO; - - protected SIPRPTabbedWindow owner; - private JTextField empresaText; - private JTextField nomeText; - private JComboBox medicosCombo; - private JTextField cpText; - - private FichaDataProvider provider; - private Hashtable medicosHash; - - /** Creates a new instance of UpperPanel */ - public UpperPanel() - throws Exception - { - provider = (FichaDataProvider)FichaDataProvider.getProvider(); - medicosHash = new Hashtable(); - JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - setupComponents(); - } - - private void setupComponents() - throws Exception - { - JLabel empresaLabel = new JLabel( "Empresa/Entidade" ); - empresaText = new JTextField(); - empresaText.setEditable( false ); - JLabel nomeLabel = new JLabel( "Nome" ); - nomeText = new JTextField(); - nomeText.setEditable( false ); - JLabel medicoLabel = new JLabel( "M\u00e9dico" ); - medicosCombo = new JComboBox(); - JLabel cpLabel = new JLabel( "c.p." ); - cpText = new JTextField(); - cpText.setEditable( false ); - fillCombo(); - GridBagLayout gridbag = new GridBagLayout(); - setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 0, 1, 0, 1 ); - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.gridheight = 1; - constraints.weighty = 0; - - constraints.gridwidth = 1; - constraints.weightx = 0; - gridbag.setConstraints( empresaLabel, constraints ); - add( empresaLabel ); - - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.weightx = 1; - gridbag.setConstraints( empresaText, constraints ); - add( empresaText ); - - constraints.gridwidth = 1; - constraints.weightx = 0; - gridbag.setConstraints( nomeLabel, constraints ); - add( nomeLabel ); - - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.weightx = 1; - gridbag.setConstraints( nomeText, constraints ); - add( nomeText ); - - constraints.gridwidth = 1; - constraints.weightx = 0; - gridbag.setConstraints( medicoLabel, constraints ); - add( medicoLabel ); - - constraints.gridwidth = 1; - constraints.weightx = 0.8; - gridbag.setConstraints( medicosCombo, constraints ); - add( medicosCombo ); - - constraints.gridwidth = 1; - constraints.weightx = 0; - gridbag.setConstraints( cpLabel, constraints ); - add( cpLabel ); - - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.weightx = 0.2; - gridbag.setConstraints( cpText, constraints ); - add( cpText ); - - new CopyPasteHandler( empresaText ); - new CopyPasteHandler( nomeText ); - new CopyPasteHandler( cpText ); - } - - public void fill(Object value) - { - Integer values[] = (Integer[])value; - Integer empresaID = values[0]; - Integer estabelecimentoID = values[1]; - Integer trabalhadorID = values[2]; - clear(); - try - { - TrabalhadoresData trabalhador; - EstabelecimentosData estabelecimento; - EmpresasData empresa; - if( trabalhadorID != null ) - { - trabalhador = ( TrabalhadoresData ) JDO.load( TrabalhadoresData.class, trabalhadorID ); - String nome = (String) trabalhador.get( TrabalhadoresData.NOME ); - nomeText.setText( nome ); - } - String nomeEstabelecimento = ""; - if( estabelecimentoID != null ) - { - estabelecimento = ( EstabelecimentosData ) JDO.load( EstabelecimentosData.class, estabelecimentoID ); - nomeEstabelecimento = (String) estabelecimento.get( EstabelecimentosData.NOME ); - try - { - Integer medicoID = provider.getMedicoForEstabelecimento( estabelecimentoID ); - if( medicoID != null && medicoID.intValue() > -1 ) - { - for( int n = 0; n < medicosCombo.getItemCount(); n++ ) - { - IDObject medico = ( IDObject ) medicosCombo.getItemAt( n ); - if( medico.getID().equals( medicoID ) ) - { - medicosCombo.setSelectedIndex( n ); - break; - } - } - } - } - catch( Exception ex ) - { - } - } - if( empresaID != null ) - { - empresa = ( EmpresasData ) JDO.load( EmpresasData.class, empresaID ); - String nomeEmpresa = (String) empresa.get( EmpresasData.DESIGNACAO_SOCIAL ); - empresaText.setText( nomeEmpresa + ( nomeEstabelecimento.length() > 0?" / " + nomeEstabelecimento:"" ) ); - } - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar os dados do cabe\u00e7alho...", true ); - } - } - - public Object save() - { - Integer id = ( (IDObject) medicosCombo.getSelectedItem() ).getID(); - if( id != null ) - { - try - { - MedicosData medico = ( MedicosData )JDO.load( MedicosData.class, id ); - return medico; - } - catch( Exception ex ) - { - ex.printStackTrace(); - } - } - else - { - throw new ValuesException( "A ficha tem de ter um m\u00e9dico associado" ); - } - return null; - } - - public void fillCombo() - throws Exception - { - medicosCombo.removeItemListener( this ); - medicosCombo.removeAllItems(); - medicosHash.clear(); - Object medicos[][] = provider.getAllMedicos(); - for( int n = 0; n < medicos.length; n++ ) - { - Object medico[] = new Object[ 4 ]; - medico[ 0 ] = new Integer( ( (Number)medicos[n][0] ).intValue() ); - medico[ 1 ] = medicos[ n ][ 1 ]; - medico[ 2 ] = medicos[ n ][ 2 ]; - medico[ 3 ] = new Integer( n ); - medicosHash.put( medicos[ n ][ 0 ], medico ); - medicosCombo.addItem( new MappableObject( (Integer) medico[ 0 ], medico[ 1 ] ) ); - } - - if( medicos.length > 0 ) - { - medicosCombo.setSelectedIndex( 0 ); - cpText.setText( medicos[ 0 ][ 2 ] != null?(String)medicos[ 0 ][ 2 ]:"" ); - } - else - { - medicosCombo.addItem( new MappableObject( null, "" ) ); - medicosCombo.setSelectedIndex( 0 ); - cpText.setText( "" ); - } - medicosCombo.addItem( new MappableObject( new Integer( -1 ), "Novo/Editar" ) ); - medicosCombo.addItemListener( this ); - } - - public void itemStateChanged(java.awt.event.ItemEvent itemEvent) - { - int index = medicosCombo.getSelectedIndex(); - if( index == medicosCombo.getItemCount() - 1 ) - { - try - { - MedicoEditor me = new MedicoEditor( owner ); - me.setVisible( true ); -// boolean isNew = me.getIsNew(); - Integer id = me.getID(); - if( id == null ) - { - medicosCombo.setSelectedIndex( 0 ); - } - else - { - fillCombo(); - if( id != null ) - { - Object[] medico = (Object[])medicosHash.get( id ); - medicosCombo.setSelectedIndex( ((Integer)medico[ 3 ] ).intValue() ); - } - } - - } - catch( Exception ex ) - { - JOptionPane.showMessageDialog( null, "Erro a abrir a janela de edi\u00e7\u00e3o...", "Erro...", - JOptionPane.ERROR_MESSAGE ); - ex.printStackTrace(); - medicosCombo.setSelectedIndex( 0 ); - return; - } - } - else - { - IDObject selected = (IDObject)medicosCombo.getItemAt( index ); - Integer id = selected.getID(); - if( id == null ) - { - cpText.setText( "" ); - } - else - { - Object[] medico = (Object[])medicosHash.get( id ); - cpText.setText( medico[ 2 ] != null?(String)medico[ 2 ]:"" ); - } - } - } - - public void clear() - { - empresaText.setText( "" ); - nomeText.setText( "" ); - medicosCombo.setSelectedIndex( 0 ); - } - - public void setEnabled( boolean enable ) - { - medicosCombo.setEnabled( enable ); - } -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/ValuesException.java b/trunk/SIPRPSoft/src/siprp/ficha/ValuesException.java deleted file mode 100644 index e5a14882..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/ValuesException.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * ValuesException.java - * - * Created on 5 de Abril de 2004, 20:22 - */ - -package siprp.ficha; - -/** - * - * @author fpalma - */ -public class ValuesException extends RuntimeException -{ - - /** Creates a new instance of ValuesException */ - public ValuesException( String msg ) - { - super( msg ); - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/ficha/ficha_aptidao_teste.xml b/trunk/SIPRPSoft/src/siprp/ficha/ficha_aptidao_teste.xml deleted file mode 100644 index 0935d901..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/ficha_aptidao_teste.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - 111-21/12/2001 - - - Evolute - Consultoria Informatica - - - - - Sede - - - Lisboa - - - - y - n - n - n - - - SIPRP - - - - - n - n - n - y - - - SIPRP - - - - - Frederico Palma - Masculino - 30-12-1977 - Portuguesa - 32434234 - 01-10-2006 - Deus - Sede - Senhor do Universo - 01-01-10000AF - - - nada a observar - - - 03-12-2007 - - y - y - y - y - y - y - y - y - y - y - sdlfjk - - - y - y - y - y - outra-func-1 - outra-func-2 - outra-func-3 - outra-func-4 - - - 10-01-2010 - - Olho por Olho, Dente por Dente - - - Joao Antonio Pedro - 4234234 - - \ No newline at end of file diff --git a/trunk/SIPRPSoft/src/siprp/ficha/out.txt b/trunk/SIPRPSoft/src/siprp/ficha/out.txt deleted file mode 100644 index f853af5a..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/out.txt +++ /dev/null @@ -1,6 +0,0 @@ -C:\Documents and Settings\Frederico\workspace\SIPRP\SIPRPSoft\src\siprp\ficha\ficha_aptidao_teste.xml -/home/fpalma/projectos2/SIPRP/SIPRPSoft/src/siprp/ficha/ficha_aptidao_teste.xml - -☐ -✓ - diff --git a/trunk/SIPRPSoft/src/siprp/ficha/svg/char_square_pure.svg b/trunk/SIPRPSoft/src/siprp/ficha/svg/char_square_pure.svg deleted file mode 100644 index 6c17f710..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/svg/char_square_pure.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/trunk/SIPRPSoft/src/siprp/ficha/svg/char_tick_pure.svg b/trunk/SIPRPSoft/src/siprp/ficha/svg/char_tick_pure.svg deleted file mode 100644 index e5e1b808..00000000 --- a/trunk/SIPRPSoft/src/siprp/ficha/svg/char_tick_pure.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/trunk/SIPRPSoft/src/siprp/initializer/SIPRPLoggerInit.java b/trunk/SIPRPSoft/src/siprp/initializer/SIPRPLoggerInit.java index fb18fb25..572a5e62 100644 --- a/trunk/SIPRPSoft/src/siprp/initializer/SIPRPLoggerInit.java +++ b/trunk/SIPRPSoft/src/siprp/initializer/SIPRPLoggerInit.java @@ -33,16 +33,6 @@ public class SIPRPLoggerInit ErrorLogger.logException( e ); } -// HashMap properties = new HashMap(); -// properties.put( LoggerProperties.PROJECT, ProjectsEnum.SIPRP.toString() ); -// properties.put( LoggerProperties.PROJECT_NAME, ProjectTools.getInstance().getProjectName() ); -// properties.put( LoggerProperties.SOFTWARE_VERSION, ProjectTools.getInstance().getVersion().toString() ); -// properties.put( LoggerProperties.SOFTWARE_NAME, "SIPRPSoft" ); -// properties.put(LoggerProperties.PASSWORD, "2DD-rg2hLOG" ); -// properties.put(LoggerProperties.USERNAME, "evo_logger" ); -// properties.put(LoggerProperties.URL, "jdbc:postgresql://www.evolute.pt:5436/evo_logging"); -// DBLogger logger = new DBLogger(properties); -// ErrorLogger.initializeLogger( logger ); } } diff --git a/trunk/SIPRPSoft/src/siprp/initializer/SIPRPUIInitializer.java b/trunk/SIPRPSoft/src/siprp/initializer/SIPRPUIInitializer.java deleted file mode 100644 index f65f3dc0..00000000 --- a/trunk/SIPRPSoft/src/siprp/initializer/SIPRPUIInitializer.java +++ /dev/null @@ -1,38 +0,0 @@ -package siprp.initializer; - -import java.awt.Color; - -import javax.swing.UIManager; - -import com.evolute.application.EvoAbstractAppInitializer; -import com.nilo.plaf.nimrod.NimRODLookAndFeel; -import com.nilo.plaf.nimrod.NimRODTheme; - -public class SIPRPUIInitializer extends EvoAbstractAppInitializer -{ - - public SIPRPUIInitializer() - { - super( "UI", false, false, false ); - } - - @Override - public boolean doInit() throws Exception - { - NimRODTheme nt = new NimRODTheme(); - - nt.setPrimary1( new Color( 150, 180, 200 ) ); // tab header highlight, scroll highlight - nt.setPrimary2( new Color( 150, 180, 200 ) ); // button highlight & progress bar & selected tab header background & selected row ... - nt.setPrimary3( new Color( 150, 150, 150 ) ); // tree's graph color - - nt.setSecondary1( new Color( 150, 150, 150 ) ); // Button contour - nt.setSecondary2( new Color( 200, 210, 220 ) ); // unselected tab header's background & border color (in tables too) - nt.setSecondary3( new Color( 235, 235, 235 ) ); // panel's background - - NimRODLookAndFeel NimRODLF = new NimRODLookAndFeel(); - NimRODLookAndFeel.setCurrentTheme( nt ); - UIManager.setLookAndFeel( NimRODLF ); - return true; - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/medicina/MarcacaoConsultaPanel.xml b/trunk/SIPRPSoft/src/siprp/medicina/MarcacaoConsultaPanel.xml deleted file mode 100644 index 7229c554..00000000 --- a/trunk/SIPRPSoft/src/siprp/medicina/MarcacaoConsultaPanel.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - siprp.data.* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo - - 4 - - - Admiss\u00e3o - Peri\u00f3dico - Peri\u00f3dico inicial - Ocasional - - - - - Estado - - 6 - - - Por realizar - Realizada - Desmarcada pelo trabalhador - Desmarcada pela SIPRP - Faltou - - - - - - Observa\u00e7\u00f5es - - - 5 - - - - diff --git a/trunk/SIPRPSoft/src/siprp/medicina/MarcacaoExamePanel.xml b/trunk/SIPRPSoft/src/siprp/medicina/MarcacaoExamePanel.xml deleted file mode 100644 index bb5e2ab1..00000000 --- a/trunk/SIPRPSoft/src/siprp/medicina/MarcacaoExamePanel.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - siprp.data.* - - - - - - - - - - - - - - - - - - - - - Detalhes - - - - - - - - - Estado - - 6 - - - Por realizar - Parcialmente realizados - Realizados - Desmarcados pelo trabalhador - Desmarcados pela SIPRP - Faltou - - - - - - Observa\u00e7\u00f5es - - - 5 - - - - diff --git a/trunk/SIPRPSoft/src/siprp/medicina/alter.sql b/trunk/SIPRPSoft/src/siprp/medicina/alter.sql deleted file mode 100644 index 3549ed22..00000000 --- a/trunk/SIPRPSoft/src/siprp/medicina/alter.sql +++ /dev/null @@ -1,159 +0,0 @@ -ALTER TABLE empresas ADD a_consultas char(1); -ALTER TABLE empresas ADD a_exames char(1); -ALTER TABLE empresas ADD b_consultas char(1); -ALTER TABLE empresas ADD b_exames char(1); -ALTER TABLE empresas ADD data_cancelamento DATE; - -ALTER TABLE marcacoes_trabalhador ADD motivo INT; -ALTER TABLE marcacoes_trabalhador ADD estado INT; -ALTER TABLE marcacoes_trabalhador ADD observacoes VARCHAR( 2048 ); -UPDATE marcacoes_trabalhador SET estado = 2 WHERE realizada = 'y'; - - --- PROTOCOLOS - -CREATE TABLE prt_grupos_protocolo -( - id int4 NOT NULL, - descricao varchar(255) NOT NULL, - descricao_plain varchar(255) NOT NULL, - CONSTRAINT grupos_protocolo_pkey PRIMARY KEY (id) -) -WITHOUT OIDS; -ALTER TABLE prt_grupos_protocolo OWNER TO postgres; - - - -CREATE TABLE prt_tipos_elementos_protocolo -( - id int4 NOT NULL, - descricao_plain varchar(255) NOT NULL, - descricao varchar(255) NOT NULL, - grupo_protocolo_id int4 NOT NULL, - CONSTRAINT prt_tipos_elementos_protocolo_pkey PRIMARY KEY (id), - CONSTRAINT prt_tipos_elementos_protocolo_grupo_protocolo_id_fkey FOREIGN KEY (grupo_protocolo_id) REFERENCES prt_grupos_protocolo (id) ON UPDATE RESTRICT ON DELETE RESTRICT -) -WITHOUT OIDS; -ALTER TABLE prt_tipos_elementos_protocolo OWNER TO postgres; - - -CREATE TABLE prt_elementos_protocolo -( - id serial NOT NULL, - tipo_elemento_protocolo_id int4 NOT NULL, - empresa_id int4 NOT NULL, - numero_perfil int4 NOT NULL, - CONSTRAINT prt_elementos_protocolo_pkey PRIMARY KEY (id), - CONSTRAINT prt_elementos_protocolo_empresa_id_fkey FOREIGN KEY (empresa_id) REFERENCES empresas (id) ON UPDATE RESTRICT ON DELETE RESTRICT, - CONSTRAINT prt_elementos_protocolo_tipo_elemento_protocolo_id_fkey FOREIGN KEY (tipo_elemento_protocolo_id) REFERENCES prt_tipos_elementos_protocolo (id) ON UPDATE RESTRICT ON DELETE RESTRICT -) -WITH OIDS; -ALTER TABLE prt_elementos_protocolo OWNER TO postgres; - - -CREATE TABLE marcacoes_grupos_realizados -( - id serial NOT NULL, - marcacao_trabalhador_id int4 NOT NULL, - grupo_protocolo_id int4 NOT NULL, - CONSTRAINT marcacoes_grupos_realizados_pkey PRIMARY KEY (id), - CONSTRAINT marcacoes_grupos_realizados_grupo_protocolo_id_fkey FOREIGN KEY (grupo_protocolo_id) REFERENCES prt_grupos_protocolo (id) ON UPDATE RESTRICT ON DELETE RESTRICT, - CONSTRAINT marcacoes_grupos_realizados_marcacao_trabalhador_id_fkey FOREIGN KEY (marcacao_trabalhador_id) REFERENCES marcacoes_trabalhador (id) ON UPDATE RESTRICT ON DELETE RESTRICT -) -WITH OIDS; -ALTER TABLE marcacoes_grupos_realizados OWNER TO postgres; - -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 1, 'Sangue', 'sangue' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 2, 'Urina', 'urina' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 3, 'RX T\\u00f3rax', 'rx torax' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 4, 'Audiograma', 'audiograma' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 5, 'Rastreio Visual', 'rastreio visual' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 6, 'ECG', 'ecg' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 7, 'Espirometria', 'espirometria' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 8, 'Exsudado Nasofar\\u00edngeo', 'exsudado nasofaringeo' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 9, 'Exame Bacteriol\\u00f3gico (Fezes)', 'exame bacteriologico (fezes)' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 10, 'Coprocultura', 'coprocultura' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 11, 'Outros ECDs', 'outros ecds' ); -INSERT INTO prt_grupos_protocolo( id, descricao, descricao_plain ) - VALUES( 12, 'Outras An\\u00e1lises', 'outras analises' ); - -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 1, 'Hemograma', 'hemograma', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 2, 'Plaquetas', 'plaquetas', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 3, 'VS', 'vs', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 4, 'Glicemia', 'glicemia', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 5, 'Creatinina', 'creatinina', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 6, 'Colesterol Total', 'colesterol total', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 7, 'colesterol hdl', 'Colesterol hdl', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 8, 'Colesterol LDL', 'colesterol ldl', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 9, 'Trigliceridos', 'trigliceridos', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 10, 'Transaminases', 'transaminases', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 11, 'Gama GT', 'gama gt', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 12, 'Ureia', 'ureia', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 13, '\\u00c1cido \\u00darico', 'acido urico', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 14, 'MBE (Chumbo)', 'mbe (chumbo)', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 15, 'MBE (Outros)', 'mbe (outros)', 1 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 16, 'Serologias Hepatite', 'serologias hepatite', 1 ); - -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 17, 'Urina II', 'urina ii', 2 ); - -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 18, 'RX T\\u00f3rax', 'rx torax', 3 ); - -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 19, 'Audiometria', 'audiometria', 4 ); - -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 20, 'Rastreio Visual', 'rastreio visual', 5 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 21, 'ECG', 'ecg', 6 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 22, 'Espirometria', 'espirometria', 7 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 23, 'Exsudado Nasofar\\u00edngeo', 'exsudado nasofaringeo', 8 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 24, 'Exame Bacteriol\\u00f3gico (Fezes)', 'exame bacteriologico (fezes)', 9 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 25, 'Coprocultura', 'coprocultura', 10 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 26, 'Outros ECDs', 'outros ecds', 11 ); -INSERT INTO prt_tipos_elementos_protocolo( id, descricao, descricao_plain, grupo_protocolo_id ) - values( 27, 'Outras An\\u00e1lises', 'outras analises', 12 ); - - -ALTER TABLE prt_grupos_protocolo ADD grupo_real char(1); -UPDATE prt_grupos_protocolo SET grupo_real='y' WHERE id <= 4; -UPDATE prt_grupos_protocolo SET grupo_real='n' WHERE id > 4; - -ALTER TABLE prt_grupos_protocolo ADD ordem int4; -UPDATE prt_grupos_protocolo SET ordem=id; - -ALTER TABLE prt_tipos_elementos_protocolo ADD ordem int4; -UPDATE prt_tipos_elementos_protocolo SET ordem=id; \ No newline at end of file diff --git a/trunk/SIPRPSoft/src/siprp/paths b/trunk/SIPRPSoft/src/siprp/paths deleted file mode 100644 index f4c4fe58..00000000 --- a/trunk/SIPRPSoft/src/siprp/paths +++ /dev/null @@ -1,2 +0,0 @@ -/home/fpalma/projectos/SIPRP/SIPRPSoft/src/siprp/teste.xml -/home/fpalma/projectos2/SIPRP/SIPRPSoft/src/siprp/analise_acidentes_trabalho.xsl \ No newline at end of file diff --git a/trunk/SIPRPSoft/src/siprp/pesquisas/PesquisasProvider.java b/trunk/SIPRPSoft/src/siprp/pesquisas/PesquisasProvider.java deleted file mode 100644 index 0c7cc436..00000000 --- a/trunk/SIPRPSoft/src/siprp/pesquisas/PesquisasProvider.java +++ /dev/null @@ -1,922 +0,0 @@ -/* - * EstatisticasProvider.java - * - * Created on 3 de Junho de 2004, 18:23 - */ - -package siprp.pesquisas; - -import java.util.Calendar; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Vector; - -import shst.data.Marcacao; -import shst.data.outer.EmpresasData; -import shst.data.outer.MarcacoesTrabalhadorData; -import shst.data.outer.TrabalhadoresData; - -import com.evolute.utils.Singleton; -import com.evolute.utils.arrays.Virtual2DArray; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.data.MappableObject; -import com.evolute.utils.db.DBManager; -import com.evolute.utils.db.Executer; -import com.evolute.utils.metadb.MetaProvider; -import com.evolute.utils.sql.Expression; -import com.evolute.utils.sql.Field; -import com.evolute.utils.sql.Select; -import com.evolute.utils.sql.Select2; -import com.evolute.utils.sql.expression.Par; -/** - * - * @author fpalma - */ -public class PesquisasProvider extends MetaProvider -{ - private static final Object LOCK = new Object(); - private static PesquisasProvider instance = null; - private final Executer executer; - - private static final int TIPOS_OCASIONAL[] = - new int[]{ 5, //mudanca de posto - 6, //mudancas das condicoes - -1, //apos 30 dias - 4, //iniciativa do medico - 3, //pedido do trabalhador - 2, //acidente de trabalho - 1, //Doenca subita - -1, //Cessacao do contrato - 10 //Outras razoes - }; - public static final String DESCRICAO_TIPOS_OCASIONAL[] = - new String[]{ "MUDAN\u00C7A DE POSTO DE TRABALHO", - "ALTERA\u00C7\u00D5ES NO POSTO DE TRABALHO", - "REGRESSO AO TRABALHO AP\u00D3S AUS\u00CANCIA SUPERIOR A 30 DIAS", - "INICIATIVA DO M\u00C9DICO", - "PEDIDO DO TRABALHADOR", - "ACIDENTE DE TRABALHO", - "DOEN\u00C7A S\u00DABITA", - "POR CESSA\u00C7\u00C3O DO CONTRATO DE TRABALHO", - "OUTRAS RAZ\u00D5ES" }; - - private static final int TIPOS_EXAME[] = - new int[]{ 1, //admissao - 2, //periodico - 3 //ocasional - }; - private static final int TIPO_OCASIONAL = 3; - - public static final String DESCRICAO_TIPOS_EXAME[] = - new String[]{ "TOTAL DE EXAMES DE ADMISS\u00C3O", - "TOTAL DE EXAMES PERI\u00D3DICOS", - "TOTAL DE EXAMES OCASIONAIS" }; - - public static final String PAR_ANO = "PAR_ANO"; - public static final String PAR_EMPRESA = "PAR_EMPRESA"; - public static final String PAR_ESTABELECIMENTO = "PAR_ESTABELECIMENTO"; - public static final String PAR_TIPO_EXAME = "PAR_TIPO_EXAME"; - public static final String PAR_RESULTADO = "PAR_RESULTADO"; - public static final String PAR_SEXO = "PAR_SEXO"; - public static final String PAR_GRUPO_ETARIO = "PAR_GRUPO_ETARIO"; - - /** Creates a new instance of EstatisticasProvider */ - public PesquisasProvider() throws Exception - { - DBManager dbm = ( DBManager ) Singleton.getInstance( Singleton.DEFAULT_DBMANAGER /*SingletonConstants.DBMANAGER*/ ); - executer = dbm.getSharedExecuter( this ); - } - - public static MetaProvider getProvider() - throws Exception - { - synchronized( LOCK ) - { - if( instance == null ) - { - instance = new PesquisasProvider(); - } - } - return instance; - } - - public IDObject[] getAllEmpresas() - throws Exception - { - Select select = new Select( new String[]{ "empresas" }, - new String[]{ EmpresasData.ID, EmpresasData.DESIGNACAO_SOCIAL, EmpresasData.DESIGNACAO_SOCIAL_PLAIN }, - new Field( EmpresasData.INACTIVO ).isDifferent( "y" ), - new String[]{ EmpresasData.DESIGNACAO_SOCIAL_PLAIN }, null ); -// Select select = new Select( "SELECT e.id, e.designacao_social FROM empresas e ORDER BY lower( e.designacao_social );" ); - Virtual2DArray array = executer.executeQuery( select ); - IDObject empresas[] = new IDObject[ array.columnLength() ]; - for( int n = 0; n < empresas.length; n++ ) - { - empresas[ n ] = new MappableObject( (Integer)array.get( n, 0 ), array.get( n, 1 ) ); - } - return empresas; - } - - public IDObject []getAllEstabelecimentosForEmpresa( Integer empresaID ) - throws Exception - { - return ( ( siprp.FichaDataProvider )siprp.FichaDataProvider.getProvider() ).getAllEstabelecimentosForEmpresa( empresaID ); - } - - public int[] countTrabalhadoresEstabelecimentoDezembro( Integer estabelecimentoID, int ano ) - throws Exception - { - Calendar cal = Calendar.getInstance(); - cal.set( Calendar.YEAR, ano ); - cal.set( Calendar.MONTH, 11 ); - cal.set( Calendar.DAY_OF_MONTH, 30 ); - Select select = - new Select( new String[]{ "trabalhadores" }, - new String[]{ "COUNT(" + TrabalhadoresData.ID + ")" }, - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ).and( - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( "m" ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ).and( - new Par( new Field( TrabalhadoresData.DATA_DEMISSAO ).isGreater( cal.getTime() ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - int contagem[] = new int[ 2 ]; - contagem[ 0 ] = ( ( Number ) array.get( 0, 0 ) ).intValue(); - select = - new Select( new String[]{ "trabalhadores" }, - new String[]{ "COUNT(" + TrabalhadoresData.ID + ")" }, - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ).and( - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( "f" ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ).and( - new Par( new Field( TrabalhadoresData.DATA_DEMISSAO ).isGreater( cal.getTime() ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ) ); - array = executer.executeQuery( select ); - contagem[ 1 ] = ( ( Number ) array.get( 0, 0 ) ).intValue(); - return contagem; - } - - public int[][] countTrabalhadoresEstabelecimentoDezembroPorGrupoEtario( Integer estabelecimentoID, int ano ) - throws Exception - { - Calendar eoy = Calendar.getInstance(); - eoy.set( Calendar.YEAR, ano ); - eoy.set( Calendar.MONTH, 11 ); - eoy.set( Calendar.DAY_OF_MONTH, 30 ); - - Calendar today = Calendar.getInstance(); - today.set( Calendar.YEAR, ano ); - today.set( Calendar.MONTH, 11 ); - today.set( Calendar.DAY_OF_MONTH, 31 ); - today.set( Calendar.HOUR_OF_DAY, 23 ); - Calendar age18 = (Calendar) today.clone(); - age18.add( Calendar.YEAR, -18 ); - Calendar age50 = (Calendar) today.clone(); - age50.add( Calendar.YEAR, -50 ); - //0-18 - Select select = - new Select( new String[]{ "trabalhadores" }, - new String[]{ "COUNT(" + TrabalhadoresData.ID + ")" }, - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ).and( - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( "m" ) ).and( - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isGreater( age18.getTime() ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ).and( - new Par( new Field( TrabalhadoresData.DATA_DEMISSAO ).isGreater( eoy.getTime() ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - int contagem[][] = new int[ 3 ][ 2 ]; - contagem[ 0 ][ 0 ] = ( ( Number ) array.get( 0, 0 ) ).intValue(); - select = - new Select( new String[]{ "trabalhadores" }, - new String[]{ "COUNT(" + TrabalhadoresData.ID + ")" }, - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ).and( - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( "f" ) ).and( - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isGreater( age18.getTime() ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ).and( - new Par( new Field( TrabalhadoresData.DATA_DEMISSAO ).isGreater( eoy.getTime() ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ) ); - array = executer.executeQuery( select ); - contagem[ 0 ][ 1 ] = ( ( Number ) array.get( 0, 0 ) ).intValue(); - //18-49 - select = - new Select( new String[]{ "trabalhadores" }, - new String[]{ "COUNT(" + TrabalhadoresData.ID + ")" }, - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ).and( - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( "m" ) ).and( - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isLessOrEqual( age18.getTime() ) ).and( - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isGreater( age50.getTime() ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ).and( - new Par( new Field( TrabalhadoresData.DATA_DEMISSAO ).isGreater( eoy.getTime() ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ) ); - array = executer.executeQuery( select ); - contagem[ 1 ][ 0 ] = ( ( Number ) array.get( 0, 0 ) ).intValue(); - select = - new Select( new String[]{ "trabalhadores" }, - new String[]{ "COUNT(" + TrabalhadoresData.ID + ")" }, - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ).and( - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( "f" ) ).and( - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isLessOrEqual( age18.getTime() ) ).and( - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isGreater( age50.getTime() ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ).and( - new Par( new Field( TrabalhadoresData.DATA_DEMISSAO ).isGreater( eoy.getTime() ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ) ); - array = executer.executeQuery( select ); - contagem[ 1 ][ 1 ] = ( ( Number ) array.get( 0, 0 ) ).intValue(); - - //50- - select = - new Select( new String[]{ "trabalhadores" }, - new String[]{ "COUNT(" + TrabalhadoresData.ID + ")" }, - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ).and( - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( "m" ) ).and( - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isLessOrEqual( age50.getTime() ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ).and( - new Par( new Field( TrabalhadoresData.DATA_DEMISSAO ).isGreater( eoy.getTime() ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ) ); - array = executer.executeQuery( select ); - contagem[ 2 ][ 0 ] = ( ( Number ) array.get( 0, 0 ) ).intValue(); - select = - new Select( new String[]{ "trabalhadores" }, - new String[]{ "COUNT(" + TrabalhadoresData.ID + ")" }, - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ).and( - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( "f" ) ).and( - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isLessOrEqual( age50.getTime() ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ).and( - new Par( new Field( TrabalhadoresData.DATA_DEMISSAO ).isGreater( eoy.getTime() ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ) ); - array = executer.executeQuery( select ); - contagem[ 2 ][ 1 ] = ( ( Number ) array.get( 0, 0 ) ).intValue(); - - return contagem; - } - - public int[][] countExamesEstabelecimentoDezembroPorGrupoEtario( Integer estabelecimentoID, int ano ) - throws Exception - { - Calendar today = Calendar.getInstance(); - today.set( Calendar.YEAR, ano ); - today.set( Calendar.MONTH, 11 ); - today.set( Calendar.DAY_OF_MONTH, 31 ); - today.set( Calendar.HOUR_OF_DAY, 23 ); - Calendar age18 = (Calendar) today.clone(); - age18.add( Calendar.YEAR, -18 ); - Calendar age50 = (Calendar) today.clone(); - age50.add( Calendar.YEAR, -50 ); - Calendar dates[] = new Calendar[]{ null, age18, age50, null }; - String sexos[] = new String[]{ "m", "f" }; - - int contagem[][] = new int[ 4 ][ 6 ]; - for( int t = 0; t < TIPOS_EXAME.length; t++ ) - { - for( int s = 0; s < sexos.length; s++ ) - { - for( int d = 0; d < dates.length - 1; d++ ) - { - Select select = - new Select( new String[]{ "exames", "trabalhadores" }, - new String[]{ "DISTINCT trabalhadores.id, exames.data" }, - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ).and( - new Field( "exames.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( sexos[s] ) ).and( - new Field( "YEAR( exames.data )" ).isEqual( new Integer( ano ) ) ).and( - dates[ d ] == null ? new Field( "exames.id" ).isDifferent( null ) : - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isLessOrEqual( dates[ d ].getTime() ) ).and( - dates[ d + 1 ] == null ? new Field( "exames.id" ).isDifferent( null ) : - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isGreater( dates[ d + 1 ].getTime() ) ).and( - new Field( "exames.tipo" ).isEqual( new Integer( TIPOS_EXAME[ t ] ) ) ).and( - new Field( "exames.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ) ); - try - { - Virtual2DArray array = executer.executeQuery( select ); - contagem[ t ][ s * 3 + d ] = array.columnLength(); -//System.out.println( select + ": " + contagem[ t ][ s * 3 + d ] ); - } - catch( Exception ex ) - { - contagem[ t ][ s * 3 + d ] = -1; - } - } - } - } - - return contagem; - } - - public int[][] countExamesOcasionaisEstabelecimentoDezembroPorGrupoEtario( Integer estabelecimentoID, int ano ) - throws Exception - { - Calendar today = Calendar.getInstance(); - today.set( Calendar.YEAR, ano ); - today.set( Calendar.MONTH, 11 ); - today.set( Calendar.DAY_OF_MONTH, 31 ); - today.set( Calendar.HOUR_OF_DAY, 23 ); - Calendar age18 = (Calendar) today.clone(); - age18.add( Calendar.YEAR, -18 ); - Calendar age50 = (Calendar) today.clone(); - age50.add( Calendar.YEAR, -50 ); - Calendar dates[] = new Calendar[]{ null, age18, age50, null }; - String sexos[] = new String[]{ "m", "f" }; - - int contagem[][] = new int[ TIPOS_OCASIONAL.length ][ ( dates.length - 1 ) * sexos.length ]; - for( int t = 0; t < TIPOS_OCASIONAL.length; t++ ) - { - for( int s = 0; s < sexos.length; s++ ) - { - for( int d = 0; d < dates.length - 1; d++ ) - { - if( TIPOS_OCASIONAL[t] == -1 ) - { - contagem[ t ][ s * 3 + d ] = -1; - continue; - } - - Select select = - new Select( new String[]{ "exames", "trabalhadores" }, - new String[]{ "DISTINCT trabalhadores.id, exames.data" }, - new Field( "estabelecimento_id" ).isEqual( estabelecimentoID ).and( - new Field( "exames.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( sexos[s] ) ).and( - new Field( "YEAR( exames.data )" ).isEqual( new Integer( ano ) ) ).and( - dates[ d ] == null ? new Field( "exames.id" ).isDifferent( null ) : - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isLessOrEqual( dates[ d ].getTime() ) ).and( - dates[ d + 1 ] == null ? new Field( "exames.id" ).isDifferent( null ) : - new Field( TrabalhadoresData.DATA_NASCIMENTO ).isGreater( dates[ d + 1 ].getTime() ) ).and( - new Field( "exames.tipo" ).isEqual( new Integer( 3 ) ) ).and( - new Field( "exames.ocasional" ).isEqual( new Integer( TIPOS_OCASIONAL[ t ] ) ) ).and( - new Field( "exames.inactivo" ).isDifferent( "y" ) ).and( - new Field( "trabalhadores.inactivo" ).isDifferent( "y" ) ) ); - try - { - Virtual2DArray array = executer.executeQuery( select ); - contagem[ t ][ s * 3 + d ] = array.columnLength(); - } - catch( Exception ex ) - { - contagem[ t ][ s * 3 + d ] = -1; - } - } - } - } - - return contagem; - } - - public double[] countNumeroMedioTrabalhadoresEmpresa( Integer empresaID, int ano ) - throws Exception - { - double contagens[] = new double[ 2 ];; - Select select; - String sexos[] = new String[]{ "m", "f" }; - - for( int n = 0; n < sexos.length; n++ ) - { - select = - new Select( new String[]{ "estabelecimentos", "trabalhadores" }, - new String[]{ "COUNT(trabalhadores.id)" }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ).and( - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLess( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ) ).and( - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_DEMISSAO + ")" ).isGreater( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ).and( - new Field( "empresa_id" ).isEqual( empresaID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( sexos[ n ] ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - contagens[ n ] = ( ( Number ) array.get( 0, 0 ) ).doubleValue(); - } - for( int n = 0; n < sexos.length; n++ ) - { - select = - new Select( new String[]{ "estabelecimentos", "trabalhadores" }, - new String[]{ "SUM( MONTH( data_demissao ) )" }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ).and( - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLess( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ) ).and( - new Field( "YEAR(" + TrabalhadoresData.DATA_DEMISSAO + ")" ).isEqual( new Integer( ano ) ) ).and( - new Field( "empresa_id" ).isEqual( empresaID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( sexos[ n ] ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ) ); -System.out.println( "SELECT: " + select ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.get( 0, 0 ) != null ) - { - contagens[ n ] += ( ( Number ) array.get( 0, 0 ) ).doubleValue() / 12.0; - } - } - - for( int n = 0; n < sexos.length; n++ ) - { - select = - new Select( new String[]{ "estabelecimentos", "trabalhadores" }, - new String[]{ "SUM( ( 1 + 12 - MONTH( data_admissao ) ) )" }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ).and( - new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isEqual( new Integer( ano ) ) ).and( - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_DEMISSAO + ")" ).isGreater( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ).and( - new Field( "empresa_id" ).isEqual( empresaID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( sexos[ n ] ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.get( 0, 0 ) != null ) - { - contagens[ n ] += ( ( Number ) array.get( 0, 0 ) ).doubleValue() / 12.0; - } - } - - for( int n = 0; n < sexos.length; n++ ) - { - select = - new Select( new String[]{ "estabelecimentos", "trabalhadores" }, - new String[]{ "SUM( ( 1 + MONTH( data_demissao ) - MONTH( data_admissao ) ) )" }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ).and( - new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isEqual( new Integer( ano ) ) ).and( - new Field( "YEAR(" + TrabalhadoresData.DATA_DEMISSAO + ")" ).isEqual( new Integer( ano ) ) ).and( - new Field( "empresa_id" ).isEqual( empresaID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( sexos[ n ] ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - if( array.get( 0, 0 ) != null ) - { - contagens[ n ] += ( ( Number ) array.get( 0, 0 ) ).doubleValue() / 12.0; - } - } - - return contagens; - } - - public double[] countNumeroTotalTrabalhadoresEmpresa( Integer empresaID, int ano ) - throws Exception - { - double contagens[] = new double[ 2 ];; - Select select; - String sexos[] = new String[]{ "m", "f" }; - - for( int n = 0; n < sexos.length; n++ ) - { - select = - new Select( new String[]{ "estabelecimentos", "trabalhadores" }, - new String[]{ "COUNT(trabalhadores.id)" }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ).and( - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_ADMISSAO + ")" ).isLessOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_ADMISSAO ).isEqual( null ) ) ) ).and( - new Par( new Field( "YEAR(" + TrabalhadoresData.DATA_DEMISSAO + ")" ).isGreaterOrEqual( new Integer( ano ) ).or( - new Field( TrabalhadoresData.DATA_DEMISSAO ).isEqual( null ) ) ) ).and( - new Field( "empresa_id" ).isEqual( empresaID ) ).and( - new Field( TrabalhadoresData.SEXO ).isEqual( sexos[ n ] ) ).and( - new Field( "trabalhadores.inactivo" ).isEqual( "n" ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - contagens[ n ] = ( ( Number ) array.get( 0, 0 ) ).doubleValue(); - } - return contagens; - } - - public String []getNomesExames() - throws Exception - { - String nomes[]; - Select select = - new Select( new String[]{ "tipos_exames_comp" }, - new String[]{ "descricao", "ordem" }, - null, - new String[]{ "ordem" }, null ); - Virtual2DArray array = executer.executeQuery( select ); - nomes = new String[ array.columnLength() ]; - for( int n = 0; n < array.columnLength(); n++ ) - { - nomes[ n ] = ( String )array.get( n, 0 ); - } - return nomes; - } - - public int []countExamesComplementaresEmpresa( Integer empresaID, int ano ) - throws Exception - { -// Vector perfis[] = new Vector[ 2 ]; -// Hashtable contagens[] = new Hashtable[ 2 ]; -// Select select; -// Virtual2DArray array; -// -// for( int p = 0; p < 2; p++ ) -// { -// Integer pAux = new Integer( p + 1 ); -// perfis[ p ] = new Vector(); -// select = new Select( new String[]{"estabelecimentos", "trabalhadores", "marcacoes_trabalhador"}, -// new String[]{"COUNT(marcacoes_trabalhador.id)", TrabalhadoresData.PERFIL }, -// new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( -// new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( -// new Field( "empresa_id" ).isEqual( empresaID ) ).and( -// new Field( MarcacoesTrabalhadorData.TIPO ).isEqual( new Integer( MarcacoesTrabalhadorData.TIPO_EXAMES ) ) ).and( -// new Field( "YEAR( marcacoes_trabalhador.data ) " ).isEqual( new Integer( ano ) ).and( -// new Field( MarcacoesTrabalhadorData.ESTADO ).in( new Integer[]{ new Integer( 1 ), new Integer( 2 ) } ) ) ).and( -// new Field( "trabalhadores.perfil" ).isEqual( pAux ) ) ); -// array = executer.executeQuery( select ); -// -// select = -// new Select( new String[]{ "prt_elementos_protocolo", "prt_tipos_elementos_protocolo" }, -// new String[]{ "DISTINCT prt_tipos_elementos_protocolo.grupo_protocolo_id" }, -// new Field( "prt_elementos_protocolo.empresa_id" ).isEqual( empresaID ).and( -// new Field( "prt_elementos_protocolo.tipo_elemento_protocolo_id" ).isEqual( new Field( "prt_elementos_protocolo.id" ) ) ).and( -// new Field( "pr_elementos_protocolo.perfil" ).isEqual( new Integer( p + 1 ) ) ) ); -// array = executer.executeQuery( select ); -// for( int ecd = 0; ecd < array.columnLength(); ecd++ ) -// { -// perfis[ p ].add( ( Integer ) array.get( 0, 0 ) ); -// } -// } -// -// -// return contagens; - - - int contagens[]; - Select select; - select = new Select( new String[]{"empresas"}, new String[]{ "perfil_1", "perfil_2" }, - new Field( "id" ).isEqual( empresaID ) ); - Virtual2DArray array = executer.executeQuery( select ); - String p1Str = (String)array.get( 0, 0 ); - String p2Str = (String)array.get( 0, 1 ); - Number perfil1 = ( p1Str != null && p1Str.length() > 0 )?new Integer( p1Str ):null; - Number perfil2 = ( p2Str != null && p2Str.length() > 0 )?new Integer( p2Str ):null; - select = - new Select( new String[]{ "tipos_exames_comp" }, - new String[]{ "id", "ordem" }, - null, - new String[]{ "ordem" }, null ); - array = executer.executeQuery( select ); - contagens = new int[ array.columnLength() ]; - Hashtable idExames = new Hashtable(); - for( int n = 0; n < array.columnLength(); n++ ) - { - idExames.put( ( Number )array.get( n, 0 ), new Integer( n ) ); - } - if( perfil1 == null && perfil2 == null ) - { - return contagens; - } - else if( perfil1 == null ) - { - perfil1 = perfil2; - } - else if( perfil2 == null ) - { - perfil2 = perfil1; - } - select = new Select( new String[]{"estabelecimentos", "trabalhadores", "marcacoes_trabalhador"}, - new String[]{"COUNT(marcacoes_trabalhador.id)", TrabalhadoresData.PERFIL }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ) ).and( - new Field( "empresa_id" ).isEqual( empresaID ) ).and( - new Field( MarcacoesTrabalhadorData.TIPO ).isEqual( new Integer( MarcacoesTrabalhadorData.TIPO_EXAMES ) ) ).and( - new Field( "YEAR( marcacoes_trabalhador.data ) " ).isEqual( new Integer( ano ) ).and( - new Field( Marcacao.REALIZADA ).isEqual( "y" ) ) ), - new String[]{ TrabalhadoresData.PERFIL }, - new String[]{ TrabalhadoresData.PERFIL } ); - array = executer.executeQuery( select ); - int numeroExames[] = new int[ 2 ]; - for( int n = 0; n < array.columnLength(); n++ ) - { - Integer perfil = (Integer)array.get( n, 1 ); - if( perfil == null || perfil.intValue() == 1 ) - { - numeroExames[0] += ( (Number) array.get( n, 0 ) ).intValue(); - } - else if( perfil.intValue() == 2 ) - { - numeroExames[1] += ( (Number) array.get( n, 0 ) ).intValue(); - } - } - - Hashtable hash = new Hashtable(); - select = new Select( new String[]{ "exames_perfis" }, - new String[]{ "tipo", "multiplicador" }, - new Field( "perfil" ).isEqual( perfil1 ) ); - array = executer.executeQuery( select ); - for( int n = 0; n < array.columnLength(); n++ ) - { - Number tipo = (Number) array.get( n, 0 ); - if( tipo == null ) - { - continue; - } - Number multiplicador = (Number) array.get( n, 1 ); - if( multiplicador == null ) - { - multiplicador = new Integer( 1 ); - } - if( idExames.containsKey( tipo ) ) - { - int pos = ((Integer)idExames.get( tipo )).intValue(); - contagens[ pos ] += numeroExames[0] * multiplicador.intValue(); - } - } - select = new Select( new String[]{ "exames_perfis" }, - new String[]{ "tipo", "multiplicador" }, - new Field( "perfil" ).isEqual( perfil2 ) ); - array = executer.executeQuery( select ); - for( int n = 0; n < array.columnLength(); n++ ) - { - Number tipo = (Number) array.get( n, 0 ); - if( tipo == null ) - { - continue; - } - Number multiplicador = (Number) array.get( n, 1 ); - if( multiplicador == null ) - { - multiplicador = new Integer( 1 ); - } - if( idExames.containsKey( tipo ) ) - { - int pos = ((Integer)idExames.get( tipo )).intValue(); - contagens[ pos ] += numeroExames[1] * multiplicador.intValue(); - } - } - return contagens; - } - - public HashMap countExamesComplementaresEmpresaNovosProtocolos( Integer empresaId, int ano ) - throws Exception - { - HashMap> perfis = new HashMap>(); - HashMap contagens = null; - - Select select = - new Select2( new String[]{ "prt_elementos_protocolo", "prt_tipos_elementos_protocolo", "prt_grupos_protocolo" }, - new Integer[]{ Select2.JOIN_INNER, Select2.JOIN_INNER }, - new Expression[]{ - new Field( "prt_elementos_protocolo.tipo_elemento_protocolo_id" ).isEqual( new Field( "prt_tipos_elementos_protocolo.id" ) ), - new Field( "prt_tipos_elementos_protocolo.grupo_protocolo_id" ).isEqual( new Field( "prt_grupos_protocolo.id" ) ), - }, - new String[]{ "DISTINCT prt_elementos_protocolo.numero_perfil", "prt_grupos_protocolo.descricao" }, - new Field( "prt_elementos_protocolo.empresa_id" ).isEqual( empresaId ), - null, - null, - null, - null ); - Virtual2DArray array = executer.executeQuery( select ); - for( int n = 0; n < array.columnLength(); n++ ) - { - Integer perfil = ( Integer ) array.get( n, 0 ); - String tipo = ( String ) array.get( n, 1 ); - if( !perfis.containsKey( perfil ) ) - { - perfis.put( perfil, new Vector() ); - } - perfis.get( perfil ).add( tipo ); - } - - if( perfis.size() > 0 ) - { - contagens = new HashMap(); - select = new Select2( - new String[]{"trabalhadores", "marcacoes_trabalhador", "empresas"}, - new Integer[]{ Select2.JOIN_INNER, Select2.JOIN_INNER }, - new Expression[]{ - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ), - new Field( "trabalhadores.estabelecimentos_id" ).isEqual( new Field( "estabelecimentos.id" ) ), - }, - new String[]{"COUNT(marcacoes_trabalhador.id)", TrabalhadoresData.PERFIL }, - new Field( "estabelecimentos.id.empresa_id" ).isEqual( empresaId ).and( - new Field( MarcacoesTrabalhadorData.TIPO ).isEqual( new Integer( MarcacoesTrabalhadorData.TIPO_EXAMES ) ) ).and( - new Field( "YEAR( marcacoes_trabalhador.data ) " ).isEqual( new Integer( ano ) ).and( - new Field( Marcacao.REALIZADA ).isEqual( "y" ) ) ), - null, - new String[]{ TrabalhadoresData.PERFIL }, - null, - null ); - array = executer.executeQuery( select ); - for( int n = 0; n < array.columnLength(); n++ ) - { - Integer perfil = (Integer)array.get( n, 1 ); - Integer count = ( ( Number ) array.get( n, 0 ) ).intValue(); - if( perfil == null ) - { - continue; - } - Vector tipos = perfis.get( perfil ); - for( String tipo : tipos ) - { - if( !contagens.containsKey( tipo ) ) - { - contagens.put( tipo, count ); - } - else - { - contagens.put( tipo, contagens.get( tipo ) + count ); - } - } - } - } - return contagens; - } - - public int []countExamesComplementaresEstabelecimento( Integer estabelecimentoID, int ano ) - throws Exception - { - int contagens[] = null; - Select select; - select = new Select( new String[]{"estabelecimentos", "empresas"}, - new String[]{ "empresas.perfil_1", "empresas.perfil_2" }, - new Field( "estabelecimentos.id" ).isEqual( estabelecimentoID ).and( - new Field( "estabelecimentos.empresa_id" ).isEqual( new Field( "empresas.id" ) ) ) ); - Virtual2DArray array = executer.executeQuery( select ); - String p1Str = (String)array.get( 0, 0 ); - String p2Str = (String)array.get( 0, 1 ); - Number perfil1 = ( p1Str != null && p1Str.length() > 0 )?new Integer( p1Str ):null; - Number perfil2 = ( p2Str != null && p2Str.length() > 0 )?new Integer( p2Str ):null; - select = - new Select( new String[]{ "tipos_exames_comp" }, - new String[]{ "id", "ordem" }, - null, - new String[]{ "ordem" }, null ); - array = executer.executeQuery( select ); - contagens = new int[ array.columnLength() ]; - Hashtable idExames = new Hashtable(); - for( int n = 0; n < array.columnLength(); n++ ) - { - idExames.put( ( Number )array.get( n, 0 ), new Integer( n ) ); - } - if( perfil1 == null && perfil2 == null ) - { - return contagens; - } - else if( perfil1 == null ) - { - perfil1 = perfil2; - } - else if( perfil2 == null ) - { - perfil2 = perfil1; - } - select = new Select( new String[]{"trabalhadores", "marcacoes_trabalhador"}, - new String[]{"COUNT(marcacoes_trabalhador.id)", TrabalhadoresData.PERFIL }, - new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).and( - new Field( "trabalhadores.estabelecimento_id" ).isEqual( estabelecimentoID ) ).and( - new Field( MarcacoesTrabalhadorData.TIPO ).isEqual( new Integer( MarcacoesTrabalhadorData.TIPO_EXAMES ) ) ).and( - new Field( "YEAR( marcacoes_trabalhador.data ) " ).isEqual( new Integer( ano ) ).and( - new Field( Marcacao.REALIZADA ).isEqual( "y" ) ) ), - new String[]{ TrabalhadoresData.PERFIL }, - new String[]{ TrabalhadoresData.PERFIL } ); - array = executer.executeQuery( select ); - int numeroExames[] = new int[ 2 ]; - for( int n = 0; n < array.columnLength(); n++ ) - { - Integer perfil = (Integer)array.get( n, 1 ); - if( perfil == null || perfil.intValue() == 1 ) - { - numeroExames[0] += ( (Number) array.get( n, 0 ) ).intValue(); - } - else if( perfil.intValue() == 2 ) - { - numeroExames[1] += ( (Number) array.get( n, 0 ) ).intValue(); - } - } - - Hashtable hash = new Hashtable(); - select = new Select( new String[]{ "exames_perfis" }, - new String[]{ "tipo", "multiplicador" }, - new Field( "perfil" ).isEqual( perfil1 ) ); - array = executer.executeQuery( select ); - for( int n = 0; n < array.columnLength(); n++ ) - { - Number tipo = (Number) array.get( n, 0 ); - if( tipo == null ) - { - continue; - } - Number multiplicador = (Number) array.get( n, 1 ); - if( multiplicador == null ) - { - multiplicador = new Integer( 1 ); - } - if( idExames.containsKey( tipo ) ) - { - int pos = ((Integer)idExames.get( tipo )).intValue(); - contagens[ pos ] += numeroExames[0] * multiplicador.intValue(); - } - } - select = new Select( new String[]{ "exames_perfis" }, - new String[]{ "tipo", "multiplicador" }, - new Field( "perfil" ).isEqual( perfil2 ) ); - array = executer.executeQuery( select ); - for( int n = 0; n < array.columnLength(); n++ ) - { - Number tipo = (Number) array.get( n, 0 ); - if( tipo == null ) - { - continue; - } - Number multiplicador = (Number) array.get( n, 1 ); - if( multiplicador == null ) - { - multiplicador = new Integer( 1 ); - } - if( idExames.containsKey( tipo ) ) - { - int pos = ((Integer)idExames.get( tipo )).intValue(); - contagens[ pos ] += numeroExames[1] * multiplicador.intValue(); - } - } - return contagens; - } - - - public HashMap countExamesComplementaresEstabelecimentoNovosProtocolos( Integer estabelecimentoID, int ano ) - throws Exception - { - HashMap> perfis = new HashMap>(); - HashMap contagens = null; - Select select = - new Select2( new String[]{ "estabelecimentos" }, - new Integer[]{}, - new Expression[]{}, - new String[]{ "empresa_id" }, - new Field( "id" ).isEqual( estabelecimentoID ), - null, - null, - null, - null ); - Virtual2DArray array = executer.executeQuery( select ); - Integer empresaId = ( Integer ) array.get( 0, 0 ); - select = - new Select2( new String[]{ "prt_elementos_protocolo", "prt_tipos_elementos_protocolo", "prt_grupos_protocolo" }, - new Integer[]{ Select2.JOIN_INNER, Select2.JOIN_INNER }, - new Expression[]{ - new Field( "prt_elementos_protocolo.tipo_elemento_protocolo_id" ).isEqual( new Field( "prt_tipos_elementos_protocolo.id" ) ), - new Field( "prt_tipos_elementos_protocolo.grupo_protocolo_id" ).isEqual( new Field( "prt_grupos_protocolo.id" ) ), - }, - new String[]{ "DISTINCT prt_elementos_protocolo.numero_perfil", "prt_grupos_protocolo.descricao" }, - new Field( "prt_elementos_protocolo.empresa_id" ).isEqual( empresaId ), - null, - null, - null, - null ); - array = executer.executeQuery( select ); - for( int n = 0; n < array.columnLength(); n++ ) - { - Integer perfil = ( Integer ) array.get( n, 0 ); - String tipo = ( String ) array.get( n, 1 ); - if( !perfis.containsKey( perfil ) ) - { - perfis.put( perfil, new Vector() ); - } - perfis.get( perfil ).add( tipo ); - } - - if( perfis.size() > 0 ) - { - contagens = new HashMap(); - select = new Select2( - new String[]{"trabalhadores", "marcacoes_trabalhador"}, - new Integer[]{ Select2.JOIN_INNER }, - new Expression[]{ new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ) }, - new String[]{"COUNT(marcacoes_trabalhador.id)", TrabalhadoresData.PERFIL }, - new Field( "trabalhadores.estabelecimento_id" ).isEqual( estabelecimentoID ).and( - new Field( MarcacoesTrabalhadorData.TIPO ).isEqual( new Integer( MarcacoesTrabalhadorData.TIPO_EXAMES ) ) ).and( - new Field( "YEAR( marcacoes_trabalhador.data ) " ).isEqual( new Integer( ano ) ).and( - new Field( Marcacao.REALIZADA ).isEqual( "y" ) ) ), - null, - new String[]{ TrabalhadoresData.PERFIL }, - null, - null ); - array = executer.executeQuery( select ); - for( int n = 0; n < array.columnLength(); n++ ) - { - Integer perfil = (Integer)array.get( n, 1 ); - Integer count = ( ( Number ) array.get( n, 0 ) ).intValue(); - if( perfil == null ) - { - continue; - } - Vector tipos = perfis.get( perfil ); - for( String tipo : tipos ) - { - if( !contagens.containsKey( tipo ) ) - { - contagens.put( tipo, count ); - } - else - { - contagens.put( tipo, contagens.get( tipo ) + count ); - } - } - } - } - return contagens; - } -} diff --git a/trunk/SIPRPSoft/src/siprp/pesquisas/RelatorioAnualWindow.java b/trunk/SIPRPSoft/src/siprp/pesquisas/RelatorioAnualWindow.java deleted file mode 100644 index 1360f197..00000000 --- a/trunk/SIPRPSoft/src/siprp/pesquisas/RelatorioAnualWindow.java +++ /dev/null @@ -1,626 +0,0 @@ -/* - * PesquisasWindow.java - * - * Created on 3 de Junho de 2004, 18:13 - */ - -package siprp.pesquisas; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.FileDialog; -import java.awt.FlowLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Vector; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JEditorPane; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import shst.data.outer.ContactosData; -import shst.data.outer.EmpresasData; -import shst.data.outer.EstabelecimentosData; -import siprp.ui.SIPRPFrame; - -import com.evolute.entity.ProviderInterface; -import com.evolute.utils.Singleton; -import com.evolute.utils.data.IDObject; -import com.evolute.utils.data.MappableObject; -import com.evolute.utils.documents.YearDocument; -import com.evolute.utils.tables.BaseTable; -import com.evolute.utils.tables.VectorTableModel; -import com.evolute.utils.tracker.TrackableWindow; -import com.evolute.utils.ui.DialogException; -import com.evolute.utils.ui.text.CopyPasteHandler; - -/** - * - * @author fpalma - */ -public class RelatorioAnualWindow extends SIPRPFrame - implements TrackableWindow, ListSelectionListener, ActionListener -{ - private ProviderInterface JDO; - private PesquisasProvider provider; - - private JTextField anoText; - private BaseTable empresasTable; - private VectorTableModel empresasModel; - private BaseTable estabelecimentosTable; - private VectorTableModel estabelecimentosModel; - private JButton pesquisarButton; - private JButton exportarButton; - private JEditorPane resultadoText; - -// public static void main( String args[] ) -// throws Exception -// { -// new PesquisasWindow().show(); -// } - - /** Creates a new instance of PesquisasWindow */ - public RelatorioAnualWindow() - throws Exception - { - provider = (PesquisasProvider)PesquisasProvider.getProvider(); - JDO =( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_EVO_DATA_PROVIDER ); - setupComponents(); - } - - private void setupComponents() - { - setSize( 1000, 700 ); - setTitle( "Relat\u00f3rio Anual" ); - - JLabel anoLabel = new JLabel( "Ano" ); - anoText = new JTextField(); - anoText.setDocument( new YearDocument() ); - anoText.setPreferredSize( new Dimension( 50, 20 ) ); - new CopyPasteHandler( anoText ); - - empresasModel = new VectorTableModel( new String[]{ "Designa\u00e7\u00e3o Social" } ); - empresasTable = new BaseTable( empresasModel ); - empresasTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); - empresasTable.setNonResizableNorReordable(); - empresasTable.getSelectionModel().addListSelectionListener( this ); - JScrollPane empresasScroll = new JScrollPane(); - empresasScroll.setViewportView( empresasTable ); - empresasScroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); - empresasScroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - empresasScroll.getVerticalScrollBar().setBlockIncrement(20); - - estabelecimentosModel = new VectorTableModel( new String[]{ "Nome" } ); - estabelecimentosTable = new BaseTable( estabelecimentosModel ); - estabelecimentosTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); - estabelecimentosTable.setNonResizableNorReordable(); - estabelecimentosTable.getSelectionModel().addListSelectionListener( this ); - JScrollPane estabelecimentosScroll = new JScrollPane(); - estabelecimentosScroll.setViewportView( estabelecimentosTable ); - estabelecimentosScroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); - estabelecimentosScroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - - pesquisarButton = new JButton( "Pesquisar" ); - pesquisarButton.addActionListener( this ); - exportarButton = new JButton( "Exportar" ); - exportarButton.addActionListener( this ); - - resultadoText = new JEditorPane( "text/html", "" ); - resultadoText.setEditable( false ); -// resultadoText.setLineWrap( true ); -// resultadoText.setWrapStyleWord( true ); - new CopyPasteHandler( resultadoText ); - JScrollPane resultadoScroll = new JScrollPane(); - resultadoScroll.setViewportView( resultadoText ); - resultadoScroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); - resultadoScroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ); - - JPanel pad; - - GridBagLayout gridbag = new GridBagLayout(); - getContentPane().setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 5, 5, 5, 5 ); - - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - JPanel anoPanel = new JPanel(); - anoPanel.setLayout( new FlowLayout( FlowLayout.LEFT ) ); - anoPanel.add( anoLabel ); - anoPanel.add( anoText ); - gridbag.setConstraints( anoPanel, constraints ); - getContentPane().add( anoPanel ); - - constraints.fill = GridBagConstraints.BOTH; - constraints.weighty = 0.2; - constraints.gridheight = 2; - constraints.weightx = 0.3; - constraints.gridwidth = 3; - - JPanel empresasPanel = new JPanel( new BorderLayout() ); - JPanel estabelecimentosPanel = new JPanel( new BorderLayout() ); - empresasPanel.setBorder( BorderFactory.createTitledBorder( "Empresa" ) ); - estabelecimentosPanel.setBorder( BorderFactory.createTitledBorder( "Estabelecimento" ) ); - empresasPanel.add( empresasScroll, BorderLayout.CENTER ); - estabelecimentosPanel.add( estabelecimentosScroll, BorderLayout.CENTER ); - - gridbag.setConstraints( empresasPanel, constraints ); - getContentPane().add( empresasPanel ); - - gridbag.setConstraints( estabelecimentosPanel, constraints ); - getContentPane().add( estabelecimentosPanel ); - - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 0.4; - constraints.gridwidth = GridBagConstraints.REMAINDER; - pad = new JPanel(); - gridbag.setConstraints( pad, constraints ); - getContentPane().add( pad ); - - constraints.fill = GridBagConstraints.HORIZONTAL; - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 0; - constraints.gridwidth = 1; - JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout( new GridLayout( 1, 2 ) ); - buttonPanel.add( pesquisarButton ); - buttonPanel.add( exportarButton ); - gridbag.setConstraints( buttonPanel, constraints ); - getContentPane().add( buttonPanel ); - - constraints.weighty = 0; - constraints.gridheight = 1; - constraints.weightx = 0.4; - constraints.gridwidth = GridBagConstraints.REMAINDER; - pad = new JPanel(); - gridbag.setConstraints( pad, constraints ); - getContentPane().add( pad ); - - constraints.fill = GridBagConstraints.BOTH; - constraints.weighty = 0.8; - constraints.gridheight = GridBagConstraints.REMAINDER; - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( resultadoScroll, constraints ); - getContentPane().add( resultadoScroll ); - } - - private boolean close() - { - setVisible( false ); - dispose(); - return true; - } - - public boolean closeIfPossible() - { - return close(); - } - - public void open() - { - empresasTable.clearSelection(); - try - { - IDObject empresas[] = provider.getAllEmpresas(); - empresasModel.setValues( new Vector( Arrays.asList( empresas ) ) ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar dados", true ); - } - setVisible( true ); - } - - public void refresh() - { - } - - public void valueChanged( ListSelectionEvent e ) - { - Object source = e.getSource(); - if( source.equals( empresasTable.getSelectionModel() ) ) - { - estabelecimentosTable.clearSelection(); - int selected = empresasTable.getSelectedRow(); - if( selected == -1 ) - { - return; - } - IDObject empresa = (IDObject) empresasModel.getRowAt( selected ); - estabelecimentosModel.clearAll(); - IDObject estabelecimentos[]; - try - { - estabelecimentos = provider.getAllEstabelecimentosForEmpresa( empresa.getID() ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar os estabelecimentos", true ); - return; - } - Vector v = new Vector( Arrays.asList( estabelecimentos ) ); - v.add( new MappableObject( new Integer( -1 ), "TODOS" ) ); - estabelecimentosModel.setValues( v ); - } -/* else if( source.equals( estabelecimentosTable.getSelectionModel() ) ) - { - }*/ - } - - public void actionPerformed( ActionEvent e ) - { - Object source = e.getSource(); - if( source.equals( pesquisarButton ) ) - { - int sEmpresa = empresasTable.getSelectedRow(); - int sEstabelecimento = estabelecimentosTable.getSelectedRow(); - String anoStr = anoText.getText(); - int ano = ( anoStr.length() != 0 )? Integer.parseInt( anoStr ): -1; - if( sEmpresa == -1 || ano == -1 ) - { - JOptionPane.showMessageDialog( this, "Tem de escolher ano e empresa", "Erro...", - JOptionPane.ERROR_MESSAGE ); - return; - } - StringBuffer buff = new StringBuffer(); - buff.append( "ANO: " ); - buff.append( "" + ano + "
" ); - buff.append( "
EMPRESA
" ); - try - { - Integer idEmpresa = ( (IDObject)empresasModel.getRowAt( sEmpresa ) ).getID(); - EmpresasData empresa = (EmpresasData)JDO.load( EmpresasData.class, idEmpresa ); - buff.append( " DESIGNA\u00C7\u00C3O SOCIAL: " ); - String designacao = (String)empresa.get( EmpresasData.DESIGNACAO_SOCIAL ); - buff.append( "" + ( designacao == null ? "" : designacao.trim() ) + "
" ); - buff.append( " MORADA: " ); - String morada = (String)empresa.get( EmpresasData.MORADA ); - buff.append( "" + ( morada == null ? "" : morada.trim() ) + "
" ); - buff.append( " LOCALIDADE: " ); - String localidade = ( String ) empresa.get( EmpresasData.LOCALIDADE ); - buff.append( "" + ( localidade == null ? "" : localidade.trim() ) + "
" ); - buff.append( " C\u00D3DIGO POSTAL: " ); - String codigoPostal = ( String ) empresa.get( EmpresasData.CODIGO_POSTAL ); - buff.append( "" + ( codigoPostal == null ? "" : codigoPostal.trim() ) + "
" ); -// ContactosData contacto = (ContactosData)empresa.get( EmpresasData.CONTACTO_2 ); - ContactosData contacto = empresa.toContacto_2(); - if( contacto == null ) - { - buff.append( " TELEFONE:
" ); - buff.append( " FAX:
" ); - } - else - { - buff.append( " TELEFONE: " ); - String telefone = ( String ) contacto.get( ContactosData.TELEFONE ); - buff.append( "" + ( telefone == null ? "" : telefone.trim() ) + "
" ); - buff.append( " FAX: " ); - String fax = ( String ) contacto.get( ContactosData.TELEFONE ); - buff.append( "" + ( fax == null ? "" : fax.trim() ) + "
" ); - } - buff.append( " DISTRITO: " ); - String distrito = ( String ) empresa.get( EmpresasData.DISTRITO ); - buff.append( "" + ( distrito == null ? "" : distrito ) + "
" ); - buff.append( " CONCELHO: " ); - String concelho = ( String ) empresa.get( EmpresasData.CONCELHO ); - buff.append( "" + ( concelho == null ? "" : concelho ) + "
" ); - buff.append( " N\u00DAMERO PESSOA COLECTIVA: " ); - String contribuinte = ( String ) empresa.get( EmpresasData.CONTRIBUINTE ); - buff.append( "" + ( contribuinte == null ? "" : contribuinte ) + "
" ); - buff.append( " N\u00DAMERO SEGURAN\u00C7A SOCIAL: " ); - String segSocial = ( String ) empresa.get( EmpresasData.SEGURANCA_SOCIAL ); - buff.append( "" + ( segSocial == null ? "" : segSocial ) + "
" ); - buff.append( " CAE: " ); - String CAE = ( String ) empresa.get( EmpresasData.CAE ); - buff.append( "" + ( CAE == null ? "" : CAE ) + "
" ); - buff.append( "
 N\u00DAMERO M\u00C9DIO DE TRABALHADORES DURANTE O ANO" ); - double contagemMedia[] = provider.countNumeroMedioTrabalhadoresEmpresa( idEmpresa, ano ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( ""); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "
    TOTAL HOMENS MULHERES
  TOTAL " + (int)( Math.round( contagemMedia[0] ) + Math.round( contagemMedia[1] ) ) + " " + ( (int)Math.round( contagemMedia[0] ) ) + " " + ( (int)Math.round( contagemMedia[1] ) ) + "
" ); - buff.append( "
 N\u00DAMERO TOTAL DE TRABALHADORES DURANTE O ANO" ); - double contagemTotal[] = provider.countNumeroTotalTrabalhadoresEmpresa( idEmpresa, ano ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( ""); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "
    TOTAL HOMENS MULHERES
  TOTAL " + (int)( Math.round( contagemTotal[0] ) + Math.round( contagemTotal[1] ) ) + " " + ( (int)Math.round( contagemTotal[0] ) ) + " " + ( (int)Math.round( contagemTotal[1] ) ) + "
" ); - - IDObject estabelecimentos[]; - if( sEstabelecimento == -1 || ( ( IDObject )estabelecimentosModel.getRowAt( sEstabelecimento ) ).getID().equals( new Integer( -1 ) ) ) - { - estabelecimentos = provider.getAllEstabelecimentosForEmpresa( idEmpresa ); - } - else - { - estabelecimentos = new IDObject[ 1 ]; - estabelecimentos[ 0 ] = ( IDObject )estabelecimentosModel.getRowAt( sEstabelecimento ); - } - buff.append( "
" ); - buff.append( "
 ESTABELECIMENTOS
" ); - buff.append( "
" ); - for( int n = 0; n < estabelecimentos.length; n++ ) - { - EstabelecimentosData estabelecimento = (EstabelecimentosData)JDO.load( EstabelecimentosData.class, estabelecimentos[ n ].getID() ); - buff.append( "  NOME: " ); - String nome = (String)estabelecimento.get( EstabelecimentosData.NOME ); - buff.append( "" + ( nome == null ? "" : nome.trim() ) + "
" ); - buff.append( "  MORADA: " ); - morada = (String)estabelecimento.get( EstabelecimentosData.MORADA ); - buff.append( "" + ( morada == null ? "" : morada.trim() ) + "
" ); - buff.append( "  LOCALIDADE: " ); - localidade = (String)estabelecimento.get( EstabelecimentosData.LOCALIDADE ); - buff.append( "" + ( localidade == null ? "" : localidade.trim() ) + "
" ); - buff.append( "  C\u00D3DIGO POSTAL: " ); - codigoPostal = (String)estabelecimento.get( EstabelecimentosData.CODIGO_POSTAL ); - buff.append( "" + ( codigoPostal == null ? "" : codigoPostal.trim() ) + "
" ); - contacto = estabelecimento.toContacto_id(); - if( contacto == null ) - { - buff.append( "  TELEFONE:
" ); - buff.append( "  FAX:
" ); - } - else - { - buff.append( "  TELEFONE: " ); - String telefone = ( String ) contacto.get( ContactosData.TELEFONE ); - buff.append( "" + ( telefone == null ? "" : telefone.trim() ) + "
" ); - buff.append( "  FAX: " ); - String fax = ( String ) contacto.get( ContactosData.TELEFONE ); - buff.append( "" + ( fax == null ? "" : fax.trim() ) + "
" ); - } - int countTrabalhadores[] = provider.countTrabalhadoresEstabelecimentoDezembro( estabelecimentos[ n ].getID(), ano ); - buff.append( "
" ); - buff.append( "  TRABALHADORES A 31 DE DEZEMBRO DE " + ano + ": " ); - buff.append( "
" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" - + "" - + "" - + "" ); - buff.append( "" ); - int countTrabalhadoresEtario[][] = provider.countTrabalhadoresEstabelecimentoDezembroPorGrupoEtario( estabelecimentos[ n ].getID(), ano ); - buff.append( "" ); - buff.append( "" - + "" - + "" - + "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" - + "" - + "" - + "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" - + "" - + "" - + "" ); - buff.append( "" ); - buff.append( "
   TOTALHOMENSMULHERES
  TOTAL " + ( countTrabalhadores[0] + countTrabalhadores[1] ) + " " + ( countTrabalhadores[0] ) + " " + ( countTrabalhadores[1] ) + "
  MENOS DE 18 ANOS " + ( countTrabalhadoresEtario[0][0] + countTrabalhadoresEtario[0][1] ) + " " + ( countTrabalhadoresEtario[0][0] ) + " " + ( countTrabalhadoresEtario[0][1] ) + "
  18 A 49 ANOS " + ( countTrabalhadoresEtario[1][0] + countTrabalhadoresEtario[1][1] ) + " " + ( countTrabalhadoresEtario[1][0] ) + " " + ( countTrabalhadoresEtario[1][1] ) + "
  MAIS DE 50 ANOS " + ( countTrabalhadoresEtario[2][0] + countTrabalhadoresEtario[2][1] ) + " " + ( countTrabalhadoresEtario[2][0] ) + " " + ( countTrabalhadoresEtario[2][1] ) + "
" ); - buff.append( "
" ); - int countExames[][] = provider.countExamesEstabelecimentoDezembroPorGrupoEtario( estabelecimentos[ n ].getID(), ano ); - for( int cE = 0; cE < countExames[ countExames.length - 2 ].length; cE++ ) - { - countExames[ countExames.length - 2 ][ cE ] += countExames[ countExames.length - 1 ][ cE ]; - } - int totais[] = new int[ 6 ]; - for( int cE1 = 0; cE1 < totais.length; cE1++ ) - { - for( int cE2 = 0; cE2 < countExames.length; cE2++ ) - { - totais[ cE1 ] += countExames[ cE2 ][ cE1 ]; - } - } - buff.append( "
" ); - buff.append( "  N\u00DAMERO DE EXAMES DE ADMISS\u00C3O, PERI\u00D3DICOS E OCASIONAIS EFECTUADOS" ); - buff.append( "
" ); - buff.append( "" ); - buff.append( "" - + "" ); - buff.append( "" ); - buff.append( "" ); - for( int t = 0; t < 3; t++ ) - { - buff.append( "" ); - } - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - for( int t = 3; t < 6; t++ ) - { - buff.append( "" ); - } - buff.append( "" ); - String sexos[] = new String[]{ "H", "M" }; - for( int t = 0; t < provider.DESCRICAO_TIPOS_EXAME.length; t++ ) - { - buff.append( "" ); - - for( int s = 0; s < 2; s++ ) - { - buff.append( "" ); - buff.append( "" ); - for( int d = 0; d < 3; d++ ) - { - buff.append( "" ); - } - if( s == 0 ) - { - buff.append( "" ); - } - else - { - buff.append( "" ); - } - } - } - int countExamesOcasionais[][] = provider.countExamesOcasionaisEstabelecimentoDezembroPorGrupoEtario( estabelecimentos[ n ].getID(), ano ); - for( int t = 0; t < provider.DESCRICAO_TIPOS_OCASIONAL.length; t++ ) - { - buff.append( "" ); - - for( int s = 0; s < 2; s++ ) - { - buff.append( "" ); - int sum = countExamesOcasionais[t][s*3]+countExamesOcasionais[t][s*3+1]+countExamesOcasionais[t][s*3+2]; - buff.append( "" ); - for( int d = 0; d < 3; d++ ) - { - int val = countExamesOcasionais[t][s*3+d]; - if( val < 0 ) - { - countExamesOcasionais[t][s*3+d] = 0; - } - buff.append( "" ); - } - if( s == 0 ) - { - buff.append( "" ); - } - else - { - buff.append( "" ); - } - } - } - buff.append( "
      TOTAL INFERIOR A 18 ANOS 18 A 49 ANOS 50 E MAIS ANOS 
   TOTAL DE EXAMES H" + ( totais[0] + totais[1] + totais[2] ) + " " + totais[t] + " 
     M" + ( totais[3] + totais[4] + totais[5] ) + " " + totais[t] + " 
    "+provider.DESCRICAO_TIPOS_EXAME[t]+" " + sexos[ s ] + "" + (countExames[t][s*3]+countExames[t][s*3+1]+countExames[t][s*3+2]) + " " + countExames[t][s*3+d] + " 
    
       "+provider.DESCRICAO_TIPOS_OCASIONAL[t]+" " + sexos[ s ] + "" + ( sum < 0 ? "-" : "" + sum ) + " " + ( val < 0 ? "-" : "" + val ) + " 
       
" ); - buff.append( "
" ); - buff.append( "  EXAMES COMPLEMENTARES REALIZADOS" ); - buff.append( "
" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - String nomesExamesComp[] = provider.getNomesExames(); -// int countExamesComp[] = provider.countExamesComplementaresEmpresa( idEmpresa, ano ); - HashMap countExamesCompNovo = provider.countExamesComplementaresEstabelecimentoNovosProtocolos( estabelecimentos[ n ].getID(), ano ); - if( countExamesCompNovo != null ) - { - String nomesExames[] = countExamesCompNovo.keySet().toArray( new String[ countExamesCompNovo.size() ] ); - Arrays.sort( nomesExames ); - for( String nomeExame : nomesExames ) - { - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - } - } - else - { - int countExamesComp[] = provider.countExamesComplementaresEstabelecimento( estabelecimentos[ n ].getID(), ano ); - for( int nec = 0; nec < nomesExamesComp.length; nec++ ) - { - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - buff.append( "" ); - } - } - buff.append( "
   TIPO DE EXAME N\u00BA TOTAL DE EXAMES
   " + nomeExame + " " + countExamesCompNovo.get( nomeExame ) + "
   " + nomesExamesComp[nec] + " " + countExamesComp[nec] + "
" ); - buff.append("


"); - } - - resultadoText.setText( buff.toString() ); - } - catch( Exception ex ) - { - DialogException.showExceptionMessage( ex, "Erro a carregar dados", false ); - return; - } - } - else if( source.equals( exportarButton ) ) - { - exportar(); - } - } - - public void exportar() - { - FileDialog dialog = new FileDialog( this, "Ficheiro de destino", FileDialog.SAVE ); - dialog.setDirectory( System.getProperty( "user.home" ) ); - dialog.setVisible( true ); - String fileName; - String dirName; - fileName = dialog.getFile(); - dirName = dialog.getDirectory(); - if( fileName != null ) - { - int index = fileName.indexOf( '.' ); - if( index == -1 ) - { - fileName += ".html"; - } - if( index == fileName.length() - 1 ) - { - fileName += "html"; - } - String fullName = dirName + fileName; - String text = resultadoText.getText(); - String title = "S.I.P.R.P. - Sociedade Ibérica de Prevenção de Riscos Profissionais"; - String style = ""; - text = text.replace( "", "\n\t\t" + title + "\n" + style ); - text = text.replace( "", "
" ); - text = text.replace( "", "
" ); - text = text.replace( "", "\n
Relatório Anual
" ); -// String title = "S.I.P.R.P. - Sociedade Ibérica de Prevenção de Riscos Profissionais"; -// text = text.replace( "", "\n\t\t" + title + "" ); -// System.out.println( text ); - try - { - FileWriter writer = new FileWriter( new File( fullName ) ); - writer.write( text ); - writer.close(); - } - catch( IOException ex ) - { - DialogException.showException( ex ); - return; - } - } - } -} - diff --git a/trunk/SIPRPSoft/src/siprp/teste.xml b/trunk/SIPRPSoft/src/siprp/teste.xml deleted file mode 100644 index de26bcab..00000000 --- a/trunk/SIPRPSoft/src/siprp/teste.xml +++ /dev/null @@ -1,384 +0,0 @@ - - - - 1 - - - - 2008 - - - 01 - - - 01 - - - - - Companhia Portuguesa de Hipermercados, S.A., com sede na Travessa Teixeira - Júnior, 1 - 1300-553 Lisboa - - - Comércio a Retalho em Supermercados e Hipermercados - - - Jumbo Alfragide - - - - - Mapfre Seguros Gerais, S.A. - - - 1500591100500 - - - - - SIPRP - Sociedade Ibérica de Prevenção de Riscos Profissionais Lda., - com sede no Edifício Atrium Saldanha, Praça Duque de Saldanha, 1 - 9º G - - 1050-094 Lisboa - - - - Tecnico HST teste - - - C1A2P3 - - - - - Medico Trabalho teste - - - C123 - - - - - - Trablhador acidentado - - - - Jumbo de Alfragide - - - - - 1980 - - - 11 - - - 08 - - - - - 1112225585 - - - - Rua de Cima, 3º dto - - - 215465981 - - - - 2004 - - - 10 - - - 01 - - - - Varredor - - - Tarde - - - - António Pedro - - - apedro@hotmail.com - - - - - - - João António - - - - - 2007 - - - 12 - - - 23 - - - - - 12 - - - 35 - - - - 4 - - - - Congelados - - - Corredor Esquerdo - - - - - A varrer - - - Vassoura - - - Chão molhado - - - - Pedro Silva, Marco Pedro - - - Sono - - - Escorregou e caiu - - - - - - - - - Conclusao sem indicios nenhuns q a suportem - - - gritar. correr as voltas em panico - - - - y - - - - - - - 3 - - - - 3487 - - - 23424 - - - - - - 0 - - - - - - - - - - - - - Cabeça - - - - - Tronco - - - - - Membro Superior Direito - - - Mão - - - - - Grave - - - - - Permanente - - - 10 - - - - 2005 - - - 01 - - - 01 - - - - - 2007 - - - 01 - - - 01 - - - - - - - - - - - - - - - - - - - - - - - - - beber mta agua - - - fazer aerobica - - - - - despedir o trabalhador - - - lamber sabao - - - - - - Joao - - - - 2007 - - - 01 - - - 01 - - - - - - Pedro - - - - 2007 - - - 01 - - - 02 - - - - - - Simao - - - - 2007 - - - 01 - - - 03 - - - - - - Rafael - - - - 2007 - - - 01 - - - 04 - - - - - - - - - - - - - - - - - diff --git a/trunk/SIPRPSoft/src/siprp/ui/SIPRPFrame.java b/trunk/SIPRPSoft/src/siprp/ui/SIPRPFrame.java deleted file mode 100644 index 6f96d6b9..00000000 --- a/trunk/SIPRPSoft/src/siprp/ui/SIPRPFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package siprp.ui; - -import com.evolute.swing.frame.EvoFrame; - -public class SIPRPFrame extends EvoFrame -{ - private static final long serialVersionUID = 1L; - - public SIPRPFrame() - { - this( "" ); - } - - public SIPRPFrame( String title ) - { - super( title ); - centerLater(); - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/ui/SIPRPTabbedWindow.java b/trunk/SIPRPSoft/src/siprp/ui/SIPRPTabbedWindow.java deleted file mode 100644 index 5ae72572..00000000 --- a/trunk/SIPRPSoft/src/siprp/ui/SIPRPTabbedWindow.java +++ /dev/null @@ -1,32 +0,0 @@ -package siprp.ui; - -import javax.swing.JPanel; - -import com.evolute.utils.ui.window.TabbedWindow; - -public class SIPRPTabbedWindow extends TabbedWindow -{ - private static final long serialVersionUID = 1L; - - public SIPRPTabbedWindow( JPanel upperPanel, String[] tabNames, boolean[][] activeActions ) - throws Exception - { - super( upperPanel, tabNames, activeActions ); - centerLater(); - } - - public SIPRPTabbedWindow( boolean upperPanel, String[] tabNames, double weight, boolean[][] activeActions ) - throws Exception - { - super( upperPanel, tabNames, weight, activeActions ); - centerLater(); - } - - public SIPRPTabbedWindow( JPanel upperPanel, String[] tabNames, double weight, boolean[][] activeActions ) - throws Exception - { - super( upperPanel, tabNames, weight, activeActions ); - centerLater(); - } - -} diff --git a/trunk/SIPRPSoft/src/siprp/web/WebUpdater.java b/trunk/SIPRPSoft/src/siprp/web/WebUpdater.java deleted file mode 100644 index 6ccb96e6..00000000 --- a/trunk/SIPRPSoft/src/siprp/web/WebUpdater.java +++ /dev/null @@ -1,1233 +0,0 @@ -/* - * WebUpdater.java - * - * Created on 27 de Outubro de 2004, 15:54 - */ - -package siprp.web; - -import java.awt.Color; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.Statement; -import java.util.Calendar; -import java.util.Properties; -import java.util.Vector; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.event.DocumentListener; - -import siprp.ui.SIPRPFrame; - -//import siprp.*; -//import siprp.clientes.*; - -/** - * - * @author fpalma - */ -public class WebUpdater extends SIPRPFrame - implements ActionListener, Runnable, DocumentListener -{ - private Connection softwareConnection; - private Connection webConnection; - - public static final String GET_ULTIMA_ACTUALIZACAO = "SELECT stamp FROM actualizacao"; - - public static final String GET_EMPRESAS = - "SELECT id, designacao_social, perfil_1, perfil_2, codigo_1, codigo_2, " - + "codigo_3, cae, contribuinte, seguranca_social, actividade, servicos, morada, " - + "localidade, codigo_postal, distrito, concelho, inactivo, contacto_1 " - + "FROM empresas WHERE actualizacao >= "; - - public static final String GET_EMAIL = - "SELECT email FROM contactos WHERE id = "; - - public static final String GET_ESTABELECIMENTOS = - "SELECT id, empresa_id, nome, contacto, morada, localidade, codigo_postal, inactivo " - + "FROM estabelecimentos WHERE actualizacao >= "; - - public static final String GET_TRABALHADORES = - "SELECT id, nome, sexo, data_nascimento, numero_mecanografico, categoria, estabelecimento_id, data_demissao, inactivo " - + "FROM trabalhadores WHERE actualizacao >= "; - - public static final String GET_CONTACTO = - "SELECT nome, telefone, telemovel, fax, email, cargo FROM contactos WHERE id = "; - - public static final String GET_MARCACOES_ESTABELECIMENTO = - "SELECT id, data, realizada, data_relatorio FROM marcacoes_estabelecimento " - + "WHERE estabelecimento_id = "; - - public static final String GET_EXAMES_TRABALHADOR = - "SELECT id, data, realizada, data_relatorio FROM marcacoes_trabalhador " - + "WHERE tipo = 0 and trabalhador_id = ?trabalhador_id " - + "ORDER BY data"; - - public static final String GET_CONSULTAS_TRABALHADOR = - "SELECT id, data, realizada, data_relatorio FROM marcacoes_trabalhador " - + "WHERE tipo = 1 and trabalhador_id = ?trabalhador_id " - + "ORDER BY data"; - - public static final String GET_ID_FICHA_APTIDAO = - "SELECT MAX(id) FROM exames WHERE trabalhador_id = ?trabalhador_id AND inactivo <> 'y'"; - - public static final String GET_DADOS_FICHA_APTIDAO = - "SELECT data, resultado FROM exames WHERE id = ?id"; - - public static final String DELETE_TRABALHADOR = - "DELETE FROM trabalhadores WHERE id = "; - - public static final String DELETE_TRABALHADORES_BY_ESTABELECIMENTO = - "DELETE FROM trabalhadores WHERE estabelecimento_id = "; - - public static final String DELETE_ESTABELECIMENTO = - "DELETE FROM estabelecimentos WHERE id = "; - - public static final String DELETE_ESTABELECIMENTOS_BY_EMPRESA = - "DELETE FROM estabelecimentos WHERE empresa_id = "; - - public static final String DELETE_TRABALHADORES_BY_EMPRESA = - "DELETE FROM trabalhadores WHERE estabelecimento_id IN ( SELECT id FROM estabelecimentos WHERE empresa_id = ?empresa_id )"; - - public static final String DELETE_EMPRESA = - "DELETE FROM empresas WHERE id = "; - - public static final String CREATE_EMPRESA = - "INSERT INTO empresas(id) VALUES( ?id )"; - - public static final String CREATE_ESTABELECIMENTO = - "INSERT INTO estabelecimentos(id) VALUES( ?id )"; - - public static final String CREATE_TRABALHADOR = - "INSERT INTO trabalhadores(id) VALUES( ?id )"; - - public static final String UPDATE_EMPRESA = - "UPDATE empresas SET morada = ?morada, codigo_postal = ?codigo_postal, " - + "localidade = ?localidade, distrito = ?distrito, concelho = ?concelho, " - + "perfil_1 = ?perfil_1, perfil_2 = ?perfil_2, codigo = ?codigo, cae = ?cae, " - + "contribuinte = ?contribuinte, seguranca_social = ?seguranca_social, " - + "actividade = ?actividade, servicos = ?servicos, designacao_social = ?designacao_social, " - + "email = ?email " - + "WHERE id = ?id"; - - public static final String UPDATE_ESTABELECIMENTO = - "UPDATE estabelecimentos SET empresa_id = ?empresa_id, morada = ?morada, " - + "codigo_postal = ?codigo_postal, localidade = ?localidade, " - + "ultima_visita = ?ultima_visita, realizada = ?realizada, " - + "proxima_visita = ?proxima_visita, nome = ?nome " - + "WHERE id = ?id"; - - public static final String UPDATE_TRABALHADOR = - "UPDATE trabalhadores SET sexo = ?sexo, data_nascimento = ?data_nascimento, " - + "numero_mecanografico = ?numero_mecanografico, categoria = ?categoria, " - + "ultimo_exame = ?ultimo_exame, realizado = ?realizado, proximo_exame = ?proximo_exame, " - + "ultima_consulta = ?ultima_consulta, realizada = ?realizada, " - + "proxima_consulta = ?proxima_consulta, nome = ?nome, " - + "resultado = ?resultado, data_ficha = ?data_ficha, " - + "estabelecimento_id = ?estabelecimento_id " - + "WHERE id = ?id"; - - public static final String UPDATE_ACTUALIZACAO = "UPDATE actualizacao SET stamp = "; - - - public static final String PROPERTIES_FILE = "updtprop.txt"; - public static final String PROP_LOCAL = "interno"; - public static final String PROP_LOCAL_U = "iuser"; - public static final String PROP_LOCAL_P = "ipasswd"; - public static final String PROP_REMOTE = "externo"; - public static final String PROP_REMOTE_U = "euser"; - public static final String PROP_REMOTE_P = "epasswd"; - public static final String PROP_INTERVAL = "intervalo"; - - - protected Vector deletes; - protected Vector updates; - - protected Thread updateThread; - - protected JTextField servidorInternoText; - protected JTextField servidorExternoText; - protected JTextField intervaloText; - protected JTextField ultimaActualizacaoText; - protected JTextField proximaActualizacaoText; - protected JButton actionButton; - protected JButton saveButton; - protected JButton cancelButton; - protected JLabel stateLabel; - - protected boolean running; - protected String servidorInterno; - protected String servidorExterno; - protected String internalUser; - protected String internalPassword; - protected String externalUser; - protected String externalPassword; - protected long intervalo; - - /** Creates a new instance of WebUpdater */ - public WebUpdater() - { - deletes = new Vector(); - updates = new Vector(); - running = false; - servidorInterno = "ws_fpalma"; - servidorExterno = "localhost:5436"; - intervalo = 10; - setupComponents(); - } - - protected void setupComponents() - { - setSize( 500, 200 ); - setResizable( false ); - setTitle( "Actualiza\u00e7\u00e3o do Site" ); - JLabel servidorInternoLabel = new JLabel( "Servidor Interno" ); - servidorInternoText = new JTextField(); - servidorInternoText.setPreferredSize( new Dimension( 120, 20 ) ); - servidorInternoText.setForeground( Color.red ); - JLabel servidorExternoLabel = new JLabel( "Servidor Externo" ); - servidorExternoText = new JTextField(); - servidorExternoText.setPreferredSize( new Dimension( 120, 20 ) ); - servidorExternoText.setForeground( Color.red ); - JLabel intervaloLabel = new JLabel( "Intervalo de Actualiza\u00e7\u00e3o (minutos)" ); - intervaloText = new JTextField(); - intervaloText.setPreferredSize( new Dimension( 50, 20 ) ); - JLabel ultimaActualizacaoLabel = new JLabel( "\u00daltima Actualiza\u00e7\u00e3o" ); - ultimaActualizacaoText = new JTextField(); - ultimaActualizacaoText.setPreferredSize( new Dimension( 120, 20 ) ); - ultimaActualizacaoText.setEditable( false ); - JLabel proximaActualizacaoLabel = new JLabel( "Pr\u00f3xima Actualiza\u00e7\u00e3o" ); - proximaActualizacaoText = new JTextField(); - proximaActualizacaoText.setPreferredSize( new Dimension( 120, 20 ) ); - proximaActualizacaoText.setEditable( false ); - actionButton = new JButton( "Executar" ); - saveButton = new JButton( "Guardar Altera\u00e7\u00f5es" ); - saveButton.setEnabled( false ); - cancelButton = new JButton( "Cancelar Altera\u00e7\u00f5es" ); - cancelButton.setEnabled( false ); - stateLabel = new JLabel( " " ); - JPanel buttonPanel = new JPanel(); - JPanel pad = new JPanel(); - pad.setPreferredSize( new Dimension( 120, 20 ) ); - - Container container = getContentPane(); - GridBagLayout gridbag = new GridBagLayout(); - container.setLayout( gridbag ); - GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets = new Insets( 1, 1, 1, 1 ); -// constraints.anchor = GridBagConstraints.EAST; - constraints.fill = GridBagConstraints.BOTH; - constraints.weighty = 0; - constraints.gridheight = 1; - - constraints.weightx = 0; - constraints.gridwidth = 1; - gridbag.setConstraints( servidorInternoLabel, constraints ); - gridbag.setConstraints( servidorExternoLabel, constraints ); - gridbag.setConstraints( intervaloLabel, constraints ); - gridbag.setConstraints( ultimaActualizacaoLabel, constraints ); - gridbag.setConstraints( proximaActualizacaoLabel, constraints ); - - constraints.weightx = 1; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( servidorInternoText, constraints ); - gridbag.setConstraints( servidorExternoText, constraints ); - gridbag.setConstraints( ultimaActualizacaoText, constraints ); - gridbag.setConstraints( proximaActualizacaoText, constraints ); - gridbag.setConstraints( buttonPanel, constraints ); - gridbag.setConstraints( stateLabel, constraints ); - - constraints.weightx = 0.5; - constraints.gridwidth = 1; - gridbag.setConstraints( intervaloText, constraints ); - - constraints.weightx = 0.5; - constraints.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints( pad, constraints ); - - container.add( servidorInternoLabel ); - container.add( servidorInternoText ); - container.add( servidorExternoLabel ); - container.add( servidorExternoText ); - container.add( intervaloLabel ); - container.add( intervaloText ); - container.add( pad ); - container.add( ultimaActualizacaoLabel ); - container.add( ultimaActualizacaoText ); - container.add( proximaActualizacaoLabel ); - container.add( proximaActualizacaoText ); - container.add( buttonPanel ); - container.add( stateLabel ); - - buttonPanel.setLayout( new FlowLayout( FlowLayout.RIGHT ) ); - buttonPanel.add( saveButton ); - buttonPanel.add( cancelButton ); - buttonPanel.add( actionButton ); - - actionButton.addActionListener( this ); - stateLabel.setText( "Parado" ); - stateLabel.setForeground( Color.red ); - -// servidorInternoText.setText( servidorInterno ); -// servidorExternoText.setText( servidorExterno ); -// intervaloText.setText( "" + intervalo ); - reload(); - - servidorInternoText.getDocument().addDocumentListener( this ); - servidorExternoText.getDocument().addDocumentListener( this ); - intervaloText.getDocument().addDocumentListener( this ); - saveButton.addActionListener( this ); - cancelButton.addActionListener( this ); - } - - public void actionPerformed(java.awt.event.ActionEvent actionEvent) - { - Object source = actionEvent.getSource(); - if( actionButton.equals( source ) ) - { - if( running ) - { - running = false; - updateThread.interrupt(); - actionButton.setText( "Executar" ); - stateLabel.setText( "Parado" ); - stateLabel.setBackground( Color.red ); - } - else - { - updateThread = new Thread( this ); - updateThread.start(); - actionButton.setText( "Parar" ); - } - } - else if( saveButton.equals( source ) ) - { - save(); - saveButton.setEnabled( false ); - cancelButton.setEnabled( false ); - } - else if( cancelButton.equals( source ) ) - { - reload(); - saveButton.setEnabled( false ); - cancelButton.setEnabled( false ); - } - } - - - public void changedUpdate(javax.swing.event.DocumentEvent documentEvent) - { - saveButton.setEnabled( true ); - cancelButton.setEnabled( true ); - } - - public void insertUpdate(javax.swing.event.DocumentEvent documentEvent) - { - saveButton.setEnabled( true ); - cancelButton.setEnabled( true ); - } - - public void removeUpdate(javax.swing.event.DocumentEvent documentEvent) - { - saveButton.setEnabled( true ); - cancelButton.setEnabled( true ); - } - - protected void save() - { - Properties props = new Properties(); - try - { - OutputStream out = new FileOutputStream( PROPERTIES_FILE ); - String auxSI = servidorInternoText.getText(); - String auxSE = servidorExternoText.getText(); - String auxI = intervaloText.getText();; - if( auxSI == null || auxSI.length() == 0 || - auxSE == null || auxSE.length() == 0 || - auxI == null || auxI.length() == 0 ) - { - throw new Exception( "" ); - } - intervalo = Long.parseLong( auxI ); - servidorInterno = auxSI; - servidorExterno = auxSE; - props.setProperty( PROP_LOCAL, servidorInterno ); - props.setProperty( PROP_LOCAL_U, internalUser ); - props.setProperty( PROP_LOCAL_P, internalPassword ); - props.setProperty( PROP_REMOTE, servidorExterno ); - props.setProperty( PROP_REMOTE_U, externalUser ); - props.setProperty( PROP_REMOTE_P, externalPassword ); - props.setProperty( PROP_INTERVAL, "" + intervalo ); - props.store( out, "Configura\u00e7\u00e3o da Ferramenta de Actualiza\u00e7\u00e3o da SIPRP" ); - out.close(); - } - catch( Exception ex ) - { - JOptionPane.showMessageDialog( this, "Erro a gravar altera\u00e7\u00f5es", "Erro", - JOptionPane.ERROR_MESSAGE ); - } - } - - protected void reload() - { - Properties props = new Properties(); - try - { - -System.out.println( new File( PROPERTIES_FILE ) ); - InputStream in = new FileInputStream( PROPERTIES_FILE ); - props.load( in ); - internalUser = props.getProperty( PROP_LOCAL_U ); - internalPassword = props.getProperty( PROP_LOCAL_P ); - externalUser = props.getProperty( PROP_REMOTE_U ); - externalPassword = props.getProperty( PROP_REMOTE_P ); - - String aux; - aux = props.getProperty( PROP_LOCAL ); - if( aux != null && aux.length() > 0 ) - { - servidorInterno = aux; - } - aux = props.getProperty( PROP_REMOTE ); - if( aux != null && aux.length() > 0 ) - { - servidorExterno = aux; - } - aux = props.getProperty( PROP_INTERVAL ); - if( aux != null && aux.length() > 0 ) - { - try - { - intervalo = Long.parseLong( aux ); - } - catch( NumberFormatException nfe ) - { - } - } - - } - catch( Exception ex ) - { - JOptionPane.showMessageDialog( this, "Erro a carregar os dados", "Erro", - JOptionPane.ERROR_MESSAGE ); - } - servidorInternoText.setText( servidorInterno ); - servidorExternoText.setText( servidorExterno ); - intervaloText.setText( "" + intervalo ); - } - - public void run() - { - running = true; - while( true ) - { - boolean erro = false; - if( !running ) - { - return; - } - proximaActualizacaoText.setText( "" ); - try - { - stateLabel.setText( "A Actualizar" ); - stateLabel.setForeground( Color.green ); - doUpdates(); - java.util.Date date = new java.util.Date(); - ultimaActualizacaoText.setText( date.toString() ); - } - catch( Exception ex ) - { - erro = true; - stateLabel.setText( "ERRO A ACTUALIZAR!!!" ); - stateLabel.setForeground( Color.red ); - } - if( !running ) - { - return; - } - try - { - if( !erro ) - { - stateLabel.setText( "Em Intervalo (" + intervalo + " minuto" + ( intervalo > 1 ? "s" : "" ) + ")" ); - stateLabel.setForeground( Color.black ); - } - Calendar cal = Calendar.getInstance(); - cal.add( Calendar.MINUTE, (int)intervalo ); - proximaActualizacaoText.setText( "" + cal.getTime() ); - Thread.sleep( intervalo * 60000 ); - } - catch( InterruptedException iex ) - { - } - } - } - - protected void doUpdates() - throws Exception - { - try - { - connect(); - getData(); - updateData(); - } - catch( Exception ex ) - { - ex.printStackTrace(); - throw ex; - } - - } - - /** - * @param args the command line arguments - */ - public static void main( String[] args ) - throws Exception - { - WebUpdater updater = new WebUpdater(); - updater.setVisible( true ); - } - - protected void connect() - throws Exception - { - Class.forName( "org.postgresql.Driver" ); - Class.forName( "com.mysql.jdbc.Driver" ); - webConnection = DriverManager.getConnection( "jdbc:postgresql://" + servidorExterno + "/siprp", externalUser, externalPassword ); - webConnection.setAutoCommit( true ); - softwareConnection = DriverManager.getConnection( "jdbc:mysql://" + servidorInterno + "/siprp", internalUser, internalPassword ); -// softwareConnection = DriverManager.getConnection( "jdbc:postgresql://" + servidorInterno + "/siprp", internalUser, internalPassword ); - softwareConnection.setAutoCommit( true ); - } - - protected void getData() - throws Exception - { - Object r[][]; - r = doQuery( webConnection, GET_ULTIMA_ACTUALIZACAO ); - String actualizacao = "'" + r[0][0] + "'"; - Calendar cal = Calendar.getInstance(); - //int hour = cal.get( Calendar.HOUR_OF_DAY ); - //if( hour < 3 && hour > 1 ) - //{ - // actualizacao = "'1970-01-01 00:00:00'"; - //} - doQuery(softwareConnection, "DELETE FROM actualizacao;", true); - doQuery(softwareConnection, "INSERT INTO actualizacao(hora) VALUES(now());", true); - readTrabalhadores( actualizacao ); - readEstabelecimentos( actualizacao ); - readEmpresas( actualizacao ); - } - - protected void updateData() - throws Exception - { - System.out.println( "DELETES" ); - for( int d = 0; d < deletes.size(); d++ ) - { - try - { - System.out.println( deletes.elementAt( d ).toString() ); - doQuery( webConnection, deletes.elementAt( d ).toString(), true ); - } - catch( Exception ex ) - { - ex.printStackTrace(); - } - } - System.out.println( "" ); - System.out.println( "UPDATES" ); - for( int u = 0; u < updates.size(); u++ ) - { - String queries[] = ( String[] ) updates.elementAt( u ); - System.out.println( queries[ 0 ] + "\n " + queries[ 1 ] ); - try - { - doQuery( webConnection, queries[ 0 ], true ); - } - catch( Exception ex ) - { - System.out.println( " ERRO DE INSERT" ); - } - try - { - doQuery( webConnection, queries[ 1 ], true ); - } - catch( Exception ex ) - { - ex.printStackTrace(); - } - } - Object r[][] = doQuery( softwareConnection, "SELECT hora FROM actualizacao;" ); - String actualizacao = "'" + r[0][0] + "'"; - doQuery( webConnection, UPDATE_ACTUALIZACAO + actualizacao, true ); - } - - protected void readTrabalhadores( String actualizacao ) - throws Exception - { - Object trabalhadores[][] = doQuery( softwareConnection, GET_TRABALHADORES + actualizacao ); - for( int t = 0; t < trabalhadores.length; t++ ) - { - for( int c = 0; c < trabalhadores[ t ].length; c++ ) - { - if( trabalhadores[ t ][ c ] instanceof String ) - { - trabalhadores[ t ][ c ] = unicodeToHTML( (String) trabalhadores[ t ][ c ] ); - } - } - int id = ( ( Number ) trabalhadores[t][0] ).intValue(); - boolean inactivo = "y".equals( trabalhadores[ t ][ trabalhadores[ t ].length - 1 ] ) || - trabalhadores[ t ][ trabalhadores[ t ].length - 2 ] != null; - if( inactivo ) - { - deletes.add( DELETE_TRABALHADOR + id ); - continue; - } - String queries[] = new String[ 2 ]; - updates.insertElementAt( queries, 0 ); - queries[ 0 ] = CREATE_TRABALHADOR.replaceFirst( "[?]id", "" + id ); - String update = UPDATE_TRABALHADOR.replaceFirst( "[?]id", "" + id ); - - String nome = "'" + trabalhadores[ t ][ 1 ] + "'"; - update = update.replaceFirst( "[?]nome", nome ); - String sexo = "'" + trabalhadores[ t ][ 2 ] + "'"; - update = update.replaceFirst( "[?]sexo", sexo ); - String dataNasc; - if( trabalhadores[ t ][ 3 ] != null ) - { - dataNasc = "'" + trabalhadores[ t ][ 3 ] + "'"; - } - else - { - dataNasc = "''"; - } - update = update.replaceFirst( "[?]data_nascimento", dataNasc ); - String numeroMecanografico; - if( trabalhadores[ t ][ 4 ] != null ) - { - numeroMecanografico = "'" + trabalhadores[ t ][ 4 ] + "'"; - } - else - { - numeroMecanografico = "''"; - } - update = update.replaceFirst( "[?]numero_mecanografico", numeroMecanografico ); - String categoria; - if( trabalhadores[ t ][ 5 ] != null ) - { - categoria = "'" + trabalhadores[ t ][ 5 ] + "'"; - } - else - { - categoria = "''"; - } - update = update.replaceFirst( "[?]categoria", categoria ); - int estabelecimentoID = ( ( Number ) trabalhadores[t][6] ).intValue(); - update = update.replaceFirst( "[?]estabelecimento_id", "" + estabelecimentoID ); - Object exames[][] = doQuery( softwareConnection, - GET_EXAMES_TRABALHADOR.replaceFirst( "[?]trabalhador_id", ""+id ) ); - - if( exames != null && exames.length > 0 ) - { - java.util.Date dataExame2 = ( java.util.Date ) exames[ exames.length - 1 ] [ 1 ]; - String realizado2 = ( String ) exames[ exames.length - 1 ][ 2 ]; - java.util.Date dataExame1; - String realizado1; - if( exames.length >= 2 ) - { - dataExame1 = ( java.util.Date ) exames[ exames.length - 2 ] [ 1 ]; - realizado1 = ( String ) exames[ exames.length - 2 ][ 2 ]; - } - else - { - dataExame1 = dataExame2; - realizado1 = realizado2; - } - if( "y".equals( realizado2 ) ) - { - update = update.replaceFirst( "[?]ultimo_exame", "'" + dataExame2 + "'" ); - update = update.replaceFirst( "[?]realizado", "'" + realizado2 + "'" ); - update = update.replaceFirst( "[?]proximo_exame", "null" ); - } - else if( new java.util.Date().after( dataExame2 ) ) - { - update = update.replaceFirst( "[?]ultimo_exame", "'" + dataExame2 + "'" ); - update = update.replaceFirst( "[?]realizado", "'" + realizado2 + "'" ); - update = update.replaceFirst( "[?]proximo_exame", "null" ); - } - else - { - update = update.replaceFirst( "[?]proximo_exame", "'" + dataExame2 + "'" ); - if( !dataExame2.equals( dataExame1 ) ) - { - update = update.replaceFirst( "[?]ultimo_exame", "'" + dataExame1 + "'" ); - update = update.replaceFirst( "[?]realizado", "'" + realizado1 + "'" ); - } - else - { - update = update.replaceFirst( "[?]ultimo_exame", "null" ); - update = update.replaceFirst( "[?]realizado", "null" ); - } - } - } - else - { - update = update.replaceFirst( "[?]ultimo_exame", "null" ); - update = update.replaceFirst( "[?]realizado", "null" ); - update = update.replaceFirst( "[?]proximo_exame", "null" ); - } - Object consultas[][] = doQuery( softwareConnection, - GET_CONSULTAS_TRABALHADOR.replaceFirst( "[?]trabalhador_id", ""+id ) ); - - if( consultas != null && consultas.length > 0 ) - { - java.util.Date dataConsulta2 = ( java.util.Date ) consultas[ consultas.length - 1 ] [ 1 ]; - String realizada2 = ( String ) consultas[ consultas.length - 1 ][ 2 ]; - java.util.Date dataConsulta1; - java.util.Date dataRelatorio1; - java.util.Date dataRelatorio2 = (java.util.Date) consultas[ consultas.length - 1 ][ 3 ]; - String realizada1; - if( consultas.length >= 2 ) - { - dataConsulta1 = ( java.util.Date ) consultas[ consultas.length - 2 ] [ 1 ]; - realizada1 = ( String ) consultas[ consultas.length - 2 ][ 2 ]; - dataRelatorio1 = (java.util.Date) consultas[ consultas.length - 2 ][ 3 ]; - } - else - { - dataConsulta1 = dataConsulta2; - realizada1 = realizada2; - dataRelatorio1 = dataRelatorio2; - } - if( "y".equals( realizada2 ) ) - { - update = update.replaceFirst( "[?]ultima_consulta", "'" + dataConsulta2 + "'" ); - update = update.replaceFirst( "[?]realizada", "'" + realizada2 + "'" ); - update = update.replaceFirst( "[?]proxima_consulta", "null" ); - if( dataRelatorio2 != null ) - { - update = update.replaceFirst( "[?]data_ficha", "'" + dataRelatorio2 + "'" ); - } - else - { - update = update.replaceFirst( "[?]data_ficha", "null" ); - } - } - else if( new java.util.Date().after( dataConsulta2 ) ) - { - update = update.replaceFirst( "[?]ultima_consulta", "'" + dataConsulta2 + "'" ); - update = update.replaceFirst( "[?]realizada", "'" + realizada2 + "'" ); - update = update.replaceFirst( "[?]proxima_consulta", "null" ); - if( dataRelatorio2 != null ) - { - update = update.replaceFirst( "[?]data_ficha", "'" + dataRelatorio2 + "'" ); - } - else - { - update = update.replaceFirst( "[?]data_ficha", "null" ); - } - } - else - { - update = update.replaceFirst( "[?]proxima_consulta", "'" + dataConsulta2 + "'" ); - if( !dataConsulta2.equals( dataConsulta1 ) ) - { - update = update.replaceFirst( "[?]ultima_consulta", "'" + dataConsulta1 + "'" ); - update = update.replaceFirst( "[?]realizada", "'" + realizada1 + "'" ); - if( dataRelatorio1 != null ) - { - update = update.replaceFirst( "[?]data_ficha", "'" + dataRelatorio1 + "'" ); - } - else - { - update = update.replaceFirst( "[?]data_ficha", "null" ); - } - } - else - { - update = update.replaceFirst( "[?]ultima_consulta", "null" ); - update = update.replaceFirst( "[?]realizada", "null" ); - update = update.replaceFirst( "[?]data_ficha", "null" ); - } - } - } - else - { - update = update.replaceFirst( "[?]ultima_consulta", "null" ); - update = update.replaceFirst( "[?]realizada", "null" ); - update = update.replaceFirst( "[?]proxima_consulta", "null" ); - update = update.replaceFirst( "[?]data_ficha", "null" ); - - } - Object fichas[][] = doQuery( softwareConnection, - GET_ID_FICHA_APTIDAO.replaceFirst( "[?]trabalhador_id", ""+id ) ); - if( fichas != null && fichas.length > 0 && fichas[0].length > 0 && fichas[0][0] != null ) - { - Integer idFicha = (Integer)fichas[0][0]; - fichas = doQuery( softwareConnection, - GET_DADOS_FICHA_APTIDAO.replaceFirst( "[?]id", "" + idFicha ) ); - java.util.Date dataFicha = ( java.util.Date ) fichas[ 0 ][ 0 ]; - /*if( dataFicha != null ) - { - update = update.replaceFirst( "[?]data_ficha", "null" ); - } - else - { - update = update.replaceFirst( "[?]data_ficha", "'" + dataFicha + "'" ); - }*/ - Integer resultadoFicha = (Integer) fichas[ 0 ][ 1 ]; - if( resultadoFicha != null ) - { - switch( resultadoFicha.intValue() ) - { - case 1: - update = update.replaceFirst( "[?]resultado", "'Apto'" ); - break; - case 2: - update = update.replaceFirst( "[?]resultado", "'Apto Condicionalmente'" ); - break; - case 3: - update = update.replaceFirst( "[?]resultado", "'Inapto Temporariamente'" ); - break; - case 4: - update = update.replaceFirst( "[?]resultado", "'Inapto Definitivamente'" ); - break; - default: - update = update.replaceFirst( "[?]resultado", "null" ); - } - } - else - { - update = update.replaceFirst( "[?]resultado", "null" ); - } - } - else - { - update = update.replaceFirst( "[?]data_ficha", "null" ); - update = update.replaceFirst( "[?]resultado", "null" ); - } - - queries[ 1 ] = update; - - } - } - - protected void readEstabelecimentos( String actualizacao ) - throws Exception - { - Object estabelecimentos[][] = doQuery( softwareConnection, GET_ESTABELECIMENTOS + actualizacao ); - //id, empresa_id, nome, contacto, inactivo - for( int t = 0; t < estabelecimentos.length; t++ ) - { - for( int c = 0; c < estabelecimentos[ t ].length; c++ ) - { - if( estabelecimentos[ t ][ c ] instanceof String ) - { - estabelecimentos[ t ][ c ] = unicodeToHTML( (String) estabelecimentos[ t ][ c ] ); - } - } - int id = ( ( Number ) estabelecimentos[t][0] ).intValue(); - boolean inactivo = "y".equals( estabelecimentos[ t ][ estabelecimentos[ t ].length - 1 ] ); - if( inactivo ) - { - deletes.add( DELETE_TRABALHADORES_BY_ESTABELECIMENTO + id ); - deletes.add( DELETE_ESTABELECIMENTO + id ); - continue; - } - String queries[] = new String[ 2 ]; - updates.insertElementAt( queries, 0 ); - queries[ 0 ] = CREATE_ESTABELECIMENTO.replaceFirst( "[?]id", "" + id ); - String update = UPDATE_ESTABELECIMENTO.replaceFirst( "[?]id", "" + id ); - - int empresaID = ( ( Number ) estabelecimentos[t][1] ).intValue(); - update = update.replaceFirst( "[?]empresa_id", "" + empresaID ); - String nome = "'" + estabelecimentos[ t ][ 2 ] + "'"; - update = update.replaceFirst( "[?]nome", nome ); - String morada; - if( estabelecimentos[ t ][ 4 ] != null ) - { - morada = "'" + estabelecimentos[ t ][ 4 ] + "'"; - } - else - { - morada = "''"; - } - update = update.replaceFirst( "[?]morada", morada ); - String localidade; - if( estabelecimentos[ t ][ 5 ] != null ) - { - localidade = "'" + estabelecimentos[ t ][ 5 ] + "'"; - } - else - { - localidade = "''"; - } - update = update.replaceFirst( "[?]localidade", localidade ); - String codigoPostal; - if( estabelecimentos[ t ][ 6 ] != null ) - { - codigoPostal = "'" + estabelecimentos[ t ][ 6 ] + "'"; - } - else - { - codigoPostal = "''"; - } - update = update.replaceFirst( "[?]codigo_postal", codigoPostal ); - - Object marcacoes[][] = doQuery( softwareConnection, - GET_MARCACOES_ESTABELECIMENTO +id ); - - if( marcacoes != null && marcacoes.length > 0 ) - { - java.util.Date dataConsulta2 = ( java.util.Date ) marcacoes[ marcacoes.length - 1 ] [ 1 ]; - String realizada2 = ( String ) marcacoes[ marcacoes.length - 1 ][ 2 ]; - java.util.Date dataConsulta1; - String realizada1; - if( marcacoes.length >= 2 ) - { - dataConsulta1 = ( java.util.Date ) marcacoes[ marcacoes.length - 2 ] [ 1 ]; - realizada1 = ( String ) marcacoes[ marcacoes.length - 2 ][ 2 ]; - } - else - { - dataConsulta1 = dataConsulta2; - realizada1 = realizada2; - } - if( "y".equals( realizada2 ) ) - { - update = update.replaceFirst( "[?]ultima_visita", "'" + dataConsulta2 + "'" ); - update = update.replaceFirst( "[?]realizada", "'" + realizada2 + "'" ); - update = update.replaceFirst( "[?]proxima_visita", "null" ); - } - else if( new java.util.Date().after( dataConsulta2 ) ) - { - update = update.replaceFirst( "[?]ultima_visita", "'" + dataConsulta2 + "'" ); - update = update.replaceFirst( "[?]realizada", "'" + realizada2 + "'" ); - update = update.replaceFirst( "[?]proxima_visita", "null" ); - } - else - { - update = update.replaceFirst( "[?]proxima_visita", "'" + dataConsulta2 + "'" ); - if( !dataConsulta2.equals( dataConsulta1 ) ) - { - update = update.replaceFirst( "[?]ultima_visita", "'" + dataConsulta1 + "'" ); - update = update.replaceFirst( "[?]realizada", "'" + realizada2 + "'" ); - } - else - { - update = update.replaceFirst( "[?]ultima_visita", "null" ); - update = update.replaceFirst( "[?]realizada", "null" ); - } - } - } - else - { - update = update.replaceFirst( "[?]ultima_visita", "null" ); - update = update.replaceFirst( "[?]realizada", "null" ); - update = update.replaceFirst( "[?]proxima_visita", "null" ); - } - - queries[ 1 ] = update; - } - } - - protected void readEmpresas( String actualizacao ) - throws Exception - { - Object empresas[][] = doQuery( softwareConnection, GET_EMPRESAS + actualizacao ); - //id, empresa_id, nome, contacto, inactivo - for( int t = 0; t < empresas.length; t++ ) - { - for( int c = 0; c < empresas[ t ].length; c++ ) - { - if( empresas[ t ][ c ] instanceof String ) - { - empresas[ t ][ c ] = unicodeToHTML( (String) empresas[ t ][ c ] ); - } - } - int id = ( ( Number ) empresas[t][0] ).intValue(); - boolean inactivo = "y".equals( empresas[ t ][ 17 ] ); - if( inactivo ) - { - String str = DELETE_TRABALHADORES_BY_EMPRESA.replaceFirst( "[?]empresa_id", "" + id ); - deletes.add( str ); - deletes.add( DELETE_ESTABELECIMENTOS_BY_EMPRESA + id ); - deletes.add( DELETE_EMPRESA + id ); - continue; - } - String queries[] = new String[ 2 ]; - updates.insertElementAt( queries, 0 ); - queries[ 0 ] = CREATE_EMPRESA.replaceFirst( "[?]id", "" + id ); - String update = UPDATE_EMPRESA.replaceFirst( "[?]id", "" + id ); - - String designacaoSocial = "'" + empresas[ t ][ 1 ] + "'"; - update = update.replaceFirst( "[?]designacao_social", designacaoSocial ); - String cae; - if( empresas[ t ][ 7 ] != null ) - { - cae = "'" + empresas[ t ][ 7 ] + "'"; - } - else - { - cae = "''"; - } - update = update.replaceFirst( "[?]cae", cae ); - String contribuinte; - if( empresas[ t ][ 8 ] != null ) - { - contribuinte = "'" + empresas[ t ][ 8 ] + "'"; - } - else - { - contribuinte = "''"; - } - update = update.replaceFirst( "[?]contribuinte", contribuinte ); - String segurancaSocial; - if( empresas[ t ][ 9 ] != null ) - { - segurancaSocial = "'" + empresas[ t ][ 9 ] + "'"; - } - else - { - segurancaSocial = "''"; - } - update = update.replaceFirst( "[?]seguranca_social", segurancaSocial ); - String actividade; - if( empresas[ t ][ 10 ] != null ) - { - actividade = "'" + empresas[ t ][ 10 ] + "'"; - } - else - { - actividade = "''"; - } - update = update.replaceFirst( "[?]actividade", actividade ); - String morada; - if( empresas[ t ][ 12 ] != null ) - { - morada = "'" + empresas[ t ][ 12 ] + "'"; - } - else - { - morada = "''"; - } - update = update.replaceFirst( "[?]morada", morada ); - String localidade; - if( empresas[ t ][ 13 ] != null ) - { - localidade = "'" + empresas[ t ][ 13 ] + "'"; - } - else - { - localidade = "''"; - } - update = update.replaceFirst( "[?]localidade", localidade ); - String codigoPostal; - if( empresas[ t ][ 14 ] != null ) - { - codigoPostal = "'" + empresas[ t ][ 14 ] + "'"; - } - else - { - codigoPostal = "''"; - } - update = update.replaceFirst( "[?]codigo_postal", codigoPostal ); - String distrito; - if( empresas[ t ][ 15 ] != null ) - { - distrito = "'" + empresas[ t ][ 15 ] + "'"; - } - else - { - distrito = "''"; - } - update = update.replaceFirst( "[?]distrito", distrito ); - String concelho; - if( empresas[ t ][ 16 ] != null ) - { - concelho = "'" + empresas[ t ][ 16 ] + "'"; - } - else - { - concelho = "''"; - } - update = update.replaceFirst( "[?]concelho", concelho ); - String email = null; - if( empresas[ t ][ 18 ] != null ) - { - try - { - Object em[][] = doQuery( softwareConnection, GET_EMAIL + empresas[ t ][ 18 ] ); - if( em != null && em.length > 0 && em[ 0 ][ 0 ] != null ) - { - email = "'" + (String)em[ 0 ][ 0 ] + "'"; - } - } - catch( Exception ex ) - { - } - } - if( email == null ) - { - email = "''"; - } - update = update.replaceFirst( "[?]email", email ); - - String codigo1 = (String) empresas[ t ][ 4 ]; - String codigo2 = (String) empresas[ t ][ 5 ]; - String codigo3 = (String) empresas[ t ][ 6 ]; - String codigo = "'" + ( codigo1 != null ? codigo1 : "_" ) + "/" - + ( codigo2 != null ? codigo2 : "_" ) + "/" - + ( codigo3 != null ? codigo3 : "_" ) + "'"; - update = update.replaceFirst( "[?]codigo", codigo ); - update = update.replaceFirst( "[?]perfil_1", "null" ); - update = update.replaceFirst( "[?]perfil_2", "null" ); - update = update.replaceFirst( "[?]perfil_3", "null" ); - update = update.replaceFirst( "[?]servicos", "null" ); - - queries[ 1 ] = update; - } - } - - protected Object [][]doQuery( Connection con, String query ) - throws Exception - { - return doQuery( con, query, false ); - } - - protected Object [][]doQuery( Connection con, String query, boolean isUpdate ) - throws Exception - { -// if( con == webConnection ) -// { -// System.out.println( "WEB" ); -// } -// else -// { -// System.out.println( "LOCAL" ); -// } -// if( query.indexOf( "INSERT" ) != -1 || query.indexOf( "UPDATE" ) != -1 ) -// { -//// System.out.println( "AAAAAAAAAAAAAHHHHHHH" + query ); -// return new Object[0][0]; -// } - Statement stm = null; - stm = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY ); - if( isUpdate ) - { - stm.executeUpdate( query ); - return null; - } - ResultSet rs = stm.executeQuery( query ); - - if( rs == null ) - { - return null; - } - ResultSetMetaData rsmd = rs.getMetaData(); - int columns = rsmd.getColumnCount(); - rs.last(); - int rows = rs.getRow(); - Object data[][] = new Object[ rows ][ columns ]; - for( int i = 0; i < rows; ++i ) - { - rs.absolute( i + 1 ); - for( int j = 0; j < columns; j++ ) - { - data[ i ][ j ] = rs.getObject( j + 1 ); - } - } - return data; - } - - protected static String unicodeToHTML( String text ) - { - if( text == null || text.length() == 0 ) - { - return ""; - } - - String output = text; - - output = output.replaceAll( "\\\\u0009", " " ); - output = output.replaceAll( "\\\\u000a", "
" ); - - output = output.replaceAll( "\\\\u00a0", " " ); - - output = output.replaceAll( "\\\\u00c0", "À" ); - output = output.replaceAll( "\\\\u00c1", "Á" ); - output = output.replaceAll( "\\\\u00c2", "Â" ); - output = output.replaceAll( "\\\\u00c3", "Ã" ); - output = output.replaceAll( "\\\\u00c7", "Ç" ); - output = output.replaceAll( "\\\\u00c8", "È" ); - output = output.replaceAll( "\\\\u00c9", "É" ); - output = output.replaceAll( "\\\\u00ca", "Ê" ); - output = output.replaceAll( "\\\\u00cc", "Ì" ); - output = output.replaceAll( "\\\\u00cd", "Í" ); - output = output.replaceAll( "\\\\u00ce", "Î" ); - output = output.replaceAll( "\\\\u00d2", "Ò" ); - output = output.replaceAll( "\\\\u00d3", "Ó" ); - output = output.replaceAll( "\\\\u00d4", "Ô" ); - output = output.replaceAll( "\\\\u00d5", "Õ" ); - output = output.replaceAll( "\\\\u00d9", "Ù" ); - output = output.replaceAll( "\\\\u00da", "Ú" ); - output = output.replaceAll( "\\\\u00db", "Û" ); - - output = output.replaceAll( "\\\\u00e0", "à" ); - output = output.replaceAll( "\\\\u00e1", "á" ); - output = output.replaceAll( "\\\\u00e2", "â" ); - output = output.replaceAll( "\\\\u00e3", "ã" ); - output = output.replaceAll( "\\\\u00e7", "ç" ); - output = output.replaceAll( "\\\\u00e8", "è" ); - output = output.replaceAll( "\\\\u00e9", "é" ); - output = output.replaceAll( "\\\\u00ea", "ê" ); - output = output.replaceAll( "\\\\u00ec", "ì" ); - output = output.replaceAll( "\\\\u00ed", "í" ); - output = output.replaceAll( "\\\\u00ee", "î" ); - output = output.replaceAll( "\\\\u00f2", "ò" ); - output = output.replaceAll( "\\\\u00f3", "ó" ); - output = output.replaceAll( "\\\\u00f4", "ô" ); - output = output.replaceAll( "\\\\u00f5", "õ" ); - output = output.replaceAll( "\\\\u00f9", "ù" ); - output = output.replaceAll( "\\\\u00fa", "ú" ); - output = output.replaceAll( "\\\\u00fb", "û" ); - output = output.replaceAll( "\\\\u00aa", "ª" ); - output = output.replaceAll( "\\\\u00ba", "º" ); - - output = output.replaceAll( "\\\\u0153", "œ" ); - - output = output.replaceAll( "\\\\u2013", "-" ); - output = output.replaceAll( "\\\\u2014", "-" ); - output = output.replaceAll( "\\\\u2018|\\\\u2019", "'" ); - output = output.replaceAll( "\\\\u201c|\\\\u201d", "\"" ); - - output = output.replaceAll( "\\\\u2022", "*" ); - output = output.replaceAll( "\\\\u2026", "..." ); - - return output; - } - - -} diff --git a/trunk/SIPRPSoft/src/updtprop.txt b/trunk/SIPRPSoft/src/updtprop.txt deleted file mode 100644 index 6153dbeb..00000000 --- a/trunk/SIPRPSoft/src/updtprop.txt +++ /dev/null @@ -1,7 +0,0 @@ -interno=localhost:5432 -iuser=postgres -ipasswd=Typein -externo=www.evolute.pt:5436 -euser=siprp -epasswd=rg2h-opksiprp -intervalo=10 diff --git a/trunk/SIPRPSoft/src/xml-apis-1.3.04.jar b/trunk/SIPRPSoft/src/xml-apis-1.3.04.jar deleted file mode 100644 index d42c0ea6cfd17ed6b444b8337febbc0bdb55ed83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194354 zcmbTeb95!j(l;DWY}>YN+vdd1#7-u*ZQHhOCllMo#F;neIrqNzoLTR4zPrAxwfD*& zRo&HHRllmP?%MKFz#xzSfBZ3aIQBtOr5j{|miC(3L?lbYQVnf}4 zNHwQpy;`Rh552AORjdhVduw^>OE%Ujt{Ks{@N+iX!_H)B?Xe#~iI;D}r77FMEkqk8 zh9hvYK@1OS;D;01oAJ|=L*j&s=#IEes9R(%Gilr{^oWe8aTZF8Hmqrpw#5{XMi1|JLKJOb+hCgFa`v~6%A2eqG(7splSnh;@qeQv0h&M z{e%tb8A5mAX;fJGkGSRyHajcUT*%rl$wa=;-b*~rb3Jmy+na`xp}NbE^r^*O8r#&iNkG}Sm60#s~6T6Wu?D3WU8Fll?~(Ad;Z{Vt%VY01dD^!dHE`f zpLd4AgX;a&ZO7cEb~_9}$Sg8@omHBFW!md?G9xkB!c;H_a6;XezQ6T5=A>dhaTzq> zt84iNTUe-q=Sd@9^)G*O?|46JOE0EADnjtZUor-iW&jCawrB6NhXn*xqJ=ljEPh69 z@G&HgN!xYG<94DQJ6-Yh<)65lQ}sSDG#KpvNMjP#cRC#`=c||4HL&ZS@zr z-^W7w8=aAXqk*HFo$)^~{9)Sv8Q8|a+StL)!0?|q5dX$uXJGGOZ13=2&){fpVB=t7 zYj6Dz9O!?W;XfQkw*P;)9R6`*vHq92931V94gNaa?;1h*8>6#v_WnI6s z!2gZK)y}}t>@U>6;}iHNwUxP{v5muDwekCyAfHsW_NIRs=XVOIe^D5G>ecL@hC=;2 z;isV)+FD!N+Wb|yzYqS0kbg|?!esalB0&Fz%FyAT#``Pf-_`y5%>S15kD33V{Az3K z_^C7lyMK`54+Z>N+CO;yS(ZP1>95qr&c-&5|0F!ZZwzLRfAiJfR{-}Lxz#_7{kt%q zZe(iwPYi!J(O;!^aCEaWb}%zG{>LT!zN?=b>ip^627kqz-`DX6ApCVEXLDnhf0FEX z`rjSlcTD@Yjr}w7{o8W>p!#Q*|F;$Vo6^|T@h>*>yBq!ikbkW1-_&NtR(5{{Jn;X) z^N7RgZi3HjVG|et0Q-~UKai>}BQ5mlLyiWYwnJ-ZW#Hft7`Npx#}7aJXhsqHQLsw6 zx@1wFWMMCi+i=Q`BxIJFOA#LsCO46q#s38;9^20+Np9+C8*dx$pd}QUv4LrGeAD!? zz1@ZD^>un$kNyiIxjAz?g=>P}FbL|TX5k$Dh3F(Dl6tjvU3G+W%5p)|^_uP-&3EI@ zBTzrL-3%u%Z9g8M)I5bb3luWx3Qf^cZL*lEY+aN%eZ2XhH#*v0B%t(T!RSMF)n}ne z2GZMN5LMH!h}=XqH?=uzeVk3+Uo$L_-T}X7rpo_lz?obqW^n+ii!CbSAdAd9G@B|u zW%d-;Cy}P(91OkUc%jbETb$ery#h_5z(`Z7j|j3p&Mnn6Z8KOizEcNE?dfZ8T1LHs zn84Yef|xk#gz5rWtMSK!9p=c(w+a4QUCsdpvQ*^2`|3HWBLDz?-W+h;o$JVsP1)}^ zcb9H}sS+Kfs}$|zHe*UV%&Q*V^V8{O+>;lN^$ti9A43QHe6vKUf2?V3S4R~8kuP*T zN*9;4TSF_SOj68?RPz=TN!s(w!K%|q=S+Qp(UIe&ca#164i?L8k~~TdE`ZN&u;)lw z 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Ž&_pYH0ua!^jQ1ju#^8(BCkVw_Ws-J@Mub@s6 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�}X7I8gxbF2`?F)6SeA) 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 z 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 KSr6gFI^h3trdb>S